From 1a64deeb894dc95e2645a75771732c6cc53a79ad Mon Sep 17 00:00:00 2001 From: =?utf8?q?Isma=C3=ABl=20Bouya?= Date: Wed, 4 Oct 2023 01:35:06 +0200 Subject: [PATCH] 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 --- .envrc | 32 +- .gitconfig | 9 - .gitignore | 3 +- .gitmodules | 3 - DOCUMENTATION.md | 30 +- Makefile | 130 +- default.nix | 14 +- deploy/flake.lock | 9816 ++++++++++++++++ deploy/flake.nix | 45 + environments/default.nix | 4 - environments/immae-eu.nix | 146 - flake.lock | 9825 +++++++++++++++++ flake.nix | 47 + flakes/backports/flake.lock | 13 +- flakes/backports/flake.nix | 105 +- flakes/copanier/default.nix | 30 + flakes/copanier/fix_reduce.patch | 13 + flakes/copanier/flake.lock | 59 + flakes/copanier/flake.nix | 28 + flakes/copanier/poetry.lock | 995 ++ flakes/copanier/pyproject.toml | 40 + flakes/diaspora/default.nix | 74 + flakes/diaspora/flake.lock | 75 + flakes/diaspora/flake.nix | 214 + {pkgs/webapps => flakes}/diaspora/gemset.nix | 0 .../diaspora/gemset_ldap.nix | 0 {pkgs/webapps => flakes}/diaspora/ldap.patch | 0 .../etherpad-lite/default.nix | 27 +- flakes/etherpad-lite/etherpad_cleanup.sql | 30 + flakes/etherpad-lite/flake.lock | 150 + flakes/etherpad-lite/flake.nix | 227 + .../etherpad-lite/libreoffice_patch.diff | 0 .../node-packages.json | 0 .../ep_aa_file_menu_toolbar/node-packages.nix | 0 .../modules/ep_adminpads/node-packages.json | 0 .../modules/ep_adminpads/node-packages.nix | 0 .../modules/ep_align/node-packages.json | 0 .../modules/ep_align/node-packages.nix | 0 .../modules/ep_bookmark/node-packages.json | 0 .../modules/ep_bookmark/node-packages.nix | 0 .../ep_clear_formatting/node-packages.json | 0 .../ep_clear_formatting/node-packages.nix | 0 .../modules/ep_colors/node-packages.json | 0 .../modules/ep_colors/node-packages.nix | 0 .../ep_comments_page/node-packages.json | 0 .../ep_comments_page/node-packages.nix | 0 .../node-packages.json | 0 .../node-packages.nix | 0 .../modules/ep_cursortrace/node-packages.json | 0 .../modules/ep_cursortrace/node-packages.nix | 0 .../ep_delete_empty_pads/node-packages.json | 0 .../ep_delete_empty_pads/node-packages.nix | 0 .../modules/ep_embedmedia/fix.patch | 0 .../modules/ep_embedmedia/node-packages.json | 0 .../modules/ep_embedmedia/node-packages.nix | 0 .../modules/ep_font_family/node-packages.json | 0 .../modules/ep_font_family/node-packages.nix | 0 .../modules/ep_font_size/node-packages.json | 0 .../modules/ep_font_size/node-packages.nix | 0 .../modules/ep_headings2/node-packages.json | 0 .../modules/ep_headings2/node-packages.nix | 0 .../modules/ep_immae_buttons/ep.json | 0 .../modules/ep_immae_buttons/hooks.js | 0 .../ep_immae_buttons/node-packages.nix | 0 .../modules/ep_immae_buttons/package.json | 0 .../ep_immae_buttons/static/js/main.js | 0 .../templates/editbarButtons.ejs | 0 .../modules/ep_ldapauth/node-packages.json | 0 .../modules/ep_ldapauth/node-packages.nix | 0 .../modules/ep_line_height/fix.patch | 0 .../modules/ep_line_height/node-packages.json | 0 .../modules/ep_line_height/node-packages.nix | 0 .../modules/ep_markdown/node-packages.json | 0 .../modules/ep_markdown/node-packages.nix | 0 .../modules/ep_mypads/fix_ldap.patch | 0 .../modules/ep_mypads/node-packages.json | 0 .../modules/ep_mypads/node-packages.nix | 0 .../modules/ep_page_view/node-packages.json | 0 .../modules/ep_page_view/node-packages.nix | 0 .../ep_previewimages/node-packages.json | 0 .../ep_previewimages/node-packages.nix | 0 .../modules/ep_private_pad/node-packages.json | 0 .../modules/ep_private_pad/node-packages.nix | 0 .../modules/ep_ruler/node-packages.json | 0 .../modules/ep_ruler/node-packages.nix | 0 .../modules/ep_scrollto/node-packages.json | 0 .../modules/ep_scrollto/node-packages.nix | 0 .../ep_set_title_on_pad/node-packages.json | 0 .../ep_set_title_on_pad/node-packages.nix | 0 .../ep_subscript_and_superscript/font.patch | 0 .../node-packages.json | 0 .../node-packages.nix | 0 .../ep_timesliderdiff/node-packages.json | 0 .../ep_timesliderdiff/node-packages.nix | 0 .../etherpad-lite/node-packages.nix | 0 flakes/files-watcher/flake.nix | 2 + flakes/flake.lock | 9669 ++++++++++++++++ flakes/flake.nix | 67 + {pkgs/webapps => flakes}/grocy/default.nix | 12 +- flakes/grocy/flake.lock | 150 + flakes/grocy/flake.nix | 35 + .../webapps => flakes}/grocy/php-packages.nix | 0 .../grocy/yarn-packages.nix | 0 {pkgs/webapps => flakes}/grocy/yarn.patch | 0 flakes/lib/flake.lock | 272 +- flakes/lib/flake.nix | 76 +- flakes/loginctl-linger/flake.nix | 56 + {pkgs/webapps => flakes}/mastodon/default.nix | 28 +- flakes/mastodon/flake.lock | 75 + flakes/mastodon/flake.nix | 331 + {pkgs/webapps => flakes}/mastodon/gemset.nix | 0 .../mastodon/yarn-packages.nix | 0 .../mediagoblin/bower-packages.nix | 0 .../mediagoblin/default.nix | 35 +- flakes/mediagoblin/flake.lock | 78 + flakes/mediagoblin/flake.nix | 271 + .../mediagoblin/ldap_fix.py | 0 .../plugins/basicsearch/default.nix | 0 flakes/multi-apache-container/flake.lock | 36 + flakes/multi-apache-container/flake.nix | 389 + flakes/mypackages/flake.lock | 83 + flakes/mypackages/flake.nix | 43 + flakes/mypackages/lib/default.nix | 37 + flakes/mypackages/lib/flake-parts-lib.nix | 10 + {lib => flakes/mypackages/lib}/node-env.nix | 52 +- .../mypackages/lib}/private/default.nix | 2 +- .../overlays}/bitlbee-discord/default.nix | 6 +- .../bitlbee/bitlbee_long_nicks.patch | 0 .../mypackages/overlays}/bitlbee/default.nix | 0 .../overlays/databases/mysql/default.nix | 28 + .../databases/postgresql/default.nix | 0 flakes/mypackages/overlays/default.nix | 25 + .../mypackages/overlays}/gitolite/default.nix | 0 .../mypackages/overlays}/gitolite/invite | 0 .../mypackages/overlays}/gitweb/default.nix | 0 .../overlays}/gitweb/theme/git-favicon.png | Bin .../overlays}/gitweb/theme/git-logo.png | Bin .../overlays}/gitweb/theme/gitweb.css | 0 .../overlays}/gitweb/theme/gitweb.js | 0 .../mypackages/overlays}/goaccess/default.nix | 0 .../mypackages/overlays/kanboard/default.nix | 19 + flakes/mypackages/overlays/morph/default.nix | 27 + .../mypackages/overlays}/morph/dry-run.patch | 0 .../overlays}/morph/verbose_nix.patch | 0 .../overlays}/php-packages/mysqli_patch.patch | 0 .../mypackages/overlays}/postfix/default.nix | 0 .../overlays}/taskwarrior/TW-1778_patch.diff | 0 .../overlays}/taskwarrior/default.nix | 0 flakes/mypackages/overlays/ympd/default.nix | 14 + .../overlays}/ympd/ympd-password-env.patch | 0 flakes/mypackages/pkgs/bash-libs/default.nix | 33 + .../mypackages/pkgs}/boinctui/default.nix | 9 +- .../mypackages/pkgs}/cnagios/default.nix | 14 +- .../mypackages/pkgs}/commento/default.nix | 0 .../mypackages/pkgs}/composer-env/default.nix | 55 +- .../pkgs}/crypto/cardano-cli/default.nix | 0 .../pkgs}/crypto/cardano/default.nix | 14 +- .../pkgs}/crypto/iota-cli-app/default.nix | 13 +- .../crypto/iota-cli-app/node-packages.nix | 0 .../mypackages/pkgs}/crypto/sia/default.nix | 0 flakes/mypackages/pkgs/default.nix | 64 + .../plugins/deleted_to_trash/default.nix | 13 +- .../plugins/deleted_to_trash/fix_mbox.patch | 0 .../mypackages/pkgs}/flrn/default.nix | 13 +- flakes/mypackages/pkgs/fluent-bit/default.nix | 47 + flakes/mypackages/pkgs/fluentd/Gemfile | 3 + flakes/mypackages/pkgs/fluentd/Gemfile.lock | 38 + flakes/mypackages/pkgs/fluentd/default.nix | 20 + flakes/mypackages/pkgs/fluentd/gemset.nix | 126 + .../mypackages/pkgs}/gearmand/default.nix | 6 +- .../mypackages/pkgs}/genius/default.nix | 4 +- flakes/mypackages/pkgs/ical2html/default.nix | 11 + .../pkgs}/monitoring-plugins/default.nix | 4 +- .../mypackages/pkgs}/mtop/default.nix | 4 +- flakes/mypackages/pkgs/mutt-ics/default.nix | 15 + .../mypackages/pkgs}/muttprint/0.73-4.diff.gz | Bin .../mypackages/pkgs}/muttprint/default.nix | 0 .../mypackages/pkgs}/muttprint/regex.patch | 0 .../mypackages/pkgs}/muttprint/two_edge.patch | 0 .../pkgs}/naemon-livestatus/default.nix | 13 +- .../mypackages/pkgs}/naemon/default.nix | 13 +- flakes/mypackages/pkgs/nagios-cli/default.nix | 12 + flakes/mypackages/pkgs/nagnu/default.nix | 21 + .../mypackages/pkgs}/nb/default.nix | 4 +- .../mypackages/pkgs}/note/default.nix | 4 +- .../pkgs}/notmuch/notmuch-python/default.nix | 0 .../pkgs}/notmuch/notmuch-vim/default.nix | 0 .../pkgs/perl-ical-parser-html/default.nix | 48 + flakes/mypackages/pkgs/pgpid/default.nix | 33 + flakes/mypackages/pkgs/predixy/default.nix | 19 + .../mypackages/pkgs}/proftpd/default.nix | 11 +- .../mypackages/pkgs}/pure-ftpd/default.nix | 4 +- flakes/mypackages/pkgs/riotkit-do/default.nix | 60 + .../mypackages/pkgs}/rrsync_sudo/default.nix | 0 .../mypackages/pkgs}/rrsync_sudo/sudo.patch | 0 flakes/mypackages/pkgs/shaarli/default.nix | 24 + .../pkgs}/shaarli/shaarli_ldap.patch | 0 .../mypackages/pkgs}/signaldctl/default.nix | 0 .../mypackages/pkgs}/slang_1/default.nix | 0 .../pkgs}/status_engine/host_perfdata.patch | 0 .../pkgs}/status_engine/interface.nix | 9 +- .../status_engine/interface_composer.lock | 0 .../status_engine/interface_php_packages.nix | 0 .../mypackages/pkgs/status_engine/module.nix | 19 + .../mypackages/pkgs/status_engine/worker.nix | 37 + .../pkgs/status_engine/worker_composer.lock | 2072 ++++ .../status_engine/worker_php_packages.nix | 266 + .../pkgs/telegram-history-dump/default.nix | 18 + .../mypackages/pkgs}/telegramircd/default.nix | 10 +- .../pkgs}/telethon_sync/default.nix | 0 .../pkgs}/terminal-velocity/default.nix | 4 +- .../pkgs}/terminal-velocity/fix_build.patch | 0 .../terminal-velocity/python3_support.patch | 0 .../terminal-velocity/sort_found_notes.patch | 0 .../mypackages/pkgs}/tiv/default.nix | 4 +- .../mypackages/pkgs}/tiv/tiv_builder.sh | 0 .../mypackages/pkgs}/twins/default.nix | 0 .../mypackages/pkgs}/umami/build-geo.patch | 0 .../mypackages/pkgs}/umami/default.nix | 0 .../mypackages/pkgs}/unicode/default.nix | 0 flakes/mypackages/pkgs/upcmd/default.nix | 13 + .../pkgs/webapps/adminer/default.nix | 14 + .../pkgs}/webapps/apache-theme/default.nix | 0 .../webapps/apache-theme/theme/.htaccess | 0 .../webapps/apache-theme/theme/footer.html | 0 .../webapps/apache-theme/theme/header.html | 0 .../apache-theme/theme/icons/archive.png | Bin .../apache-theme/theme/icons/audio.png | Bin .../apache-theme/theme/icons/authors.png | Bin .../webapps/apache-theme/theme/icons/bin.png | Bin .../apache-theme/theme/icons/blank.png | Bin .../webapps/apache-theme/theme/icons/bmp.png | Bin .../webapps/apache-theme/theme/icons/c.png | Bin .../webapps/apache-theme/theme/icons/calc.png | Bin .../webapps/apache-theme/theme/icons/cd.png | Bin .../apache-theme/theme/icons/copying.png | Bin .../webapps/apache-theme/theme/icons/cpp.png | Bin .../webapps/apache-theme/theme/icons/css.png | Bin .../webapps/apache-theme/theme/icons/deb.png | Bin .../apache-theme/theme/icons/default.png | Bin .../webapps/apache-theme/theme/icons/diff.png | Bin .../webapps/apache-theme/theme/icons/doc.png | Bin .../webapps/apache-theme/theme/icons/draw.png | Bin .../webapps/apache-theme/theme/icons/eps.png | Bin .../webapps/apache-theme/theme/icons/exe.png | Bin .../apache-theme/theme/icons/folder-home.png | Bin .../apache-theme/theme/icons/folder-open.png | Bin .../apache-theme/theme/icons/folder-page.png | Bin .../theme/icons/folder-parent-old.png | Bin .../theme/icons/folder-parent.png | Bin .../apache-theme/theme/icons/folder.png | Bin .../webapps/apache-theme/theme/icons/gif.png | Bin .../webapps/apache-theme/theme/icons/gzip.png | Bin .../webapps/apache-theme/theme/icons/h.png | Bin .../webapps/apache-theme/theme/icons/hpp.png | Bin .../webapps/apache-theme/theme/icons/html.png | Bin .../webapps/apache-theme/theme/icons/ico.png | Bin .../apache-theme/theme/icons/image.png | Bin .../apache-theme/theme/icons/install.png | Bin .../webapps/apache-theme/theme/icons/java.png | Bin .../webapps/apache-theme/theme/icons/jpg.png | Bin .../webapps/apache-theme/theme/icons/js.png | Bin .../webapps/apache-theme/theme/icons/json.png | Bin .../webapps/apache-theme/theme/icons/log.png | Bin .../apache-theme/theme/icons/makefile.png | Bin .../apache-theme/theme/icons/markdown.png | Bin .../apache-theme/theme/icons/package.png | Bin .../webapps/apache-theme/theme/icons/pdf.png | Bin .../webapps/apache-theme/theme/icons/php.png | Bin .../apache-theme/theme/icons/playlist.png | Bin .../webapps/apache-theme/theme/icons/png.png | Bin .../webapps/apache-theme/theme/icons/pres.png | Bin .../webapps/apache-theme/theme/icons/ps.png | Bin .../webapps/apache-theme/theme/icons/psd.png | Bin .../webapps/apache-theme/theme/icons/py.png | Bin .../webapps/apache-theme/theme/icons/rar.png | Bin .../webapps/apache-theme/theme/icons/rb.png | Bin .../apache-theme/theme/icons/readme.png | Bin .../webapps/apache-theme/theme/icons/rpm.png | Bin .../webapps/apache-theme/theme/icons/rss.png | Bin .../webapps/apache-theme/theme/icons/rtf.png | Bin .../apache-theme/theme/icons/script.png | Bin .../apache-theme/theme/icons/source.png | Bin .../webapps/apache-theme/theme/icons/sql.png | Bin .../webapps/apache-theme/theme/icons/tar.png | Bin .../webapps/apache-theme/theme/icons/tex.png | Bin .../webapps/apache-theme/theme/icons/text.png | Bin .../webapps/apache-theme/theme/icons/tiff.png | Bin .../apache-theme/theme/icons/unknown.png | Bin .../webapps/apache-theme/theme/icons/vcal.png | Bin .../apache-theme/theme/icons/video.png | Bin .../webapps/apache-theme/theme/icons/xml.png | Bin .../webapps/apache-theme/theme/icons/zip.png | Bin .../webapps/apache-theme/theme/style.css | 2 +- .../mypackages/pkgs}/webapps/awl/default.nix | 0 .../pkgs}/webapps/davical/default.nix | 0 flakes/mypackages/pkgs/webapps/default.nix | 24 + .../pkgs}/webapps/dokuwiki/default.nix | 13 +- .../pkgs}/webapps/dokuwiki/plugins/farmer.nix | 0 .../pkgs}/webapps/dokuwiki/plugins/todo.nix | 0 .../pkgs}/webapps/infcloud/default.nix | 0 .../pkgs}/webapps/infcloud/infcloud_config.js | 0 .../webapps/mantisbt_2/bug_report.php.diff | 0 .../mantisbt_2/bug_report_page.php.diff | 0 .../webapps/mantisbt_2/bugnote_add.php.diff | 0 .../mantisbt_2/bugnote_add_inc.php.diff | 0 .../pkgs}/webapps/mantisbt_2/default.nix | 1 + .../mantisbt_2/plugins/slack/default.nix | 0 .../source-integration/Source.API.php.diff | 0 .../plugins/source-integration/default.nix | 1 + .../webapps/nextcloud/apps/audioplayer.nix | 15 + .../pkgs/webapps/nextcloud/apps/bookmarks.nix | 21 + .../pkgs/webapps/nextcloud/apps/calendar.nix | 15 + .../pkgs/webapps/nextcloud/apps/carnet.nix | 15 + .../pkgs/webapps/nextcloud/apps/contacts.nix | 15 + .../pkgs/webapps/nextcloud/apps/cookbook.nix | 15 + .../pkgs/webapps/nextcloud/apps/deck.nix | 27 + .../pkgs/webapps/nextcloud/apps/drawio.nix | 24 + .../pkgs/webapps/nextcloud/apps/external.nix | 27 + .../pkgs/webapps/nextcloud/apps/extract.nix | 15 + .../webapps/nextcloud/apps/files_markdown.nix | 15 + .../webapps/nextcloud/apps/files_mindmap.nix | 15 + .../webapps/nextcloud/apps/files_readmemd.nix | 14 + .../webapps/nextcloud/apps/flowupload.nix | 14 + .../pkgs/webapps/nextcloud/apps/gpxedit.nix | 22 + .../pkgs/webapps/nextcloud/apps/gpxpod.nix | 31 + .../webapps/nextcloud/apps/groupfolders.nix | 27 + .../webapps/nextcloud/apps/impersonate.nix | 27 + .../nextcloud/apps/integration_dropbox.nix | 13 + .../pkgs/webapps/nextcloud/apps/keeweb.nix | 24 + .../pkgs/webapps/nextcloud/apps/maps.nix | 15 + .../pkgs/webapps/nextcloud/apps/metadata.nix | 15 + .../pkgs/webapps/nextcloud/apps/music.nix | 15 + .../pkgs/webapps/nextcloud/apps/notes.nix | 15 + .../pkgs/webapps/nextcloud/apps/ocsms.nix | 21 + .../webapps/nextcloud/apps/onlyoffice.nix | 21 + .../pkgs/webapps/nextcloud/apps/passman.nix | 21 + .../pkgs/webapps/nextcloud/apps/polls.nix | 15 + .../pkgs/webapps/nextcloud/apps/side_menu.nix | 16 + .../pkgs/webapps/nextcloud/apps/social.nix | 14 + .../pkgs/webapps/nextcloud/apps/spreed.nix | 27 + .../nextcloud/apps/talk_matterbridge.nix | 14 + .../pkgs/webapps/nextcloud/apps/tasks.nix | 15 + .../pkgs/webapps/nextcloud/default.nix | 84 + .../pkgs}/webapps/phpbb/default.nix | 0 .../webapps/phpbb/extensions/adduser.nix | 0 .../phpbb/extensions/autosubscribe.nix | 0 .../webapps/phpbb/extensions/mailinglist.nix | 0 .../webapps/phpbb/extensions/markdown.nix | 0 .../pkgs}/webapps/phpbb/extensions/mchat.nix | 0 .../phpbb/extensions/monitoranswers.nix | 0 .../pkgs}/webapps/phpbb/langs/fr.nix | 0 .../pkgs}/webapps/phpldapadmin/default.nix | 0 .../phpldapadmin/ldap-align-button.patch | 0 .../phpldapadmin/ldap-fix-password.patch | 0 .../phpldapadmin/ldap-sort-in-templates.patch | 0 .../mypackages/pkgs/webapps/rompr/default.nix | 17 + .../pkgs}/webapps/roundcubemail/add_all.patch | 0 .../pkgs}/webapps/roundcubemail/default.nix | 0 .../plugins/automatic_addressbook/default.nix | 0 .../roundcubemail/plugins/carddav/default.nix | 0 .../plugins/contextmenu/default.nix | 0 .../plugins/contextmenu_folder/default.nix | 0 .../plugins/html5_notifier/default.nix | 0 .../plugins/ident_switch/default.nix | 0 .../plugins/message_highlight/default.nix | 0 .../plugins/thunderbird_labels/default.nix | 0 .../mypackages/pkgs}/webapps/spip/default.nix | 0 .../pkgs}/webapps/spip/spip_ldap_patch.patch | 0 .../pkgs}/webapps/spip/spip_mes_options.php | 0 .../pkgs}/webapps/ttrss/default.nix | 4 +- .../ttrss/plugins/af_feedmod/default.nix | 18 + .../plugins/af_feedmod/type_replace.patch | 0 .../ttrss/plugins/auth_ldap/default.nix | 17 + .../ttrss/plugins/feediron/default.nix | 18 + .../plugins/feediron/json_reformat.patch | 0 .../ttrss/plugins/ff_instagram/default.nix | 17 + .../ttrss/plugins/tumblr_gdpr_ua/default.nix | 17 + .../pkgs}/webapps/wallabag/default.nix | 0 .../pkgs}/webapps/wallabag/ldap.patch | 0 .../pkgs}/webapps/yourls/default.nix | 15 +- .../webapps/yourls/plugins/ldap/default.nix | 17 + flakes/myuids/flake.nix | 14 +- flakes/naemon/flake.nix | 191 + {modules => flakes}/naemon/naemon.cfg | 0 flakes/openarc/flake.lock | 17 +- flakes/openarc/flake.nix | 6 +- flakes/opendmarc/flake.lock | 17 +- flakes/opendmarc/flake.nix | 8 +- flakes/openfoodnetwork/default.nix | 39 + flakes/openfoodnetwork/gemset.nix | 2896 +++++ flakes/paste/flake.nix | 2 + flakes/paste/paste/paste.py | 29 +- flakes/peertube/flake.lock | 17 +- flakes/peertube/flake.nix | 10 +- .../private/buildbot}/buildslist/bower.nix | 0 .../private/buildbot}/buildslist/default.nix | 7 +- .../buildbot}/buildslist/yarn-packages.nix | 0 .../private/buildbot/common/build_helpers.py | 188 +- .../private/buildbot/common/libvirt.py | 0 .../private/buildbot/common/master.cfg | 26 +- flakes/private/buildbot/flake.lock | 61 + flakes/private/buildbot/flake.nix | 74 + .../private/buildbot/test_project/__init__.py | 121 + flakes/private/chatons/flake.lock | 23 + flakes/private/chatons/flake.nix | 142 + flakes/private/environment-dummy/flake.nix | 18 + flakes/private/environment-dummy/ldap.conf | 13 + flakes/private/environment-dummy/vars.yml | 1 + flakes/private/environment/flake.nix | 1135 ++ .../mail-relay}/filter-rewrite-from.py | 0 flakes/private/mail-relay/flake.lock | 36 + flakes/private/mail-relay/flake.nix | 58 + flakes/private/milters/flake.lock | 186 + flakes/private/milters/flake.nix | 106 + .../private/milters}/verify_from.py | 0 flakes/private/monitoring/flake.lock | 67 + flakes/private/monitoring/flake.nix | 267 + .../private/monitoring/myplugins.nix | 65 +- .../private/monitoring/nagios-cli.cfg | 0 .../private/monitoring/objects_common.nix | 58 +- .../monitoring/plugins/check_backup_age | 0 .../monitoring/plugins/check_bandwidth | 3 +- .../private/monitoring/plugins/check_command | 0 .../private/monitoring/plugins/check_emails | 0 .../private/monitoring/plugins/check_eriomem | 0 .../monitoring/plugins/check_ftp_database | 0 .../private/monitoring/plugins/check_git | 0 .../monitoring/plugins/check_imap_connection | 0 .../monitoring/plugins/check_last_file_date | 0 .../private/monitoring/plugins/check_mem.sh | 14 +- .../plugins/check_mysql_replication | 0 .../plugins/check_openldap_replication | 0 .../private/monitoring/plugins/check_ovh_sms | 0 .../plugins/check_postgres_database_count | 0 .../plugins/check_postgres_replication | 0 .../plugins/check_redis_replication | 0 .../monitoring/plugins/check_zfs_snapshot | 0 .../monitoring/plugins/notify_by_apprise | 31 + .../monitoring/plugins/notify_by_email | 0 .../monitoring/plugins/notify_by_slack | 0 .../private/monitoring/plugins/send_nrdp.sh | 0 .../private/monitoring/send_mails | 0 .../private/monitoring/to_objects.nix | 10 +- flakes/private/openarc/flake.lock | 72 +- flakes/private/openarc/flake.nix | 96 +- flakes/private/opendmarc/flake.lock | 85 +- flakes/private/opendmarc/flake.nix | 125 +- flakes/private/openldap/flake.nix | 6 + flakes/private/openldap/immae.ldif | 83 + .../private}/openldap/immae.schema | 4 +- flakes/private/paste/flake.lock | 51 +- flakes/private/paste/flake.nix | 36 +- flakes/private/peertube/flake.lock | 89 +- flakes/private/peertube/flake.nix | 16 +- flakes/private/php/flake.lock | 62 + flakes/private/php/flake.nix | 40 + flakes/private/ssh/flake.lock | 36 + flakes/private/ssh/flake.nix | 107 + .../private/ssh/ldap_authorized_keys.sh | 14 +- flakes/private/system/flake.lock | 185 + flakes/private/system/flake.nix | 168 + .../private/system}/public_keys/Immae.pub | 0 flakes/rsync_backup/flake.nix | 4 +- flakes/secrets/flake.nix | 60 +- {pkgs/webapps => flakes}/surfer/default.nix | 6 +- flakes/surfer/flake.lock | 149 + flakes/surfer/flake.nix | 36 + .../surfer/node-packages.nix | 0 .../taskwarrior-web/Gemfile.lock | 0 .../taskwarrior-web/default.nix | 9 +- .../taskwarrior-web/fixes.patch | 57 + flakes/taskwarrior-web/flake.lock | 62 + flakes/taskwarrior-web/flake.nix | 33 + .../taskwarrior-web/gemset.nix | 0 .../taskwarrior-web/thin.patch | 0 lib/default.nix | 16 - lib/flake-compat-patched.nix | 190 - lib/flake-compat.nix | 8 - modules/default.nix | 29 - modules/naemon/default.nix | 183 - .../buildbot/projects/caldance/__init__.py | 198 - .../projects/cryptoportfolio/__init__.py | 169 - .../buildbot/projects/denise/__init__.py | 186 - .../buildbot/projects/immaeEu/__init__.py | 314 - .../projects/immaeEu/scripts/lacells_download | 163 - .../buildbot/projects/test/__init__.py | 197 - modules/private/certificates.nix | 199 - .../private/databases/openldap/default.nix | 147 - .../databases/openldap/eldiron_schemas.nix | 21 - modules/private/default.nix | 136 - modules/private/dns.nix | 197 - modules/private/environment.nix | 1492 --- modules/private/gemini/default.nix | 26 - modules/private/gitolite/default.nix | 77 - modules/private/gitolite/ldap_gitolite.sh | 33 - modules/private/irc.nix | 54 - modules/private/loginctl-linger.nix | 47 - modules/private/mail/default.nix | 42 - modules/private/mail/milters.nix | 88 - modules/private/mail/opensmtpd.nix | 57 - modules/private/monitoring/default.nix | 249 - .../private/monitoring/objects_backup-2.nix | 111 - modules/private/monitoring/objects_dilion.nix | 32 - modules/private/monitoring/objects_eban.nix | 70 - .../private/monitoring/objects_eldiron.nix | 38 - modules/private/monitoring/objects_master.nix | 39 - .../monitoring/objects_monitoring-1.nix | 714 -- .../monitoring/objects_quatresaisons.nix | 38 - .../monitoring/objects_tiboqorl-fr.nix | 174 - .../monitoring/plugins/notify_eban_url | 6 - modules/private/pub/default.nix | 56 - modules/private/pub/ldap_pub.sh | 56 - modules/private/ssh/default.nix | 91 - modules/private/system.nix | 98 - modules/private/system/dilion/vms.nix | 185 - modules/private/system/eldiron.nix | 228 - modules/private/system/quatresaisons.nix | 436 - .../system/quatresaisons/databases.nix | 147 - .../private/system/quatresaisons/landing.yml | 32 - .../system/quatresaisons/landing_4c.yml | 24 - .../system/quatresaisons/nextcloud.nix | 141 - modules/private/websites/bakeer/cloud.nix | 23 - .../capitaines/discourse_static/discourse.png | Bin 2440 -> 0 bytes .../capitaines/discourse_static/index.html | 28 - .../websites/capitaines/landing_pages.nix | 57 - .../capitaines/mastodon_static/index.html | 29 - .../capitaines/mastodon_static/oops.png | Bin 120305 -> 0 bytes .../private/websites/chloe/app/default.nix | 22 - .../private/websites/chloe/config/chmod.php | 4 - .../private/websites/chloe/config/connect.php | 15 - .../private/websites/chloe/config/ldap.php | 9 - .../private/websites/chloe/integration.nix | 104 - modules/private/websites/chloe/production.nix | 112 - modules/private/websites/cip-ca/sympa.nix | 28 - modules/private/websites/commons/adminer.nix | 4 - .../websites/connexionswing/app/default.nix | 29 - .../connexionswing/app/php-packages.nix | 597 - .../websites/connexionswing/integration.nix | 141 - .../websites/connexionswing/production.nix | 110 - .../private/websites/denise/aventuriers.nix | 26 - modules/private/websites/denise/bingo.nix | 100 - .../private/websites/denise/denisejerome.nix | 31 - modules/private/websites/denise/evariste.nix | 104 - modules/private/websites/denise/oms.nix | 100 - .../private/websites/denise/production.nix | 25 - .../websites/emilia/atelierfringant.nix | 65 - modules/private/websites/emilia/moodle.nix | 65 - .../private/websites/emilia/moodle/pause.html | 48 - modules/private/websites/florian/app.nix | 142 - .../private/websites/florian/app/default.nix | 27 - .../websites/florian/app/php-packages.nix | 389 - .../private/websites/florian/integration.nix | 34 - .../private/websites/florian/production.nix | 34 - .../immae/chatons/immae-eu.properties | 46 - .../immae/chatons/service-etherpad.properties | 164 - modules/private/websites/immae/temp.nix | 64 - .../websites/isabelle/aten_app/default.nix | 61 - .../isabelle/aten_app/php-packages.nix | 740 -- .../isabelle/aten_app/yarn-packages.nix | 7871 ------------- .../websites/isabelle/aten_integration.nix | 91 - .../websites/isabelle/aten_production.nix | 90 - .../websites/isabelle/config/chmod.php | 4 - .../websites/isabelle/config/connect.php | 15 - .../private/websites/isabelle/config/ldap.php | 9 - .../private/websites/isabelle/iridologie.nix | 113 - .../isabelle/iridologie_app/default.nix | 19 - .../private/websites/jerome/naturaloutil.nix | 97 - modules/private/websites/leila/production.nix | 114 - .../private/websites/ludivine/app/default.nix | 37 - .../websites/ludivine/app/php-packages.nix | 868 -- .../private/websites/ludivine/integration.nix | 145 - .../private/websites/ludivine/production.nix | 116 - .../private/websites/nassime/production.nix | 35 - modules/private/websites/nath/villon.nix | 42 - modules/private/websites/papa/maison_bbc.nix | 28 - .../websites/papa/maison_bbc_static/data.json | 4101 ------- .../papa/maison_bbc_static/favicon.ico | Bin 318 -> 0 bytes .../papa/maison_bbc_static/index.html | 164 - .../papa/maison_bbc_static/lamaison.png | Bin 259991 -> 0 bytes .../private/websites/papa/surveillance.nix | 50 - .../websites/patrick_fodella/altermondia.nix | 73 - .../websites/patrick_fodella/ecolyeu.nix | 72 - .../websites/piedsjaloux/app/default.nix | 29 - .../websites/piedsjaloux/app/php-packages.nix | 1009 -- .../websites/piedsjaloux/integration.nix | 135 - .../websites/piedsjaloux/production.nix | 106 - .../websites/ressourcerie_banon/cloud.nix | 20 - .../websites/ressourcerie_banon/cryptpad.nix | 49 - .../ressourcerie_banon/production.nix | 70 - .../private/websites/richie/production.nix | 106 - modules/private/websites/syden/peertube.nix | 132 - .../websites/telio_tortay/production.nix | 81 - .../private/websites/tools/assets/default.nix | 39 - .../private/websites/tools/cloud/default.nix | 184 - modules/private/websites/tools/cloud/farm.nix | 123 - .../websites/tools/cryptpad/default.nix | 50 - .../private/websites/tools/dav/default.nix | 55 - modules/private/websites/tools/db/default.nix | 21 - .../private/websites/tools/git/default.nix | 49 - modules/private/websites/tools/im/default.nix | 42 - .../private/websites/tools/mail/default.nix | 79 - .../private/websites/tools/tools/adminer.nix | 46 - .../websites/tools/tools/csp_reports.nix | 11 - .../private/websites/tools/tools/dokuwiki.nix | 56 - .../private/websites/tools/tools/landing.nix | 29 - .../tools/landing/report_csp_violation.php | 22 - .../private/websites/tools/tools/webhooks.nix | 17 - modules/webapps/diaspora.nix | 173 - modules/webapps/etherpad-lite.nix | 162 - modules/webapps/mastodon.nix | 265 - modules/webapps/mediagoblin.nix | 231 - modules/websites/default.nix | 281 - modules/websites/httpd-service-builder.nix | 735 -- modules/websites/httpd-service-builder.patch | 150 - modules/websites/php-application.nix | 224 - modules/zrepl.nix | 45 - nix/README.md | 2 - nix/sources.json | 209 - nix/sources.nix | 135 - nixops/.gitignore | 1 - nixops/.sops.yaml | 19 - nixops/Makefile | 102 - nixops/default.nix | 8 - nixops/scripts/with_env | 22 - nixops/secrets | 1 - overlays/bonfire/default.nix | 36 - overlays/bugwarrior/default.nix | 5 - overlays/bugwarrior/mantisbt.patch | 379 - overlays/bundix/default.nix | 7 - overlays/databases/mysql/default.nix | 24 - overlays/default.nix | 48 - overlays/doing/default.nix | 10 - overlays/dwm/default.nix | 7 - overlays/dwm/dwm_config.h | 98 - overlays/elinks/default.nix | 14 - overlays/elinks/elinks.json | 15 - overlays/kanboard/default.nix | 18 - overlays/khal/default.nix | 8 - overlays/ledger/default.nix | 20 - overlays/lesspipe/default.nix | 5 - overlays/morph/default.nix | 5 - overlays/neomutt/default.nix | 7 - overlays/neomutt/tx.patch | 44 - overlays/nix-direnv/default.nix | 7 - overlays/nixops/default.nix | 20 - overlays/nixops/fix_glibc.patch | 15 - overlays/nixops/hetzner_cloud.patch | 480 - overlays/pass/default.nix | 5 - overlays/pass/pass-fix-pass-init.patch | 42 - overlays/pelican/default.nix | 7 - overlays/php-packages/default.nix | 6 - overlays/procps-ng/default.nix | 5 - overlays/python-packages/buildbot.nix | 8 - overlays/python-packages/default.nix | 29 - overlays/sc-im/default.nix | 9 - overlays/shaarli/default.nix | 15 - overlays/slrn/default.nix | 5 - overlays/vcsh/default.nix | 7 - overlays/weechat/default.nix | 12 - overlays/ympd/default.nix | 5 - overlays/ympd/ympd.json | 15 - pkgs/cnagios/cnagios.json | 15 - pkgs/crypto/cardano/daedalus.json | 15 - pkgs/crypto/iota-cli-app/iota-cli-app.json | 15 - pkgs/default.nix | 64 - .../dovecot-deleted_to_trash.json | 15 - pkgs/flrn/flrn.json | 15 - pkgs/mutt-ics/default.nix | 5 - pkgs/mutt-ics/mutt-ics.json | 15 - pkgs/naemon-livestatus/naemon-livestatus.json | 15 - pkgs/naemon/naemon.json | 15 - pkgs/nagios-cli/default.nix | 2 - pkgs/nagios-cli/nagios-cli.json | 15 - pkgs/nagnu/default.nix | 12 - pkgs/nagnu/nagnu.json | 15 - pkgs/pgloader/default.nix | 40 - pkgs/predixy/default.nix | 10 - pkgs/predixy/predixy.json | 15 - pkgs/python-packages/blivet/default.nix | 118 - pkgs/python-packages/blivet/fix_path.patch | 21 - pkgs/python-packages/blivet/poetry.lock | 96 - pkgs/python-packages/blivet/pyproject.toml | 20 - .../buildbot/plugins/default.nix | 6 - pkgs/python-packages/default.nix | 7 - pkgs/python-packages/pymilter.nix | 11 - pkgs/python-packages/wokkel.nix | 11 - pkgs/status_engine/module.json | 15 - pkgs/status_engine/module.nix | 10 - pkgs/status_engine/worker.json | 15 - pkgs/status_engine/worker.nix | 24 - pkgs/status_engine/worker_composer.lock | 1457 --- pkgs/status_engine/worker_php_packages.nix | 217 - pkgs/telegram-history-dump/default.nix | 9 - .../telegram-history-dump.json | 15 - pkgs/telegramircd/telegramircd.json | 15 - pkgs/webapps/adminer/default.nix | 14 - pkgs/webapps/default.nix | 27 - pkgs/webapps/diaspora/default.nix | 69 - pkgs/webapps/diaspora/diaspora.json | 15 - pkgs/webapps/dokuwiki/dokuwiki.json | 15 - pkgs/webapps/etherpad-lite/etherpad-lite.json | 15 - pkgs/webapps/grocy/grocy.json | 15 - pkgs/webapps/mastodon/mastodon.json | 15 - pkgs/webapps/mediagoblin/tempita.json | 15 - pkgs/webapps/nextcloud/apps/apporder.nix | 8 - pkgs/webapps/nextcloud/apps/audioplayer.nix | 8 - pkgs/webapps/nextcloud/apps/bookmarks.nix | 8 - pkgs/webapps/nextcloud/apps/calendar.nix | 8 - pkgs/webapps/nextcloud/apps/carnet.nix | 8 - pkgs/webapps/nextcloud/apps/circles.nix | 8 - pkgs/webapps/nextcloud/apps/contacts.nix | 8 - pkgs/webapps/nextcloud/apps/cookbook.nix | 14 - pkgs/webapps/nextcloud/apps/deck.nix | 8 - pkgs/webapps/nextcloud/apps/extract.nix | 8 - .../webapps/nextcloud/apps/files_markdown.nix | 8 - .../webapps/nextcloud/apps/files_readmemd.nix | 8 - pkgs/webapps/nextcloud/apps/flowupload.nix | 8 - pkgs/webapps/nextcloud/apps/gpxedit.nix | 16 - pkgs/webapps/nextcloud/apps/gpxpod.nix | 16 - pkgs/webapps/nextcloud/apps/impersonate.nix | 9 - pkgs/webapps/nextcloud/apps/keeweb.nix | 17 - pkgs/webapps/nextcloud/apps/maps.nix | 8 - pkgs/webapps/nextcloud/apps/metadata.nix | 8 - pkgs/webapps/nextcloud/apps/music.nix | 9 - pkgs/webapps/nextcloud/apps/notes.nix | 8 - pkgs/webapps/nextcloud/apps/ocsms.nix | 12 - pkgs/webapps/nextcloud/apps/passman.nix | 10 - pkgs/webapps/nextcloud/apps/polls.nix | 8 - pkgs/webapps/nextcloud/apps/social.nix | 9 - pkgs/webapps/nextcloud/apps/spreed.nix | 8 - pkgs/webapps/nextcloud/apps/tasks.nix | 8 - pkgs/webapps/nextcloud/default.nix | 69 - pkgs/webapps/rompr/default.nix | 8 - pkgs/webapps/rompr/rompr.json | 15 - .../taskwarrior-web/taskwarrior-web.json | 15 - .../ttrss/plugins/af_feedmod/af_feedmod.json | 15 - .../ttrss/plugins/af_feedmod/default.nix | 9 - .../ttrss/plugins/auth_ldap/auth-ldap.json | 15 - .../ttrss/plugins/auth_ldap/default.nix | 8 - .../ttrss/plugins/feediron/default.nix | 9 - .../ttrss/plugins/feediron/feediron.json | 15 - .../ttrss/plugins/ff_instagram/default.nix | 8 - .../plugins/ff_instagram/ff_instagram.json | 15 - .../ttrss/plugins/tumblr_gdpr_ua/default.nix | 8 - .../tumblr_gdpr_ua/tumblr_gdpr_ua.json | 15 - pkgs/webapps/yourls/plugins/ldap/default.nix | 8 - pkgs/webapps/yourls/plugins/ldap/ldap.json | 15 - pkgs/webapps/yourls/yourls.json | 15 - scripts/fetch_version | 173 - scripts/make-nur | 2 +- scripts/refresh_flakes | 71 + {nixops/scripts => scripts}/setup | 0 scripts/update_flake | 18 + scripts/with_env | 27 + shell.nix | 18 - .../backup-2.nix => systems/backup-2/base.nix | 59 +- .../databases/mariadb_replication.nix | 26 +- .../databases/openldap_replication.nix | 11 +- .../databases/postgresql_replication.nix | 21 + .../backup-2}/databases/redis_replication.nix | 2 +- .../backup-2}/databases/utils.nix | 2 +- systems/backup-2/flake.lock | 1159 ++ systems/backup-2/flake.nix | 51 + .../backup-2}/mail/relay.nix | 85 +- systems/backup-2/monitoring.nix | 117 + .../dilion.nix => systems/dilion/base.nix | 241 +- systems/dilion/flake.lock | 695 ++ systems/dilion/flake.nix | 43 + systems/dilion/monitoring.nix | 43 + .../dilion/ssh_ldap_regular.sh | 0 systems/dilion/vms.nix | 200 + .../dilion/vms/base_configuration.nix | 12 +- .../dilion/vms/base_image.nix | 18 +- .../dilion/vms/buildbot_configuration.nix | 8 +- systems/eldiron/base.nix | 371 + .../eldiron}/buildbot/default.nix | 130 +- systems/eldiron/coturn.nix | 73 + .../eldiron}/databases/default.nix | 11 +- .../eldiron}/databases/mariadb.nix | 12 +- .../eldiron/databases/openldap/default.nix | 304 + .../eldiron}/databases/postgresql.nix | 56 +- .../eldiron}/databases/redis.nix | 97 +- systems/eldiron/dns.nix | 290 + .../eldiron/duply_backup.nix | 27 + .../eldiron}/ejabberd/default.nix | 69 +- .../eldiron}/ejabberd/ejabberd.yml | 0 systems/eldiron/ejabberd/warn_xmpp_email.py | 112 + systems/eldiron/flake.lock | 2758 +++++ systems/eldiron/flake.nix | 90 + {modules/private => systems/eldiron}/ftp.nix | 95 +- .../private => systems/eldiron}/ftp_sync.sh | 4 +- systems/eldiron/gemini/default.nix | 50 + .../eldiron}/gemini/public/index.gmi | 0 systems/eldiron/gitolite/default.nix | 127 + .../eldiron}/gitolite/gitolite_ldap_groups.sh | 4 +- systems/eldiron/gitolite/ldap_gitolite.sh | 28 + systems/eldiron/irc.nix | 80 + systems/eldiron/mail/default.nix | 44 + .../eldiron}/mail/dovecot.nix | 80 +- .../eldiron}/mail/postfix.nix | 268 +- .../eldiron}/mail/rspamd.nix | 1 + .../eldiron}/mail/scan_reported_mails | 0 .../eldiron}/mail/sieve_bin/imapsieve_copy | 0 .../eldiron}/mail/sieve_scripts/backup.sieve | 0 .../mail/sieve_scripts/report_ham.sieve | 0 .../mail/sieve_scripts/report_spam.sieve | 0 .../eldiron}/mail/sympa.nix | 47 +- systems/eldiron/monitoring.nix | 51 + {modules/private => systems/eldiron}/mpd.nix | 0 systems/eldiron/pub/default.nix | 100 + systems/eldiron/pub/ldap_pub.sh | 38 + .../private => systems/eldiron}/pub/restrict | 11 +- .../eldiron}/pub/tmux.restrict.conf | 0 .../eldiron}/tasks/default.nix | 67 +- .../eldiron}/tasks/www/index.php | 2 +- .../eldiron}/vpn/default.nix | 29 +- .../eldiron}/vpn/tinc/host-down | 0 .../eldiron}/vpn/tinc/host-up | 0 .../eldiron}/vpn/tinc/tinc-down | 0 .../eldiron}/vpn/tinc/tinc-up | 0 .../eldiron}/vpn/tinc/tinc.conf | 0 .../websites/_www/googleb6d69446ff4ca3e5.html | 0 .../eldiron}/websites/_www/index.htm | 0 .../websites/_www/maintenance_immae.html | 0 .../eldiron}/websites/_www/nossl.html | 0 systems/eldiron/websites/assets/default.nix | 98 + .../websites}/assets/static/favicon.png | Bin .../websites}/assets/static/logger.png | Bin .../websites}/assets/static/logger.txt | 0 .../eldiron/websites}/assets/static/logo.jpg | Bin .../eldiron/websites}/assets/static/logo.txt | 0 .../websites}/assets/static/logo_big.jpg | Bin .../websites}/assets/static/logo_big.txt | 0 .../websites}/assets/static/logo_center.jpg | Bin .../websites}/assets/static/logo_center.txt | 0 .../websites}/assets/static/monitoring.png | Bin .../websites}/assets/static/monitoring.txt | 0 .../websites}/assets/static/photos/ct.jpg | Bin .../assets/static/photos/fretlink.jpg | Bin .../websites}/assets/static/photos/raton.jpg | Bin .../eldiron/websites/cloud/add-htaccess.php | 70 + systems/eldiron/websites/cloud/default.nix | 151 + systems/eldiron/websites/cloud/farm.nix | 221 + .../eldiron/websites}/commento/default.nix | 27 +- systems/eldiron/websites/cryptpad/default.nix | 89 + .../eldiron/websites}/cryptpad/farm.nix | 6 + .../eldiron/websites}/dav/davical.nix | 11 +- systems/eldiron/websites/dav/default.nix | 140 + .../eldiron/websites}/dav/www/index.html | 0 systems/eldiron/websites/db/default.nix | 32 + .../eldiron}/websites/default.nix | 187 +- .../eldiron/websites}/diaspora/default.nix | 43 +- .../eldiron/websites}/ether/default.nix | 59 +- .../websites}/games/codenames/codenames.patch | 0 .../websites}/games/codenames/default.nix | 28 +- .../websites}/games/codenames/deps.nix | 0 .../websites}/games/codenames/elm-srcs.nix | 0 .../websites}/games/codenames/frontend.nix | 0 .../websites}/games/codenames/greenapid.nix | 0 .../websites}/games/codenames/greenapid.patch | 0 .../games/codenames/immae-assets.patch | 15 + .../games/codenames/node-packages.nix | 1 + .../websites}/games/codenames/registry.dat | Bin .../websites}/games/codenames/shell.nix | 0 .../games/codenames/wordlists/french.txt | 0 .../games/terraforming-mars/default.nix | 31 +- .../terraforming-mars/immae-assets.patch | 13 + .../games/terraforming-mars/node-packages.nix | 0 .../terraforming-mars/terraforming-mars.nix | 11 +- systems/eldiron/websites/git/cgit_js.html | 16 + systems/eldiron/websites/git/default.nix | 98 + .../eldiron/websites}/git/gitweb.nix | 5 + .../eldiron/websites}/git/mantisbt.nix | 11 +- systems/eldiron/websites/im/default.nix | 118 + .../eldiron/websites}/im/www/converse.html | 10 +- .../eldiron/websites}/im/www/index.html | 0 .../eldiron}/websites/immae/matrix/client | 3 + .../eldiron}/websites/immae/matrix/server | 0 .../eldiron}/websites/immae/production.nix | 94 +- .../eldiron}/websites/immae/release.nix | 5 +- .../sarl}/certificates/2021-certificate.crt | 0 systems/eldiron/websites/kanboard/farm.nix | 183 + systems/eldiron/websites/mail/default.nix | 141 + .../eldiron/websites}/mail/mta-sts.nix | 28 +- .../eldiron/websites}/mail/rainloop.nix | 6 +- .../eldiron/websites}/mail/roundcubemail.nix | 5 +- .../eldiron/websites}/mail/www/index.html | 0 .../eldiron/websites}/mastodon/default.nix | 66 +- .../eldiron/websites}/mgoblin/default.nix | 45 +- .../eldiron}/websites/moomin.txt | 0 .../eldiron/websites/nossl}/index.html | 0 .../eldiron/websites}/peertube/default.nix | 59 +- .../eldiron/websites}/performance/default.nix | 13 +- .../eldiron/websites}/stats/default.nix | 2 +- systems/eldiron/websites/tools/adminer.nix | 83 + .../eldiron/websites}/tools/default.nix | 214 +- .../eldiron/websites}/tools/dmarc_reports.nix | 4 +- .../websites}/tools/dmarc_reports/api.php | 0 .../websites}/tools/dmarc_reports/app.js | 0 .../websites}/tools/dmarc_reports/default.css | 0 .../websites}/tools/dmarc_reports/index.html | 0 systems/eldiron/websites/tools/dokuwiki.nix | 106 + .../eldiron/websites}/tools/grocy.nix | 4 +- .../eldiron/websites}/tools/kanboard.nix | 45 +- systems/eldiron/websites/tools/landing.nix | 38 + .../websites}/tools/landing/ldap_password.php | 60 +- .../websites}/tools/landing/ldap_ssh_keys.php | 125 +- .../eldiron/websites}/tools/landing/myip.php | 0 .../websites}/tools/landing/node-packages.nix | 0 .../websites}/tools/landing/yarn-packages.nix | 0 .../eldiron/websites}/tools/ldap.nix | 24 +- .../eldiron/websites}/tools/phpbb.nix | 18 +- .../eldiron/websites}/tools/rompr.nix | 20 +- .../eldiron/websites}/tools/shaarli.nix | 44 +- .../eldiron/websites}/tools/ttrss.nix | 42 +- .../eldiron/websites}/tools/wallabag.nix | 38 + systems/eldiron/websites/tools/webhooks.nix | 25 + .../eldiron/websites}/tools/ympd.nix | 18 +- .../eldiron/websites}/tools/yourls.nix | 48 +- systems/eldiron/websites/visio/default.nix | 63 + .../eldiron/websites}/vpn/default.nix | 2 +- .../eldiron/websites}/vpn/www/index.html | 0 .../eldiron/websites}/vpn/www/style.css | 0 .../eldiron}/webstats/default.nix | 6 +- .../eldiron}/webstats/goaccess.conf | 0 .../monitoring-1/base.nix | 32 +- systems/monitoring-1/flake.lock | 790 ++ systems/monitoring-1/flake.nix | 45 + systems/monitoring-1/monitoring-master.nix | 87 + systems/monitoring-1/monitoring.nix | 61 + systems/monitoring-1/monitoring/master.nix | 43 + .../monitoring-1/monitoring/phare.nix | 11 +- .../monitoring-1/monitoring/ulminfo-fr.nix | 11 +- .../monitoring-1}/status.nix | 13 +- .../monitoring-1}/status/app.py | 0 .../monitoring-1}/status_engine.nix | 14 +- systems/quatresaisons/flake.lock | 767 ++ systems/quatresaisons/flake.nix | 49 + systems/zoldene/Immae.pub | 322 + systems/zoldene/base.nix | 122 + systems/zoldene/disko.nix | 87 + systems/zoldene/flake.lock | 560 + systems/zoldene/flake.nix | 29 + systems/zoldene/logging.nix | 138 + 945 files changed, 58591 insertions(+), 37078 deletions(-) delete mode 100644 .gitconfig delete mode 100644 .gitmodules create mode 100644 deploy/flake.lock create mode 100644 deploy/flake.nix delete mode 100644 environments/default.nix delete mode 100644 environments/immae-eu.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 flakes/copanier/default.nix create mode 100644 flakes/copanier/fix_reduce.patch create mode 100644 flakes/copanier/flake.lock create mode 100644 flakes/copanier/flake.nix create mode 100644 flakes/copanier/poetry.lock create mode 100644 flakes/copanier/pyproject.toml create mode 100644 flakes/diaspora/default.nix create mode 100644 flakes/diaspora/flake.lock create mode 100644 flakes/diaspora/flake.nix rename {pkgs/webapps => flakes}/diaspora/gemset.nix (100%) rename {pkgs/webapps => flakes}/diaspora/gemset_ldap.nix (100%) rename {pkgs/webapps => flakes}/diaspora/ldap.patch (100%) rename {pkgs/webapps => flakes}/etherpad-lite/default.nix (77%) create mode 100644 flakes/etherpad-lite/etherpad_cleanup.sql create mode 100644 flakes/etherpad-lite/flake.lock create mode 100644 flakes/etherpad-lite/flake.nix rename {pkgs/webapps => flakes}/etherpad-lite/libreoffice_patch.diff (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_adminpads/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_adminpads/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_align/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_align/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_bookmark/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_bookmark/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_clear_formatting/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_clear_formatting/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_colors/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_colors/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_comments_page/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_comments_page/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_cursortrace/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_cursortrace/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_embedmedia/fix.patch (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_embedmedia/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_embedmedia/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_font_family/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_font_family/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_font_size/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_font_size/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_headings2/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_headings2/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_immae_buttons/ep.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_immae_buttons/hooks.js (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_immae_buttons/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_immae_buttons/package.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_immae_buttons/static/js/main.js (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_ldapauth/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_ldapauth/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_line_height/fix.patch (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_line_height/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_line_height/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_markdown/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_markdown/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_mypads/fix_ldap.patch (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_mypads/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_mypads/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_page_view/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_page_view/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_previewimages/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_previewimages/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_private_pad/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_private_pad/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_ruler/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_ruler/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_scrollto/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_scrollto/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_subscript_and_superscript/font.patch (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_timesliderdiff/node-packages.json (100%) rename {pkgs/webapps => flakes}/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix (100%) rename {pkgs/webapps => flakes}/etherpad-lite/node-packages.nix (100%) create mode 100644 flakes/flake.lock create mode 100644 flakes/flake.nix rename {pkgs/webapps => flakes}/grocy/default.nix (83%) create mode 100644 flakes/grocy/flake.lock create mode 100644 flakes/grocy/flake.nix rename {pkgs/webapps => flakes}/grocy/php-packages.nix (100%) rename {pkgs/webapps => flakes}/grocy/yarn-packages.nix (100%) rename {pkgs/webapps => flakes}/grocy/yarn.patch (100%) create mode 100644 flakes/loginctl-linger/flake.nix rename {pkgs/webapps => flakes}/mastodon/default.nix (82%) create mode 100644 flakes/mastodon/flake.lock create mode 100644 flakes/mastodon/flake.nix rename {pkgs/webapps => flakes}/mastodon/gemset.nix (100%) rename {pkgs/webapps => flakes}/mastodon/yarn-packages.nix (100%) rename {pkgs/webapps => flakes}/mediagoblin/bower-packages.nix (100%) rename {pkgs/webapps => flakes}/mediagoblin/default.nix (89%) create mode 100644 flakes/mediagoblin/flake.lock create mode 100644 flakes/mediagoblin/flake.nix rename {pkgs/webapps => flakes}/mediagoblin/ldap_fix.py (100%) rename {pkgs/webapps => flakes}/mediagoblin/plugins/basicsearch/default.nix (100%) create mode 100644 flakes/multi-apache-container/flake.lock create mode 100644 flakes/multi-apache-container/flake.nix create mode 100644 flakes/mypackages/flake.lock create mode 100644 flakes/mypackages/flake.nix create mode 100644 flakes/mypackages/lib/default.nix create mode 100644 flakes/mypackages/lib/flake-parts-lib.nix rename {lib => flakes/mypackages/lib}/node-env.nix (90%) rename {lib => flakes/mypackages/lib}/private/default.nix (97%) rename {overlays => flakes/mypackages/overlays}/bitlbee-discord/default.nix (60%) rename {overlays => flakes/mypackages/overlays}/bitlbee/bitlbee_long_nicks.patch (100%) rename {overlays => flakes/mypackages/overlays}/bitlbee/default.nix (100%) create mode 100644 flakes/mypackages/overlays/databases/mysql/default.nix rename {overlays => flakes/mypackages/overlays}/databases/postgresql/default.nix (100%) create mode 100644 flakes/mypackages/overlays/default.nix rename {overlays => flakes/mypackages/overlays}/gitolite/default.nix (100%) rename {overlays => flakes/mypackages/overlays}/gitolite/invite (100%) rename {overlays => flakes/mypackages/overlays}/gitweb/default.nix (100%) rename {overlays => flakes/mypackages/overlays}/gitweb/theme/git-favicon.png (100%) rename {overlays => flakes/mypackages/overlays}/gitweb/theme/git-logo.png (100%) rename {overlays => flakes/mypackages/overlays}/gitweb/theme/gitweb.css (100%) rename {overlays => flakes/mypackages/overlays}/gitweb/theme/gitweb.js (100%) rename {overlays => flakes/mypackages/overlays}/goaccess/default.nix (100%) create mode 100644 flakes/mypackages/overlays/kanboard/default.nix create mode 100644 flakes/mypackages/overlays/morph/default.nix rename {overlays => flakes/mypackages/overlays}/morph/dry-run.patch (100%) rename {overlays => flakes/mypackages/overlays}/morph/verbose_nix.patch (100%) rename {overlays => flakes/mypackages/overlays}/php-packages/mysqli_patch.patch (100%) rename {overlays => flakes/mypackages/overlays}/postfix/default.nix (100%) rename {overlays => flakes/mypackages/overlays}/taskwarrior/TW-1778_patch.diff (100%) rename {overlays => flakes/mypackages/overlays}/taskwarrior/default.nix (100%) create mode 100644 flakes/mypackages/overlays/ympd/default.nix rename {overlays => flakes/mypackages/overlays}/ympd/ympd-password-env.patch (100%) create mode 100644 flakes/mypackages/pkgs/bash-libs/default.nix rename {pkgs => flakes/mypackages/pkgs}/boinctui/default.nix (63%) rename {pkgs => flakes/mypackages/pkgs}/cnagios/default.nix (60%) rename {pkgs => flakes/mypackages/pkgs}/commento/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/composer-env/default.nix (80%) rename {pkgs => flakes/mypackages/pkgs}/crypto/cardano-cli/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/crypto/cardano/default.nix (68%) rename {pkgs => flakes/mypackages/pkgs}/crypto/iota-cli-app/default.nix (54%) rename {pkgs => flakes/mypackages/pkgs}/crypto/iota-cli-app/node-packages.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/crypto/sia/default.nix (100%) create mode 100644 flakes/mypackages/pkgs/default.nix rename {pkgs => flakes/mypackages/pkgs}/dovecot/plugins/deleted_to_trash/default.nix (58%) rename {pkgs => flakes/mypackages/pkgs}/dovecot/plugins/deleted_to_trash/fix_mbox.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/flrn/default.nix (57%) create mode 100644 flakes/mypackages/pkgs/fluent-bit/default.nix create mode 100644 flakes/mypackages/pkgs/fluentd/Gemfile create mode 100644 flakes/mypackages/pkgs/fluentd/Gemfile.lock create mode 100644 flakes/mypackages/pkgs/fluentd/default.nix create mode 100644 flakes/mypackages/pkgs/fluentd/gemset.nix rename {pkgs => flakes/mypackages/pkgs}/gearmand/default.nix (77%) rename {pkgs => flakes/mypackages/pkgs}/genius/default.nix (82%) create mode 100644 flakes/mypackages/pkgs/ical2html/default.nix rename {pkgs => flakes/mypackages/pkgs}/monitoring-plugins/default.nix (94%) rename {pkgs => flakes/mypackages/pkgs}/mtop/default.nix (90%) create mode 100644 flakes/mypackages/pkgs/mutt-ics/default.nix rename {pkgs => flakes/mypackages/pkgs}/muttprint/0.73-4.diff.gz (100%) rename {pkgs => flakes/mypackages/pkgs}/muttprint/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/muttprint/regex.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/muttprint/two_edge.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/naemon-livestatus/default.nix (56%) rename {pkgs => flakes/mypackages/pkgs}/naemon/default.nix (70%) create mode 100644 flakes/mypackages/pkgs/nagios-cli/default.nix create mode 100644 flakes/mypackages/pkgs/nagnu/default.nix rename {pkgs => flakes/mypackages/pkgs}/nb/default.nix (80%) rename {pkgs => flakes/mypackages/pkgs}/note/default.nix (88%) rename {pkgs => flakes/mypackages/pkgs}/notmuch/notmuch-python/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/notmuch/notmuch-vim/default.nix (100%) create mode 100644 flakes/mypackages/pkgs/perl-ical-parser-html/default.nix create mode 100644 flakes/mypackages/pkgs/pgpid/default.nix create mode 100644 flakes/mypackages/pkgs/predixy/default.nix rename {pkgs => flakes/mypackages/pkgs}/proftpd/default.nix (56%) rename {pkgs => flakes/mypackages/pkgs}/pure-ftpd/default.nix (92%) create mode 100644 flakes/mypackages/pkgs/riotkit-do/default.nix rename {pkgs => flakes/mypackages/pkgs}/rrsync_sudo/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/rrsync_sudo/sudo.patch (100%) create mode 100644 flakes/mypackages/pkgs/shaarli/default.nix rename {overlays => flakes/mypackages/pkgs}/shaarli/shaarli_ldap.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/signaldctl/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/slang_1/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/status_engine/host_perfdata.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/status_engine/interface.nix (63%) rename {pkgs => flakes/mypackages/pkgs}/status_engine/interface_composer.lock (100%) rename {pkgs => flakes/mypackages/pkgs}/status_engine/interface_php_packages.nix (100%) create mode 100644 flakes/mypackages/pkgs/status_engine/module.nix create mode 100644 flakes/mypackages/pkgs/status_engine/worker.nix create mode 100644 flakes/mypackages/pkgs/status_engine/worker_composer.lock create mode 100644 flakes/mypackages/pkgs/status_engine/worker_php_packages.nix create mode 100644 flakes/mypackages/pkgs/telegram-history-dump/default.nix rename {pkgs => flakes/mypackages/pkgs}/telegramircd/default.nix (62%) rename {pkgs => flakes/mypackages/pkgs}/telethon_sync/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/terminal-velocity/default.nix (94%) rename {pkgs => flakes/mypackages/pkgs}/terminal-velocity/fix_build.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/terminal-velocity/python3_support.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/terminal-velocity/sort_found_notes.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/tiv/default.nix (86%) rename {pkgs => flakes/mypackages/pkgs}/tiv/tiv_builder.sh (100%) rename {pkgs => flakes/mypackages/pkgs}/twins/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/umami/build-geo.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/umami/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/unicode/default.nix (100%) create mode 100644 flakes/mypackages/pkgs/upcmd/default.nix create mode 100644 flakes/mypackages/pkgs/webapps/adminer/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/.htaccess (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/footer.html (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/header.html (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/archive.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/audio.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/authors.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/bin.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/blank.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/bmp.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/c.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/calc.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/cd.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/copying.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/cpp.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/css.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/deb.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/default.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/diff.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/doc.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/draw.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/eps.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/exe.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/folder-home.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/folder-open.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/folder-page.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/folder-parent-old.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/folder-parent.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/folder.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/gif.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/gzip.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/h.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/hpp.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/html.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/ico.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/image.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/install.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/java.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/jpg.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/js.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/json.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/log.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/makefile.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/markdown.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/package.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/pdf.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/php.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/playlist.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/png.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/pres.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/ps.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/psd.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/py.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/rar.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/rb.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/readme.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/rpm.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/rss.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/rtf.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/script.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/source.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/sql.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/tar.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/tex.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/text.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/tiff.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/unknown.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/vcal.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/video.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/xml.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/icons/zip.png (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/apache-theme/theme/style.css (97%) rename {pkgs => flakes/mypackages/pkgs}/webapps/awl/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/davical/default.nix (100%) create mode 100644 flakes/mypackages/pkgs/webapps/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/dokuwiki/default.nix (79%) rename {pkgs => flakes/mypackages/pkgs}/webapps/dokuwiki/plugins/farmer.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/dokuwiki/plugins/todo.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/infcloud/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/infcloud/infcloud_config.js (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/bug_report.php.diff (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/bug_report_page.php.diff (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/bugnote_add.php.diff (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/bugnote_add_inc.php.diff (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/default.nix (96%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/plugins/slack/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/mantisbt_2/plugins/source-integration/default.nix (92%) create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix create mode 100644 flakes/mypackages/pkgs/webapps/nextcloud/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/extensions/adduser.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/extensions/autosubscribe.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/extensions/mailinglist.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/extensions/markdown.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/extensions/mchat.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/extensions/monitoranswers.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpbb/langs/fr.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpldapadmin/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpldapadmin/ldap-align-button.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpldapadmin/ldap-fix-password.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/phpldapadmin/ldap-sort-in-templates.patch (100%) create mode 100644 flakes/mypackages/pkgs/webapps/rompr/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/add_all.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/automatic_addressbook/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/carddav/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/contextmenu/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/contextmenu_folder/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/html5_notifier/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/ident_switch/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/message_highlight/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/roundcubemail/plugins/thunderbird_labels/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/spip/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/spip/spip_ldap_patch.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/spip/spip_mes_options.php (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/ttrss/default.nix (93%) create mode 100644 flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/ttrss/plugins/af_feedmod/type_replace.patch (100%) create mode 100644 flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix create mode 100644 flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/ttrss/plugins/feediron/json_reformat.patch (100%) create mode 100644 flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix create mode 100644 flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix rename {pkgs => flakes/mypackages/pkgs}/webapps/wallabag/default.nix (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/wallabag/ldap.patch (100%) rename {pkgs => flakes/mypackages/pkgs}/webapps/yourls/default.nix (63%) create mode 100644 flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix create mode 100644 flakes/naemon/flake.nix rename {modules => flakes}/naemon/naemon.cfg (100%) create mode 100644 flakes/openfoodnetwork/default.nix create mode 100644 flakes/openfoodnetwork/gemset.nix rename {pkgs/python-packages/buildbot/plugins => flakes/private/buildbot}/buildslist/bower.nix (100%) rename {pkgs/python-packages/buildbot/plugins => flakes/private/buildbot}/buildslist/default.nix (88%) rename {pkgs/python-packages/buildbot/plugins => flakes/private/buildbot}/buildslist/yarn-packages.nix (100%) rename {modules => flakes}/private/buildbot/common/build_helpers.py (62%) rename {modules => flakes}/private/buildbot/common/libvirt.py (100%) rename {modules => flakes}/private/buildbot/common/master.cfg (67%) create mode 100644 flakes/private/buildbot/flake.lock create mode 100644 flakes/private/buildbot/flake.nix create mode 100644 flakes/private/buildbot/test_project/__init__.py create mode 100644 flakes/private/chatons/flake.lock create mode 100644 flakes/private/chatons/flake.nix create mode 100644 flakes/private/environment-dummy/flake.nix create mode 100644 flakes/private/environment-dummy/ldap.conf create mode 100644 flakes/private/environment-dummy/vars.yml create mode 100644 flakes/private/environment/flake.nix rename {modules/private/mail => flakes/private/mail-relay}/filter-rewrite-from.py (100%) create mode 100644 flakes/private/mail-relay/flake.lock create mode 100644 flakes/private/mail-relay/flake.nix create mode 100644 flakes/private/milters/flake.lock create mode 100644 flakes/private/milters/flake.nix rename {modules/private/mail => flakes/private/milters}/verify_from.py (100%) create mode 100644 flakes/private/monitoring/flake.lock create mode 100644 flakes/private/monitoring/flake.nix rename {modules => flakes}/private/monitoring/myplugins.nix (88%) rename {modules => flakes}/private/monitoring/nagios-cli.cfg (100%) rename {modules => flakes}/private/monitoring/objects_common.nix (82%) rename {modules => flakes}/private/monitoring/plugins/check_backup_age (100%) rename {modules => flakes}/private/monitoring/plugins/check_bandwidth (95%) rename {modules => flakes}/private/monitoring/plugins/check_command (100%) rename {modules => flakes}/private/monitoring/plugins/check_emails (100%) rename {modules => flakes}/private/monitoring/plugins/check_eriomem (100%) rename {modules => flakes}/private/monitoring/plugins/check_ftp_database (100%) rename {modules => flakes}/private/monitoring/plugins/check_git (100%) rename {modules => flakes}/private/monitoring/plugins/check_imap_connection (100%) rename {modules => flakes}/private/monitoring/plugins/check_last_file_date (100%) rename {modules => flakes}/private/monitoring/plugins/check_mem.sh (56%) rename {modules => flakes}/private/monitoring/plugins/check_mysql_replication (100%) rename {modules => flakes}/private/monitoring/plugins/check_openldap_replication (100%) rename {modules => flakes}/private/monitoring/plugins/check_ovh_sms (100%) rename {modules => flakes}/private/monitoring/plugins/check_postgres_database_count (100%) rename {modules => flakes}/private/monitoring/plugins/check_postgres_replication (100%) rename {modules => flakes}/private/monitoring/plugins/check_redis_replication (100%) rename {modules => flakes}/private/monitoring/plugins/check_zfs_snapshot (100%) create mode 100755 flakes/private/monitoring/plugins/notify_by_apprise rename {modules => flakes}/private/monitoring/plugins/notify_by_email (100%) rename {modules => flakes}/private/monitoring/plugins/notify_by_slack (100%) rename {modules => flakes}/private/monitoring/plugins/send_nrdp.sh (100%) rename {modules => flakes}/private/monitoring/send_mails (100%) rename {modules => flakes}/private/monitoring/to_objects.nix (88%) create mode 100644 flakes/private/openldap/flake.nix create mode 100644 flakes/private/openldap/immae.ldif rename {modules/private/databases => flakes/private}/openldap/immae.schema (98%) create mode 100644 flakes/private/php/flake.lock create mode 100644 flakes/private/php/flake.nix create mode 100644 flakes/private/ssh/flake.lock create mode 100644 flakes/private/ssh/flake.nix rename {modules => flakes}/private/ssh/ldap_authorized_keys.sh (71%) create mode 100644 flakes/private/system/flake.lock create mode 100644 flakes/private/system/flake.nix rename {nixops => flakes/private/system}/public_keys/Immae.pub (100%) rename {pkgs/webapps => flakes}/surfer/default.nix (71%) create mode 100644 flakes/surfer/flake.lock create mode 100644 flakes/surfer/flake.nix rename {pkgs/webapps => flakes}/surfer/node-packages.nix (100%) rename {pkgs/webapps => flakes}/taskwarrior-web/Gemfile.lock (100%) rename {pkgs/webapps => flakes}/taskwarrior-web/default.nix (75%) rename {pkgs/webapps => flakes}/taskwarrior-web/fixes.patch (56%) create mode 100644 flakes/taskwarrior-web/flake.lock create mode 100644 flakes/taskwarrior-web/flake.nix rename {pkgs/webapps => flakes}/taskwarrior-web/gemset.nix (100%) rename {pkgs/webapps => flakes}/taskwarrior-web/thin.patch (100%) delete mode 100644 lib/default.nix delete mode 100644 lib/flake-compat-patched.nix delete mode 100644 lib/flake-compat.nix delete mode 100644 modules/default.nix delete mode 100644 modules/naemon/default.nix delete mode 100644 modules/private/buildbot/projects/caldance/__init__.py delete mode 100644 modules/private/buildbot/projects/cryptoportfolio/__init__.py delete mode 100644 modules/private/buildbot/projects/denise/__init__.py delete mode 100644 modules/private/buildbot/projects/immaeEu/__init__.py delete mode 100755 modules/private/buildbot/projects/immaeEu/scripts/lacells_download delete mode 100644 modules/private/buildbot/projects/test/__init__.py delete mode 100644 modules/private/certificates.nix delete mode 100644 modules/private/databases/openldap/default.nix delete mode 100644 modules/private/databases/openldap/eldiron_schemas.nix delete mode 100644 modules/private/default.nix delete mode 100644 modules/private/dns.nix delete mode 100644 modules/private/environment.nix delete mode 100644 modules/private/gemini/default.nix delete mode 100644 modules/private/gitolite/default.nix delete mode 100644 modules/private/gitolite/ldap_gitolite.sh delete mode 100644 modules/private/irc.nix delete mode 100644 modules/private/loginctl-linger.nix delete mode 100644 modules/private/mail/default.nix delete mode 100644 modules/private/mail/milters.nix delete mode 100644 modules/private/mail/opensmtpd.nix delete mode 100644 modules/private/monitoring/default.nix delete mode 100644 modules/private/monitoring/objects_backup-2.nix delete mode 100644 modules/private/monitoring/objects_dilion.nix delete mode 100644 modules/private/monitoring/objects_eban.nix delete mode 100644 modules/private/monitoring/objects_eldiron.nix delete mode 100644 modules/private/monitoring/objects_master.nix delete mode 100644 modules/private/monitoring/objects_monitoring-1.nix delete mode 100644 modules/private/monitoring/objects_quatresaisons.nix delete mode 100644 modules/private/monitoring/objects_tiboqorl-fr.nix delete mode 100755 modules/private/monitoring/plugins/notify_eban_url delete mode 100644 modules/private/pub/default.nix delete mode 100644 modules/private/pub/ldap_pub.sh delete mode 100644 modules/private/ssh/default.nix delete mode 100644 modules/private/system.nix delete mode 100644 modules/private/system/dilion/vms.nix delete mode 100644 modules/private/system/eldiron.nix delete mode 100644 modules/private/system/quatresaisons.nix delete mode 100644 modules/private/system/quatresaisons/databases.nix delete mode 100644 modules/private/system/quatresaisons/landing.yml delete mode 100644 modules/private/system/quatresaisons/landing_4c.yml delete mode 100644 modules/private/system/quatresaisons/nextcloud.nix delete mode 100644 modules/private/websites/bakeer/cloud.nix delete mode 100644 modules/private/websites/capitaines/discourse_static/discourse.png delete mode 100644 modules/private/websites/capitaines/discourse_static/index.html delete mode 100644 modules/private/websites/capitaines/landing_pages.nix delete mode 100644 modules/private/websites/capitaines/mastodon_static/index.html delete mode 100644 modules/private/websites/capitaines/mastodon_static/oops.png delete mode 100644 modules/private/websites/chloe/app/default.nix delete mode 100644 modules/private/websites/chloe/config/chmod.php delete mode 100644 modules/private/websites/chloe/config/connect.php delete mode 100644 modules/private/websites/chloe/config/ldap.php delete mode 100644 modules/private/websites/chloe/integration.nix delete mode 100644 modules/private/websites/chloe/production.nix delete mode 100644 modules/private/websites/cip-ca/sympa.nix delete mode 100644 modules/private/websites/commons/adminer.nix delete mode 100644 modules/private/websites/connexionswing/app/default.nix delete mode 100644 modules/private/websites/connexionswing/app/php-packages.nix delete mode 100644 modules/private/websites/connexionswing/integration.nix delete mode 100644 modules/private/websites/connexionswing/production.nix delete mode 100644 modules/private/websites/denise/aventuriers.nix delete mode 100644 modules/private/websites/denise/bingo.nix delete mode 100644 modules/private/websites/denise/denisejerome.nix delete mode 100644 modules/private/websites/denise/evariste.nix delete mode 100644 modules/private/websites/denise/oms.nix delete mode 100644 modules/private/websites/denise/production.nix delete mode 100644 modules/private/websites/emilia/atelierfringant.nix delete mode 100644 modules/private/websites/emilia/moodle.nix delete mode 100644 modules/private/websites/emilia/moodle/pause.html delete mode 100644 modules/private/websites/florian/app.nix delete mode 100644 modules/private/websites/florian/app/default.nix delete mode 100644 modules/private/websites/florian/app/php-packages.nix delete mode 100644 modules/private/websites/florian/integration.nix delete mode 100644 modules/private/websites/florian/production.nix delete mode 100644 modules/private/websites/immae/chatons/immae-eu.properties delete mode 100644 modules/private/websites/immae/chatons/service-etherpad.properties delete mode 100644 modules/private/websites/immae/temp.nix delete mode 100644 modules/private/websites/isabelle/aten_app/default.nix delete mode 100644 modules/private/websites/isabelle/aten_app/php-packages.nix delete mode 100644 modules/private/websites/isabelle/aten_app/yarn-packages.nix delete mode 100644 modules/private/websites/isabelle/aten_integration.nix delete mode 100644 modules/private/websites/isabelle/aten_production.nix delete mode 100644 modules/private/websites/isabelle/config/chmod.php delete mode 100644 modules/private/websites/isabelle/config/connect.php delete mode 100644 modules/private/websites/isabelle/config/ldap.php delete mode 100644 modules/private/websites/isabelle/iridologie.nix delete mode 100644 modules/private/websites/isabelle/iridologie_app/default.nix delete mode 100644 modules/private/websites/jerome/naturaloutil.nix delete mode 100644 modules/private/websites/leila/production.nix delete mode 100644 modules/private/websites/ludivine/app/default.nix delete mode 100644 modules/private/websites/ludivine/app/php-packages.nix delete mode 100644 modules/private/websites/ludivine/integration.nix delete mode 100644 modules/private/websites/ludivine/production.nix delete mode 100644 modules/private/websites/nassime/production.nix delete mode 100644 modules/private/websites/nath/villon.nix delete mode 100644 modules/private/websites/papa/maison_bbc.nix delete mode 100644 modules/private/websites/papa/maison_bbc_static/data.json delete mode 100644 modules/private/websites/papa/maison_bbc_static/favicon.ico delete mode 100644 modules/private/websites/papa/maison_bbc_static/index.html delete mode 100644 modules/private/websites/papa/maison_bbc_static/lamaison.png delete mode 100644 modules/private/websites/papa/surveillance.nix delete mode 100644 modules/private/websites/patrick_fodella/altermondia.nix delete mode 100644 modules/private/websites/patrick_fodella/ecolyeu.nix delete mode 100644 modules/private/websites/piedsjaloux/app/default.nix delete mode 100644 modules/private/websites/piedsjaloux/app/php-packages.nix delete mode 100644 modules/private/websites/piedsjaloux/integration.nix delete mode 100644 modules/private/websites/piedsjaloux/production.nix delete mode 100644 modules/private/websites/ressourcerie_banon/cloud.nix delete mode 100644 modules/private/websites/ressourcerie_banon/cryptpad.nix delete mode 100644 modules/private/websites/ressourcerie_banon/production.nix delete mode 100644 modules/private/websites/richie/production.nix delete mode 100644 modules/private/websites/syden/peertube.nix delete mode 100644 modules/private/websites/telio_tortay/production.nix delete mode 100644 modules/private/websites/tools/assets/default.nix delete mode 100644 modules/private/websites/tools/cloud/default.nix delete mode 100644 modules/private/websites/tools/cloud/farm.nix delete mode 100644 modules/private/websites/tools/cryptpad/default.nix delete mode 100644 modules/private/websites/tools/dav/default.nix delete mode 100644 modules/private/websites/tools/db/default.nix delete mode 100644 modules/private/websites/tools/git/default.nix delete mode 100644 modules/private/websites/tools/im/default.nix delete mode 100644 modules/private/websites/tools/mail/default.nix delete mode 100644 modules/private/websites/tools/tools/adminer.nix delete mode 100644 modules/private/websites/tools/tools/csp_reports.nix delete mode 100644 modules/private/websites/tools/tools/dokuwiki.nix delete mode 100644 modules/private/websites/tools/tools/landing.nix delete mode 100644 modules/private/websites/tools/tools/landing/report_csp_violation.php delete mode 100644 modules/private/websites/tools/tools/webhooks.nix delete mode 100644 modules/webapps/diaspora.nix delete mode 100644 modules/webapps/etherpad-lite.nix delete mode 100644 modules/webapps/mastodon.nix delete mode 100644 modules/webapps/mediagoblin.nix delete mode 100644 modules/websites/default.nix delete mode 100644 modules/websites/httpd-service-builder.nix delete mode 100644 modules/websites/httpd-service-builder.patch delete mode 100644 modules/websites/php-application.nix delete mode 100644 modules/zrepl.nix delete mode 100644 nix/README.md delete mode 100644 nix/sources.json delete mode 100644 nix/sources.nix delete mode 100644 nixops/.gitignore delete mode 100644 nixops/.sops.yaml delete mode 100644 nixops/Makefile delete mode 100644 nixops/default.nix delete mode 100755 nixops/scripts/with_env delete mode 160000 nixops/secrets delete mode 100644 overlays/bonfire/default.nix delete mode 100644 overlays/bugwarrior/default.nix delete mode 100644 overlays/bugwarrior/mantisbt.patch delete mode 100644 overlays/bundix/default.nix delete mode 100644 overlays/databases/mysql/default.nix delete mode 100644 overlays/default.nix delete mode 100644 overlays/doing/default.nix delete mode 100644 overlays/dwm/default.nix delete mode 100644 overlays/dwm/dwm_config.h delete mode 100644 overlays/elinks/default.nix delete mode 100644 overlays/elinks/elinks.json delete mode 100644 overlays/kanboard/default.nix delete mode 100644 overlays/khal/default.nix delete mode 100644 overlays/ledger/default.nix delete mode 100644 overlays/lesspipe/default.nix delete mode 100644 overlays/morph/default.nix delete mode 100644 overlays/neomutt/default.nix delete mode 100644 overlays/neomutt/tx.patch delete mode 100644 overlays/nix-direnv/default.nix delete mode 100644 overlays/nixops/default.nix delete mode 100644 overlays/nixops/fix_glibc.patch delete mode 100644 overlays/nixops/hetzner_cloud.patch delete mode 100644 overlays/pass/default.nix delete mode 100644 overlays/pass/pass-fix-pass-init.patch delete mode 100644 overlays/pelican/default.nix delete mode 100644 overlays/php-packages/default.nix delete mode 100644 overlays/procps-ng/default.nix delete mode 100644 overlays/python-packages/buildbot.nix delete mode 100644 overlays/python-packages/default.nix delete mode 100644 overlays/sc-im/default.nix delete mode 100644 overlays/shaarli/default.nix delete mode 100644 overlays/slrn/default.nix delete mode 100644 overlays/vcsh/default.nix delete mode 100644 overlays/weechat/default.nix delete mode 100644 overlays/ympd/default.nix delete mode 100644 overlays/ympd/ympd.json delete mode 100644 pkgs/cnagios/cnagios.json delete mode 100644 pkgs/crypto/cardano/daedalus.json delete mode 100644 pkgs/crypto/iota-cli-app/iota-cli-app.json delete mode 100644 pkgs/default.nix delete mode 100644 pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json delete mode 100644 pkgs/flrn/flrn.json delete mode 100644 pkgs/mutt-ics/default.nix delete mode 100644 pkgs/mutt-ics/mutt-ics.json delete mode 100644 pkgs/naemon-livestatus/naemon-livestatus.json delete mode 100644 pkgs/naemon/naemon.json delete mode 100644 pkgs/nagios-cli/default.nix delete mode 100644 pkgs/nagios-cli/nagios-cli.json delete mode 100644 pkgs/nagnu/default.nix delete mode 100644 pkgs/nagnu/nagnu.json delete mode 100644 pkgs/pgloader/default.nix delete mode 100644 pkgs/predixy/default.nix delete mode 100644 pkgs/predixy/predixy.json delete mode 100644 pkgs/python-packages/blivet/default.nix delete mode 100644 pkgs/python-packages/blivet/fix_path.patch delete mode 100644 pkgs/python-packages/blivet/poetry.lock delete mode 100644 pkgs/python-packages/blivet/pyproject.toml delete mode 100644 pkgs/python-packages/buildbot/plugins/default.nix delete mode 100644 pkgs/python-packages/default.nix delete mode 100644 pkgs/python-packages/pymilter.nix delete mode 100644 pkgs/python-packages/wokkel.nix delete mode 100644 pkgs/status_engine/module.json delete mode 100644 pkgs/status_engine/module.nix delete mode 100644 pkgs/status_engine/worker.json delete mode 100644 pkgs/status_engine/worker.nix delete mode 100644 pkgs/status_engine/worker_composer.lock delete mode 100644 pkgs/status_engine/worker_php_packages.nix delete mode 100644 pkgs/telegram-history-dump/default.nix delete mode 100644 pkgs/telegram-history-dump/telegram-history-dump.json delete mode 100644 pkgs/telegramircd/telegramircd.json delete mode 100644 pkgs/webapps/adminer/default.nix delete mode 100644 pkgs/webapps/default.nix delete mode 100644 pkgs/webapps/diaspora/default.nix delete mode 100644 pkgs/webapps/diaspora/diaspora.json delete mode 100644 pkgs/webapps/dokuwiki/dokuwiki.json delete mode 100644 pkgs/webapps/etherpad-lite/etherpad-lite.json delete mode 100644 pkgs/webapps/grocy/grocy.json delete mode 100644 pkgs/webapps/mastodon/mastodon.json delete mode 100644 pkgs/webapps/mediagoblin/tempita.json delete mode 100644 pkgs/webapps/nextcloud/apps/apporder.nix delete mode 100644 pkgs/webapps/nextcloud/apps/audioplayer.nix delete mode 100644 pkgs/webapps/nextcloud/apps/bookmarks.nix delete mode 100644 pkgs/webapps/nextcloud/apps/calendar.nix delete mode 100644 pkgs/webapps/nextcloud/apps/carnet.nix delete mode 100644 pkgs/webapps/nextcloud/apps/circles.nix delete mode 100644 pkgs/webapps/nextcloud/apps/contacts.nix delete mode 100644 pkgs/webapps/nextcloud/apps/cookbook.nix delete mode 100644 pkgs/webapps/nextcloud/apps/deck.nix delete mode 100644 pkgs/webapps/nextcloud/apps/extract.nix delete mode 100644 pkgs/webapps/nextcloud/apps/files_markdown.nix delete mode 100644 pkgs/webapps/nextcloud/apps/files_readmemd.nix delete mode 100644 pkgs/webapps/nextcloud/apps/flowupload.nix delete mode 100644 pkgs/webapps/nextcloud/apps/gpxedit.nix delete mode 100644 pkgs/webapps/nextcloud/apps/gpxpod.nix delete mode 100644 pkgs/webapps/nextcloud/apps/impersonate.nix delete mode 100644 pkgs/webapps/nextcloud/apps/keeweb.nix delete mode 100644 pkgs/webapps/nextcloud/apps/maps.nix delete mode 100644 pkgs/webapps/nextcloud/apps/metadata.nix delete mode 100644 pkgs/webapps/nextcloud/apps/music.nix delete mode 100644 pkgs/webapps/nextcloud/apps/notes.nix delete mode 100644 pkgs/webapps/nextcloud/apps/ocsms.nix delete mode 100644 pkgs/webapps/nextcloud/apps/passman.nix delete mode 100644 pkgs/webapps/nextcloud/apps/polls.nix delete mode 100644 pkgs/webapps/nextcloud/apps/social.nix delete mode 100644 pkgs/webapps/nextcloud/apps/spreed.nix delete mode 100644 pkgs/webapps/nextcloud/apps/tasks.nix delete mode 100644 pkgs/webapps/nextcloud/default.nix delete mode 100644 pkgs/webapps/rompr/default.nix delete mode 100644 pkgs/webapps/rompr/rompr.json delete mode 100644 pkgs/webapps/taskwarrior-web/taskwarrior-web.json delete mode 100644 pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json delete mode 100644 pkgs/webapps/ttrss/plugins/af_feedmod/default.nix delete mode 100644 pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json delete mode 100644 pkgs/webapps/ttrss/plugins/auth_ldap/default.nix delete mode 100644 pkgs/webapps/ttrss/plugins/feediron/default.nix delete mode 100644 pkgs/webapps/ttrss/plugins/feediron/feediron.json delete mode 100644 pkgs/webapps/ttrss/plugins/ff_instagram/default.nix delete mode 100644 pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json delete mode 100644 pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix delete mode 100644 pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json delete mode 100644 pkgs/webapps/yourls/plugins/ldap/default.nix delete mode 100644 pkgs/webapps/yourls/plugins/ldap/ldap.json delete mode 100644 pkgs/webapps/yourls/yourls.json delete mode 100755 scripts/fetch_version create mode 100755 scripts/refresh_flakes rename {nixops/scripts => scripts}/setup (100%) create mode 100755 scripts/update_flake create mode 100755 scripts/with_env delete mode 100644 shell.nix rename modules/private/system/backup-2.nix => systems/backup-2/base.nix (70%) rename {modules/private => systems/backup-2}/databases/mariadb_replication.nix (89%) rename {modules/private => systems/backup-2}/databases/openldap_replication.nix (96%) rename {modules/private => systems/backup-2}/databases/postgresql_replication.nix (88%) rename {modules/private => systems/backup-2}/databases/redis_replication.nix (98%) rename {modules/private => systems/backup-2}/databases/utils.nix (96%) create mode 100644 systems/backup-2/flake.lock create mode 100644 systems/backup-2/flake.nix rename {modules/private => systems/backup-2}/mail/relay.nix (68%) create mode 100644 systems/backup-2/monitoring.nix rename modules/private/system/dilion.nix => systems/dilion/base.nix (50%) create mode 100644 systems/dilion/flake.lock create mode 100644 systems/dilion/flake.nix create mode 100644 systems/dilion/monitoring.nix rename modules/private/ssh/ldap_regular.sh => systems/dilion/ssh_ldap_regular.sh (100%) create mode 100644 systems/dilion/vms.nix rename {modules/private/system => systems}/dilion/vms/base_configuration.nix (52%) rename {modules/private/system => systems}/dilion/vms/base_image.nix (82%) rename {modules/private/system => systems}/dilion/vms/buildbot_configuration.nix (87%) create mode 100644 systems/eldiron/base.nix rename {modules/private => systems/eldiron}/buildbot/default.nix (70%) create mode 100644 systems/eldiron/coturn.nix rename {modules/private => systems/eldiron}/databases/default.nix (82%) rename {modules/private => systems/eldiron}/databases/mariadb.nix (92%) create mode 100644 systems/eldiron/databases/openldap/default.nix rename {modules/private => systems/eldiron}/databases/postgresql.nix (81%) rename {modules/private => systems/eldiron}/databases/redis.nix (56%) create mode 100644 systems/eldiron/dns.nix rename modules/duply_backup/default.nix => systems/eldiron/duply_backup.nix (83%) rename {modules/private => systems/eldiron}/ejabberd/default.nix (54%) rename {modules/private => systems/eldiron}/ejabberd/ejabberd.yml (100%) create mode 100755 systems/eldiron/ejabberd/warn_xmpp_email.py create mode 100644 systems/eldiron/flake.lock create mode 100644 systems/eldiron/flake.nix rename {modules/private => systems/eldiron}/ftp.nix (68%) rename {modules/private => systems/eldiron}/ftp_sync.sh (91%) create mode 100644 systems/eldiron/gemini/default.nix rename {modules/private => systems/eldiron}/gemini/public/index.gmi (100%) create mode 100644 systems/eldiron/gitolite/default.nix rename {modules/private => systems/eldiron}/gitolite/gitolite_ldap_groups.sh (84%) create mode 100644 systems/eldiron/gitolite/ldap_gitolite.sh create mode 100644 systems/eldiron/irc.nix create mode 100644 systems/eldiron/mail/default.nix rename {modules/private => systems/eldiron}/mail/dovecot.nix (77%) rename {modules/private => systems/eldiron}/mail/postfix.nix (71%) rename {modules/private => systems/eldiron}/mail/rspamd.nix (97%) rename {modules/private => systems/eldiron}/mail/scan_reported_mails (100%) rename {modules/private => systems/eldiron}/mail/sieve_bin/imapsieve_copy (100%) rename {modules/private => systems/eldiron}/mail/sieve_scripts/backup.sieve (100%) rename {modules/private => systems/eldiron}/mail/sieve_scripts/report_ham.sieve (100%) rename {modules/private => systems/eldiron}/mail/sieve_scripts/report_spam.sieve (100%) rename {modules/private => systems/eldiron}/mail/sympa.nix (84%) create mode 100644 systems/eldiron/monitoring.nix rename {modules/private => systems/eldiron}/mpd.nix (100%) create mode 100644 systems/eldiron/pub/default.nix create mode 100644 systems/eldiron/pub/ldap_pub.sh rename {modules/private => systems/eldiron}/pub/restrict (82%) rename {modules/private => systems/eldiron}/pub/tmux.restrict.conf (100%) rename {modules/private => systems/eldiron}/tasks/default.nix (88%) rename {modules/private => systems/eldiron}/tasks/www/index.php (100%) rename {modules/private => systems/eldiron}/vpn/default.nix (61%) rename {modules/private => systems/eldiron}/vpn/tinc/host-down (100%) rename {modules/private => systems/eldiron}/vpn/tinc/host-up (100%) rename {modules/private => systems/eldiron}/vpn/tinc/tinc-down (100%) rename {modules/private => systems/eldiron}/vpn/tinc/tinc-up (100%) rename {modules/private => systems/eldiron}/vpn/tinc/tinc.conf (100%) rename {modules/private => systems/eldiron}/websites/_www/googleb6d69446ff4ca3e5.html (100%) rename {modules/private => systems/eldiron}/websites/_www/index.htm (100%) rename {modules/private => systems/eldiron}/websites/_www/maintenance_immae.html (100%) rename {modules/private => systems/eldiron}/websites/_www/nossl.html (100%) create mode 100644 systems/eldiron/websites/assets/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/favicon.png (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logger.png (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logger.txt (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logo.jpg (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logo.txt (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logo_big.jpg (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logo_big.txt (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logo_center.jpg (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/logo_center.txt (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/monitoring.png (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/monitoring.txt (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/photos/ct.jpg (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/photos/fretlink.jpg (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/assets/static/photos/raton.jpg (100%) create mode 100644 systems/eldiron/websites/cloud/add-htaccess.php create mode 100644 systems/eldiron/websites/cloud/default.nix create mode 100644 systems/eldiron/websites/cloud/farm.nix rename {modules/private/websites/tools => systems/eldiron/websites}/commento/default.nix (63%) create mode 100644 systems/eldiron/websites/cryptpad/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/cryptpad/farm.nix (96%) rename {modules/private/websites/tools => systems/eldiron/websites}/dav/davical.nix (93%) create mode 100644 systems/eldiron/websites/dav/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/dav/www/index.html (100%) create mode 100644 systems/eldiron/websites/db/default.nix rename {modules/private => systems/eldiron}/websites/default.nix (73%) rename {modules/private/websites/tools => systems/eldiron/websites}/diaspora/default.nix (73%) rename {modules/private/websites/tools => systems/eldiron/websites}/ether/default.nix (79%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/codenames.patch (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/default.nix (58%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/deps.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/elm-srcs.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/frontend.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/greenapid.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/greenapid.patch (100%) create mode 100644 systems/eldiron/websites/games/codenames/immae-assets.patch rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/node-packages.nix (99%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/registry.dat (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/shell.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/codenames/wordlists/french.txt (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/terraforming-mars/default.nix (51%) create mode 100644 systems/eldiron/websites/games/terraforming-mars/immae-assets.patch rename {modules/private/websites/tools => systems/eldiron/websites}/games/terraforming-mars/node-packages.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/games/terraforming-mars/terraforming-mars.nix (73%) create mode 100644 systems/eldiron/websites/git/cgit_js.html create mode 100644 systems/eldiron/websites/git/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/git/gitweb.nix (95%) rename {modules/private/websites/tools => systems/eldiron/websites}/git/mantisbt.nix (89%) create mode 100644 systems/eldiron/websites/im/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/im/www/converse.html (90%) rename {modules/private/websites/tools => systems/eldiron/websites}/im/www/index.html (100%) rename {modules/private => systems/eldiron}/websites/immae/matrix/client (65%) rename {modules/private => systems/eldiron}/websites/immae/matrix/server (100%) rename {modules/private => systems/eldiron}/websites/immae/production.nix (56%) rename {modules/private => systems/eldiron}/websites/immae/release.nix (82%) rename {modules/private/websites/immae/eurl => systems/eldiron/websites/immae/sarl}/certificates/2021-certificate.crt (100%) create mode 100644 systems/eldiron/websites/kanboard/farm.nix create mode 100644 systems/eldiron/websites/mail/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/mail/mta-sts.nix (61%) rename {modules/private/websites/tools => systems/eldiron/websites}/mail/rainloop.nix (87%) rename {modules/private/websites/tools => systems/eldiron/websites}/mail/roundcubemail.nix (94%) rename {modules/private/websites/tools => systems/eldiron/websites}/mail/www/index.html (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/mastodon/default.nix (60%) rename {modules/private/websites/tools => systems/eldiron/websites}/mgoblin/default.nix (70%) rename {modules/private => systems/eldiron}/websites/moomin.txt (100%) rename {modules/websites/nosslVhost => systems/eldiron/websites/nossl}/index.html (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/peertube/default.nix (57%) rename {modules/private/websites/tools => systems/eldiron/websites}/performance/default.nix (79%) rename {modules/private/websites/tools => systems/eldiron/websites}/stats/default.nix (95%) create mode 100644 systems/eldiron/websites/tools/adminer.nix rename {modules/private/websites/tools => systems/eldiron/websites}/tools/default.nix (62%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/dmarc_reports.nix (86%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/dmarc_reports/api.php (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/dmarc_reports/app.js (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/dmarc_reports/default.css (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/dmarc_reports/index.html (100%) create mode 100644 systems/eldiron/websites/tools/dokuwiki.nix rename {modules/private/websites/tools => systems/eldiron/websites}/tools/grocy.nix (86%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/kanboard.nix (56%) create mode 100644 systems/eldiron/websites/tools/landing.nix rename {modules/private/websites/tools => systems/eldiron/websites}/tools/landing/ldap_password.php (80%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/landing/ldap_ssh_keys.php (75%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/landing/myip.php (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/landing/node-packages.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/landing/yarn-packages.nix (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/ldap.nix (74%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/phpbb.nix (71%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/rompr.nix (75%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/shaarli.nix (57%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/ttrss.nix (72%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/wallabag.nix (76%) create mode 100644 systems/eldiron/websites/tools/webhooks.nix rename {modules/private/websites/tools => systems/eldiron/websites}/tools/ympd.nix (70%) rename {modules/private/websites/tools => systems/eldiron/websites}/tools/yourls.nix (64%) create mode 100644 systems/eldiron/websites/visio/default.nix rename {modules/private/websites/tools => systems/eldiron/websites}/vpn/default.nix (78%) rename {modules/private/websites/tools => systems/eldiron/websites}/vpn/www/index.html (100%) rename {modules/private/websites/tools => systems/eldiron/websites}/vpn/www/style.css (100%) rename {modules/webapps => systems/eldiron}/webstats/default.nix (90%) rename {modules/webapps => systems/eldiron}/webstats/goaccess.conf (100%) rename modules/private/system/monitoring-1.nix => systems/monitoring-1/base.nix (75%) create mode 100644 systems/monitoring-1/flake.lock create mode 100644 systems/monitoring-1/flake.nix create mode 100644 systems/monitoring-1/monitoring-master.nix create mode 100644 systems/monitoring-1/monitoring.nix create mode 100644 systems/monitoring-1/monitoring/master.nix rename modules/private/monitoring/objects_phare.nix => systems/monitoring-1/monitoring/phare.nix (53%) rename modules/private/monitoring/objects_ulminfo-fr.nix => systems/monitoring-1/monitoring/ulminfo-fr.nix (50%) rename {modules/private/monitoring => systems/monitoring-1}/status.nix (84%) rename {modules/private/monitoring => systems/monitoring-1}/status/app.py (100%) rename {modules/private/monitoring => systems/monitoring-1}/status_engine.nix (89%) create mode 100644 systems/quatresaisons/flake.lock create mode 100644 systems/quatresaisons/flake.nix create mode 100644 systems/zoldene/Immae.pub create mode 100644 systems/zoldene/base.nix create mode 100644 systems/zoldene/disko.nix create mode 100644 systems/zoldene/flake.lock create mode 100644 systems/zoldene/flake.nix create mode 100644 systems/zoldene/logging.nix diff --git a/.envrc b/.envrc index 438d807..4718a18 100644 --- a/.envrc +++ b/.envrc @@ -1,13 +1,25 @@ # vim: filetype=bash -export NIX_PATH=nixpkgs=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nixops".url') -NIX_PATH=$NIX_PATH:nixpkgs-nix=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nix".url') +export DIRENV_FLAKE_DONT_ADD_SOURCES_ROOT=y +nix_direnv_watch_file() { + nix_watches+=("$@") + filtered=() + for i in "$@"; do + case "$i" in + */flake.lock) + ;; + *) + filtered+=("$i") + esac + done + watch_file "${filtered[@]}" +} -export NIXOPS_ENV_LOADED=1 +if nix eval './deploy#sops-vars-file' 2>/dev/null >/dev/null; then + export DEVSHELL_NO_MOTD=1 + cd deploy + use flake . --no-warn-dirty + cd .. + unset DEVSHELL_NO_MOTD +fi -PATH_add $(expand_path scripts) -PATH_add $(expand_path nixops/scripts) - -use nix -watch_file $(expand_path nix/sources.json) - -clean_nix_shell +use flake . --no-warn-dirty diff --git a/.gitconfig b/.gitconfig deleted file mode 100644 index 7aa8870..0000000 --- a/.gitconfig +++ /dev/null @@ -1,9 +0,0 @@ -; git config --local include.path '../.gitconfig' -[push] - recurseSubmodules = on-demand -; Find a way to include this file automatically? -; git -C nixops/secrets config --local diff.gpgdiffer.textconv "gpg --quiet -d" -[diff "gpgdiffer"] - textconv = "gpg --quiet -d" -[diff "sopsdiffer"] - textconv = "sops -d" diff --git a/.gitignore b/.gitignore index ff9c9cf..0c17e7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /result* /versions_log .direnv/ -/nixops/.gcroots +/deploy/.gcroots +/deploy/history diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c2d9b18..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "nixops/secrets"] - path = nixops/secrets - url = gitolite@git.immae.eu:perso/Immae/Config/Nix/Nixops/Secrets diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 6c68680..fcd0b15 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -1,7 +1,7 @@ Get Started =========== -- You may run ./nixops/scripts/setup to setup the directory and variables +- You may run ./scripts/setup to setup the directory and variables The script won’t do anything without asking first, you may stop at any step. @@ -43,8 +43,7 @@ The directory is divided in several sections: of hosts. They tend to be less used now. But sometimes they need to have an identity (mostly to be able to send e-mails) The subsection "roles" (ou=roles,ou=hosts,dc=immae,dc=eu) was from a Puppet age and - is deprecated. Only one host remains handled by Puppet (caldance) and - should be replaced with an internal VM. + is deprecated. - The "groups" section (ou=groups,dc=immae,dc=eu) contains the generic groups of users not associated to a service. - The "group_users" and "users" sections contain the users (usually with @@ -58,7 +57,7 @@ How does nixpkgs resolve To build nixops machines ------------------------ -The `NIX_PATH` environment variable is built in nixops/Makefile and +The `NIX_PATH` environment variable is built in deploy/Makefile and contains three paths: nixpkgs, nixpkgsNext, nixpkgsPrevious. Only the first one is actually used most of the time. Derivations that need pinned nixpkgs should declare it in `nix/sources.json` (it’s the case @@ -236,13 +235,18 @@ Nextcloud --------- - Do not skip major versions! +- Check php supported version (lib/versioncheck.php file) +- Update all the apps: check on https://apps.nextcloud.com/ and build with + ``` + nix-build -E "with import {};webapps.nextcloud.withApps (a: builtins.attrValues webapps.nextcloud.allApps)" + ``` - Put nextcloud in maintenance mode : ``` nextcloud-occ maintenance:mode --on ``` - Do a backup : ``` - sudo -u postgres pg_dump -n owncloud webapps > nextcloud.sql + sudo -u postgres pg_dump owncloud > nextcloud.sql ``` - Upgrade - Run the upgrade task : @@ -256,6 +260,22 @@ Nextcloud - Issues : https://docs.nextcloud.com/server/16/admin_manual/maintenance/manual_upgrade.html +- Farm : + Once a new instance thename is created, create the database: + ``` + CREATE USER nextcloud_thename WITH PASSWORD 'somepassword'; + CREATE DATABASE nextcloud_thename WITH OWNER nextcloud_thename; + ``` + Then add this to the config.php: + ``` + 'appstoreenabled' => false, + ``` + Then run: + ``` + nextcloud-occ-thename maintenance:install --database=pgsql --database-name=nextcloud_thename --database-host=/run/postgresql --database-user=nextcloud_thename --admin-user=immae --data-dir=/var/lib/nextcloud_farm/thename/data + ``` + Finally, edit the config.php to add the correct trusted domain + Flakes ------ diff --git a/Makefile b/Makefile index 50fa09f..6282df2 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,128 @@ -subrecipes = setup nix-info edit_env edit_vars -subrecipes += ssh-eldiron ssh-backup-2 ssh-monitoring-1 ssh-4c -subrecipes += debug build dry-run upload deploy next-boot deploy-reboot -subrecipes += list-generations delete-generations cleanup -${subrecipes}: - @$(MAKE) --no-print-directory -C nixops/ $@ -.PHONY: ${subrecipes} - nur: ./scripts/make-nur curl -o /dev/null -XPOST "https://nur-update.herokuapp.com/update?repo=immae" shellcheck: - shellcheck scripts/* nixops/scripts/* modules/private/gitolite/gitolite_ldap_groups.sh modules/private/ssh/ldap_authorized_keys.sh modules/private/pub/restrict + shellcheck scripts/* deploy/scripts/* modules/private/gitolite/gitolite_ldap_groups.sh modules/private/ssh/ldap_authorized_keys.sh modules/private/pub/restrict .PHONY: nur shellcheck + +###### Initial setup +setup: + ./scripts/setup +.PHONY: setup + +###### Morph regular tasks +PROFILE=./deploy/history +TARGET ?= +COMMON_COLEMNA_ARGS = -f ./deploy/flake.nix -v +#Only enabled in colemna 0.4: --nix-option allow-unsafe-native-code-during-evaluation true --nix-option allow-import-from-derivation true --nix-option substituters https://cache.nixos.org/ +MORPH_ARGS ?= +ifdef TARGET + # multiple targets: --on="{machine1,machine2}" (works with * glob too) + override MORPH_ARGS +=--on=$(TARGET) +endif +SSH_ARGS ?= + +nodes= dilion eldiron backup-2 monitoring-1 quatresaisons zoldene + +refresh_flakes: + @if [ -n "$(TARGET)" ]; then \ + ./scripts/refresh_flakes --no-new-inputs ./systems/$(TARGET)/flake.nix; \ + nix --no-warn-dirty flake lock --update-input n-$(TARGET) ./flakes; \ + nix --no-warn-dirty flake lock --update-input main-flake ./deploy; \ + else \ + ./scripts/refresh_flakes --no-new-inputs; \ + fi + (cd deploy ; nix flake lock --update-input secrets-local || true) + +.PHONY: refresh_flakes + +.PHONY: build $(addprefix build-,$(nodes)) +build-dilion build-eldiron build-backup-2 build-monitoring-1 build-quatresaisons build-zoldene: + $(MAKE) build TARGET=$(@:build-%=%) +build: refresh_flakes + colmena build $(COMMON_COLEMNA_ARGS) $(MORPH_ARGS) + +.PHONY: deploy $(addprefix deploy-,$(nodes)) +deploy-dilion deploy-eldiron deploy-backup-2 deploy-monitoring-1 deploy-quatresaisons deploy-zoldene: + $(MAKE) deploy TARGET=$(@:deploy-%=%) +deploy: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) switch --keep-result $(MORPH_ARGS) + $(MAKE) keep-roots + +.PHONY: ssh $(addprefix ssh-,$(nodes)) +ssh-4c: ssh-quatresaisons +ssh-dilion ssh-eldiron ssh-backup-2 ssh-monitoring-1 ssh-quatresaisons ssh-zoldene: + $(MAKE) ssh TARGET=$(@:ssh-%=%) +ssh: + ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@$(TARGET) $(SSH_ARGS)' + +.PHONY: ssh-decrypt $(addsuffix -decrypt,$(addprefix ssh-,$(nodes))) +ssh-zoldene-decrypt: + $(MAKE) ssh-decrypt TARGET=$(@:ssh-%-decrypt=%) +ssh-decrypt: + ./scripts/with_env bash -c 'ssh -p 2222 -i $$SSH_IDENTITY_FILE root@$(TARGET) $(SSH_ARGS)' + +.PHONY: debug $(addprefix debug-,$(nodes)) +debug-dilion debug-eldiron debug-backup-2 debug-monitoring-1 debug-quatresaisons debug-zoldene: + $(MAKE) debug TARGET=$(@:debug-%=%) +debug: refresh_flakes + colmena build $(COMMON_COLEMNA_ARGS) --show-trace $(MORPH_ARGS) + +.PHONY: upload $(addprefix upload-,$(nodes)) +upload-dilion upload-eldiron upload-backup-2 upload-monitoring-1 upload-quatresaisons upload-zoldene: + $(MAKE) upload TARGET=$(@:upload-%=%) +upload: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) push $(MORPH_ARGS) + +.PHONY: test-deploy $(addprefix test-deploy-,$(nodes)) +test-deploy-dilion test-deploy-eldiron test-deploy-backup-2 test-deploy-monitoring-1 test-deploy-quatresaisons test-deploy-zoldene: + $(MAKE) test-deploy TARGET=$(@:test-deploy-%=%) +test-deploy: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) test $(MORPH_ARGS) + +.PHONY: next-boot $(addprefix next-boot-,$(nodes)) +next-boot-dilion next-boot-eldiron next-boot-backup-2 next-boot-monitoring-1 next-boot-quatresaisons next-boot-zoldene: + $(MAKE) next-boot TARGET=$(@:next-boot-%=%) +next-boot: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) boot $(MORPH_ARGS) + +.PHONY: deploy-reboot $(addprefix deploy-reboot-,$(nodes)) +deploy-reboot-dilion deploy-reboot-eldiron deploy-reboot-backup-2 deploy-reboot-monitoring-1 deploy-reboot-quatresaisons deploy-reboot-zoldene: + $(MAKE) deploy-reboot TARGET=$(@:deploy-reboot-%=%) +deploy-reboot: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) boot --reboot $(MORPH_ARGS) + # Run it a second time because first time uploads the secrets + # before rebooting + $(MAKE) deploy + +keep-roots: + mkdir -p $(PROFILE) + for i in deploy/.gcroots/node-*; do nix-env -p $(PROFILE)/$$(basename $$i | sed -e "s/node-//") --set "$$i"; done + +systems := $(shell find $(PROFILE) -type l -not -name "*link" -printf "%f ") +###### Cleanup generations and garbage collection +GEN ?= "+3" + +list-generations: + @$(foreach system, $(systems), echo $(system);\ + nix-env -p $(PROFILE)/$(system) --list-generations;\ + $(MAKE) ssh-$(system) SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations";\ + ) +.PHONY: list-generations + +delete-generations: + $(MAKE) keep-roots + @$(foreach system, $(systems), echo $(system); \ + nix-env -p $(PROFILE)/$(system) --delete-generations $(GEN);\ + $(MAKE) ssh-$(system) SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)";\ + ) +.PHONY: delete-generations + +cleanup: delete-generations + nix-store --gc + @$(foreach system, $(systems), echo $(system); \ + $(MAKE) ssh-$(system) SSH_ARGS="nix-store --gc";\ + ) +.PHONY: cleanup diff --git a/default.nix b/default.nix index 1f43cdd..d0bc618 100644 --- a/default.nix +++ b/default.nix @@ -1,11 +1,9 @@ -{ sources ? import ./nix/sources.nix, pkgs ? import sources.nixpkgs {} }: +{}: let - mypkgs = pkgs.callPackage ./pkgs {}; + mypackages = builtins.getFlake "path:${builtins.toString ./flakes/mypackages}"; in { - lib = pkgs.callPackage ./lib {}; - modules = import ./modules; - overlays = import ./overlays; - pkgs = mypkgs; - environments = pkgs.callPackage ./environments {}; -} // mypkgs + lib = mypackages.mylibs; + overlays = mypackages.overlays; + pkgs = mypackages.packages."${builtins.currentSystem}"; +} // mypackages.packages."${builtins.currentSystem}" diff --git a/deploy/flake.lock b/deploy/flake.lock new file mode 100644 index 0000000..afa2ec5 --- /dev/null +++ b/deploy/flake.lock @@ -0,0 +1,9816 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_2": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_3": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_34" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_4": { + "inputs": { + "flake-utils": "flake-utils_34", + "nixpkgs": "nixpkgs_57" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_5": { + "inputs": { + "flake-utils": "flake-utils_37", + "nixpkgs": "nixpkgs_65" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_6": { + "inputs": { + "flake-utils": "flake-utils_39", + "nixpkgs": "nixpkgs_72" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_7": { + "inputs": { + "flake-utils": "flake-utils_61", + "nixpkgs": "nixpkgs_101" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "buildslist_2": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "chatons_2": { + "inputs": { + "environment": "environment_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_4", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_2": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_13", + "stable": "stable_2" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_20", + "stable": "stable_3" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_32", + "nixpkgs": "nixpkgs_51", + "stable": "stable_4" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_5": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_35", + "nixpkgs": "nixpkgs_59", + "stable": "stable_5" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_6": { + "inputs": { + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_38", + "nixpkgs": "nixpkgs_67", + "stable": "stable_6" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_7": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_45", + "nixpkgs": "nixpkgs_81", + "stable": "stable_7" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "copanier_2": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1688380630, + "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=", + "owner": "numtide", + "repo": "devshell", + "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "diaspora_2": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_2": { + "inputs": { + "nixpkgs": "nixpkgs_14" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_3": { + "inputs": { + "nixpkgs": "nixpkgs_21" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_4": { + "inputs": { + "nixpkgs": "nixpkgs_52" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_5": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_6": { + "inputs": { + "nixpkgs": "nixpkgs_68" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_7": { + "inputs": { + "nixpkgs": "nixpkgs_82" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "main-flake", + "n-eldiron", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "etherpad-lite_2": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_13" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_15" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_12": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_16" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_13": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_18" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_14": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_19" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_15": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_20" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_16": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_21" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_17": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_22" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_18": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_23" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_19": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_24" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_20": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_25" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_21": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_27" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_22": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_28" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_9" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_10" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_11" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_12" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_33": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_40": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_41": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_42": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_43": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_44": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_45": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_46": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_47": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_48": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_49": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_50": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_51": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_52": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_53": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_54": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_55": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_56": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_57": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_58": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_59": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_60": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_61": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_62": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_63": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "grocy_2": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mail-relay_2": { + "inputs": { + "environment": "environment_20", + "secrets": "secrets_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "main-flake": { + "inputs": { + "n-backup-2": "n-backup-2", + "n-dilion": "n-dilion", + "n-eldiron": "n-eldiron", + "n-monitoring-1": "n-monitoring-1", + "n-quatresaisons": "n-quatresaisons", + "n-zoldene": "n-zoldene", + "s-backports": "s-backports", + "s-copanier": "s-copanier", + "s-diaspora": "s-diaspora", + "s-etherpad-lite": "s-etherpad-lite", + "s-fiche": "s-fiche", + "s-files-watcher": "s-files-watcher", + "s-grocy": "s-grocy", + "s-lib": "s-lib", + "s-loginctl-linger": "s-loginctl-linger", + "s-mastodon": "s-mastodon", + "s-mediagoblin": "s-mediagoblin", + "s-multi-apache-container": "s-multi-apache-container", + "s-mypackages": "s-mypackages", + "s-myuids": "s-myuids", + "s-naemon": "s-naemon", + "s-openarc": "s-openarc", + "s-opendmarc": "s-opendmarc", + "s-paste": "s-paste", + "s-peertube": "s-peertube", + "s-private-buildbot": "s-private-buildbot", + "s-private-chatons": "s-private-chatons", + "s-private-environment": "s-private-environment", + "s-private-mail-relay": "s-private-mail-relay", + "s-private-milters": "s-private-milters", + "s-private-monitoring": "s-private-monitoring", + "s-private-openarc": "s-private-openarc", + "s-private-opendmarc": "s-private-opendmarc", + "s-private-openldap": "s-private-openldap", + "s-private-paste": "s-private-paste", + "s-private-peertube": "s-private-peertube", + "s-private-php": "s-private-php", + "s-private-ssh": "s-private-ssh", + "s-private-system": "s-private-system", + "s-rsync_backup": "s-rsync_backup", + "s-secrets": "s-secrets", + "s-surfer": "s-surfer", + "s-taskwarrior-web": "s-taskwarrior-web", + "secrets": [ + "secrets" + ] + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=", + "path": "../flakes", + "type": "path" + }, + "original": { + "path": "../flakes", + "type": "path" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mastodon_2": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "mediagoblin_2": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_2": { + "inputs": { + "environment": "environment_9", + "naemon": "naemon_2", + "nixpkgs-lib": "nixpkgs-lib_4", + "secrets": "secrets_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_3": { + "inputs": { + "environment": "environment_21", + "naemon": "naemon_4", + "nixpkgs-lib": "nixpkgs-lib_14", + "secrets": "secrets_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_4": { + "inputs": { + "environment": "environment_24", + "naemon": "naemon_5", + "nixpkgs-lib": "nixpkgs-lib_17", + "secrets": "secrets_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_11", + "myuids": "myuids_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_2": { + "inputs": { + "colmena": "colmena_2", + "disko": "disko_2", + "flake-parts": "flake-parts_3", + "nixos-anywhere": "nixos-anywhere_2", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_3": { + "inputs": { + "colmena": "colmena_3", + "disko": "disko_3", + "flake-parts": "flake-parts_5", + "nixos-anywhere": "nixos-anywhere_3", + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_4": { + "inputs": { + "colmena": "colmena_4", + "disko": "disko_4", + "flake-parts": "flake-parts_11", + "nixos-anywhere": "nixos-anywhere_4", + "nixpkgs": "nixpkgs_54" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_5": { + "inputs": { + "colmena": "colmena_5", + "disko": "disko_5", + "flake-parts": "flake-parts_13", + "nixos-anywhere": "nixos-anywhere_5", + "nixpkgs": "nixpkgs_62" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_6": { + "inputs": { + "colmena": "colmena_6", + "disko": "disko_6", + "flake-parts": "flake-parts_15", + "nixos-anywhere": "nixos-anywhere_6", + "nixpkgs": "nixpkgs_70" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_12", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_10": { + "inputs": { + "flake-parts": "flake-parts_17", + "nixpkgs": "nixpkgs_77", + "webapps-ttrss": "webapps-ttrss_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_11": { + "inputs": { + "flake-parts": "flake-parts_18", + "nixpkgs": "nixpkgs_79", + "webapps-ttrss": "webapps-ttrss_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_12": { + "inputs": { + "flake-parts": "flake-parts_21", + "nixpkgs": "nixpkgs_102", + "webapps-ttrss": "webapps-ttrss_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_13": { + "inputs": { + "flake-parts": "flake-parts_22", + "nixpkgs": "nixpkgs_103", + "webapps-ttrss": "webapps-ttrss_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_4", + "nixpkgs": "nixpkgs_19", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_6", + "nixpkgs": "nixpkgs_35", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_7", + "nixpkgs": "nixpkgs_38", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_5": { + "inputs": { + "flake-parts": "flake-parts_8", + "nixpkgs": "nixpkgs_40", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_6": { + "inputs": { + "flake-parts": "flake-parts_10", + "nixpkgs": "nixpkgs_48", + "webapps-ttrss": "webapps-ttrss_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_7": { + "inputs": { + "flake-parts": "flake-parts_12", + "nixpkgs": "nixpkgs_58", + "webapps-ttrss": "webapps-ttrss_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_8": { + "inputs": { + "flake-parts": "flake-parts_14", + "nixpkgs": "nixpkgs_66", + "webapps-ttrss": "webapps-ttrss_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_9": { + "inputs": { + "flake-parts": "flake-parts_16", + "nixpkgs": "nixpkgs_73", + "webapps-ttrss": "webapps-ttrss_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_34": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_35": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_36": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_37": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_38": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_39": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_40": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_41": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_42": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "n-backup-2": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=", + "path": "../systems/backup-2", + "type": "path" + }, + "original": { + "path": "../systems/backup-2", + "type": "path" + } + }, + "n-dilion": { + "inputs": { + "environment": "environment_8", + "files-watcher": "files-watcher_4", + "loginctl-linger": "loginctl-linger_2", + "monitoring": "monitoring_2", + "my-lib": "my-lib_2", + "myuids": "myuids_7", + "nixpkgs": "nixpkgs_17", + "secrets": "secrets_8", + "ssh": "ssh", + "system": "system_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=", + "path": "../systems/dilion", + "type": "path" + }, + "original": { + "path": "../systems/dilion", + "type": "path" + } + }, + "n-eldiron": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib_3", + "nixpkgs": "nixpkgs_24", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=", + "path": "../systems/eldiron", + "type": "path" + }, + "original": { + "path": "../systems/eldiron", + "type": "path" + } + }, + "n-monitoring-1": { + "inputs": { + "chatons": "chatons_2", + "environment": "environment_19", + "files-watcher": "files-watcher_9", + "loginctl-linger": "loginctl-linger_3", + "mail-relay": "mail-relay_2", + "monitoring": "monitoring_3", + "my-lib": "my-lib_4", + "myuids": "myuids_23", + "nixpkgs": "nixpkgs_55", + "php": "php", + "secrets": "secrets_17", + "system": "system_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=", + "path": "../systems/monitoring-1", + "type": "path" + }, + "original": { + "path": "../systems/monitoring-1", + "type": "path" + } + }, + "n-quatresaisons": { + "inputs": { + "environment": "environment_23", + "files-watcher": "files-watcher_10", + "landing-page": "landing-page", + "monitoring": "monitoring_4", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib_5", + "myuids": "myuids_26", + "nixpkgs": "nixpkgs_63", + "php": "php_2", + "secrets": "secrets_19", + "system": "system_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=", + "path": "../systems/quatresaisons", + "type": "path" + }, + "original": { + "path": "../systems/quatresaisons", + "type": "path" + } + }, + "n-zoldene": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib_6", + "nixpkgs": "nixpkgs_71", + "private-environment": "private-environment_2", + "private-system": "private-system_2", + "public-secrets": "public-secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=", + "path": "../systems/zoldene", + "type": "path" + }, + "original": { + "path": "../systems/zoldene", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_2": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_3": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_4": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_5": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_6": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_7": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "main-flake", + "n-backup-2", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-backup-2", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_6", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_2": { + "inputs": { + "disko": [ + "main-flake", + "n-dilion", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-dilion", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_2", + "nixos-images": "nixos-images_2", + "nixpkgs": "nixpkgs_15", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_3": { + "inputs": { + "disko": [ + "main-flake", + "n-eldiron", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-eldiron", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_3", + "nixos-images": "nixos-images_3", + "nixpkgs": "nixpkgs_22", + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_4": { + "inputs": { + "disko": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_4", + "nixos-images": "nixos-images_4", + "nixpkgs": "nixpkgs_53", + "treefmt-nix": "treefmt-nix_4" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_5": { + "inputs": { + "disko": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_5", + "nixos-images": "nixos-images_5", + "nixpkgs": "nixpkgs_61", + "treefmt-nix": "treefmt-nix_5" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_6": { + "inputs": { + "disko": [ + "main-flake", + "n-zoldene", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-zoldene", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_6", + "nixos-images": "nixos-images_6", + "nixpkgs": "nixpkgs_69", + "treefmt-nix": "treefmt-nix_6" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_7": { + "inputs": { + "disko": [ + "main-flake", + "s-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "s-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_7", + "nixos-images": "nixos-images_7", + "nixpkgs": "nixpkgs_83", + "treefmt-nix": "treefmt-nix_7" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_2": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_3": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_4": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_5": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_6": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_7": { + "inputs": { + "nixos-2305": [ + "main-flake", + "s-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1677383253, + "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9952d6bc395f5841262b006fbace8dd7e143b634", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_2": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_3": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_10": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_11": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_12": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_13": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_14": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_15": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_16": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_17": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_18": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_19": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_20": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_21": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_22": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_23": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_24": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_25": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_26": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_27": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_28": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_8": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_9": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_100": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_101": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_102": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_103": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_104": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_105": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_106": { + "locked": { + "dir": "lib", + "lastModified": 1691472822, + "narHash": "sha256-XVfYZ2oB3lNPVq6sHCY9WkdQ8lHoIDzzbpg8bB6oBxA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "41c7605718399dcfa53dd7083793b6ae3bc969ff", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_107": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_23": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_24": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_25": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_33": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_36": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_37": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_38": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_39": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_41": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_42": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_43": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_48": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_49": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_55": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_56": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_64": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_72": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_73": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_74": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_75": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_76": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_77": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_78": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_79": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_80": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_81": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_82": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_83": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_84": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_85": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_86": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_87": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_88": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_89": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_90": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_91": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_92": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_93": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_94": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_95": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_96": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_97": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_98": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_99": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs_2", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_10": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_11": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_12": { + "inputs": { + "flake-utils": "flake-utils_53", + "myuids": "myuids_36", + "nixpkgs": "nixpkgs_93", + "openarc": "openarc_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_13": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_14": { + "inputs": { + "flake-utils": "flake-utils_55", + "myuids": "myuids_38", + "nixpkgs": "nixpkgs_95", + "openarc": "openarc_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_15": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_9", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_6": { + "inputs": { + "flake-utils": "flake-utils_12", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_26", + "openarc": "openarc_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_7": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_8": { + "inputs": { + "flake-utils": "flake-utils_14", + "myuids": "myuids_11", + "nixpkgs": "nixpkgs_28", + "openarc": "openarc_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_9": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_5": { + "inputs": { + "flake-utils": "flake-utils_15", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_6": { + "inputs": { + "flake-utils": "flake-utils_54", + "myuids": "myuids_37", + "nixpkgs": "nixpkgs_94" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_7": { + "inputs": { + "flake-utils": "flake-utils_56", + "myuids": "myuids_39", + "nixpkgs": "nixpkgs_96" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_30" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "paste_2": { + "inputs": { + "flake-utils": "flake-utils_57", + "nixpkgs": "nixpkgs_97" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_4": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_5": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_6": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_17", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_31", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_open_instance_2": { + "inputs": { + "flake-utils": "flake-utils_58", + "myuids": "myuids_40", + "nixpkgs": "nixpkgs_98", + "peertube": "peertube_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_18", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_32", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin_2": { + "inputs": { + "flake-utils": "flake-utils_59", + "myuids": "myuids_41", + "nixpkgs": "nixpkgs_99", + "peertube": "peertube_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": "nixpkgs_56", + "nixpkgs-4": "nixpkgs-4_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "php_2": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_64", + "nixpkgs-4": "nixpkgs-4_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_13", + "files-watcher": "files-watcher_5", + "openarc": "openarc_6", + "opendmarc": "opendmarc_4", + "secrets": "secrets_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_14", + "naemon": "naemon_3", + "nixpkgs-lib": "nixpkgs-lib_8", + "secrets": "secrets_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_6", + "openarc": "openarc_8", + "secrets": "secrets_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_15", + "files-watcher": "files-watcher_7", + "opendmarc": "opendmarc_5", + "secrets": "secrets_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_33", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_16", + "secrets": "secrets_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports_3", + "environment": "environment_17", + "mypackages": "mypackages_3", + "myuids": "myuids_15", + "secrets-public": "secrets-public_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "private-system_2": { + "inputs": { + "backports": "backports_6", + "environment": "environment_26", + "mypackages": "mypackages_9", + "myuids": "myuids_28", + "secrets-public": "secrets-public_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_22", + "myuids": "myuids_16", + "nixpkgs": "nixpkgs_37" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_23", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_39" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_24", + "grocy": "grocy", + "mypackages": "mypackages_5", + "nixpkgs": "nixpkgs_41" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_25", + "mastodon": "mastodon", + "myuids": "myuids_17", + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_26", + "mediagoblin": "mediagoblin", + "myuids": "myuids_18", + "nixpkgs": "nixpkgs_43" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_8", + "myuids": "myuids_19" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_9", + "nixpkgs": "nixpkgs_44", + "webapps-ttrss": "webapps-ttrss_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_27", + "myuids": "myuids_20", + "nixpkgs": "nixpkgs_45", + "openarc": "openarc_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_28", + "myuids": "myuids_21", + "nixpkgs": "nixpkgs_46" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_29", + "myuids": "myuids_22", + "nixpkgs": "nixpkgs_47", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_30", + "mypackages": "mypackages_6", + "nixpkgs": "nixpkgs_49", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": "nixpkgs_50", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "devshell": "devshell", + "main-flake": "main-flake", + "nixpkgs": "nixpkgs_106", + "secrets": "secrets_26" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "s-backports": { + "inputs": { + "flake-utils": "flake-utils_40", + "nixpkgs": "nixpkgs_74" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "./backports", + "type": "path" + }, + "original": { + "path": "./backports", + "type": "path" + } + }, + "s-copanier": { + "inputs": { + "copanier": "copanier_2", + "flake-utils": "flake-utils_41", + "nixpkgs": "nixpkgs_75" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "./copanier", + "type": "path" + }, + "original": { + "path": "./copanier", + "type": "path" + } + }, + "s-diaspora": { + "inputs": { + "diaspora": "diaspora_2", + "flake-utils": "flake-utils_42", + "myuids": "myuids_29", + "nixpkgs": "nixpkgs_76" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "./diaspora", + "type": "path" + }, + "original": { + "path": "./diaspora", + "type": "path" + } + }, + "s-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite_2", + "flake-utils": "flake-utils_43", + "mypackages": "mypackages_10", + "nixpkgs": "nixpkgs_78" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "./etherpad-lite", + "type": "path" + }, + "original": { + "path": "./etherpad-lite", + "type": "path" + } + }, + "s-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "./fiche", + "type": "path" + }, + "original": { + "path": "./fiche", + "type": "path" + } + }, + "s-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "./files-watcher", + "type": "path" + }, + "original": { + "path": "./files-watcher", + "type": "path" + } + }, + "s-grocy": { + "inputs": { + "flake-utils": "flake-utils_44", + "grocy": "grocy_2", + "mypackages": "mypackages_11", + "nixpkgs": "nixpkgs_80" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "./grocy", + "type": "path" + }, + "original": { + "path": "./grocy", + "type": "path" + } + }, + "s-lib": { + "inputs": { + "colmena": "colmena_7", + "disko": "disko_7", + "flake-parts": "flake-parts_19", + "nixos-anywhere": "nixos-anywhere_7", + "nixpkgs": "nixpkgs_84" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "./lib", + "type": "path" + }, + "original": { + "path": "./lib", + "type": "path" + } + }, + "s-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "./loginctl-linger", + "type": "path" + }, + "original": { + "path": "./loginctl-linger", + "type": "path" + } + }, + "s-mastodon": { + "inputs": { + "flake-utils": "flake-utils_46", + "mastodon": "mastodon_2", + "myuids": "myuids_30", + "nixpkgs": "nixpkgs_85" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "./mastodon", + "type": "path" + }, + "original": { + "path": "./mastodon", + "type": "path" + } + }, + "s-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_47", + "mediagoblin": "mediagoblin_2", + "myuids": "myuids_31", + "nixpkgs": "nixpkgs_86" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "./mediagoblin", + "type": "path" + }, + "original": { + "path": "./mediagoblin", + "type": "path" + } + }, + "s-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_12", + "myuids": "myuids_32" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "./multi-apache-container", + "type": "path" + }, + "original": { + "path": "./multi-apache-container", + "type": "path" + } + }, + "s-mypackages": { + "inputs": { + "flake-parts": "flake-parts_20", + "nixpkgs": "nixpkgs_87", + "webapps-ttrss": "webapps-ttrss_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "./mypackages", + "type": "path" + }, + "original": { + "path": "./mypackages", + "type": "path" + } + }, + "s-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "./myuids", + "type": "path" + }, + "original": { + "path": "./myuids", + "type": "path" + } + }, + "s-naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "./naemon", + "type": "path" + }, + "original": { + "path": "./naemon", + "type": "path" + } + }, + "s-openarc": { + "inputs": { + "flake-utils": "flake-utils_48", + "myuids": "myuids_33", + "nixpkgs": "nixpkgs_88", + "openarc": "openarc_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "./openarc", + "type": "path" + }, + "original": { + "path": "./openarc", + "type": "path" + } + }, + "s-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_49", + "myuids": "myuids_34", + "nixpkgs": "nixpkgs_89" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "./opendmarc", + "type": "path" + }, + "original": { + "path": "./opendmarc", + "type": "path" + } + }, + "s-paste": { + "inputs": { + "flake-utils": "flake-utils_50", + "nixpkgs": "nixpkgs_90" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "./paste", + "type": "path" + }, + "original": { + "path": "./paste", + "type": "path" + } + }, + "s-peertube": { + "inputs": { + "flake-utils": "flake-utils_51", + "myuids": "myuids_35", + "nixpkgs": "nixpkgs_91", + "peertube": "peertube_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./peertube", + "type": "path" + }, + "original": { + "path": "./peertube", + "type": "path" + } + }, + "s-private-buildbot": { + "inputs": { + "buildslist": "buildslist_2", + "flake-utils": "flake-utils_52", + "nixpkgs": "nixpkgs_92" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "./private/buildbot", + "type": "path" + }, + "original": { + "path": "./private/buildbot", + "type": "path" + } + }, + "s-private-chatons": { + "inputs": { + "environment": "environment_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "./private/chatons", + "type": "path" + }, + "original": { + "path": "./private/chatons", + "type": "path" + } + }, + "s-private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "./private/environment", + "type": "path" + }, + "original": { + "path": "./private/environment", + "type": "path" + } + }, + "s-private-mail-relay": { + "inputs": { + "environment": "environment_28", + "secrets": "secrets_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "./private/mail-relay", + "type": "path" + }, + "original": { + "path": "./private/mail-relay", + "type": "path" + } + }, + "s-private-milters": { + "inputs": { + "environment": "environment_29", + "files-watcher": "files-watcher_13", + "openarc": "openarc_12", + "opendmarc": "opendmarc_6", + "secrets": "secrets_21" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "./private/milters", + "type": "path" + }, + "original": { + "path": "./private/milters", + "type": "path" + } + }, + "s-private-monitoring": { + "inputs": { + "environment": "environment_30", + "naemon": "naemon_6", + "nixpkgs-lib": "nixpkgs-lib_26", + "secrets": "secrets_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "./private/monitoring", + "type": "path" + }, + "original": { + "path": "./private/monitoring", + "type": "path" + } + }, + "s-private-openarc": { + "inputs": { + "files-watcher": "files-watcher_14", + "openarc": "openarc_14", + "secrets": "secrets_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "./private/openarc", + "type": "path" + }, + "original": { + "path": "./private/openarc", + "type": "path" + } + }, + "s-private-opendmarc": { + "inputs": { + "environment": "environment_31", + "files-watcher": "files-watcher_15", + "opendmarc": "opendmarc_7", + "secrets": "secrets_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "./private/opendmarc", + "type": "path" + }, + "original": { + "path": "./private/opendmarc", + "type": "path" + } + }, + "s-private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "./private/openldap", + "type": "path" + }, + "original": { + "path": "./private/openldap", + "type": "path" + } + }, + "s-private-paste": { + "inputs": { + "paste": "paste_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "./private/paste", + "type": "path" + }, + "original": { + "path": "./private/paste", + "type": "path" + } + }, + "s-private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance_2", + "peertube_origin": "peertube_origin_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "./private/peertube", + "type": "path" + }, + "original": { + "path": "./private/peertube", + "type": "path" + } + }, + "s-private-php": { + "inputs": { + "flake-utils": "flake-utils_60", + "nixpkgs": "nixpkgs_100", + "nixpkgs-4": "nixpkgs-4_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "./private/php", + "type": "path" + }, + "original": { + "path": "./private/php", + "type": "path" + } + }, + "s-private-ssh": { + "inputs": { + "environment": "environment_32", + "secrets": "secrets_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "./private/ssh", + "type": "path" + }, + "original": { + "path": "./private/ssh", + "type": "path" + } + }, + "s-private-system": { + "inputs": { + "backports": "backports_7", + "environment": "environment_33", + "mypackages": "mypackages_12", + "myuids": "myuids_42", + "secrets-public": "secrets-public_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "./private/system", + "type": "path" + }, + "original": { + "path": "./private/system", + "type": "path" + } + }, + "s-rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "./rsync_backup", + "type": "path" + }, + "original": { + "path": "./rsync_backup", + "type": "path" + } + }, + "s-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "./secrets", + "type": "path" + }, + "original": { + "path": "./secrets", + "type": "path" + } + }, + "s-surfer": { + "inputs": { + "flake-utils": "flake-utils_62", + "mypackages": "mypackages_13", + "nixpkgs": "nixpkgs_104", + "surfer": "surfer_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "./surfer", + "type": "path" + }, + "original": { + "path": "./surfer", + "type": "path" + } + }, + "s-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_63", + "nixpkgs": "nixpkgs_105", + "taskwarrior-web": "taskwarrior-web_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "./taskwarrior-web", + "type": "path" + }, + "original": { + "path": "./taskwarrior-web", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_26": { + "inputs": { + "nixpkgs": "nixpkgs_107" + }, + "locked": { + "lastModified": 1696144631, + "narHash": "sha256-zV7tbNrrrUpPkaATkc6OsQC8n75QybaBKsaD7d5kQGA=", + "ref": "master", + "rev": "ae51ac0227647e30348256067934b8c9eb7e3f06", + "revCount": 688, + "type": "git", + "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets" + }, + "original": { + "ref": "master", + "type": "git", + "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_10", + "secrets": "secrets_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_2": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_3": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_4": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_5": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_6": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_7": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "surfer_2": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_2": { + "inputs": { + "backports": "backports_2", + "environment": "environment_11", + "mypackages": "mypackages_2", + "myuids": "myuids_8", + "secrets-public": "secrets-public_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_3": { + "inputs": { + "backports": "backports_4", + "environment": "environment_22", + "mypackages": "mypackages_7", + "myuids": "myuids_24", + "secrets-public": "secrets-public_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_4": { + "inputs": { + "backports": "backports_5", + "environment": "environment_25", + "mypackages": "mypackages_8", + "myuids": "myuids_27", + "secrets-public": "secrets-public_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "taskwarrior-web_2": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_4": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_5": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_6": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_7": { + "inputs": { + "nixpkgs": [ + "main-flake", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_10": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_11": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_12": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_13": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_14": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_15": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_6": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_7": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_8": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_9": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/deploy/flake.nix b/deploy/flake.nix new file mode 100644 index 0000000..f613b19 --- /dev/null +++ b/deploy/flake.nix @@ -0,0 +1,45 @@ +{ + inputs = { + devshell.url = "github:numtide/devshell"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable?dir=lib"; + # Uncomment temporarily below value and replace with local path to + # your secrets, and replace "follows" key below to use it. + #secrets-local.url = "path:/home/immae/projets/mes_sites/nixops-secrets"; + secrets = { + type = "git"; + url = "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"; + ref = "master"; + }; + main-flake.url = "path:../flakes"; + main-flake.inputs.secrets.follows = "secrets"; + }; + outputs = inputs@{ self, nixpkgs, main-flake, devshell, ... }: { + sops-vars-file = (inputs.secrets-local or inputs.secrets).vars-file; + # FIXME: next line Can be removed in nix 2.16.* + devShell.x86_64-linux = self.devShells.x86_64-linux.default; + devShells.x86_64-linux.default = devshell.legacyPackages.x86_64-linux.mkShell { + env = [ + { name = "NIX_BUILD_TOP"; value = ""; } + { name = "SOPS_VARS_FILE"; value = builtins.toString self.sops-vars-file; } + ]; + }; + colmena = + let + nodeFlakes = main-flake.subflakes.nodes; + hosts = builtins.attrNames nodeFlakes; + toHostNixpkgs = name: nodeFlakes.${name}.colmena.meta.nixpkgs; + toHostSpecialArgs = name: nodeFlakes.${name}.colmena.meta.specialArgs; + toHostColmena = name: nodeFlakes.${name}.colmena.${name}; + + in nixpkgs.lib.genAttrs hosts toHostColmena + // { + meta = { + # nixpkgs is required for colmena, but only lib is actually used + nixpkgs.lib = nixpkgs.lib; + specialArgs.secrets = main-flake.subflakes.secrets; + nodeNixpkgs = nixpkgs.lib.genAttrs hosts toHostNixpkgs; + nodeSpecialArgs = nixpkgs.lib.genAttrs hosts toHostSpecialArgs; + }; + }; + }; +} diff --git a/environments/default.nix b/environments/default.nix deleted file mode 100644 index 5f17eb9..0000000 --- a/environments/default.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ callPackage }: -{ - immae-eu = callPackage ./immae-eu.nix {}; -} diff --git a/environments/immae-eu.nix b/environments/immae-eu.nix deleted file mode 100644 index 4def84b..0000000 --- a/environments/immae-eu.nix +++ /dev/null @@ -1,146 +0,0 @@ -{ pkgs }: with pkgs; -let - # https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh - # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks - vlock' = vlock.overrideAttrs(old: { - configureFlags = old.configureFlags ++ [ "--enable-root-password=no" ]; - }); - paths = [ - # archives - lzo unzip bzip2 xz - # unrar is unfree - - # backups - duply - - # calendar/contacts - abook khard khal cadaver vdirsyncerStable pal - - # computing - boinctui - - # cryptocurrencies - monero - cointop - # failing xmr-stak - solc - iota-cli-app - - # debugging - rr valgrind netcat-gnu strace shellcheck - - # documentations - unicodeDoc - - # e-mails - muttprint mutt-ics - notmuch-python2 notmuch-python3 notmuch-vim - neomutt mairix - bogofilter fetchmail - sieve-connect - - # git - vcsh gitRepo stgit tig ripgrep mr - - # graphical tools - nextcloud-client firefox - dwm dmenu st xorg.xauth tigervnc - - # images - feh imagemagick tiv graphicsmagick qrcode - - # internet browsing - w3m lynx links elinks browsh woob urlview urlscan googler urlwatch - - # less - python3Packages.pygments lesspipe highlight sourceHighlight - - # monitoring - cnagios mtop pg_activity nagios-cli mtr - iftop htop iotop iperf bonfire - goaccess tcpdump tshark tcpflow - mitmproxy - # nagnu - - # messaging/forums/news - flrn slrn - signal-cli signaldctl - telegram-cli telegram-history-dump telegramircd - weechat profanity - newsboat irssi - - # nix - yarn2nix-moretea.yarn2nix nixUnstable - nixops nix-prefetch-scripts nix-generate-from-cpan - bundix nodePackages.bower2nix nix-diff - nodePackages.node2nix niv - # (nixos {}).nixos-generate-config - # (nixos {}).nixos-install - # (nixos {}).nixos-enter - # (nixos {}).manual.manpages - - # note taking - note terminal-velocity jrnl doing nb - - # office - sc-im ranger - genius bc - ledger - tmux - rtorrent - ldapvi - fzf - buku - vimPlugins.vim-plug - (vim_configurable.override { python = python3; }) - mailcap - webapps.surfer - - # password management - (pass.withExtensions (exts: [ exts.pass-otp ])) apg pwgen - - # pdf - pdftk poppler_utils - - # programming - pelican emacs26-nox ctags - wdiff patch gnumake - - # security - keybase gnupg - - # todolist/time management - taskwarrior vit timewarrior taskopen - bugwarrior - - # video/music - youtube-dl ncmpc ncmpcpp ffmpeg - - # s6 tools (part of skawarePackages) - skalibs execline s6 s6-dns s6-linux-utils s6-networking - s6-portable-utils - - # system tools - telnet bind.dnsutils httpie ngrep nmap p0f socat lsof psmisc - wget patchelf rename tmux (lib.meta.hiPrio nettools) - vlock' mosh manpages openssl openssl.doc openssl.man - sshfs ncdu procps-ng - - # other tools - pgloader s3cmd lftp jq cpulimit libxslt gandi-cli bubblewrap - - # Terraform + AWS - terraform_0_12 awscli - ansible python3Packages.boto - openvpn - - zsh-completions - ]; -in -buildEnv { - name = "immae-eu-packages"; - inherit paths; - pathsToLink = [ "/bin" "/etc" "/include" "/lib" "/libexec" "/share"]; - extraOutputsToInstall = [ "bin" "man" "doc" "info" ]; - passthru = { packages = paths; }; -} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b109986 --- /dev/null +++ b/flake.lock @@ -0,0 +1,9825 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_2": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_3": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_34" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_4": { + "inputs": { + "flake-utils": "flake-utils_34", + "nixpkgs": "nixpkgs_57" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_5": { + "inputs": { + "flake-utils": "flake-utils_37", + "nixpkgs": "nixpkgs_65" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_6": { + "inputs": { + "flake-utils": "flake-utils_39", + "nixpkgs": "nixpkgs_72" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_7": { + "inputs": { + "flake-utils": "flake-utils_61", + "nixpkgs": "nixpkgs_101" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "buildslist_2": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "chatons_2": { + "inputs": { + "environment": "environment_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_4", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_2": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_13", + "stable": "stable_2" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_20", + "stable": "stable_3" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_32", + "nixpkgs": "nixpkgs_51", + "stable": "stable_4" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_5": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_35", + "nixpkgs": "nixpkgs_59", + "stable": "stable_5" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_6": { + "inputs": { + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_38", + "nixpkgs": "nixpkgs_67", + "stable": "stable_6" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_7": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_45", + "nixpkgs": "nixpkgs_81", + "stable": "stable_7" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "copanier_2": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1688380630, + "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=", + "owner": "numtide", + "repo": "devshell", + "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "diaspora_2": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_2": { + "inputs": { + "nixpkgs": "nixpkgs_14" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_3": { + "inputs": { + "nixpkgs": "nixpkgs_21" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_4": { + "inputs": { + "nixpkgs": "nixpkgs_52" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_5": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_6": { + "inputs": { + "nixpkgs": "nixpkgs_68" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_7": { + "inputs": { + "nixpkgs": "nixpkgs_82" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "flakes", + "n-eldiron", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "etherpad-lite_2": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_13" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_14" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_12": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_16" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_13": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_17" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_14": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_19" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_15": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_20" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_16": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_21" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_17": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_22" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_18": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_23" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_19": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_24" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_20": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_25" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_21": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_26" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_22": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_28" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_23": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_29" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_4" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_8" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_10" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_11" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_12" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_33": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_40": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_41": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_42": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_43": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_44": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_45": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_46": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_47": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_48": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_49": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_50": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_51": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_52": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_53": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_54": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_55": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_56": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_57": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_58": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_59": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_60": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_61": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_62": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_63": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flakes": { + "inputs": { + "n-backup-2": "n-backup-2", + "n-dilion": "n-dilion", + "n-eldiron": "n-eldiron", + "n-monitoring-1": "n-monitoring-1", + "n-quatresaisons": "n-quatresaisons", + "n-zoldene": "n-zoldene", + "s-backports": "s-backports", + "s-copanier": "s-copanier", + "s-diaspora": "s-diaspora", + "s-etherpad-lite": "s-etherpad-lite", + "s-fiche": "s-fiche", + "s-files-watcher": "s-files-watcher", + "s-grocy": "s-grocy", + "s-lib": "s-lib", + "s-loginctl-linger": "s-loginctl-linger", + "s-mastodon": "s-mastodon", + "s-mediagoblin": "s-mediagoblin", + "s-multi-apache-container": "s-multi-apache-container", + "s-mypackages": "s-mypackages", + "s-myuids": "s-myuids", + "s-naemon": "s-naemon", + "s-openarc": "s-openarc", + "s-opendmarc": "s-opendmarc", + "s-paste": "s-paste", + "s-peertube": "s-peertube", + "s-private-buildbot": "s-private-buildbot", + "s-private-chatons": "s-private-chatons", + "s-private-environment": "s-private-environment", + "s-private-mail-relay": "s-private-mail-relay", + "s-private-milters": "s-private-milters", + "s-private-monitoring": "s-private-monitoring", + "s-private-openarc": "s-private-openarc", + "s-private-opendmarc": "s-private-opendmarc", + "s-private-openldap": "s-private-openldap", + "s-private-paste": "s-private-paste", + "s-private-peertube": "s-private-peertube", + "s-private-php": "s-private-php", + "s-private-ssh": "s-private-ssh", + "s-private-system": "s-private-system", + "s-rsync_backup": "s-rsync_backup", + "s-secrets": "s-secrets", + "s-surfer": "s-surfer", + "s-taskwarrior-web": "s-taskwarrior-web", + "secrets": "secrets_26" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=", + "path": "./flakes", + "type": "path" + }, + "original": { + "path": "./flakes", + "type": "path" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "grocy_2": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mail-relay_2": { + "inputs": { + "environment": "environment_20", + "secrets": "secrets_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mastodon_2": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "mediagoblin_2": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib_2", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_2": { + "inputs": { + "environment": "environment_9", + "naemon": "naemon_2", + "nixpkgs-lib": "nixpkgs-lib_5", + "secrets": "secrets_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_3": { + "inputs": { + "environment": "environment_21", + "naemon": "naemon_4", + "nixpkgs-lib": "nixpkgs-lib_15", + "secrets": "secrets_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_4": { + "inputs": { + "environment": "environment_24", + "naemon": "naemon_5", + "nixpkgs-lib": "nixpkgs-lib_18", + "secrets": "secrets_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_11", + "myuids": "myuids_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts_2", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_2": { + "inputs": { + "colmena": "colmena_2", + "disko": "disko_2", + "flake-parts": "flake-parts_4", + "nixos-anywhere": "nixos-anywhere_2", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_3": { + "inputs": { + "colmena": "colmena_3", + "disko": "disko_3", + "flake-parts": "flake-parts_6", + "nixos-anywhere": "nixos-anywhere_3", + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_4": { + "inputs": { + "colmena": "colmena_4", + "disko": "disko_4", + "flake-parts": "flake-parts_12", + "nixos-anywhere": "nixos-anywhere_4", + "nixpkgs": "nixpkgs_54" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_5": { + "inputs": { + "colmena": "colmena_5", + "disko": "disko_5", + "flake-parts": "flake-parts_14", + "nixos-anywhere": "nixos-anywhere_5", + "nixpkgs": "nixpkgs_62" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_6": { + "inputs": { + "colmena": "colmena_6", + "disko": "disko_6", + "flake-parts": "flake-parts_16", + "nixos-anywhere": "nixos-anywhere_6", + "nixpkgs": "nixpkgs_70" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_3", + "nixpkgs": "nixpkgs_12", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_10": { + "inputs": { + "flake-parts": "flake-parts_18", + "nixpkgs": "nixpkgs_77", + "webapps-ttrss": "webapps-ttrss_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_11": { + "inputs": { + "flake-parts": "flake-parts_19", + "nixpkgs": "nixpkgs_79", + "webapps-ttrss": "webapps-ttrss_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_12": { + "inputs": { + "flake-parts": "flake-parts_22", + "nixpkgs": "nixpkgs_102", + "webapps-ttrss": "webapps-ttrss_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_13": { + "inputs": { + "flake-parts": "flake-parts_23", + "nixpkgs": "nixpkgs_103", + "webapps-ttrss": "webapps-ttrss_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_5", + "nixpkgs": "nixpkgs_19", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_7", + "nixpkgs": "nixpkgs_35", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_8", + "nixpkgs": "nixpkgs_38", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_5": { + "inputs": { + "flake-parts": "flake-parts_9", + "nixpkgs": "nixpkgs_40", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_6": { + "inputs": { + "flake-parts": "flake-parts_11", + "nixpkgs": "nixpkgs_48", + "webapps-ttrss": "webapps-ttrss_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_7": { + "inputs": { + "flake-parts": "flake-parts_13", + "nixpkgs": "nixpkgs_58", + "webapps-ttrss": "webapps-ttrss_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_8": { + "inputs": { + "flake-parts": "flake-parts_15", + "nixpkgs": "nixpkgs_66", + "webapps-ttrss": "webapps-ttrss_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_9": { + "inputs": { + "flake-parts": "flake-parts_17", + "nixpkgs": "nixpkgs_73", + "webapps-ttrss": "webapps-ttrss_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_34": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_35": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_36": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_37": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_38": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_39": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_40": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_41": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_42": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "n-backup-2": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=", + "path": "../systems/backup-2", + "type": "path" + }, + "original": { + "path": "../systems/backup-2", + "type": "path" + } + }, + "n-dilion": { + "inputs": { + "environment": "environment_8", + "files-watcher": "files-watcher_4", + "loginctl-linger": "loginctl-linger_2", + "monitoring": "monitoring_2", + "my-lib": "my-lib_2", + "myuids": "myuids_7", + "nixpkgs": "nixpkgs_17", + "secrets": "secrets_8", + "ssh": "ssh", + "system": "system_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=", + "path": "../systems/dilion", + "type": "path" + }, + "original": { + "path": "../systems/dilion", + "type": "path" + } + }, + "n-eldiron": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib_3", + "nixpkgs": "nixpkgs_24", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=", + "path": "../systems/eldiron", + "type": "path" + }, + "original": { + "path": "../systems/eldiron", + "type": "path" + } + }, + "n-monitoring-1": { + "inputs": { + "chatons": "chatons_2", + "environment": "environment_19", + "files-watcher": "files-watcher_9", + "loginctl-linger": "loginctl-linger_3", + "mail-relay": "mail-relay_2", + "monitoring": "monitoring_3", + "my-lib": "my-lib_4", + "myuids": "myuids_23", + "nixpkgs": "nixpkgs_55", + "php": "php", + "secrets": "secrets_17", + "system": "system_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=", + "path": "../systems/monitoring-1", + "type": "path" + }, + "original": { + "path": "../systems/monitoring-1", + "type": "path" + } + }, + "n-quatresaisons": { + "inputs": { + "environment": "environment_23", + "files-watcher": "files-watcher_10", + "landing-page": "landing-page", + "monitoring": "monitoring_4", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib_5", + "myuids": "myuids_26", + "nixpkgs": "nixpkgs_63", + "php": "php_2", + "secrets": "secrets_19", + "system": "system_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=", + "path": "../systems/quatresaisons", + "type": "path" + }, + "original": { + "path": "../systems/quatresaisons", + "type": "path" + } + }, + "n-zoldene": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib_6", + "nixpkgs": "nixpkgs_71", + "private-environment": "private-environment_2", + "private-system": "private-system_2", + "public-secrets": "public-secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=", + "path": "../systems/zoldene", + "type": "path" + }, + "original": { + "path": "../systems/zoldene", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_2": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_3": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_4": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_5": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_6": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_7": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "flakes", + "n-backup-2", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-backup-2", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_6", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_2": { + "inputs": { + "disko": [ + "flakes", + "n-dilion", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-dilion", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_2", + "nixos-images": "nixos-images_2", + "nixpkgs": "nixpkgs_15", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_3": { + "inputs": { + "disko": [ + "flakes", + "n-eldiron", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-eldiron", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_3", + "nixos-images": "nixos-images_3", + "nixpkgs": "nixpkgs_22", + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_4": { + "inputs": { + "disko": [ + "flakes", + "n-monitoring-1", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-monitoring-1", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_4", + "nixos-images": "nixos-images_4", + "nixpkgs": "nixpkgs_53", + "treefmt-nix": "treefmt-nix_4" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_5": { + "inputs": { + "disko": [ + "flakes", + "n-quatresaisons", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-quatresaisons", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_5", + "nixos-images": "nixos-images_5", + "nixpkgs": "nixpkgs_61", + "treefmt-nix": "treefmt-nix_5" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_6": { + "inputs": { + "disko": [ + "flakes", + "n-zoldene", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-zoldene", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_6", + "nixos-images": "nixos-images_6", + "nixpkgs": "nixpkgs_69", + "treefmt-nix": "treefmt-nix_6" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_7": { + "inputs": { + "disko": [ + "flakes", + "s-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "s-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_7", + "nixos-images": "nixos-images_7", + "nixpkgs": "nixpkgs_83", + "treefmt-nix": "treefmt-nix_7" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_2": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_3": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_4": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_5": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_6": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_7": { + "inputs": { + "nixos-2305": [ + "flakes", + "s-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1677383253, + "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9952d6bc395f5841262b006fbace8dd7e143b634", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_2": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_3": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_10": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_11": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_12": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_13": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_14": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_15": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_16": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_17": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_18": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_19": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_20": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_21": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_22": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_23": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_24": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_25": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_26": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_27": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_28": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_29": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_8": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_9": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_100": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_101": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_102": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_103": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_104": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_105": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_106": { + "locked": { + "lastModified": 1692447944, + "narHash": "sha256-fkJGNjEmTPvqBs215EQU4r9ivecV5Qge5cF/QDLVn3U=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d680ded26da5cf104dd2735a51e88d2d8f487b4d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_23": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_24": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_25": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_33": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_36": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_37": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_38": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_39": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_41": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_42": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_43": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_48": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_49": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_55": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_56": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_64": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_72": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_73": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_74": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_75": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_76": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_77": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_78": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_79": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_80": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_81": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_82": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_83": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_84": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_85": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_86": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_87": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_88": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_89": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_90": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_91": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_92": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_93": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_94": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_95": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_96": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_97": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_98": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_99": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs_2", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_10": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_11": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_12": { + "inputs": { + "flake-utils": "flake-utils_53", + "myuids": "myuids_36", + "nixpkgs": "nixpkgs_93", + "openarc": "openarc_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_13": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_14": { + "inputs": { + "flake-utils": "flake-utils_55", + "myuids": "myuids_38", + "nixpkgs": "nixpkgs_95", + "openarc": "openarc_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_15": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_9", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_6": { + "inputs": { + "flake-utils": "flake-utils_12", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_26", + "openarc": "openarc_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_7": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_8": { + "inputs": { + "flake-utils": "flake-utils_14", + "myuids": "myuids_11", + "nixpkgs": "nixpkgs_28", + "openarc": "openarc_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_9": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_5": { + "inputs": { + "flake-utils": "flake-utils_15", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_6": { + "inputs": { + "flake-utils": "flake-utils_54", + "myuids": "myuids_37", + "nixpkgs": "nixpkgs_94" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_7": { + "inputs": { + "flake-utils": "flake-utils_56", + "myuids": "myuids_39", + "nixpkgs": "nixpkgs_96" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_30" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "paste_2": { + "inputs": { + "flake-utils": "flake-utils_57", + "nixpkgs": "nixpkgs_97" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_4": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_5": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_6": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_17", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_31", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_open_instance_2": { + "inputs": { + "flake-utils": "flake-utils_58", + "myuids": "myuids_40", + "nixpkgs": "nixpkgs_98", + "peertube": "peertube_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_18", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_32", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin_2": { + "inputs": { + "flake-utils": "flake-utils_59", + "myuids": "myuids_41", + "nixpkgs": "nixpkgs_99", + "peertube": "peertube_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": "nixpkgs_56", + "nixpkgs-4": "nixpkgs-4_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "php_2": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_64", + "nixpkgs-4": "nixpkgs-4_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_13", + "files-watcher": "files-watcher_5", + "openarc": "openarc_6", + "opendmarc": "opendmarc_4", + "secrets": "secrets_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_14", + "naemon": "naemon_3", + "nixpkgs-lib": "nixpkgs-lib_9", + "secrets": "secrets_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_6", + "openarc": "openarc_8", + "secrets": "secrets_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_15", + "files-watcher": "files-watcher_7", + "opendmarc": "opendmarc_5", + "secrets": "secrets_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_33", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_16", + "secrets": "secrets_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports_3", + "environment": "environment_17", + "mypackages": "mypackages_3", + "myuids": "myuids_15", + "secrets-public": "secrets-public_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "private-system_2": { + "inputs": { + "backports": "backports_6", + "environment": "environment_26", + "mypackages": "mypackages_9", + "myuids": "myuids_28", + "secrets-public": "secrets-public_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_22", + "myuids": "myuids_16", + "nixpkgs": "nixpkgs_37" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_23", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_39" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_24", + "grocy": "grocy", + "mypackages": "mypackages_5", + "nixpkgs": "nixpkgs_41" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_25", + "mastodon": "mastodon", + "myuids": "myuids_17", + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_26", + "mediagoblin": "mediagoblin", + "myuids": "myuids_18", + "nixpkgs": "nixpkgs_43" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_8", + "myuids": "myuids_19" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_10", + "nixpkgs": "nixpkgs_44", + "webapps-ttrss": "webapps-ttrss_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_27", + "myuids": "myuids_20", + "nixpkgs": "nixpkgs_45", + "openarc": "openarc_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_28", + "myuids": "myuids_21", + "nixpkgs": "nixpkgs_46" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_29", + "myuids": "myuids_22", + "nixpkgs": "nixpkgs_47", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_30", + "mypackages": "mypackages_6", + "nixpkgs": "nixpkgs_49", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": "nixpkgs_50", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "devshell": "devshell", + "flake-parts": "flake-parts", + "flakes": "flakes", + "nixpkgs": "nixpkgs_106" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "s-backports": { + "inputs": { + "flake-utils": "flake-utils_40", + "nixpkgs": "nixpkgs_74" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "./backports", + "type": "path" + }, + "original": { + "path": "./backports", + "type": "path" + } + }, + "s-copanier": { + "inputs": { + "copanier": "copanier_2", + "flake-utils": "flake-utils_41", + "nixpkgs": "nixpkgs_75" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "./copanier", + "type": "path" + }, + "original": { + "path": "./copanier", + "type": "path" + } + }, + "s-diaspora": { + "inputs": { + "diaspora": "diaspora_2", + "flake-utils": "flake-utils_42", + "myuids": "myuids_29", + "nixpkgs": "nixpkgs_76" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "./diaspora", + "type": "path" + }, + "original": { + "path": "./diaspora", + "type": "path" + } + }, + "s-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite_2", + "flake-utils": "flake-utils_43", + "mypackages": "mypackages_10", + "nixpkgs": "nixpkgs_78" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "./etherpad-lite", + "type": "path" + }, + "original": { + "path": "./etherpad-lite", + "type": "path" + } + }, + "s-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "./fiche", + "type": "path" + }, + "original": { + "path": "./fiche", + "type": "path" + } + }, + "s-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "./files-watcher", + "type": "path" + }, + "original": { + "path": "./files-watcher", + "type": "path" + } + }, + "s-grocy": { + "inputs": { + "flake-utils": "flake-utils_44", + "grocy": "grocy_2", + "mypackages": "mypackages_11", + "nixpkgs": "nixpkgs_80" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "./grocy", + "type": "path" + }, + "original": { + "path": "./grocy", + "type": "path" + } + }, + "s-lib": { + "inputs": { + "colmena": "colmena_7", + "disko": "disko_7", + "flake-parts": "flake-parts_20", + "nixos-anywhere": "nixos-anywhere_7", + "nixpkgs": "nixpkgs_84" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "./lib", + "type": "path" + }, + "original": { + "path": "./lib", + "type": "path" + } + }, + "s-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "./loginctl-linger", + "type": "path" + }, + "original": { + "path": "./loginctl-linger", + "type": "path" + } + }, + "s-mastodon": { + "inputs": { + "flake-utils": "flake-utils_46", + "mastodon": "mastodon_2", + "myuids": "myuids_30", + "nixpkgs": "nixpkgs_85" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "./mastodon", + "type": "path" + }, + "original": { + "path": "./mastodon", + "type": "path" + } + }, + "s-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_47", + "mediagoblin": "mediagoblin_2", + "myuids": "myuids_31", + "nixpkgs": "nixpkgs_86" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "./mediagoblin", + "type": "path" + }, + "original": { + "path": "./mediagoblin", + "type": "path" + } + }, + "s-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_12", + "myuids": "myuids_32" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "./multi-apache-container", + "type": "path" + }, + "original": { + "path": "./multi-apache-container", + "type": "path" + } + }, + "s-mypackages": { + "inputs": { + "flake-parts": "flake-parts_21", + "nixpkgs": "nixpkgs_87", + "webapps-ttrss": "webapps-ttrss_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "./mypackages", + "type": "path" + }, + "original": { + "path": "./mypackages", + "type": "path" + } + }, + "s-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "./myuids", + "type": "path" + }, + "original": { + "path": "./myuids", + "type": "path" + } + }, + "s-naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "./naemon", + "type": "path" + }, + "original": { + "path": "./naemon", + "type": "path" + } + }, + "s-openarc": { + "inputs": { + "flake-utils": "flake-utils_48", + "myuids": "myuids_33", + "nixpkgs": "nixpkgs_88", + "openarc": "openarc_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "./openarc", + "type": "path" + }, + "original": { + "path": "./openarc", + "type": "path" + } + }, + "s-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_49", + "myuids": "myuids_34", + "nixpkgs": "nixpkgs_89" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "./opendmarc", + "type": "path" + }, + "original": { + "path": "./opendmarc", + "type": "path" + } + }, + "s-paste": { + "inputs": { + "flake-utils": "flake-utils_50", + "nixpkgs": "nixpkgs_90" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "./paste", + "type": "path" + }, + "original": { + "path": "./paste", + "type": "path" + } + }, + "s-peertube": { + "inputs": { + "flake-utils": "flake-utils_51", + "myuids": "myuids_35", + "nixpkgs": "nixpkgs_91", + "peertube": "peertube_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./peertube", + "type": "path" + }, + "original": { + "path": "./peertube", + "type": "path" + } + }, + "s-private-buildbot": { + "inputs": { + "buildslist": "buildslist_2", + "flake-utils": "flake-utils_52", + "nixpkgs": "nixpkgs_92" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "./private/buildbot", + "type": "path" + }, + "original": { + "path": "./private/buildbot", + "type": "path" + } + }, + "s-private-chatons": { + "inputs": { + "environment": "environment_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "./private/chatons", + "type": "path" + }, + "original": { + "path": "./private/chatons", + "type": "path" + } + }, + "s-private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "./private/environment", + "type": "path" + }, + "original": { + "path": "./private/environment", + "type": "path" + } + }, + "s-private-mail-relay": { + "inputs": { + "environment": "environment_28", + "secrets": "secrets_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "./private/mail-relay", + "type": "path" + }, + "original": { + "path": "./private/mail-relay", + "type": "path" + } + }, + "s-private-milters": { + "inputs": { + "environment": "environment_29", + "files-watcher": "files-watcher_13", + "openarc": "openarc_12", + "opendmarc": "opendmarc_6", + "secrets": "secrets_21" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "./private/milters", + "type": "path" + }, + "original": { + "path": "./private/milters", + "type": "path" + } + }, + "s-private-monitoring": { + "inputs": { + "environment": "environment_30", + "naemon": "naemon_6", + "nixpkgs-lib": "nixpkgs-lib_27", + "secrets": "secrets_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "./private/monitoring", + "type": "path" + }, + "original": { + "path": "./private/monitoring", + "type": "path" + } + }, + "s-private-openarc": { + "inputs": { + "files-watcher": "files-watcher_14", + "openarc": "openarc_14", + "secrets": "secrets_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "./private/openarc", + "type": "path" + }, + "original": { + "path": "./private/openarc", + "type": "path" + } + }, + "s-private-opendmarc": { + "inputs": { + "environment": "environment_31", + "files-watcher": "files-watcher_15", + "opendmarc": "opendmarc_7", + "secrets": "secrets_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "./private/opendmarc", + "type": "path" + }, + "original": { + "path": "./private/opendmarc", + "type": "path" + } + }, + "s-private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "./private/openldap", + "type": "path" + }, + "original": { + "path": "./private/openldap", + "type": "path" + } + }, + "s-private-paste": { + "inputs": { + "paste": "paste_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "./private/paste", + "type": "path" + }, + "original": { + "path": "./private/paste", + "type": "path" + } + }, + "s-private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance_2", + "peertube_origin": "peertube_origin_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "./private/peertube", + "type": "path" + }, + "original": { + "path": "./private/peertube", + "type": "path" + } + }, + "s-private-php": { + "inputs": { + "flake-utils": "flake-utils_60", + "nixpkgs": "nixpkgs_100", + "nixpkgs-4": "nixpkgs-4_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "./private/php", + "type": "path" + }, + "original": { + "path": "./private/php", + "type": "path" + } + }, + "s-private-ssh": { + "inputs": { + "environment": "environment_32", + "secrets": "secrets_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "./private/ssh", + "type": "path" + }, + "original": { + "path": "./private/ssh", + "type": "path" + } + }, + "s-private-system": { + "inputs": { + "backports": "backports_7", + "environment": "environment_33", + "mypackages": "mypackages_12", + "myuids": "myuids_42", + "secrets-public": "secrets-public_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "./private/system", + "type": "path" + }, + "original": { + "path": "./private/system", + "type": "path" + } + }, + "s-rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "./rsync_backup", + "type": "path" + }, + "original": { + "path": "./rsync_backup", + "type": "path" + } + }, + "s-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "./secrets", + "type": "path" + }, + "original": { + "path": "./secrets", + "type": "path" + } + }, + "s-surfer": { + "inputs": { + "flake-utils": "flake-utils_62", + "mypackages": "mypackages_13", + "nixpkgs": "nixpkgs_104", + "surfer": "surfer_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "./surfer", + "type": "path" + }, + "original": { + "path": "./surfer", + "type": "path" + } + }, + "s-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_63", + "nixpkgs": "nixpkgs_105", + "taskwarrior-web": "taskwarrior-web_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "./taskwarrior-web", + "type": "path" + }, + "original": { + "path": "./taskwarrior-web", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=", + "path": "./private/environment-dummy", + "type": "path" + }, + "original": { + "path": "./private/environment-dummy", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_10", + "secrets": "secrets_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_2": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_3": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_4": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_5": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_6": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_7": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "surfer_2": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_2": { + "inputs": { + "backports": "backports_2", + "environment": "environment_11", + "mypackages": "mypackages_2", + "myuids": "myuids_8", + "secrets-public": "secrets-public_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_3": { + "inputs": { + "backports": "backports_4", + "environment": "environment_22", + "mypackages": "mypackages_7", + "myuids": "myuids_24", + "secrets-public": "secrets-public_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_4": { + "inputs": { + "backports": "backports_5", + "environment": "environment_25", + "mypackages": "mypackages_8", + "myuids": "myuids_27", + "secrets-public": "secrets-public_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "taskwarrior-web_2": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_4": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_5": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_6": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_7": { + "inputs": { + "nixpkgs": [ + "flakes", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_10": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_11": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_12": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_13": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_14": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_15": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_6": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_7": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_8": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_9": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..e3ed4c9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,47 @@ +{ + description = "immae-eu infrastructure"; + inputs = { + flake-parts.url = "github:hercules-ci/flake-parts"; + devshell.url = "github:numtide/devshell"; + # nixpkgs for local tools + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + flakes.url = "path:./flakes"; + }; + outputs = inputs@{ self, flake-parts, flakes, ... }: + let + inherit (flakes.subflakes) public private; + inherit (public) mypackages; + in + flake-parts.lib.mkFlake { inherit inputs; } ({ withSystem, ... }: { + imports = [ + inputs.devshell.flakeModule + (mypackages.mylibs.flakePartsAddPerSystem { name = "lib"; type = "unspecified"; }) + ]; + systems = [ "x86_64-linux" ]; + perSystem = { config, inputs', pkgs, system, ... }: + { + packages = mypackages.packages."${system}"; + lib = mypackages.lib."${system}"; + devshells.default = { + packages = [ + pkgs.colmena + pkgs.nixUnstable pkgs.python3 pkgs.sops + pkgs.curl pkgs.shellcheck pkgs.jq + pkgs.gnumake pkgs.yq + ]; + env = [ + { name = "NIX_BUILD_TOP"; value = ""; } + { name = "PATH"; prefix = "scripts"; } + { name = "NIX_PATH"; value = "nixpkgs=${pkgs.path}"; } + ]; + }; + }; + flake = { + # FIXME: next line Can be removed in nix 2.16.* + devShell.x86_64-linux = self.devShells.x86_64-linux.default; + inherit (mypackages) mylibs sources overlays; + inherit (flakes) subflakes; + }; + }); +} diff --git a/flakes/backports/flake.lock b/flakes/backports/flake.lock index 5f9289e..8981e53 100644 --- a/flakes/backports/flake.lock +++ b/flakes/backports/flake.lock @@ -2,11 +2,11 @@ "nodes": { "flake-utils": { "locked": { - "lastModified": 1629481132, - "narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "997f7efcb746a9c140ce1f13c72263189225f482", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -17,15 +17,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1634032472, - "narHash": "sha256-IoSg358w6nPpTYLWhvN3UgnU6r322dDPOLFXHyqyIkM=", + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3abf4b55b7c991909fde3115827d398dd7c5a299", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flakes/backports/flake.nix b/flakes/backports/flake.nix index 8be885f..796664a 100644 --- a/flakes/backports/flake.nix +++ b/flakes/backports/flake.nix @@ -1,62 +1,19 @@ { description = "Backported packages"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: let - pkgs = import nixpkgs { inherit system; overlays = []; }; + pkgs = import nixpkgs { inherit system; overlays = []; config = {}; }; in rec { packages = { - apprise = pkgs.apprise; - bitlbee-mastodon = pkgs.bitlbee-mastodon; - cointop = pkgs.cointop; - cryptpad = pkgs.cryptpad; - dovecot_fts-xapian = pkgs.dovecot_fts_xapian; - duply = pkgs.duply; - fiche = pkgs.fiche; - influxdb2 = pkgs.influxdb2; - ldapvi = pkgs.ldapvi; - lego = pkgs.lego; - mpd = pkgs.mpd; - mpd-small = pkgs.mpd-small; - opensmtpd = pkgs.opensmtpd; - pass = pkgs.pass; - pg_activity = pkgs.pg_activity; - signald = pkgs.signald; - ssh-to-age = pkgs.ssh-to-age; - stgit = pkgs.stgit; - sops = pkgs.sops; - sudo = pkgs.sudo; - telegram-cli = pkgs.telegram-cli; - woob = pkgs.python3Packages.woob; - zrepl = pkgs.zrepl; + ntfy-sh = pkgs.ntfy-sh; }; legacyPackages = packages; apps = { - apprise = flake-utils.lib.mkApp { drv = packages.apprise; name = "apprise"; }; - cointop = flake-utils.lib.mkApp { drv = packages.cointop; name = "cointop"; }; - cryptpad = flake-utils.lib.mkApp { drv = packages.cryptpad; name = "cryptpad"; }; - duply = flake-utils.lib.mkApp { drv = packages.duply; name = "duply"; }; - fiche = flake-utils.lib.mkApp { drv = packages.fiche; name = "fiche"; }; - influxd = flake-utils.lib.mkApp { drv = packages.influxdb2; name = "influxd"; }; - influx = flake-utils.lib.mkApp { drv = packages.influxdb2; name = "influx"; }; - ldapvi = flake-utils.lib.mkApp { drv = packages.ldapvi; name = "ldapvi"; }; - lego = flake-utils.lib.mkApp { drv = packages.lego; name = "lego"; }; - mpd = flake-utils.lib.mkApp { drv = packages.mpd; name = "mpd"; }; - mpd-small = flake-utils.lib.mkApp { drv = packages.mpd-small; name = "mpd"; }; - opensmtpd = flake-utils.lib.mkApp { drv = packages.opensmtpd; name = "opensmtpd"; }; - pass = flake-utils.lib.mkApp { drv = packages.pass; name = "pass"; }; - pg_activity = flake-utils.lib.mkApp { drv = packages.pg_activity; name = "pg_activity"; }; - signald = flake-utils.lib.mkApp { drv = packages.signald; name = "signald"; }; - ssh-to-age = flake-utils.lib.mkApp { drv = packages.ssh-to-age; name = "ssh-to-age"; }; - stgit = flake-utils.lib.mkApp { drv = packages.stgit; name = "stgit"; }; - sops = flake-utils.lib.mkApp { drv = packages.sops; name = "sops"; }; - sudo = flake-utils.lib.mkApp { drv = packages.sudo; name = "sudo"; }; - telegram-cli = flake-utils.lib.mkApp { drv = packages.telegram-cli; name = "telegram-cli"; }; - woob = flake-utils.lib.mkApp { drv = packages.woob; name = "woob"; }; - zrepl = flake-utils.lib.mkApp { drv = packages.zrepl; name = "zrepl"; }; + ntfy-sh = flake-utils.lib.mkApp { drv = packages.ntfy-sh; name = "ntfy-sh"; }; }; } ) // rec { @@ -66,62 +23,14 @@ in package.override (pkgs.lib.genAttrs packageDeps (n: pkgs."${n}")); }; overlays = { - apprise = final: prev: { apprise = self.packages."${final.system}".apprise; }; - bitlbee-mastodon = final: prev: { - bitlbee-mastodon = lib.overrideDeps final self.packages."${final.system}".bitlbee-mastodon; - }; - cointop = final: prev: { cointop = self.packages."${final.system}".cointop; }; - cryptpad = final: prev: { cryptpad = self.packages."${final.system}".cryptpad; }; - dovecot_fts-xapian = final: prev: { - dovecot_fts-xapian = lib.overrideDeps final self.packages."${final.system}".dovecot_fts-xapian; - }; - duply = final: prev: { duply = self.packages."${final.system}".duply; }; - fiche = final: prev: { fiche = self.packages."${final.system}".fiche; }; - influxdb2 = final: prev: { influxdb2 = self.packages."${final.system}".influxdb2; }; - ldapvi = final: prev: { ldapvi = self.packages."${final.system}".ldapvi; }; - lego = final: prev: { lego = self.packages."${final.system}".lego; }; - mpd = final: prev: { mpd = self.packages."${final.system}".mpd; }; - opensmtpd = final: prev: { opensmtpd = self.packages."${final.system}".opensmtpd; }; - pass = final: prev: { pass = self.packages."${final.system}".pass; }; - pg_activity = final: prev: { pg_activity = self.packages."${final.system}".pg_activity; }; - signald = final: prev: { signald = self.packages."${final.system}".signald; }; - ssh-to-age = final: prev: { ssh-to-age = self.packages."${final.system}".ssh-to-age; }; - stgit = final: prev: { stgit = self.packages."${final.system}".stgit; }; - sops = final: prev: { sops = self.packages."${final.system}".sops; }; - sudo = final: prev: { sudo = self.packages."${final.system}".sudo; }; - telegram-cli = final: prev: { telegram-cli = self.packages."${final.system}".telegram-cli; }; - woob = final: prev: { woob = self.packages."${final.system}".woob; }; - zrepl = final: prev: { zrepl = self.packages."${final.system}".zrepl; }; + ntfy-sh = final: prev: { ntfy-sh = self.packages."${final.system}".ntfy-sh; }; }; overlay = final: prev: ({} - // overlays.apprise final prev - // overlays.bitlbee-mastodon final prev - // overlays.cointop final prev - // overlays.cryptpad final prev - // overlays.dovecot_fts-xapian final prev - // overlays.duply final prev - // overlays.fiche final prev - // overlays.influxdb2 final prev - // overlays.ldapvi final prev - // overlays.lego final prev - // overlays.mpd final prev - // overlays.opensmtpd final prev - // overlays.pass final prev - // overlays.pg_activity final prev - // overlays.signald final prev - // overlays.ssh-to-age final prev - // overlays.stgit final prev - // overlays.sops final prev - // overlays.sudo final prev - // overlays.telegram-cli final prev - // overlays.woob final prev - // overlays.zrepl final prev + // overlays.ntfy-sh final prev ); nixosModules = { - influxdb2 = import (nixpkgs + "/nixos/modules/services/databases/influxdb2.nix"); - mpd = import (nixpkgs + "/nixos/modules/services/audio/mpd.nix"); - zrepl = import (nixpkgs + "/nixos/modules/services/backup/zrepl.nix"); + #coturn = import (nixpkgs + "/nixos/modules/services/networking/coturn.nix"); }; }; } diff --git a/flakes/copanier/default.nix b/flakes/copanier/default.nix new file mode 100644 index 0000000..0486c0a --- /dev/null +++ b/flakes/copanier/default.nix @@ -0,0 +1,30 @@ +{ src, glibcLocales, poetry2nix, fetchFromGitHub, python37, fetchpatch }: +let + poetryApp = poetry2nix.mkPoetryApplication rec { + inherit src; + patches = [ ./fix_reduce.patch ]; + overrides = poetry2nix.overrides.withDefaults (self: super: { + weasyprint = super.weasyprint.overridePythonAttrs (old: { + patches = let + p0 = (fetchpatch { + url = "https://github.com/Kozea/WeasyPrint/commit/47043a1fd7e50a892b9836466f521df85d597c44.patch"; + sha256 = "18lmz6whjqxdpv4fdmg5vcpk2acdl99kfmp14badpw1jmffw7zl2"; + postFetch = '' + sed -i -e "s/font_filename/filename/" $out + ''; + }); + p1 = (builtins.elemAt old.patches 1).overrideAttrs(old: { + postInstall = '' + sed -i -e "s/so.0/so/" $out + ''; + }); + in [ p0 p1 ]; + }); + }); + pyproject = ./pyproject.toml; + poetrylock = ./poetry.lock; + python = python37; + locales = "${glibcLocales}/lib/locale/locale-archive"; + }; +in + poetryApp diff --git a/flakes/copanier/fix_reduce.patch b/flakes/copanier/fix_reduce.patch new file mode 100644 index 0000000..5390bcc --- /dev/null +++ b/flakes/copanier/fix_reduce.patch @@ -0,0 +1,13 @@ +diff --git a/copanier/views/delivery.py b/copanier/views/delivery.py +index 779d52c..1696919 100644 +--- a/copanier/views/delivery.py ++++ b/copanier/views/delivery.py +@@ -401,7 +401,7 @@ async def compute_payments(request, response, id): + balance.append((group_id, amount)) + + debiters, crediters = order_balance(balance) +- results = reduce_balance(debiters[:], crediters[:]) ++ results = reduce_balance(debiters[:], crediters[:], []) + + results_dict = defaultdict(partial(defaultdict, float)) + diff --git a/flakes/copanier/flake.lock b/flakes/copanier/flake.lock new file mode 100644 index 0000000..fe84a9d --- /dev/null +++ b/flakes/copanier/flake.lock @@ -0,0 +1,59 @@ +{ + "nodes": { + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/copanier/flake.nix b/flakes/copanier/flake.nix new file mode 100644 index 0000000..74e6829 --- /dev/null +++ b/flakes/copanier/flake.nix @@ -0,0 +1,28 @@ +{ + description = "Copanier"; + + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs"; + inputs.copanier = { + url = "github:spiral-project/copanier"; + flake = false; + }; + + outputs = { self, copanier, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + in rec { + packages.copanier = pkgs.callPackage ./. { src = copanier; }; + defaultPackage = packages.copanier; + legacyPackages.copanier = packages.copanier; + apps.copanier = flake-utils.lib.mkApp { drv = packages.copanier; }; + defaultApp = apps.copanier; + }) // rec { + overlays = { + copanier = final: prev: { + copanier = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.copanier; + }; + } diff --git a/flakes/copanier/poetry.lock b/flakes/copanier/poetry.lock new file mode 100644 index 0000000..232bdf3 --- /dev/null +++ b/flakes/copanier/poetry.lock @@ -0,0 +1,995 @@ +[[package]] +name = "autoroutes" +version = "0.3.5" +description = "Routes for speed" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +dev = ["cython", "pytest", "twine"] + +[[package]] +name = "biscuits" +version = "0.3.0" +description = "Fast and tasty cookies handling." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cachetools" +version = "4.2.4" +description = "Extensible memoizing collections and decorators" +category = "main" +optional = false +python-versions = "~=3.5" + +[[package]] +name = "cairocffi" +version = "1.3.0" +description = "cffi-based cairo bindings for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cffi = ">=1.1.0" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"] +xcb = ["xcffib (>=0.3.2)"] + +[[package]] +name = "cairosvg" +version = "2.5.2" +description = "A Simple SVG Converter based on Cairo" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +cairocffi = "*" +cssselect2 = "*" +defusedxml = "*" +pillow = "*" +tinycss2 = "*" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.14.6" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "charset-normalizer" +version = "2.0.6" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cssselect" +version = "1.1.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "cssselect2" +version = "0.4.1" +description = "cssselect2" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +tinycss2 = "*" +webencodings = "*" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "cssutils" +version = "2.3.0" +description = "A CSS Cascading Style Sheets library for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "mock", "lxml", "cssselect", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources"] + +[[package]] +name = "debts" +version = "0.5" +description = "Help solve debts settlement." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +jinja2 = "*" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "emails" +version = "0.6" +description = "Modern python library for emails." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +chardet = "*" +cssutils = "*" +lxml = "*" +premailer = "*" +python-dateutil = "*" +requests = "*" + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "httptools" +version = "0.2.0" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["Cython (==0.29.22)"] + +[[package]] +name = "idna" +version = "3.2" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "4.8.1" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "jdcal" +version = "1.4.1" +description = "Julian dates from proleptic Gregorian and Julian calendars." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "lxml" +version = "4.6.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["beautifulsoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "minicli" +version = "0.5.0" +description = "Minimalist CLI" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +doc = ["mkdocs (==1.1.2)"] +test = ["pytest (==6.0.1)"] + +[[package]] +name = "multifruits" +version = "0.1.5" +description = "Tasty multipart form data parser built with cython." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +dev = ["Cython (==0.29.21)"] + +[[package]] +name = "openpyxl" +version = "3.0.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +category = "main" +optional = false +python-versions = ">=3.6," + +[package.dependencies] +et-xmlfile = "*" +jdcal = "*" + +[[package]] +name = "pillow" +version = "8.3.2" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "premailer" +version = "3.10.0" +description = "Turns CSS blocks into style attributes" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +cachetools = "*" +cssselect = "*" +cssutils = "*" +lxml = "*" +requests = "*" + +[package.extras] +dev = ["tox", "twine", "therapist", "black", "flake8", "wheel"] +test = ["nose", "mock"] + +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyjwt" +version = "1.7.1" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +crypto = ["cryptography (>=1.4)"] +flake8 = ["flake8", "flake8-import-order", "pep8-naming"] +test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"] + +[[package]] +name = "pyphen" +version = "0.11.0" +description = "Pure Python module to hyphenate text" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-slugify" +version = "4.0.1" +description = "A Python Slugify application that handles Unicode" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "roll" +version = "0.13.0" +description = "Roll is a pico framework with performances and aesthetic in mind." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +autoroutes = "0.3.5" +biscuits = "0.3.0" +httptools = "0.2.0" +multifruits = "0.1.5" +websockets = "8.1" + +[package.extras] +docs = ["mkdocs"] +test = ["pytest"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tinycss2" +version = "1.1.0" +description = "tinycss2" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "ujson" +version = "3.2.0" +description = "Ultra fast JSON encoder and decoder for Python" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "weasyprint" +version = "51" +description = "The Awesome Document Factory" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +cairocffi = ">=0.9.0" +CairoSVG = ">=2.4.0" +cffi = ">=0.6" +cssselect2 = ">=0.1" +html5lib = ">=0.999999999" +Pyphen = ">=0.9.1" +tinycss2 = ">=1.0.0" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "websockets" +version = "8.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[[package]] +name = "zipp" +version = "3.6.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.7" +content-hash = "e82001513bafdfab9338f3fe9e786a7cc23c55f7e77a98e6b1d3924ab8887f5f" + +[metadata.files] +autoroutes = [ + {file = "autoroutes-0.3.5.tar.gz", hash = "sha256:087fcc5bd7e6f457931b9e8420d575f6aa7d35803d667013463c58d2bcf6b814"}, +] +biscuits = [ + {file = "biscuits-0.3.0.tar.gz", hash = "sha256:08b899164133c81b99b7307d629a45e2fb6a3bcc3ea7c08b1ff24b464b411307"}, +] +cachetools = [ + {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, + {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, +] +cairocffi = [ + {file = "cairocffi-1.3.0.tar.gz", hash = "sha256:108a3a7cb09e203bdd8501d9baad91d786d204561bd71e9364e8b34897c47b91"}, +] +cairosvg = [ + {file = "CairoSVG-2.5.2-py3-none-any.whl", hash = "sha256:98c276b7e4f0caf01e5c7176765c104ffa1aa1461d63b2053b04ab663cf7052b"}, + {file = "CairoSVG-2.5.2.tar.gz", hash = "sha256:b0b9929cf5dba005178d746a8036fcf0025550f498ca54db61873322384783bc"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cffi = [ + {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, + {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, + {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, + {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, + {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, + {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, + {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, + {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, + {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, + {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, + {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, + {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, + {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, + {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, + {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, + {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, + {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, + {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, + {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, +] +cssselect = [ + {file = "cssselect-1.1.0-py2.py3-none-any.whl", hash = "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf"}, + {file = "cssselect-1.1.0.tar.gz", hash = "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc"}, +] +cssselect2 = [ + {file = "cssselect2-0.4.1-py3-none-any.whl", hash = "sha256:2f4a9f20965367bae459e3bb42561f7927e0cfe5b7ea1692757cf67ef5d7dace"}, + {file = "cssselect2-0.4.1.tar.gz", hash = "sha256:93fbb9af860e95dd40bf18c3b2b6ed99189a07c0f29ba76f9c5be71344664ec8"}, +] +cssutils = [ + {file = "cssutils-2.3.0-py3-none-any.whl", hash = "sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46"}, + {file = "cssutils-2.3.0.tar.gz", hash = "sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00"}, +] +debts = [ + {file = "debts-0.5.tar.gz", hash = "sha256:f239fa356500b0cc7d2334a6ad45dcaf542796f759ca44052c59566afca8e5f8"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +emails = [ + {file = "emails-0.6-py2.py3-none-any.whl", hash = "sha256:72c1e3198075709cc35f67e1b49e2da1a2bc087e9b444073db61a379adfb7f3c"}, + {file = "emails-0.6.tar.gz", hash = "sha256:a4c2d67ea8b8831967a750d8edc6e77040d7693143fe280e6d2a367d9c36ff88"}, +] +et-xmlfile = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +httptools = [ + {file = "httptools-0.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:79dbc21f3612a78b28384e989b21872e2e3cf3968532601544696e4ed0007ce5"}, + {file = "httptools-0.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:78d03dd39b09c99ec917d50189e6743adbfd18c15d5944392d2eabda688bf149"}, + {file = "httptools-0.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a23166e5ae2775709cf4f7ad4c2048755ebfb272767d244e1a96d55ac775cca7"}, + {file = "httptools-0.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3ab1f390d8867f74b3b5ee2a7ecc9b8d7f53750bd45714bf1cb72a953d7dfa77"}, + {file = "httptools-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a7594f9a010cdf1e16a58b3bf26c9da39bbf663e3b8d46d39176999d71816658"}, + {file = "httptools-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:01b392a166adcc8bc2f526a939a8aabf89fe079243e1543fd0e7dc1b58d737cb"}, + {file = "httptools-0.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:80ffa04fe8c8dfacf6e4cef8277347d35b0442c581f5814f3b0cf41b65c43c6e"}, + {file = "httptools-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d5682eeb10cca0606c4a8286a3391d4c3c5a36f0c448e71b8bd05be4e1694bfb"}, + {file = "httptools-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a289c27ccae399a70eacf32df9a44059ca2ba4ac444604b00a19a6c1f0809943"}, + {file = "httptools-0.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:813871f961edea6cb2fe312f2d9b27d12a51ba92545380126f80d0de1917ea15"}, + {file = "httptools-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cc9be041e428c10f8b6ab358c6b393648f9457094e1dcc11b4906026d43cd380"}, + {file = "httptools-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b08d00d889a118f68f37f3c43e359aab24ee29eb2e3fe96d64c6a2ba8b9d6557"}, + {file = "httptools-0.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fd3b8905e21431ad306eeaf56644a68fdd621bf8f3097eff54d0f6bdf7262065"}, + {file = "httptools-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:200fc1cdf733a9ff554c0bb97a4047785cfaad9875307d6087001db3eb2b417f"}, + {file = "httptools-0.2.0.tar.gz", hash = "sha256:94505026be56652d7a530ab03d89474dc6021019d6b8682281977163b3471ea0"}, +] +idna = [ + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, +] +jdcal = [ + {file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"}, + {file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +lxml = [ + {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"}, + {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"}, + {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"}, + {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"}, + {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"}, + {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"}, + {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16"}, + {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"}, + {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"}, + {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617"}, + {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"}, + {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"}, + {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92"}, + {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"}, + {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"}, + {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae"}, + {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"}, + {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"}, + {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a"}, + {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"}, + {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"}, + {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +minicli = [ + {file = "minicli-0.5.0-py3-none-any.whl", hash = "sha256:c6118c0c6c5678cfc2ad7317dca9bfa8c4da2363337a0adbe526aeeb3007582e"}, + {file = "minicli-0.5.0.tar.gz", hash = "sha256:baea96017039c0eba448cd07d746eda623be3226367b3a532d3843154bb347ad"}, +] +multifruits = [ + {file = "multifruits-0.1.5.tar.gz", hash = "sha256:c5eff8b375121b96a96a0c4bd05cd817ec7e204feadc6c6a211ca16029f78a7f"}, +] +openpyxl = [ + {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"}, + {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"}, +] +pillow = [ + {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"}, + {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"}, + {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"}, + {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"}, + {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"}, + {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"}, + {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"}, + {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"}, + {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"}, + {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"}, + {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"}, + {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"}, + {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"}, + {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"}, + {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"}, + {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"}, + {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"}, + {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"}, + {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"}, +] +premailer = [ + {file = "premailer-3.10.0-py2.py3-none-any.whl", hash = "sha256:021b8196364d7df96d04f9ade51b794d0b77bcc19e998321c515633a2273be1a"}, + {file = "premailer-3.10.0.tar.gz", hash = "sha256:d1875a8411f5dc92b53ef9f193db6c0f879dc378d618e0ad292723e388bfe4c2"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pyjwt = [ + {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, + {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, +] +pyphen = [ + {file = "pyphen-0.11.0-py3-none-any.whl", hash = "sha256:e3c1b1d05deaa31acdd78e2e24005402358feb7a4b407c4af7e5cc2e41c4d608"}, + {file = "pyphen-0.11.0.tar.gz", hash = "sha256:e2c3ed82c3a04317df5102addafe89652b0876bc6c6265f5dd4c3efaf02315e8"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +python-slugify = [ + {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, +] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +roll = [ + {file = "roll-0.13.0-py3-none-any.whl", hash = "sha256:a9a833c791167406599f4a234c7b244e074e9e1c796f94adf99bde2894730684"}, + {file = "roll-0.13.0.tar.gz", hash = "sha256:5847d408bc74ec495d55fe7b482b4d780f88fc6ab56c0bef49336d3fa078e050"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +text-unidecode = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] +tinycss2 = [ + {file = "tinycss2-1.1.0-py3-none-any.whl", hash = "sha256:0353b5234bcaee7b1ac7ca3dea7e02cd338a9f8dcbb8f2dcd32a5795ec1e5f9a"}, + {file = "tinycss2-1.1.0.tar.gz", hash = "sha256:fbdcac3044d60eb85fdb2aa840ece43cf7dbe798e373e6ee0be545d4d134e18a"}, +] +typing-extensions = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] +ujson = [ + {file = "ujson-3.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:437e051a3e292ddbd5b4682f9b6c3e2ea4cd059d0d75bc9f8314349d63cbb015"}, + {file = "ujson-3.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a27ea44406100a97fb0fcc0b18dcdaf324824e722a00856a2992fafc65779351"}, + {file = "ujson-3.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6f7c24dabb0ff0ff43744d18211af6035ef37197f530c13edf704e627da7251d"}, + {file = "ujson-3.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:5ae6f599ef7c01ef626697f9e15e9d4e2a186ab4c0593ddb529b86866b562efb"}, + {file = "ujson-3.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:59048958793e0b0489449a414e2fbe54644457be1dd882b99a4fe16158632af1"}, + {file = "ujson-3.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a476525862a394018a7a3438c86596815b84518b2744184444fc6f8b0e3e4aee"}, + {file = "ujson-3.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:2050c7f1ce72055f1b6fba29e4694ccf4509917d3be3ed6f3543ef3ff00eec4a"}, + {file = "ujson-3.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fda324ca055e671eae46e8fc32b46fab20eb251d3e6e22beb67f71f1d240b0b4"}, + {file = "ujson-3.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0bdc62a1543d697e9c649ac0ac41e0d076a7b886d6b45f9f21971e25b90a2b27"}, + {file = "ujson-3.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d0ad63fc88d4e4cb7630f59aacd742256804a4cee447e9589e55957107a469b7"}, + {file = "ujson-3.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:66d47eabb4f0e12b5784b1a49c59bc6f32e91e18e02f2a43c5e91e2f6ad9cc60"}, + {file = "ujson-3.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:253edfe274538bb1060ab8877d51fc75e416047d5fab5340454a48b971f30612"}, + {file = "ujson-3.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6ee651c0210a67e3a72367de53ccac83b623913214e7c75015caadfad2b7e0dc"}, + {file = "ujson-3.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0784f35f2ace41ed55c435ee11f9d9877cf3e6ff03c8850f87504cb93e9a9469"}, + {file = "ujson-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:812748c8de041f1ef5e9b37f33121c0c7390055fa5f12215b3d06a63b1c055a2"}, + {file = "ujson-3.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:17460d88dd4b9630e449e5d29b97301e6dbbbedbf46a6f95f3b2cb7e1333e6ea"}, + {file = "ujson-3.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2d50cb3d87d4aabe6dbeb6ef79025bf9fdf350c4355c24819dc5c5cc38bad3dc"}, + {file = "ujson-3.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7060105de892cada2f01bd072d33b2421b4eefd32536207c1c9f2ade18656139"}, + {file = "ujson-3.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7b6496b3e2bc396628f114fd96ec41655b10c84adececc0ef8cf1c2329dae36c"}, + {file = "ujson-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:782bdf016da793a3bf138e50ed973428e59006b8d73a9e1911bc6207c6b79fff"}, + {file = "ujson-3.2.0.tar.gz", hash = "sha256:abb1996ba1c1d2faf5b1e38efa97da7f64e5373a31f705b96fe0587f5f778db4"}, +] +urllib3 = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] +weasyprint = [ + {file = "WeasyPrint-51-py3-none-any.whl", hash = "sha256:469974f6e74b1eef71dc56a9b80cc17621f319234d2a4ab656ddd0fd9e66c27f"}, + {file = "WeasyPrint-51.tar.gz", hash = "sha256:b3e971973a4f03c1430e6b838b75b5b57630415fcae8666d2be1347630ff6d6a"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +websockets = [ + {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, + {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, + {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, + {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, + {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, + {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, + {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, + {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, + {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, + {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, + {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, + {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, + {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, + {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, +] +zipp = [ + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, +] diff --git a/flakes/copanier/pyproject.toml b/flakes/copanier/pyproject.toml new file mode 100644 index 0000000..ba487ae --- /dev/null +++ b/flakes/copanier/pyproject.toml @@ -0,0 +1,40 @@ +[tool.poetry] +name = "copanier" +version = "0.0.4" +description = "" +authors = ["Your Name "] + +[tool.poetry.dependencies] +python = "^3.7" +Jinja2 = "2.11.2" +openpyxl = "3.0.5" +PyJWT = "1.7.1" +PyYAML = "5.3.1" +roll = "0.13.0" +ujson = "3.2.0" +minicli = "0.5.0" +python-slugify = "4.0.1" +debts = "0.5" +emails = "0.6" +Weasyprint = "51" + +#[tool.poetry.dev-dependencies] +#hupper = "1.10.2" +#minicli = "0.5.0" +#usine = "0.2.3" +# +#[tool.poetry.group.test.dependencies] +#pyquery = "1.4.1" +#pytest = "6.0.2" +#pytest-asyncio = "0.14.0" +# +#[tool.poetry.group.prod.dependencies] +#gunicorn = "20.0.4" +#uvloop = "0.14.0" + +[tool.poetry.scripts] +copanier = 'copanier:main' + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/flakes/diaspora/default.nix b/flakes/diaspora/default.nix new file mode 100644 index 0000000..f4038ad --- /dev/null +++ b/flakes/diaspora/default.nix @@ -0,0 +1,74 @@ +{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora", + src, stdenv, bundlerEnv, writeText, + cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }: +let + diaspora_src = stdenv.mkDerivation { + inherit (src) version; + pname = "diaspora"; + inherit src; + buildPhase = '' + ${if ldap then "patch -p1 < ${./ldap.patch}" else ""} + # FIXME: bundlerEnv below doesn't take postgresql group for some + # reason + echo 'gem "pg", "1.1.3"' >> Gemfile + ''; + installPhase = '' + cp -a . $out + ''; + }; + gems = bundlerEnv { + name = "diaspora-env"; + gemfile = "${diaspora_src}/Gemfile"; + lockfile = "${diaspora_src}/Gemfile.lock"; + gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix; + groups = [ "postgresql" "default" "production" ]; + gemConfig = defaultGemConfig // { + kostya-sigar = attrs: { + buildInputs = [ perl ]; + }; + }; + }; + build_config = writeText "diaspora.yml" '' + configuration: + environment: + certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt' + ${if podmin_email != null then '' + # dummy comment for indentation + admins: + podmin_email: '${podmin_email}' + '' else ""} + production: + environment: + ''; + dummy_token = writeText "secret_token.rb" '' + Diaspora::Application.config.secret_key_base = 'dummy' + ''; + diaspora = stdenv.mkDerivation { + name = "diaspora"; + version = src.version; + inherit diaspora_src; + builder = writeText "build_diaspora" '' + source $stdenv/setup + cp -a $diaspora_src $out + cd $out + chmod -R u+rwX . + tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru} + ln -s database.yml.example config/database.yml + ln -s ${build_config} config/diaspora.yml + ln -s ${dummy_token} config/initializers/secret_token.rb + ln -sf ${varDir}/schedule.yml config/schedule.yml + ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem + ln -sf ${varDir}/uploads public/uploads + RAILS_ENV=production ${gems}/bin/rake assets:precompile + ln -sf ${config_dir}/database.yml config/database.yml + ln -sf ${config_dir}/diaspora.yml config/diaspora.yml + ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb + rm -rf tmp log + ln -sf ${varDir}/tmp tmp + ln -sf ${varDir}/log log + ''; + propagatedBuildInputs = [ gems nodejs which git ]; + passthru = { inherit gems varDir; }; + }; +in + diaspora diff --git a/flakes/diaspora/flake.lock b/flakes/diaspora/flake.lock new file mode 100644 index 0000000..3af470f --- /dev/null +++ b/flakes/diaspora/flake.lock @@ -0,0 +1,75 @@ +{ + "nodes": { + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/diaspora/flake.nix b/flakes/diaspora/flake.nix new file mode 100644 index 0000000..21b05d6 --- /dev/null +++ b/flakes/diaspora/flake.nix @@ -0,0 +1,214 @@ +{ + description = "A privacy-aware, distributed, open source social network."; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.diaspora = { + url = "github:diaspora/diaspora/v0.7.10.0"; + flake = false; + }; + + outputs = { self, myuids, nixpkgs, diaspora, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.diaspora.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.diaspora = callPackage ./. { src = diaspora // { inherit version; }; }; + defaultPackage = packages.diaspora; + legacyPackages.diaspora = packages.diaspora; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + diaspora = final: prev: { + diaspora = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.diaspora; + nixosModule = { lib, pkgs, config, ... }: + let + name = "diaspora"; + cfg = config.services.diaspora; + + uid = config.ids.uids.diaspora; + gid = config.ids.gids.diaspora; + in + { + options.services.diaspora = { + enable = lib.mkEnableOption "Enable Diaspora’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Diaspora runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Diaspora runs"; + }; + adminEmail = lib.mkOption { + type = lib.types.str; + example = "admin@example.com"; + description = "Admin e-mail for Diaspora"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Diaspora stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Diaspora puts runtime files and sockets. + ''; + }; + configDir = lib.mkOption { + type = lib.types.path; + description = '' + The configuration path for Diaspora. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.diaspora; + description = '' + Diaspora package to use. + ''; + }; + withLdap = lib.mkEnableOption "Add ldap patch"; + # Output variables + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Diaspora data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Diaspora sockets directory for systemd + ''; + readOnly = true; + }; + workdir = lib.mkOption { + type = lib.types.package; + default = cfg.package.override { + varDir = cfg.dataDir; + podmin_email = cfg.adminEmail; + config_dir = cfg.configDir; + ldap = cfg.withLdap; + }; + description = '' + Adjusted diaspora package with overriden values + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + rails = "${cfg.socketsDir}/diaspora.sock"; + eye = "${cfg.socketsDir}/eye.sock"; + }; + readOnly = true; + description = '' + Diaspora sockets + ''; + }; + pids = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + eye = "${cfg.socketsDir}/eye.pid"; + }; + readOnly = true; + description = '' + Diaspora pids + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + uid = myuids.lib.uids.diaspora; + group = cfg.group; + description = "Diaspora user"; + home = cfg.dataDir; + packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ]; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + gid = myuids.lib.gids.diaspora; + }; + }; + + systemd.services.diaspora = { + description = "Diaspora"; + wantedBy = [ "multi-user.target" ]; + after = [ + "network.target" "redis.service" "postgresql.service" + ]; + wants = [ + "redis.service" "postgresql.service" + ]; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.EYE_SOCK = cfg.sockets.eye; + environment.EYE_PID = cfg.pids.eye; + + path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ]; + + preStart = '' + install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log + install -m 0700 -d ${cfg.dataDir}/tmp/pids + if [ ! -f ${cfg.dataDir}/schedule.yml ]; then + echo "{}" > ${cfg.dataDir}/schedule.yml + fi + ./bin/bundle exec rails db:migrate + ''; + + script = '' + exec ${cfg.workdir}/script/server + ''; + + serviceConfig = { + User = cfg.user; + PrivateTmp = true; + Restart = "always"; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StandardInput = "null"; + KillMode = "control-group"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + }; + }; + }; +} + diff --git a/pkgs/webapps/diaspora/gemset.nix b/flakes/diaspora/gemset.nix similarity index 100% rename from pkgs/webapps/diaspora/gemset.nix rename to flakes/diaspora/gemset.nix diff --git a/pkgs/webapps/diaspora/gemset_ldap.nix b/flakes/diaspora/gemset_ldap.nix similarity index 100% rename from pkgs/webapps/diaspora/gemset_ldap.nix rename to flakes/diaspora/gemset_ldap.nix diff --git a/pkgs/webapps/diaspora/ldap.patch b/flakes/diaspora/ldap.patch similarity index 100% rename from pkgs/webapps/diaspora/ldap.patch rename to flakes/diaspora/ldap.patch diff --git a/pkgs/webapps/etherpad-lite/default.nix b/flakes/etherpad-lite/default.nix similarity index 77% rename from pkgs/webapps/etherpad-lite/default.nix rename to flakes/etherpad-lite/default.nix index 4327384..1dd5aa4 100644 --- a/pkgs/webapps/etherpad-lite/default.nix +++ b/flakes/etherpad-lite/default.nix @@ -1,7 +1,6 @@ { varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too! -, stdenv, callPackage, mylibs, lib }: +, nodeEnv, stdenv, callPackage, src, lib, nodejs }: let - nodeEnv = callPackage mylibs.nodeEnv {}; moduleNames = [ "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark" "ep_clear_formatting" "ep_colors" "ep_comments_page" @@ -14,9 +13,9 @@ let ]; # nix files are built using node2nix -i node-packages.json allModules = lib.attrsets.genAttrs moduleNames - (name: (callPackage (./modules + "/${name}/node-packages.nix") { inherit nodeEnv; }).${name}); - toPassthru = pkg: { - inherit varDir allModules; + (name: (callPackage (./modules + "/${name}/node-packages.nix") { nodeEnv = callPackage nodeEnv {}; }).${name}); + toPassthru = pkg: moduleNames: { + inherit varDir allModules nodejs moduleNames; withModules = withModules pkg; }; withModules = pkg: toModules: @@ -29,16 +28,20 @@ let ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized fi ''; + modulesNames = map (n: n.packageName) modules; newEtherpad = pkg.overrideAttrs(old: { installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallModule modules); - passthru = toPassthru newEtherpad; + passthru = toPassthru newEtherpad moduleNames; }); in newEtherpad; # built using node2nix -l package-lock.json # and changing "./." to "src" node-environment = (callPackage ./node-packages.nix { - inherit nodeEnv; - src = stdenv.mkDerivation (mylibs.fetchedGithub ./etherpad-lite.json // rec { + nodeEnv = callPackage nodeEnv {}; + src = stdenv.mkDerivation { + pname = "etherpad-lite"; + version = src.version; + inherit src; patches = [ ./libreoffice_patch.diff ]; buildPhase = '' touch src/.ep_initialized @@ -46,18 +49,20 @@ let installPhase = '' cp -a src/ $out ''; - }); + }; }).package; package = stdenv.mkDerivation rec { - name = (mylibs.fetchedGithub ./etherpad-lite.json).name; + name = "etherpad-lite-${src.version}"; src = node-environment; + version = src.version; installPhase = '' mkdir -p $out mkdir $out/node_modules cp -a lib/node_modules/ep_etherpad-lite $out/src chmod u+w $out/src/static/js/ ln -s ../src $out/node_modules/ep_etherpad-lite + ln -s ${varDir}/var $out/var ''; - passthru = toPassthru package; + passthru = toPassthru package []; }; in package diff --git a/flakes/etherpad-lite/etherpad_cleanup.sql b/flakes/etherpad-lite/etherpad_cleanup.sql new file mode 100644 index 0000000..4002715 --- /dev/null +++ b/flakes/etherpad-lite/etherpad_cleanup.sql @@ -0,0 +1,30 @@ +DO $$ + DECLARE todelete record; + BEGIN + FOR todelete IN + select split_part(key, ':', 4) as k from store where key like 'mypads:jobqueue:deletePad:%' + LOOP + select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || todelete.k); + select * from store where key = 'pad2readonly:' || todelete.k; + select * from store where key like 'pad:' || todelete.k || ':revs:%'; + select * from store where key like 'pad:' || todelete.k || ':chats:%'; + END LOOP; + END $$ + +-- /nix/store/1i77431p6996lbyflpkb803zsiaj24kx-etherpad-lite-1.8.3/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js +for toDelete in + select split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%' +loop + select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || toDelete); + select * from store where key = 'pad2readonly:' || toDelete; + select * from store where key like 'pad:' || toDelete || ':revs:%'; + select * from store where key like 'pad:' || toDelete || ':chats:%'; +end loop +--select * from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'); +-- +--delete from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%')) +--delete from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'); +--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':revs:%' from store where key like 'mypads:jobqueue:deletePad:%'); +--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':chats:%' from store where key like 'mypads:jobqueue:deletePad:%'); +--delete from store where key like 'mypads:jobqueue:deletePad:%'; + diff --git a/flakes/etherpad-lite/flake.lock b/flakes/etherpad-lite/flake.lock new file mode 100644 index 0000000..19d9ffa --- /dev/null +++ b/flakes/etherpad-lite/flake.lock @@ -0,0 +1,150 @@ +{ + "nodes": { + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils", + "mypackages": "mypackages", + "nixpkgs": "nixpkgs_2" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/etherpad-lite/flake.nix b/flakes/etherpad-lite/flake.nix new file mode 100644 index 0000000..6e0d7db --- /dev/null +++ b/flakes/etherpad-lite/flake.nix @@ -0,0 +1,227 @@ +{ + description = "Your self-hosted, globally interconnected microblogging community"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.etherpad-lite = { + url = "github:ether/etherpad-lite/1.8.3"; + flake = false; + }; + inputs.mypackages.url = "path:../mypackages"; + + outputs = { self, nixpkgs, etherpad-lite, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.etherpad-lite.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.etherpad-lite = callPackage ./. { inherit (mypackages.mylibs) nodeEnv; src = etherpad-lite // { inherit version; }; }; + defaultPackage = packages.etherpad-lite; + legacyPackages.etherpad-lite = packages.etherpad-lite; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + etherpad-lite = final: prev: { + etherpad-lite = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.etherpad-lite; + nixosModule = { lib, pkgs, config, ... }: + let + name = "etherpad-lite"; + cfg = config.services.etherpad-lite; + in + { + options.services.etherpad-lite = { + enable = lib.mkEnableOption "Enable Etherpad lite’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Etherpad lite runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Etherpad lite runs"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Etherpad lite stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Etherpad lite stores its sockets. + ''; + }; + configFile = lib.mkOption { + type = lib.types.path; + description = '' + The config file path for Etherpad lite. + ''; + }; + sessionKeyFile = lib.mkOption { + type = lib.types.path; + description = '' + The Session key file path for Etherpad lite. + ''; + }; + apiKeyFile = lib.mkOption { + type = lib.types.path; + description = '' + The API key file path for Etherpad lite. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.etherpad-lite; + description = '' + Etherpad lite package to use. + ''; + example = lib.literalExample '' + pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]); + ''; + }; + modules = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = []; + description = '' + Etherpad lite modules to use. + DEPRECATED: use package directly + ''; + }; + # Output variables + workdir = lib.mkOption { + type = lib.types.package; + default = cfg.package.withModules (_: cfg.modules); + description = '' + Adjusted Etherpad lite package with plugins + ''; + readOnly = true; + }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Etherpad lite data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Etherpad lite sockets directory for systemd + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + node = "${cfg.socketsDir}/etherpad-lite.sock"; + }; + readOnly = true; + description = '' + Etherpad lite sockets + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + systemd.services.etherpad-lite-cleanup = { + description = "Etherpad-lite cleanup old mypads"; + after = [ "network.target" "postgresql.service" ]; + wants = [ "postgresql.service" ]; + + environment.NODE_ENV = "production"; + environment.HOME = cfg.workdir; + + path = [ cfg.workdir.nodejs ]; + + script = '' + exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js \ + --settings ${cfg.configFile} \ + --oneshot + ''; + + serviceConfig = { + DynamicUser = true; + User = cfg.user; + Group = cfg.group; + WorkingDirectory = "%T"; + PrivateTmp = true; + NoNewPrivileges = true; + PrivateDevices = true; + ProtectHome = true; + ProtectControlGroups = true; + ProtectKernelModules = true; + Type = "oneshot"; + }; + }; + systemd.services.etherpad-lite = { + description = "Etherpad-lite"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "postgresql.service" ]; + wants = [ "postgresql.service" ]; + + environment.NODE_ENV = "production"; + environment.HOME = cfg.workdir; + + path = [ cfg.workdir.nodejs ]; + + script = '' + exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \ + --sessionkey ${cfg.sessionKeyFile} \ + --apikey ${cfg.apiKeyFile} \ + --settings ${cfg.configFile} + ''; + + postStart = '' + while [ ! -S ${cfg.sockets.node} ]; do + sleep 0.5 + done + chmod a+w ${cfg.sockets.node} + ''; + serviceConfig = { + DynamicUser = true; + User = cfg.user; + Group = cfg.group; + WorkingDirectory = cfg.workdir; + PrivateTmp = true; + NoNewPrivileges = true; + PrivateDevices = true; + ProtectHome = true; + ProtectControlGroups = true; + ProtectKernelModules = true; + Restart = "always"; + Type = "simple"; + TimeoutSec = 60; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StateDirectory= cfg.systemdStateDirectory; + ExecStartPre = [ + "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/var ${cfg.dataDir}/ep_initialized" + "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}" + ]; + }; + }; + + }; + }; + }; +} + + diff --git a/pkgs/webapps/etherpad-lite/libreoffice_patch.diff b/flakes/etherpad-lite/libreoffice_patch.diff similarity index 100% rename from pkgs/webapps/etherpad-lite/libreoffice_patch.diff rename to flakes/etherpad-lite/libreoffice_patch.diff diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json rename to flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix rename to flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json rename to flakes/etherpad-lite/modules/ep_adminpads/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix rename to flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json b/flakes/etherpad-lite/modules/ep_align/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json rename to flakes/etherpad-lite/modules/ep_align/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix b/flakes/etherpad-lite/modules/ep_align/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix rename to flakes/etherpad-lite/modules/ep_align/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json rename to flakes/etherpad-lite/modules/ep_bookmark/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix rename to flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json rename to flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix rename to flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json b/flakes/etherpad-lite/modules/ep_colors/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json rename to flakes/etherpad-lite/modules/ep_colors/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix b/flakes/etherpad-lite/modules/ep_colors/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix rename to flakes/etherpad-lite/modules/ep_colors/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json rename to flakes/etherpad-lite/modules/ep_comments_page/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix rename to flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json rename to flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix rename to flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json rename to flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix rename to flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json rename to flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix rename to flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch b/flakes/etherpad-lite/modules/ep_embedmedia/fix.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch rename to flakes/etherpad-lite/modules/ep_embedmedia/fix.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json rename to flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix rename to flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json b/flakes/etherpad-lite/modules/ep_font_family/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json rename to flakes/etherpad-lite/modules/ep_font_family/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_family/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix rename to flakes/etherpad-lite/modules/ep_font_family/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json b/flakes/etherpad-lite/modules/ep_font_size/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json rename to flakes/etherpad-lite/modules/ep_font_size/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_size/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix rename to flakes/etherpad-lite/modules/ep_font_size/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json b/flakes/etherpad-lite/modules/ep_headings2/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json rename to flakes/etherpad-lite/modules/ep_headings2/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix b/flakes/etherpad-lite/modules/ep_headings2/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix rename to flakes/etherpad-lite/modules/ep_headings2/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json b/flakes/etherpad-lite/modules/ep_immae_buttons/ep.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json rename to flakes/etherpad-lite/modules/ep_immae_buttons/ep.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js b/flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js rename to flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix b/flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix rename to flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json b/flakes/etherpad-lite/modules/ep_immae_buttons/package.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json rename to flakes/etherpad-lite/modules/ep_immae_buttons/package.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js b/flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js rename to flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs b/flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs rename to flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json rename to flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix rename to flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch b/flakes/etherpad-lite/modules/ep_line_height/fix.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch rename to flakes/etherpad-lite/modules/ep_line_height/fix.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json b/flakes/etherpad-lite/modules/ep_line_height/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json rename to flakes/etherpad-lite/modules/ep_line_height/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix b/flakes/etherpad-lite/modules/ep_line_height/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix rename to flakes/etherpad-lite/modules/ep_line_height/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json b/flakes/etherpad-lite/modules/ep_markdown/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json rename to flakes/etherpad-lite/modules/ep_markdown/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix b/flakes/etherpad-lite/modules/ep_markdown/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix rename to flakes/etherpad-lite/modules/ep_markdown/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch b/flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch rename to flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json b/flakes/etherpad-lite/modules/ep_mypads/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json rename to flakes/etherpad-lite/modules/ep_mypads/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix b/flakes/etherpad-lite/modules/ep_mypads/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix rename to flakes/etherpad-lite/modules/ep_mypads/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json b/flakes/etherpad-lite/modules/ep_page_view/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json rename to flakes/etherpad-lite/modules/ep_page_view/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix b/flakes/etherpad-lite/modules/ep_page_view/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix rename to flakes/etherpad-lite/modules/ep_page_view/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json rename to flakes/etherpad-lite/modules/ep_previewimages/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix rename to flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json rename to flakes/etherpad-lite/modules/ep_private_pad/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix rename to flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json b/flakes/etherpad-lite/modules/ep_ruler/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json rename to flakes/etherpad-lite/modules/ep_ruler/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix b/flakes/etherpad-lite/modules/ep_ruler/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix rename to flakes/etherpad-lite/modules/ep_ruler/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json rename to flakes/etherpad-lite/modules/ep_scrollto/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix rename to flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json rename to flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix rename to flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch rename to flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json rename to flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix rename to flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json rename to flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix rename to flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/node-packages.nix b/flakes/etherpad-lite/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/node-packages.nix rename to flakes/etherpad-lite/node-packages.nix diff --git a/flakes/files-watcher/flake.nix b/flakes/files-watcher/flake.nix index 29ea428..3be566d 100644 --- a/flakes/files-watcher/flake.nix +++ b/flakes/files-watcher/flake.nix @@ -2,6 +2,8 @@ description = "Module to watch fo file changes to force restart systemd service"; outputs = { self }: { nixosModule = { config, lib, pkgs, ... }: let cfg = config.services.filesWatcher; in with lib; { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options = { services.filesWatcher = with lib.types; mkOption { default = {}; diff --git a/flakes/flake.lock b/flakes/flake.lock new file mode 100644 index 0000000..c65312c --- /dev/null +++ b/flakes/flake.lock @@ -0,0 +1,9669 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_2": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_17" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_3": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_33" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_4": { + "inputs": { + "flake-utils": "flake-utils_34", + "nixpkgs": "nixpkgs_56" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_5": { + "inputs": { + "flake-utils": "flake-utils_37", + "nixpkgs": "nixpkgs_64" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_6": { + "inputs": { + "flake-utils": "flake-utils_39", + "nixpkgs": "nixpkgs_71" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_7": { + "inputs": { + "flake-utils": "flake-utils_61", + "nixpkgs": "nixpkgs_100" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "buildslist_2": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "chatons_2": { + "inputs": { + "environment": "environment_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_3", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_2": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_12", + "stable": "stable_2" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_19", + "stable": "stable_3" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_32", + "nixpkgs": "nixpkgs_50", + "stable": "stable_4" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_5": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_35", + "nixpkgs": "nixpkgs_58", + "stable": "stable_5" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_6": { + "inputs": { + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_38", + "nixpkgs": "nixpkgs_66", + "stable": "stable_6" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_7": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_45", + "nixpkgs": "nixpkgs_80", + "stable": "stable_7" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "copanier_2": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "diaspora_2": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_2": { + "inputs": { + "nixpkgs": "nixpkgs_13" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_3": { + "inputs": { + "nixpkgs": "nixpkgs_20" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_4": { + "inputs": { + "nixpkgs": "nixpkgs_51" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_5": { + "inputs": { + "nixpkgs": "nixpkgs_59" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_6": { + "inputs": { + "nixpkgs": "nixpkgs_67" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_7": { + "inputs": { + "nixpkgs": "nixpkgs_81" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "n-eldiron", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "etherpad-lite_2": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_13" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_15" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_12": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_16" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_13": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_18" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_14": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_19" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_15": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_20" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_16": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_21" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_17": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_22" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_18": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_23" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_19": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_24" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_20": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_25" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_21": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_27" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_22": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_28" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_9" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_10" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_11" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_12" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_33": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_40": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_41": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_42": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_43": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_44": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_45": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_46": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_47": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_48": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_49": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_50": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_51": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_52": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_53": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_54": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_55": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_56": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_57": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_58": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_59": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_60": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_61": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_62": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_63": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "grocy_2": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mail-relay_2": { + "inputs": { + "environment": "environment_20", + "secrets": "secrets_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mastodon_2": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "mediagoblin_2": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_2": { + "inputs": { + "environment": "environment_9", + "naemon": "naemon_2", + "nixpkgs-lib": "nixpkgs-lib_4", + "secrets": "secrets_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_3": { + "inputs": { + "environment": "environment_21", + "naemon": "naemon_4", + "nixpkgs-lib": "nixpkgs-lib_14", + "secrets": "secrets_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_4": { + "inputs": { + "environment": "environment_24", + "naemon": "naemon_5", + "nixpkgs-lib": "nixpkgs-lib_17", + "secrets": "secrets_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_11", + "myuids": "myuids_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_2": { + "inputs": { + "colmena": "colmena_2", + "disko": "disko_2", + "flake-parts": "flake-parts_3", + "nixos-anywhere": "nixos-anywhere_2", + "nixpkgs": "nixpkgs_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_3": { + "inputs": { + "colmena": "colmena_3", + "disko": "disko_3", + "flake-parts": "flake-parts_5", + "nixos-anywhere": "nixos-anywhere_3", + "nixpkgs": "nixpkgs_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_4": { + "inputs": { + "colmena": "colmena_4", + "disko": "disko_4", + "flake-parts": "flake-parts_11", + "nixos-anywhere": "nixos-anywhere_4", + "nixpkgs": "nixpkgs_53" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_5": { + "inputs": { + "colmena": "colmena_5", + "disko": "disko_5", + "flake-parts": "flake-parts_13", + "nixos-anywhere": "nixos-anywhere_5", + "nixpkgs": "nixpkgs_61" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_6": { + "inputs": { + "colmena": "colmena_6", + "disko": "disko_6", + "flake-parts": "flake-parts_15", + "nixos-anywhere": "nixos-anywhere_6", + "nixpkgs": "nixpkgs_69" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_11", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_10": { + "inputs": { + "flake-parts": "flake-parts_17", + "nixpkgs": "nixpkgs_76", + "webapps-ttrss": "webapps-ttrss_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_11": { + "inputs": { + "flake-parts": "flake-parts_18", + "nixpkgs": "nixpkgs_78", + "webapps-ttrss": "webapps-ttrss_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_12": { + "inputs": { + "flake-parts": "flake-parts_21", + "nixpkgs": "nixpkgs_101", + "webapps-ttrss": "webapps-ttrss_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_13": { + "inputs": { + "flake-parts": "flake-parts_22", + "nixpkgs": "nixpkgs_102", + "webapps-ttrss": "webapps-ttrss_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_4", + "nixpkgs": "nixpkgs_18", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_6", + "nixpkgs": "nixpkgs_34", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_7", + "nixpkgs": "nixpkgs_37", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_5": { + "inputs": { + "flake-parts": "flake-parts_8", + "nixpkgs": "nixpkgs_39", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_6": { + "inputs": { + "flake-parts": "flake-parts_10", + "nixpkgs": "nixpkgs_47", + "webapps-ttrss": "webapps-ttrss_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_7": { + "inputs": { + "flake-parts": "flake-parts_12", + "nixpkgs": "nixpkgs_57", + "webapps-ttrss": "webapps-ttrss_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_8": { + "inputs": { + "flake-parts": "flake-parts_14", + "nixpkgs": "nixpkgs_65", + "webapps-ttrss": "webapps-ttrss_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_9": { + "inputs": { + "flake-parts": "flake-parts_16", + "nixpkgs": "nixpkgs_72", + "webapps-ttrss": "webapps-ttrss_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_34": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_35": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_36": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_37": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_38": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_39": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_40": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_41": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_42": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "n-backup-2": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_7", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=", + "path": "../systems/backup-2", + "type": "path" + }, + "original": { + "path": "../systems/backup-2", + "type": "path" + } + }, + "n-dilion": { + "inputs": { + "environment": "environment_8", + "files-watcher": "files-watcher_4", + "loginctl-linger": "loginctl-linger_2", + "monitoring": "monitoring_2", + "my-lib": "my-lib_2", + "myuids": "myuids_7", + "nixpkgs": "nixpkgs_16", + "secrets": "secrets_8", + "ssh": "ssh", + "system": "system_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=", + "path": "../systems/dilion", + "type": "path" + }, + "original": { + "path": "../systems/dilion", + "type": "path" + } + }, + "n-eldiron": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib_3", + "nixpkgs": "nixpkgs_23", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=", + "path": "../systems/eldiron", + "type": "path" + }, + "original": { + "path": "../systems/eldiron", + "type": "path" + } + }, + "n-monitoring-1": { + "inputs": { + "chatons": "chatons_2", + "environment": "environment_19", + "files-watcher": "files-watcher_9", + "loginctl-linger": "loginctl-linger_3", + "mail-relay": "mail-relay_2", + "monitoring": "monitoring_3", + "my-lib": "my-lib_4", + "myuids": "myuids_23", + "nixpkgs": "nixpkgs_54", + "php": "php", + "secrets": "secrets_17", + "system": "system_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=", + "path": "../systems/monitoring-1", + "type": "path" + }, + "original": { + "path": "../systems/monitoring-1", + "type": "path" + } + }, + "n-quatresaisons": { + "inputs": { + "environment": "environment_23", + "files-watcher": "files-watcher_10", + "landing-page": "landing-page", + "monitoring": "monitoring_4", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib_5", + "myuids": "myuids_26", + "nixpkgs": "nixpkgs_62", + "php": "php_2", + "secrets": "secrets_19", + "system": "system_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=", + "path": "../systems/quatresaisons", + "type": "path" + }, + "original": { + "path": "../systems/quatresaisons", + "type": "path" + } + }, + "n-zoldene": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib_6", + "nixpkgs": "nixpkgs_70", + "private-environment": "private-environment_2", + "private-system": "private-system_2", + "public-secrets": "public-secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=", + "path": "../systems/zoldene", + "type": "path" + }, + "original": { + "path": "../systems/zoldene", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_2": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_3": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_4": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_5": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_6": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_7": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "n-backup-2", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-backup-2", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_5", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_2": { + "inputs": { + "disko": [ + "n-dilion", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-dilion", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_2", + "nixos-images": "nixos-images_2", + "nixpkgs": "nixpkgs_14", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_3": { + "inputs": { + "disko": [ + "n-eldiron", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-eldiron", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_3", + "nixos-images": "nixos-images_3", + "nixpkgs": "nixpkgs_21", + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_4": { + "inputs": { + "disko": [ + "n-monitoring-1", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-monitoring-1", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_4", + "nixos-images": "nixos-images_4", + "nixpkgs": "nixpkgs_52", + "treefmt-nix": "treefmt-nix_4" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_5": { + "inputs": { + "disko": [ + "n-quatresaisons", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-quatresaisons", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_5", + "nixos-images": "nixos-images_5", + "nixpkgs": "nixpkgs_60", + "treefmt-nix": "treefmt-nix_5" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_6": { + "inputs": { + "disko": [ + "n-zoldene", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-zoldene", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_6", + "nixos-images": "nixos-images_6", + "nixpkgs": "nixpkgs_68", + "treefmt-nix": "treefmt-nix_6" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_7": { + "inputs": { + "disko": [ + "s-lib", + "disko" + ], + "flake-parts": [ + "s-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_7", + "nixos-images": "nixos-images_7", + "nixpkgs": "nixpkgs_82", + "treefmt-nix": "treefmt-nix_7" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_2": { + "inputs": { + "nixos-2305": [ + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_3": { + "inputs": { + "nixos-2305": [ + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_4": { + "inputs": { + "nixos-2305": [ + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_5": { + "inputs": { + "nixos-2305": [ + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_6": { + "inputs": { + "nixos-2305": [ + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_7": { + "inputs": { + "nixos-2305": [ + "s-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_2": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_3": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_10": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_11": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_12": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_13": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_14": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_15": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_16": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_17": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_18": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_19": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_20": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_21": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_22": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_23": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_24": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_25": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_26": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_27": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_28": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_8": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_9": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_100": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_101": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_102": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_103": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_104": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_23": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_24": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_25": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_33": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_36": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_37": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_38": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_39": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_41": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_42": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_43": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_48": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_49": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_55": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_56": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_64": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_72": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_73": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_74": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_75": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_76": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_77": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_78": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_79": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_80": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_81": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_82": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_83": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_84": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_85": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_86": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_87": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_88": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_89": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_90": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_91": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_92": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_93": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_94": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_95": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_96": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_97": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_98": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_99": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_10": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_11": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_12": { + "inputs": { + "flake-utils": "flake-utils_53", + "myuids": "myuids_36", + "nixpkgs": "nixpkgs_92", + "openarc": "openarc_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_13": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_14": { + "inputs": { + "flake-utils": "flake-utils_55", + "myuids": "myuids_38", + "nixpkgs": "nixpkgs_94", + "openarc": "openarc_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_15": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_6": { + "inputs": { + "flake-utils": "flake-utils_12", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_25", + "openarc": "openarc_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_7": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_8": { + "inputs": { + "flake-utils": "flake-utils_14", + "myuids": "myuids_11", + "nixpkgs": "nixpkgs_27", + "openarc": "openarc_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_9": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_26" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_5": { + "inputs": { + "flake-utils": "flake-utils_15", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_28" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_6": { + "inputs": { + "flake-utils": "flake-utils_54", + "myuids": "myuids_37", + "nixpkgs": "nixpkgs_93" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_7": { + "inputs": { + "flake-utils": "flake-utils_56", + "myuids": "myuids_39", + "nixpkgs": "nixpkgs_95" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "paste_2": { + "inputs": { + "flake-utils": "flake-utils_57", + "nixpkgs": "nixpkgs_96" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_4": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_5": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_6": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_17", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_30", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_open_instance_2": { + "inputs": { + "flake-utils": "flake-utils_58", + "myuids": "myuids_40", + "nixpkgs": "nixpkgs_97", + "peertube": "peertube_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_18", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_31", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin_2": { + "inputs": { + "flake-utils": "flake-utils_59", + "myuids": "myuids_41", + "nixpkgs": "nixpkgs_98", + "peertube": "peertube_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": "nixpkgs_55", + "nixpkgs-4": "nixpkgs-4_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "php_2": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_63", + "nixpkgs-4": "nixpkgs-4_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_13", + "files-watcher": "files-watcher_5", + "openarc": "openarc_6", + "opendmarc": "opendmarc_4", + "secrets": "secrets_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_14", + "naemon": "naemon_3", + "nixpkgs-lib": "nixpkgs-lib_8", + "secrets": "secrets_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_6", + "openarc": "openarc_8", + "secrets": "secrets_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_15", + "files-watcher": "files-watcher_7", + "opendmarc": "opendmarc_5", + "secrets": "secrets_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_32", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_16", + "secrets": "secrets_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports_3", + "environment": "environment_17", + "mypackages": "mypackages_3", + "myuids": "myuids_15", + "secrets-public": "secrets-public_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "private-system_2": { + "inputs": { + "backports": "backports_6", + "environment": "environment_26", + "mypackages": "mypackages_9", + "myuids": "myuids_28", + "secrets-public": "secrets-public_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_35" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_22", + "myuids": "myuids_16", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_23", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_38" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_24", + "grocy": "grocy", + "mypackages": "mypackages_5", + "nixpkgs": "nixpkgs_40" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_25", + "mastodon": "mastodon", + "myuids": "myuids_17", + "nixpkgs": "nixpkgs_41" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_26", + "mediagoblin": "mediagoblin", + "myuids": "myuids_18", + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_8", + "myuids": "myuids_19" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_9", + "nixpkgs": "nixpkgs_43", + "webapps-ttrss": "webapps-ttrss_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_27", + "myuids": "myuids_20", + "nixpkgs": "nixpkgs_44", + "openarc": "openarc_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_28", + "myuids": "myuids_21", + "nixpkgs": "nixpkgs_45" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_29", + "myuids": "myuids_22", + "nixpkgs": "nixpkgs_46", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_30", + "mypackages": "mypackages_6", + "nixpkgs": "nixpkgs_48", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": "nixpkgs_49", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "n-backup-2": "n-backup-2", + "n-dilion": "n-dilion", + "n-eldiron": "n-eldiron", + "n-monitoring-1": "n-monitoring-1", + "n-quatresaisons": "n-quatresaisons", + "n-zoldene": "n-zoldene", + "s-backports": "s-backports", + "s-copanier": "s-copanier", + "s-diaspora": "s-diaspora", + "s-etherpad-lite": "s-etherpad-lite", + "s-fiche": "s-fiche", + "s-files-watcher": "s-files-watcher", + "s-grocy": "s-grocy", + "s-lib": "s-lib", + "s-loginctl-linger": "s-loginctl-linger", + "s-mastodon": "s-mastodon", + "s-mediagoblin": "s-mediagoblin", + "s-multi-apache-container": "s-multi-apache-container", + "s-mypackages": "s-mypackages", + "s-myuids": "s-myuids", + "s-naemon": "s-naemon", + "s-openarc": "s-openarc", + "s-opendmarc": "s-opendmarc", + "s-paste": "s-paste", + "s-peertube": "s-peertube", + "s-private-buildbot": "s-private-buildbot", + "s-private-chatons": "s-private-chatons", + "s-private-environment": "s-private-environment", + "s-private-mail-relay": "s-private-mail-relay", + "s-private-milters": "s-private-milters", + "s-private-monitoring": "s-private-monitoring", + "s-private-openarc": "s-private-openarc", + "s-private-opendmarc": "s-private-opendmarc", + "s-private-openldap": "s-private-openldap", + "s-private-paste": "s-private-paste", + "s-private-peertube": "s-private-peertube", + "s-private-php": "s-private-php", + "s-private-ssh": "s-private-ssh", + "s-private-system": "s-private-system", + "s-rsync_backup": "s-rsync_backup", + "s-secrets": "s-secrets", + "s-surfer": "s-surfer", + "s-taskwarrior-web": "s-taskwarrior-web", + "secrets": "secrets_26" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "s-backports": { + "inputs": { + "flake-utils": "flake-utils_40", + "nixpkgs": "nixpkgs_73" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "./backports", + "type": "path" + }, + "original": { + "path": "./backports", + "type": "path" + } + }, + "s-copanier": { + "inputs": { + "copanier": "copanier_2", + "flake-utils": "flake-utils_41", + "nixpkgs": "nixpkgs_74" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "./copanier", + "type": "path" + }, + "original": { + "path": "./copanier", + "type": "path" + } + }, + "s-diaspora": { + "inputs": { + "diaspora": "diaspora_2", + "flake-utils": "flake-utils_42", + "myuids": "myuids_29", + "nixpkgs": "nixpkgs_75" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "./diaspora", + "type": "path" + }, + "original": { + "path": "./diaspora", + "type": "path" + } + }, + "s-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite_2", + "flake-utils": "flake-utils_43", + "mypackages": "mypackages_10", + "nixpkgs": "nixpkgs_77" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "./etherpad-lite", + "type": "path" + }, + "original": { + "path": "./etherpad-lite", + "type": "path" + } + }, + "s-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "./fiche", + "type": "path" + }, + "original": { + "path": "./fiche", + "type": "path" + } + }, + "s-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "./files-watcher", + "type": "path" + }, + "original": { + "path": "./files-watcher", + "type": "path" + } + }, + "s-grocy": { + "inputs": { + "flake-utils": "flake-utils_44", + "grocy": "grocy_2", + "mypackages": "mypackages_11", + "nixpkgs": "nixpkgs_79" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "./grocy", + "type": "path" + }, + "original": { + "path": "./grocy", + "type": "path" + } + }, + "s-lib": { + "inputs": { + "colmena": "colmena_7", + "disko": "disko_7", + "flake-parts": "flake-parts_19", + "nixos-anywhere": "nixos-anywhere_7", + "nixpkgs": "nixpkgs_83" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "./lib", + "type": "path" + }, + "original": { + "path": "./lib", + "type": "path" + } + }, + "s-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "./loginctl-linger", + "type": "path" + }, + "original": { + "path": "./loginctl-linger", + "type": "path" + } + }, + "s-mastodon": { + "inputs": { + "flake-utils": "flake-utils_46", + "mastodon": "mastodon_2", + "myuids": "myuids_30", + "nixpkgs": "nixpkgs_84" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "./mastodon", + "type": "path" + }, + "original": { + "path": "./mastodon", + "type": "path" + } + }, + "s-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_47", + "mediagoblin": "mediagoblin_2", + "myuids": "myuids_31", + "nixpkgs": "nixpkgs_85" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "./mediagoblin", + "type": "path" + }, + "original": { + "path": "./mediagoblin", + "type": "path" + } + }, + "s-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_12", + "myuids": "myuids_32" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "./multi-apache-container", + "type": "path" + }, + "original": { + "path": "./multi-apache-container", + "type": "path" + } + }, + "s-mypackages": { + "inputs": { + "flake-parts": "flake-parts_20", + "nixpkgs": "nixpkgs_86", + "webapps-ttrss": "webapps-ttrss_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "./mypackages", + "type": "path" + }, + "original": { + "path": "./mypackages", + "type": "path" + } + }, + "s-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "./myuids", + "type": "path" + }, + "original": { + "path": "./myuids", + "type": "path" + } + }, + "s-naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "./naemon", + "type": "path" + }, + "original": { + "path": "./naemon", + "type": "path" + } + }, + "s-openarc": { + "inputs": { + "flake-utils": "flake-utils_48", + "myuids": "myuids_33", + "nixpkgs": "nixpkgs_87", + "openarc": "openarc_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "./openarc", + "type": "path" + }, + "original": { + "path": "./openarc", + "type": "path" + } + }, + "s-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_49", + "myuids": "myuids_34", + "nixpkgs": "nixpkgs_88" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "./opendmarc", + "type": "path" + }, + "original": { + "path": "./opendmarc", + "type": "path" + } + }, + "s-paste": { + "inputs": { + "flake-utils": "flake-utils_50", + "nixpkgs": "nixpkgs_89" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "./paste", + "type": "path" + }, + "original": { + "path": "./paste", + "type": "path" + } + }, + "s-peertube": { + "inputs": { + "flake-utils": "flake-utils_51", + "myuids": "myuids_35", + "nixpkgs": "nixpkgs_90", + "peertube": "peertube_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./peertube", + "type": "path" + }, + "original": { + "path": "./peertube", + "type": "path" + } + }, + "s-private-buildbot": { + "inputs": { + "buildslist": "buildslist_2", + "flake-utils": "flake-utils_52", + "nixpkgs": "nixpkgs_91" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "./private/buildbot", + "type": "path" + }, + "original": { + "path": "./private/buildbot", + "type": "path" + } + }, + "s-private-chatons": { + "inputs": { + "environment": "environment_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "./private/chatons", + "type": "path" + }, + "original": { + "path": "./private/chatons", + "type": "path" + } + }, + "s-private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "./private/environment", + "type": "path" + }, + "original": { + "path": "./private/environment", + "type": "path" + } + }, + "s-private-mail-relay": { + "inputs": { + "environment": "environment_28", + "secrets": "secrets_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "./private/mail-relay", + "type": "path" + }, + "original": { + "path": "./private/mail-relay", + "type": "path" + } + }, + "s-private-milters": { + "inputs": { + "environment": "environment_29", + "files-watcher": "files-watcher_13", + "openarc": "openarc_12", + "opendmarc": "opendmarc_6", + "secrets": "secrets_21" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "./private/milters", + "type": "path" + }, + "original": { + "path": "./private/milters", + "type": "path" + } + }, + "s-private-monitoring": { + "inputs": { + "environment": "environment_30", + "naemon": "naemon_6", + "nixpkgs-lib": "nixpkgs-lib_26", + "secrets": "secrets_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "./private/monitoring", + "type": "path" + }, + "original": { + "path": "./private/monitoring", + "type": "path" + } + }, + "s-private-openarc": { + "inputs": { + "files-watcher": "files-watcher_14", + "openarc": "openarc_14", + "secrets": "secrets_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "./private/openarc", + "type": "path" + }, + "original": { + "path": "./private/openarc", + "type": "path" + } + }, + "s-private-opendmarc": { + "inputs": { + "environment": "environment_31", + "files-watcher": "files-watcher_15", + "opendmarc": "opendmarc_7", + "secrets": "secrets_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "./private/opendmarc", + "type": "path" + }, + "original": { + "path": "./private/opendmarc", + "type": "path" + } + }, + "s-private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "./private/openldap", + "type": "path" + }, + "original": { + "path": "./private/openldap", + "type": "path" + } + }, + "s-private-paste": { + "inputs": { + "paste": "paste_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "./private/paste", + "type": "path" + }, + "original": { + "path": "./private/paste", + "type": "path" + } + }, + "s-private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance_2", + "peertube_origin": "peertube_origin_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "./private/peertube", + "type": "path" + }, + "original": { + "path": "./private/peertube", + "type": "path" + } + }, + "s-private-php": { + "inputs": { + "flake-utils": "flake-utils_60", + "nixpkgs": "nixpkgs_99", + "nixpkgs-4": "nixpkgs-4_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "./private/php", + "type": "path" + }, + "original": { + "path": "./private/php", + "type": "path" + } + }, + "s-private-ssh": { + "inputs": { + "environment": "environment_32", + "secrets": "secrets_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "./private/ssh", + "type": "path" + }, + "original": { + "path": "./private/ssh", + "type": "path" + } + }, + "s-private-system": { + "inputs": { + "backports": "backports_7", + "environment": "environment_33", + "mypackages": "mypackages_12", + "myuids": "myuids_42", + "secrets-public": "secrets-public_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "./private/system", + "type": "path" + }, + "original": { + "path": "./private/system", + "type": "path" + } + }, + "s-rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "./rsync_backup", + "type": "path" + }, + "original": { + "path": "./rsync_backup", + "type": "path" + } + }, + "s-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "./secrets", + "type": "path" + }, + "original": { + "path": "./secrets", + "type": "path" + } + }, + "s-surfer": { + "inputs": { + "flake-utils": "flake-utils_62", + "mypackages": "mypackages_13", + "nixpkgs": "nixpkgs_103", + "surfer": "surfer_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "./surfer", + "type": "path" + }, + "original": { + "path": "./surfer", + "type": "path" + } + }, + "s-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_63", + "nixpkgs": "nixpkgs_104", + "taskwarrior-web": "taskwarrior-web_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "./taskwarrior-web", + "type": "path" + }, + "original": { + "path": "./taskwarrior-web", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=", + "path": "./private/environment-dummy", + "type": "path" + }, + "original": { + "path": "./private/environment-dummy", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_10", + "secrets": "secrets_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_2": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_3": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_4": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_5": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_6": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_7": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "surfer_2": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_2": { + "inputs": { + "backports": "backports_2", + "environment": "environment_11", + "mypackages": "mypackages_2", + "myuids": "myuids_8", + "secrets-public": "secrets-public_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_3": { + "inputs": { + "backports": "backports_4", + "environment": "environment_22", + "mypackages": "mypackages_7", + "myuids": "myuids_24", + "secrets-public": "secrets-public_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_4": { + "inputs": { + "backports": "backports_5", + "environment": "environment_25", + "mypackages": "mypackages_8", + "myuids": "myuids_27", + "secrets-public": "secrets-public_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "taskwarrior-web_2": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_4": { + "inputs": { + "nixpkgs": [ + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_5": { + "inputs": { + "nixpkgs": [ + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_6": { + "inputs": { + "nixpkgs": [ + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_7": { + "inputs": { + "nixpkgs": [ + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_10": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_11": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_12": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_13": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_14": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_15": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_6": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_7": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_8": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_9": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/flake.nix b/flakes/flake.nix new file mode 100644 index 0000000..aecff57 --- /dev/null +++ b/flakes/flake.nix @@ -0,0 +1,67 @@ +{ + description = "immae-eu infrastructure"; + inputs = { + s-backports.url = "path:./backports"; + s-copanier.url = "path:./copanier"; + s-diaspora.url = "path:./diaspora"; + s-etherpad-lite.url = "path:./etherpad-lite"; + s-fiche.url = "path:./fiche"; + s-files-watcher.url = "path:./files-watcher"; + s-grocy.url = "path:./grocy"; + s-lib.url = "path:./lib"; + s-loginctl-linger.url = "path:./loginctl-linger"; + s-mastodon.url = "path:./mastodon"; + s-mediagoblin.url = "path:./mediagoblin"; + s-multi-apache-container.url = "path:./multi-apache-container"; + s-mypackages.url = "path:./mypackages"; + s-myuids.url = "path:./myuids"; + s-naemon.url = "path:./naemon"; + s-openarc.url = "path:./openarc"; + s-opendmarc.url = "path:./opendmarc"; + s-paste.url = "path:./paste"; + s-peertube.url = "path:./peertube"; + s-rsync_backup.url = "path:./rsync_backup"; + s-secrets.url = "path:./secrets"; + s-surfer.url = "path:./surfer"; + s-taskwarrior-web.url = "path:./taskwarrior-web"; + + s-private-buildbot.url = "path:./private/buildbot"; + s-private-chatons.url = "path:./private/chatons"; + s-private-environment.url = "path:./private/environment"; + s-private-mail-relay.url = "path:./private/mail-relay"; + s-private-milters.url = "path:./private/milters"; + s-private-monitoring.url = "path:./private/monitoring"; + s-private-openarc.url = "path:./private/openarc"; + s-private-opendmarc.url = "path:./private/opendmarc"; + s-private-openldap.url = "path:./private/openldap"; + s-private-paste.url = "path:./private/paste"; + s-private-peertube.url = "path:./private/peertube"; + s-private-php.url = "path:./private/php"; + s-private-ssh.url = "path:./private/ssh"; + s-private-system.url = "path:./private/system"; + + n-backup-2.url = "path:../systems/backup-2"; + n-dilion.url = "path:../systems/dilion"; + n-eldiron.url = "path:../systems/eldiron"; + n-monitoring-1.url = "path:../systems/monitoring-1"; + n-quatresaisons.url = "path:../systems/quatresaisons"; + n-zoldene.url = "path:../systems/zoldene"; + + secrets.url = "path:./private/environment-dummy"; + }; + outputs = inputs@{ self, secrets, ... }: { + subflakes = let + flakeNames = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "s-") (builtins.attrNames inputs)); + partitionned = builtins.partition (a: builtins.substring 0 8 a == "private-") flakeNames; + privateFlakes = builtins.map (a: builtins.substring 8 (builtins.stringLength a) a) partitionned.right; + publicFlakes = partitionned.wrong; + + nodeFlakes = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "n-") (builtins.attrNames inputs)); + in { + public = builtins.foldl' (a: b: a // { "${b}" = inputs."s-${b}"; }) {} publicFlakes; + private = builtins.foldl' (a: b: a // { "${b}" = inputs."s-private-${b}"; }) {} privateFlakes; + nodes = builtins.foldl' (a: b: a // { "${b}" = inputs."n-${b}"; }) {} nodeFlakes; + inherit secrets; + }; + }; +} diff --git a/pkgs/webapps/grocy/default.nix b/flakes/grocy/default.nix similarity index 83% rename from pkgs/webapps/grocy/default.nix rename to flakes/grocy/default.nix index f87f6ec..26b6ed8 100644 --- a/pkgs/webapps/grocy/default.nix +++ b/flakes/grocy/default.nix @@ -1,8 +1,9 @@ -{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, mylibs, runCommand, git, which, jq, yarn2nix-moretea }: +{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, src, runCommand, git, which, jq, yarn2nix-moretea }: let version = "2.6.1-1"; - packagesource = mylibs.fetchedGithub ./grocy.json; - patchedPackages = stdenv.mkDerivation (packagesource // rec { + patchedPackages = stdenv.mkDerivation rec { + name = "grocy"; + inherit src; buildInputs = [ jq ]; patches = [ ./yarn.patch ]; installPhase = '' @@ -10,7 +11,7 @@ let cat package.json | jq -r '.version = "${version}"' > $out/package.json cp yarn.lock $out/ ''; - }); + }; yarnModules = yarn2nix-moretea.mkYarnModules rec { name = "grocy-yarn"; pname = name; @@ -26,8 +27,9 @@ let }; app = composerEnv.buildPackage ( import ./php-packages.nix { inherit composerEnv fetchurl; } // - packagesource // { + name = "grocy"; + inherit src; noDev = true; buildInputs = [ yarnModules ]; postInstall = '' diff --git a/flakes/grocy/flake.lock b/flakes/grocy/flake.lock new file mode 100644 index 0000000..13aa4a6 --- /dev/null +++ b/flakes/grocy/flake.lock @@ -0,0 +1,150 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "grocy": "grocy", + "mypackages": "mypackages", + "nixpkgs": "nixpkgs_2" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/grocy/flake.nix b/flakes/grocy/flake.nix new file mode 100644 index 0000000..a08852f --- /dev/null +++ b/flakes/grocy/flake.nix @@ -0,0 +1,35 @@ +{ + description = "ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.grocy = { + url = "github:grocy/grocy/d7738aa1ec330c81f11e4976681df0299d4ed35a"; + flake = false; + }; + inputs.mypackages.url = "path:../mypackages"; + outputs = { self, nixpkgs, grocy, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + composerEnv = mypackages.lib."${system}".composerEnv; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.grocy.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.grocy = callPackage ./. { inherit composerEnv; src = grocy // { inherit version; }; }; + defaultPackage = packages.grocy; + legacyPackages.grocy = packages.grocy; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + grocy = final: prev: { + grocy = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.grocy; + }; +} diff --git a/pkgs/webapps/grocy/php-packages.nix b/flakes/grocy/php-packages.nix similarity index 100% rename from pkgs/webapps/grocy/php-packages.nix rename to flakes/grocy/php-packages.nix diff --git a/pkgs/webapps/grocy/yarn-packages.nix b/flakes/grocy/yarn-packages.nix similarity index 100% rename from pkgs/webapps/grocy/yarn-packages.nix rename to flakes/grocy/yarn-packages.nix diff --git a/pkgs/webapps/grocy/yarn.patch b/flakes/grocy/yarn.patch similarity index 100% rename from pkgs/webapps/grocy/yarn.patch rename to flakes/grocy/yarn.patch diff --git a/flakes/lib/flake.lock b/flakes/lib/flake.lock index 3e0b21e..3ca158e 100644 --- a/flakes/lib/flake.lock +++ b/flakes/lib/flake.lock @@ -1,12 +1,235 @@ { "nodes": { + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "disko" + ], + "flake-parts": [ + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", "type": "github" }, "original": { @@ -17,7 +240,48 @@ }, "root": { "inputs": { - "nixpkgs": "nixpkgs" + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" } } }, diff --git a/flakes/lib/flake.nix b/flakes/lib/flake.nix index 8faa136..5b78fb6 100644 --- a/flakes/lib/flake.nix +++ b/flakes/lib/flake.nix @@ -1,28 +1,68 @@ { inputs.nixpkgs.url = "github:NixOS/nixpkgs"; + inputs.flake-parts.url = "github:hercules-ci/flake-parts"; + inputs.disko.url = "github:nix-community/disko"; + # replace with zhaofengli/colmena once https://github.com/zhaofengli/colmena/pull/161 is merged + inputs.colmena.url = "github:immae/colmena/add-lib-get-flake"; + inputs.nixos-anywhere.url = "github:numtide/nixos-anywhere"; + inputs.nixos-anywhere.inputs.disko.follows = "disko"; + inputs.nixos-anywhere.inputs.flake-parts.follows = "flake-parts"; description = "Useful libs"; - outputs = { self, nixpkgs }: { + outputs = { self, nixpkgs, flake-parts, disko, colmena, nixos-anywhere }: { lib = rec { - computeNarHash = path: - let pkgs = import nixpkgs {}; - in - builtins.readFile (pkgs.runCommand "narHash" { - buildInputs = [ pkgs.nix ]; - } "echo -n $(nix hash-path ${path}) > $out"); + mkColmenaFlake = { name, self, nixpkgs, system ? "x86_64-linux", nixosModules, moduleArgs ? {}, targetHost, targetUser ? "root" }: + flake-parts.lib.mkFlake { inputs = { inherit nixpkgs self; }; } { + systems = [ system ]; + perSystem = { pkgs, ... }: { + apps."${name}-install" = { + type = "app"; + program = pkgs.writeScriptBin "${name}-install" '' + #!${pkgs.stdenv.shell} + set -euo pipefail + : $SOPS_VARS_FILE + TEMPDIR=$(mktemp -d) + trap '[ -d "$TEMPDIR" ] && rm -rf "$TEMPDIR"' EXIT - withNarKeyCompat = flakeCompat: path: moduleAttrs: - let module = (flakeCompat path).${moduleAttrs}; - narHash = computeNarHash path; - in if builtins.isFunction module - then args@{ config, lib, pkgs, ... }: (module args // { key = narHash; }) - else module // { key = narHash; }; + password=$(sops -d $SOPS_VARS_FILE | yq -r .cryptsetup_encryption_keys.${name}) + mkdir -p $TEMPDIR/boot/initrdSecrets + chmod -R go-rwx $TEMPDIR/boot/initrdSecrets + sops -d $SOPS_VARS_FILE | yq -c '.ssh_host_keys.${name}[]' | while read -r key; do + keytype=$(echo "$key" | yq -r .type) + keyprivate=$(echo "$key" | yq -r .private) + keypublic=$(echo "$key" | yq -r .public) + echo "$keyprivate" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key + echo "$keypublic" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key.pub + done + chmod -R go-rwx $TEMPDIR/boot/initrdSecrets - withNarKey = dep: moduleAttrs: - let module = dep.${moduleAttrs}; - in if builtins.isFunction module - then args@{ config, lib, pkgs, ... }: (module args // { key = dep.narHash; }) - else module // { key = dep.narHash; }; + ${nixos-anywhere.packages.${system}.nixos-anywhere}/bin/nixos-anywhere \ + -f .#${name}WithEncryption ${targetUser}@${targetHost} \ + --disk-encryption-keys /run/decrypt-key <(echo -n "$password") \ + --extra-files "$TEMPDIR" + ''; + }; + + }; + flake = { + nixosConfigurations.${name} = (colmena.lib.fromRawFlake self).nodes.${name}; + nixosConfigurations."${name}WithEncryption" = let + selfWithEncryption = nixpkgs.lib.recursiveUpdate self { outputs.colmena.meta.specialArgs.cryptKeyFile = "/run/decrypt-key"; }; + in + (colmena.lib.fromRawFlake selfWithEncryption).nodes.${name}; + colmena = { + meta.nixpkgs = nixpkgs.legacyPackages.${system}; + meta.specialArgs = moduleArgs; + "${name}" = { + deployment = { inherit targetHost targetUser; }; + imports = builtins.attrValues self.nixosModules; + }; + }; + nixosModules = { + _diskoModules = disko.nixosModules.disko; + } // nixosModules; + }; + }; }; }; } diff --git a/flakes/loginctl-linger/flake.nix b/flakes/loginctl-linger/flake.nix new file mode 100644 index 0000000..4828d37 --- /dev/null +++ b/flakes/loginctl-linger/flake.nix @@ -0,0 +1,56 @@ +{ + outputs = { self }: { + nixosModule = { config, lib, pkgs, ... }: + # https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1 + # A temporary hack to `loginctl enable-linger $somebody` (for + # multiplexer sessions to last), until this one is unresolved: + # https://github.com/NixOS/nixpkgs/issues/3702 + # + # Usage: `users.extraUsers.somebody.linger = true` or slt. + + with lib; + + let + + dataDir = "/var/lib/systemd/linger"; + + lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger))); + + lingeringUsersFile = builtins.toFile "lingering-users" + (concatStrings (map (s: "${s}\n") + (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly + + updateLingering = pkgs.writeScript "update-lingering" '' + if [ ! -e ${dataDir} ]; then + install -m 0755 -o root -g root -d ${dataDir} + fi + if [ -e ${dataDir} ] ; then + ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger + ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger + fi + ''; + + in + + { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + options = { + users.users = mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + linger = mkEnableOption "lingering for the user"; + }; + }); + }; + }; + + config = { + system.activationScripts.update-lingering = { + deps = ["users"]; + text = "${updateLingering}"; + }; + }; + }; + }; +} diff --git a/pkgs/webapps/mastodon/default.nix b/flakes/mastodon/default.nix similarity index 82% rename from pkgs/webapps/mastodon/default.nix rename to flakes/mastodon/default.nix index ce015c5..5d32c23 100644 --- a/pkgs/webapps/mastodon/default.nix +++ b/flakes/mastodon/default.nix @@ -1,23 +1,21 @@ -{ varDir ? "/var/lib/mastodon", mylibs, - stdenv, writeText, runCommand, +{ varDir ? "/var/lib/mastodon", + stdenv, src, writeText, runCommand, ruby_2_6, bundlerEnv, defaultGemConfig, jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn, yarn2nix-moretea }: let - info = mylibs.fetchedGithub ./mastodon.json // { - src = runCommand "mastodon-patched" { - source = (mylibs.fetchedGithub ./mastodon.json).src; + patched = runCommand "mastodon-patched" { + source = src; } '' cp -a $source $out chmod -R u+w $out sed -i -e "/fuubar/s/2.4.0/2.4.1/" $out/Gemfile.lock sed -i -e "s/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9#4255dc41fa7df9c3a02c1595f058e248bc37b784/" $out/yarn.lock ''; - }; gems = bundlerEnv { name = "mastodon-env"; ruby = ruby_2_6; gemset = ./gemset.nix; - gemdir = info.src; + gemdir = patched; groups = [ "default" "production" "test" "development" ]; gemConfig = defaultGemConfig // { redis-rack = attrs: { @@ -43,15 +41,15 @@ let }; yarnModules = let packagejson = runCommand "package.json" { buildInputs = [ jq ]; } '' - cat ${info.src}/package.json | jq -r '.version = "${info.version}"' > $out + cat ${patched}/package.json | jq -r '.version = "${src.version}"' > $out ''; in yarn2nix-moretea.mkYarnModules rec { name = "mastodon-yarn"; pname = name; - version = info.version; + version = src.version; packageJSON = packagejson; - yarnLock = "${info.src}/yarn.lock"; + yarnLock = "${patched}/yarn.lock"; yarnNix = ./yarn-packages.nix; pkgConfig = { uws = { @@ -61,16 +59,20 @@ let }; }; }; - mastodon_with_yarn = stdenv.mkDerivation (info // rec { + mastodon_with_yarn = stdenv.mkDerivation { + pname = "mastodon"; + version = src.version; + inherit src; installPhase = '' cp -a . $out cp -a ${yarnModules}/node_modules $out ''; buildInputs = [ yarnModules ]; - }); + }; in stdenv.mkDerivation { name = "mastodon"; + version = src.version; inherit mastodon_with_yarn; builder = writeText "build_mastodon" '' source $stdenv/setup @@ -88,5 +90,5 @@ stdenv.mkDerivation { ln -sf ${varDir}/tmp/cache tmp ''; buildInputs = [ gems gems.ruby nodejs yarn ]; - passthru = { inherit gems varDir; }; + passthru = { inherit gems varDir nodejs; }; } diff --git a/flakes/mastodon/flake.lock b/flakes/mastodon/flake.lock new file mode 100644 index 0000000..aed0925 --- /dev/null +++ b/flakes/mastodon/flake.lock @@ -0,0 +1,75 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "mastodon": "mastodon", + "myuids": "myuids", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/mastodon/flake.nix b/flakes/mastodon/flake.nix new file mode 100644 index 0000000..1d0db10 --- /dev/null +++ b/flakes/mastodon/flake.nix @@ -0,0 +1,331 @@ +{ + description = "Your self-hosted, globally interconnected microblogging community"; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.mastodon = { + url = "github:tootsuite/mastodon/v2.9.4"; + flake = false; + }; + + outputs = { self, myuids, nixpkgs, mastodon, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mastodon.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.mastodon = callPackage ./. { src = mastodon // { inherit version; }; }; + defaultPackage = packages.mastodon; + legacyPackages.mastodon = packages.mastodon; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + mastodon = final: prev: { + mastodon = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.mastodon; + nixosModule = { lib, pkgs, config, ... }: + let + name = "mastodon"; + cfg = config.immaeServices.mastodon; + in + { + options.immaeServices.mastodon = { + enable = lib.mkEnableOption "Enable Mastodon’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Mastodon runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Mastodon runs"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Mastodon stores its data. + ''; + }; + socketsPrefix = lib.mkOption { + type = lib.types.str; + default = "live"; + description = '' + The prefix to use for Mastodon sockets. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Mastodon puts runtime files and sockets. + ''; + }; + configFile = lib.mkOption { + type = lib.types.path; + description = '' + The configuration file path for Mastodon. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.mastodon; + description = '' + Mastodon package to use. + ''; + }; + # Output variables + workdir = lib.mkOption { + type = lib.types.package; + default = cfg.package.override { varDir = cfg.dataDir; }; + description = '' + Adjusted mastodon package with overriden varDir + ''; + readOnly = true; + }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Mastodon data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Mastodon sockets directory for systemd + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + node = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock"; + rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock"; + }; + readOnly = true; + description = '' + Mastodon sockets + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + uid = myuids.lib.uids.mastodon; + group = cfg.group; + description = "Mastodon user"; + home = cfg.dataDir; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + gid = myuids.lib.gids.mastodon; + }; + }; + + systemd.slices.mastodon = { + description = "Mastodon slice"; + }; + + systemd.services.mastodon-streaming = { + description = "Mastodon Streaming"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "mastodon-web.service" ]; + + environment.NODE_ENV = "production"; + environment.SOCKET = cfg.sockets.node; + + path = [ cfg.workdir.nodejs pkgs.bashInteractive ]; + + script = '' + exec npm run start + ''; + + postStart = '' + while [ ! -S $SOCKET ]; do + sleep 0.5 + done + chmod a+w $SOCKET + ''; + + postStop = '' + rm $SOCKET + ''; + + serviceConfig = { + Slice = "mastodon.slice"; + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 15; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-web = { + description = "Mastodon Web app"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ]; + + preStart = '' + install -m 0755 -d ${cfg.dataDir}/tmp/cache + ./bin/bundle exec rails db:migrate + ''; + + script = '' + exec ./bin/bundle exec puma -C config/puma.rb + ''; + + postStart = '' + exec ./bin/tootctl cache clear + ''; + serviceConfig = { + Slice = "mastodon.slice"; + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 60; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + # To be run manually because computationnally heavy + systemd.services.mastodon-cleanup-manual = { + description = "Cleanup mastodon"; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; + + script = '' + exec ./bin/tootctl statuses remove --days 365 + ''; + + serviceConfig = { + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Type = "oneshot"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-cleanup = { + description = "Cleanup mastodon"; + startAt = "daily"; + restartIfChanged = false; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; + + script = '' + exec ./bin/tootctl media remove --days 30 + ''; + + serviceConfig = { + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Type = "oneshot"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-sidekiq = { + description = "Mastodon Sidekiq"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "mastodon-web.service" ]; + + environment.RAILS_ENV="production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.DB_POOL="5"; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ]; + + script = '' + exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push + ''; + + serviceConfig = { + Slice = "mastodon.slice"; + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 15; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + }; + }; + }; +} + + diff --git a/pkgs/webapps/mastodon/gemset.nix b/flakes/mastodon/gemset.nix similarity index 100% rename from pkgs/webapps/mastodon/gemset.nix rename to flakes/mastodon/gemset.nix diff --git a/pkgs/webapps/mastodon/yarn-packages.nix b/flakes/mastodon/yarn-packages.nix similarity index 100% rename from pkgs/webapps/mastodon/yarn-packages.nix rename to flakes/mastodon/yarn-packages.nix diff --git a/pkgs/webapps/mediagoblin/bower-packages.nix b/flakes/mediagoblin/bower-packages.nix similarity index 100% rename from pkgs/webapps/mediagoblin/bower-packages.nix rename to flakes/mediagoblin/bower-packages.nix diff --git a/pkgs/webapps/mediagoblin/default.nix b/flakes/mediagoblin/default.nix similarity index 89% rename from pkgs/webapps/mediagoblin/default.nix rename to flakes/mediagoblin/default.nix index 22cb292..47cc628 100644 --- a/pkgs/webapps/mediagoblin/default.nix +++ b/flakes/mediagoblin/default.nix @@ -1,4 +1,4 @@ -{ makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, mylibs, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit }: +{ src, makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit, fetchFromGitHub }: let overridePython = let packageOverrides = self: super: { @@ -67,10 +67,20 @@ let }; doCheck = false; }); - tempita_5_3_dev = super.buildPythonPackage (mylibs.fetchedGithub ./tempita.json // rec { + tempita_5_3_dev = super.buildPythonPackage rec { + version = "47414a7-master"; + pname = "tempita"; + name = "${pname}-${version}"; + src = fetchFromGitHub { + owner = "gjhiggins"; + repo = "tempita"; + rev = "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d"; + sha256 = "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn"; + fetchSubmodules = true; + }; buildInputs = with self; [ nose ]; disabled = false; - }); + }; sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec { propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ]; }); @@ -125,23 +135,16 @@ let load_entry_point('mediagoblin', 'console_scripts', 'gmg')() ) ''; - mediagoblinSrc = fetchgit { - name = "mediagoblin"; - url = "git://git.savannah.gnu.org/mediagoblin.git"; - rev = "cd465ebfec837a75a44c4ebd727dffe2fff6d850"; - sha256 = "1yz4i4i97z3rxl534a6psaybyjbyp5nnc52v3nvbpzc4pd2s69mx"; - fetchSubmodules = true; # important! - }; bowerComponents = buildBowerComponents { name = "mediagoblin-bower-components"; generated = ./bower-packages.nix; - src = mediagoblinSrc; + inherit src; }; pluginNames = [ "basicsearch" ]; allPlugins = lib.attrsets.genAttrs pluginNames (name: callPackage (./plugins + "/${name}") {}); - toPassthru = pkg: { - inherit allPlugins; + toPassthru = pkg: plugins: { + inherit allPlugins plugins; withPlugins = withPlugins pkg; }; withPlugins = pkg: toPlugins: @@ -150,14 +153,14 @@ let toBuildPlugin = n: "ln -s ${n} mediagoblin/plugins/${n.pluginName}"; newMediagoblin = pkg.overrideAttrs(old: { postBuild = old.postBuild + "\n" + builtins.concatStringsSep "\n" (map toBuildPlugin plugins); - passthru = toPassthru newMediagoblin; + passthru = toPassthru newMediagoblin plugins; }); in newMediagoblin; package = stdenv.mkDerivation rec { pname = "mediagoblin"; name = "${pname}-${version}"; version = "cd465eb-stable"; - src = mediagoblinSrc; + inherit src; preConfigure = '' # ./bootstrap.sh aclocal -I m4 --install @@ -205,6 +208,6 @@ let ''; buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ]; propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ]; - passthru = toPassthru package; + passthru = toPassthru package []; }; in package diff --git a/flakes/mediagoblin/flake.lock b/flakes/mediagoblin/flake.lock new file mode 100644 index 0000000..bba6479 --- /dev/null +++ b/flakes/mediagoblin/flake.lock @@ -0,0 +1,78 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "mediagoblin": "mediagoblin", + "myuids": "myuids", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/mediagoblin/flake.nix b/flakes/mediagoblin/flake.nix new file mode 100644 index 0000000..2e821d5 --- /dev/null +++ b/flakes/mediagoblin/flake.nix @@ -0,0 +1,271 @@ +{ + description = "a free software media publishing platform that anyone can run."; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.mediagoblin = { + url = "git+https://git.savannah.gnu.org/git/mediagoblin.git?submodules=1&ref=stable&rev=cd465ebfec837a75a44c4ebd727dffe2fff6d850"; + flake = false; + }; + + outputs = { self, myuids, nixpkgs, mediagoblin, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mediagoblin.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.mediagoblin = callPackage ./. { src = mediagoblin // { inherit version; }; }; + defaultPackage = packages.mediagoblin; + legacyPackages.mediagoblin = packages.mediagoblin; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + mediagoblin = final: prev: { + mediagoblin = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.mediagoblin; + nixosModule = { lib, pkgs, config, ... }: + let + name = "mediagoblin"; + cfg = config.services.mediagoblin; + + uid = config.ids.uids.mediagoblin; + gid = config.ids.gids.mediagoblin; + + paste_local = pkgs.writeText "paste_local.ini" '' + [DEFAULT] + debug = false + + [pipeline:main] + pipeline = mediagoblin + + [app:mediagoblin] + use = egg:mediagoblin#app + config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini + /mgoblin_static = ${cfg.package}/mediagoblin/static + + [loggers] + keys = root + + [handlers] + keys = console + + [formatters] + keys = generic + + [logger_root] + level = INFO + handlers = console + + [handler_console] + class = StreamHandler + args = (sys.stderr,) + level = NOTSET + formatter = generic + + [formatter_generic] + format = %(levelname)-7.7s [%(name)s] %(message)s + + [filter:errors] + use = egg:mediagoblin#errors + debug = false + + [server:main] + use = egg:waitress#main + unix_socket = ${cfg.sockets.paster} + unix_socket_perms = 777 + url_scheme = https + ''; + in + { + options.services.mediagoblin = { + enable = lib.mkEnableOption "Enable Mediagoblin’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Mediagoblin runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Mediagoblin runs"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Mediagoblin stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Mediagoblin puts runtime files and sockets. + ''; + }; + configFile = lib.mkOption { + type = lib.types.path; + description = '' + The configuration file path for Mediagoblin. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.mediagoblin; + example = lib.literalExample '' + pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]) + ''; + description = '' + Mediagoblin package to use. + ''; + }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Mediagoblin data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Mediagoblin sockets directory for systemd + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + paster = "${cfg.socketsDir}/mediagoblin.sock"; + }; + readOnly = true; + description = '' + Mediagoblin sockets + ''; + }; + pids = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + paster = "${cfg.socketsDir}/mediagoblin.pid"; + celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid"; + }; + readOnly = true; + description = '' + Mediagoblin pid files + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + inherit uid; + group = cfg.group; + description = "Mediagoblin user"; + home = cfg.dataDir; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + inherit gid; + }; + }; + + systemd.slices.mediagoblin = { + description = "Mediagoblin slice"; + }; + systemd.services.mediagoblin-web = { + description = "Mediagoblin service"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + wants = [ "postgresql.service" "redis.service" ]; + + environment.SCRIPT_NAME = "/mediagoblin/"; + + script = '' + exec ./bin/paster serve \ + ${paste_local} \ + --pid-file=${cfg.pids.paster} + ''; + preStop = '' + exec ./bin/paster serve \ + --pid-file=${cfg.pids.paster} \ + ${paste_local} stop + ''; + preStart = '' + if [ -d ${cfg.dataDir}/plugin_static/ ]; then + rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth + ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth + fi + ./bin/gmg -cf ${cfg.configFile} dbupdate + ''; + + serviceConfig = { + Slice = "mediagoblin.slice"; + User = cfg.user; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 15; + Type = "simple"; + WorkingDirectory = cfg.package; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StateDirectory= cfg.systemdStateDirectory; + PIDFile = cfg.pids.paster; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mediagoblin-celeryd = { + description = "Mediagoblin service"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "mediagoblin-web.service" ]; + + environment.MEDIAGOBLIN_CONFIG = cfg.configFile; + environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery"; + + script = '' + exec ./bin/celery worker \ + --logfile=${cfg.dataDir}/celery.log \ + --loglevel=INFO + ''; + + serviceConfig = { + Slice = "mediagoblin.slice"; + User = cfg.user; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 60; + Type = "simple"; + WorkingDirectory = cfg.package; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StateDirectory= cfg.systemdStateDirectory; + PIDFile = cfg.pids.celery; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + }; + }; + }; +} + + diff --git a/pkgs/webapps/mediagoblin/ldap_fix.py b/flakes/mediagoblin/ldap_fix.py similarity index 100% rename from pkgs/webapps/mediagoblin/ldap_fix.py rename to flakes/mediagoblin/ldap_fix.py diff --git a/pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix b/flakes/mediagoblin/plugins/basicsearch/default.nix similarity index 100% rename from pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix rename to flakes/mediagoblin/plugins/basicsearch/default.nix diff --git a/flakes/multi-apache-container/flake.lock b/flakes/multi-apache-container/flake.lock new file mode 100644 index 0000000..f8dda19 --- /dev/null +++ b/flakes/multi-apache-container/flake.lock @@ -0,0 +1,36 @@ +{ + "nodes": { + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "root": { + "inputs": { + "files-watcher": "files-watcher", + "myuids": "myuids" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/multi-apache-container/flake.nix b/flakes/multi-apache-container/flake.nix new file mode 100644 index 0000000..fd788f7 --- /dev/null +++ b/flakes/multi-apache-container/flake.nix @@ -0,0 +1,389 @@ +{ + description = "Module to handle multiple separate apache instances (using containers)"; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.files-watcher = { + url = "path:../files-watcher"; + }; + + outputs = { self, myuids, files-watcher }: { + nixosModule = { lib, config, pkgs, options, ... }: + with lib; + let + cfg = config.services.websites; + hostConfig = config; + toHttpdConfig = icfg: + let + nosslVhost = ips: cfg: { + listen = map (ip: { inherit ip; port = 80; }) ips; + hostName = cfg.host; + logFormat = "combinedVhost"; + documentRoot = cfg.root; + extraConfig = '' + + DirectoryIndex ${cfg.indexFile} + AllowOverride None + Require all granted + + RewriteEngine on + RewriteRule ^/(.+) / [L] + + ''; + }; + toVhost = ips: vhostConf: { + acmeRoot = hostConfig.security.acme.certs.${vhostConf.certName}.webroot; + forceSSL = vhostConf.forceSSL or true; + useACMEHost = vhostConf.certName; + logFormat = "combinedVhost"; + listen = if vhostConf.forceSSL + then lists.flatten (map (ip: [{ inherit ip; port = 443; ssl = true; } { inherit ip; port = 80; }]) ips) + else map (ip: { inherit ip; port = 443; ssl = true; }) ips; + hostName = builtins.head vhostConf.hosts; + serverAliases = builtins.tail vhostConf.hosts or []; + documentRoot = vhostConf.root; + extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; + }; + toVhostNoSSL = ips: vhostConf: { + logFormat = "combinedVhost"; + listen = map (ip: { inherit ip; port = 80; }) ips; + hostName = builtins.head vhostConf.hosts; + serverAliases = builtins.tail vhostConf.hosts or []; + documentRoot = vhostConf.root; + extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; + }; + in { + enable = true; + logPerVirtualHost = true; + mpm = "event"; + # https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.0.2t&guideline=5.4 + # test with https://www.ssllabs.com/ssltest/analyze.html?d=www.immae.eu&s=176.9.151.154&latest + sslProtocols = "all -SSLv3 -TLSv1 -TLSv1.1"; + sslCiphers = builtins.concatStringsSep ":" [ + "ECDHE-ECDSA-AES128-GCM-SHA256" "ECDHE-RSA-AES128-GCM-SHA256" + "ECDHE-ECDSA-AES256-GCM-SHA384" "ECDHE-RSA-AES256-GCM-SHA384" + "ECDHE-ECDSA-CHACHA20-POLY1305" "ECDHE-RSA-CHACHA20-POLY1305" + "DHE-RSA-AES128-GCM-SHA256" "DHE-RSA-AES256-GCM-SHA384" + ]; + inherit (icfg) adminAddr; + logFormat = "combinedVhost"; + extraModules = lists.unique icfg.modules; + extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig; + + virtualHosts = with attrsets; { + ___fallbackVhost = toVhost icfg.ips icfg.fallbackVhost; + } // (optionalAttrs icfg.nosslVhost.enable { + nosslVhost = nosslVhost icfg.ips icfg.nosslVhost; + }) // (mapAttrs' (n: v: nameValuePair ("nossl_" + n) (toVhostNoSSL icfg.ips v)) icfg.vhostNoSSLConfs) + // (mapAttrs' (n: v: nameValuePair ("ssl_" + n) (toVhost icfg.ips v)) icfg.vhostConfs); + }; + in + { + options.services.websites = with types; { + env = mkOption { + default = {}; + description = "Each type of website to enable will target a distinct httpd server"; + type = attrsOf (submodule ({ name, config, ... }: { + options = { + enable = mkEnableOption "Enable websites of this type"; + moduleType = mkOption { + type = enum [ "container" "main" ]; + default = "container"; + description = '' + How to deploy the web environment: + - container -> inside a dedicated container (running only httpd) + - main -> as main services.httpd module + ''; + }; + adminAddr = mkOption { + type = str; + description = "Admin e-mail address of the instance"; + }; + user = mkOption { + type = str; + description = "Username of httpd service"; + readOnly = true; + default = if config.moduleType == "container" + then hostConfig.containers."httpd-${name}".config.services.httpd.user + else hostConfig.services.httpd.user; + }; + group = mkOption { + type = str; + description = "Group of httpd service"; + readOnly = true; + default = if config.moduleType == "container" + then hostConfig.containers."httpd-${name}".config.services.httpd.group + else hostConfig.services.httpd.group; + }; + httpdName = mkOption { + type = str; + description = "Name of the httpd instance to assign this type to"; + }; + ips = mkOption { + type = listOf str; + default = []; + description = "ips to listen to"; + }; + bindMounts = mkOption { + type = attrsOf unspecified; + default = {}; + description = "bind mounts to add to container"; + }; + modules = mkOption { + type = listOf str; + default = []; + description = "Additional modules to load in Apache"; + }; + extraConfig = mkOption { + type = listOf lines; + default = []; + description = "Additional configuration to append to Apache"; + }; + nosslVhost = mkOption { + description = "A default nossl vhost for captive portals"; + default = {}; + type = submodule { + options = { + enable = mkEnableOption "Add default no-ssl vhost for this instance"; + host = mkOption { + type = str; + description = "The hostname to use for this vhost"; + }; + root = mkOption { + type = path; + description = "The root folder to serve"; + }; + indexFile = mkOption { + type = str; + default = "index.html"; + description = "The index file to show."; + }; + }; + }; + }; + fallbackVhost = mkOption { + description = "The fallback vhost that will be defined as first vhost in Apache"; + type = submodule { + options = { + certName = mkOption { type = str; }; + hosts = mkOption { type = listOf str; }; + root = mkOption { type = nullOr path; }; + forceSSL = mkOption { + type = bool; + default = true; + description = '' + Automatically create a corresponding non-ssl vhost + that will only redirect to the ssl version + ''; + }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; + }; + }; + vhostNoSSLConfs = mkOption { + default = {}; + description = "List of no ssl vhosts to define for Apache"; + type = attrsOf (submodule { + options = { + hosts = mkOption { type = listOf str; }; + root = mkOption { type = nullOr path; }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; + }); + }; + vhostConfs = mkOption { + default = {}; + description = "List of vhosts to define for Apache"; + type = attrsOf (submodule { + options = { + certName = mkOption { type = str; }; + hosts = mkOption { type = listOf str; }; + root = mkOption { type = nullOr path; }; + forceSSL = mkOption { + type = bool; + default = true; + description = '' + Automatically create a corresponding non-ssl vhost + that will only redirect to the ssl version + ''; + }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; + }); + }; + watchPaths = mkOption { + type = listOf str; + default = []; + description = '' + Paths to watch that should trigger a reload of httpd + ''; + }; + }; + })); + }; + }; + + config = lib.mkMerge [ + { + assertions = [ + { + assertion = builtins.length (builtins.attrNames (lib.filterAttrs (k: v: v.enable && v.moduleType == "main") cfg.env)) <= 1; + message = '' + Only one enabled environment can have moduleType = "main" + ''; + } + ]; + } + + { + environment.etc = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + "httpd/${name}/httpd.conf" { source = (pkgs.nixos { + imports = [ + { + config.security.acme.acceptTerms = true; + config.security.acme.preliminarySelfsigned = false; + config.security.acme.certs = + lib.mapAttrs (n: lib.filterAttrs (n': v': n' != "directory")) config.security.acme.certs; + config.security.acme.defaults = config.security.acme.defaults; + config.networking.hostName = "${hostConfig.networking.hostName}-${name}"; + config.services.httpd = toHttpdConfig icfg; + } + ]; + }).config.services.httpd.configFile; + }) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env); + + system.activationScripts.httpd-containers = { + deps = [ "etc" ]; + text = builtins.concatStringsSep "\n" ( + lib.mapAttrsToList (n: v: '' + install -d -m 0750 -o ${v.user} -g ${v.group} /var/log/httpd/${n} /var/lib/nixos-containers/httpd-${n}-mounts/conf + install -Dm644 -o ${v.user} -g ${v.group} /etc/httpd/${n}/httpd.conf /var/lib/nixos-containers/httpd-${n}-mounts/conf/ + '') (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env) + ); + }; + + security.acme.certs = lib.mkMerge (lib.mapAttrsToList (name: icfg: + let + containerCertNames = lib.unique (lib.mapAttrsToList (n: v: v.certName) icfg.vhostConfs + ++ [ icfg.fallbackVhost.certName ]); + in + lib.genAttrs containerCertNames (n: + { postRun = "machinectl shell httpd-${name} /run/current-system/sw/bin/systemctl reload httpd.service"; } + ) + ) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env) + ); + containers = let hostConfig = config; in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + "httpd-${name}" { + autoStart = true; + privateNetwork = false; + bindMounts = { + "/var/log/httpd" = { + hostPath = "/var/log/httpd/${name}"; + isReadOnly = false; + }; + "/etc/httpd" = { + hostPath = "/var/lib/nixos-containers/httpd-${name}-mounts/conf"; + }; + } // icfg.bindMounts; + + config = { config, options, ... }: { + imports = [ + myuids.nixosModule + files-watcher.nixosModule + ]; + config = lib.mkMerge [ + { + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = "23.05"; # Did you read the comment? + } + { + users.mutableUsers = false; + users.allowNoPasswordLogin = true; + users.users.acme.uid = config.ids.uids.acme; + users.users.acme.group = "acme"; + users.groups.acme.gid = config.ids.gids.acme; + } + { + services.logrotate.settings.httpd.enable = false; + } + { + environment.etc."httpd/httpd.conf".enable = false; + services.httpd = { + enable = true; + configFile = "/etc/httpd/httpd.conf"; + }; + + services.filesWatcher.http-config-reload = { + paths = [ "/etc/httpd/httpd.conf" ]; + waitTime = 2; + restart = true; + }; + services.filesWatcher.httpd = { + paths = icfg.watchPaths; + waitTime = 5; + }; + + users.users.${icfg.user}.extraGroups = [ "acme" "keys" ]; + systemd.services.http-config-reload = { + wants = [ "httpd.service" ]; + wantedBy = [ "multi-user.target" ]; + restartTriggers = [ config.services.httpd.configFile ]; + serviceConfig.Type = "oneshot"; + serviceConfig.TimeoutSec = 60; + serviceConfig.RemainAfterExit = true; + script = '' + if ${pkgs.systemd}/bin/systemctl -q is-active httpd.service ; then + ${config.services.httpd.package.out}/bin/httpd -f ${config.services.httpd.configFile} -t && \ + ${pkgs.systemd}/bin/systemctl reload httpd.service + fi + ''; + }; + } + ]; + }; + }) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env); + } + + { + services.httpd = lib.concatMapAttrs (name: toHttpdConfig) + (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + users.users = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + config.services.httpd.user { extraGroups = [ "acme" ]; } + ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + "httpd" { + paths = icfg.watchPaths; + waitTime = 5; + } + ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + services.logrotate.settings.httpd.enable = false; + systemd.services = lib.concatMapAttrs (name: v: { + httpd.restartTriggers = lib.mkForce []; + }) + (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + security.acme.certs = lib.mkMerge (lib.mapAttrsToList (name: icfg: + let + containerCertNames = lib.unique (lib.mapAttrsToList (n: v: v.certName) icfg.vhostConfs + ++ [ icfg.fallbackVhost.certName ]); + in + lib.genAttrs containerCertNames (n: + { postRun = "systemctl reload httpd.service"; } + ) + ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env) + ); + + } + ]; + }; + }; +} + + diff --git a/flakes/mypackages/flake.lock b/flakes/mypackages/flake.lock new file mode 100644 index 0000000..f11f6c5 --- /dev/null +++ b/flakes/mypackages/flake.lock @@ -0,0 +1,83 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/mypackages/flake.nix b/flakes/mypackages/flake.nix new file mode 100644 index 0000000..adad96f --- /dev/null +++ b/flakes/mypackages/flake.nix @@ -0,0 +1,43 @@ +{ + description = "immae-eu infrastructure"; + inputs = { + flake-parts.url = "github:hercules-ci/flake-parts"; + # TODO: use nixos-unstable branch at some point and use the lock to keep the actual commit + nixpkgs.url = "github:nixos/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026"; + webapps-ttrss = { + url = "https://git.tt-rss.org/fox/tt-rss.git"; + ref = "master"; + rev = "986ca251f995f7754a0470d3e0c44538a545081f"; + type = "git"; + flake = false; + }; + }; + outputs = inputs@{ self, flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + (import ./lib/flake-parts-lib.nix { name = "lib"; type = "unspecified"; }) + ]; + systems = [ "x86_64-linux" ]; + perSystem = { config, inputs', pkgs, ... }: + let + mypkgs = import ./pkgs/default.nix { inherit pkgs; inherit (self) mylibs sources; }; + in { + packages = builtins.removeAttrs mypkgs [ "composerEnv" "webapps-apache-theme" ]; + lib = { + inherit (self) sources; + inherit (mypkgs) composerEnv; + inherit (self.mylibs) postfixScript; + apache-theme = mypkgs.webapps-apache-theme; + }; + }; + flake = { + mylibs = import ./lib/default.nix; + sources.tools.ttrss = inputs.webapps-ttrss; + # We want overlays to be infected (in contrary to "packages" + # above): if someone imports an overlay here, we want his own + # overlays to be taken into account in every package, even new + # ones. + overlays = import ./overlays/default.nix { inherit (self) sources mylibs; }; + }; + }; +} diff --git a/flakes/mypackages/lib/default.nix b/flakes/mypackages/lib/default.nix new file mode 100644 index 0000000..972ace0 --- /dev/null +++ b/flakes/mypackages/lib/default.nix @@ -0,0 +1,37 @@ +{ + flakePartsAddPerSystem = import ./flake-parts-lib.nix; + nodeEnv = import ./node-env.nix; + postfixScript = pkgs: name: script: pkgs.writeScript name '' + #! ${pkgs.stdenv.shell} + mail=$(${pkgs.coreutils}/bin/cat -) + output=$(echo "$mail" | ${script} 2>&1) + ret=$? + + if [ "$ret" != "0" ]; then + echo "$mail" \ + | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \ + | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu + + messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:") + repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:") + + ${pkgs.coreutils}/bin/cat < $out/bin/shell < $out/nix-support/propagated-build-inputs + cp $src/man/* $out/share/doc/bash-libs + ''; +} diff --git a/pkgs/boinctui/default.nix b/flakes/mypackages/pkgs/boinctui/default.nix similarity index 63% rename from pkgs/boinctui/default.nix rename to flakes/mypackages/pkgs/boinctui/default.nix index d8b106a..565840c 100644 --- a/pkgs/boinctui/default.nix +++ b/flakes/mypackages/pkgs/boinctui/default.nix @@ -1,10 +1,10 @@ -{ stdenv, fetchurl, expat, openssl, autoconf, ncurses }: +{ stdenv, fetchurl, expat, openssl, autoconf269, ncurses }: stdenv.mkDerivation rec { name = "boinctui-${version}"; - version = "2.5.0"; + version = "2.6.0"; src = fetchurl { url = "http://sourceforge.net/projects/boinctui/files/boinctui_${version}.tar.gz"; - sha256 = "16zxp8r4z6pllacdacg681y56cg2phnn3pm5gwszbsi93cix2g8p"; + sha256 = "1c6hc4x28z8hjncxcwxhb0r3980f72i6480569a0hd9y7vcgf3d0"; }; configureFlags = [ "--without-gnutls" ]; @@ -12,9 +12,10 @@ stdenv.mkDerivation rec { autoconf ''; + makeFlags = [ "DESTDIR=$(out)" ]; preBuild = '' sed -i -e 's/"HOME"/"XDG_CONFIG_HOME"/' src/cfg.cpp sed -i -e 's@\.boinctui\.cfg@boinctui/boinctui.cfg@' src/mainprog.cpp ''; - buildInputs = [ expat openssl autoconf ncurses ]; + buildInputs = [ expat openssl autoconf269 ncurses ]; } diff --git a/pkgs/cnagios/default.nix b/flakes/mypackages/pkgs/cnagios/default.nix similarity index 60% rename from pkgs/cnagios/default.nix rename to flakes/mypackages/pkgs/cnagios/default.nix index d5b52f3..2b8b0da 100644 --- a/pkgs/cnagios/default.nix +++ b/flakes/mypackages/pkgs/cnagios/default.nix @@ -1,5 +1,15 @@ -{ stdenv, mylibs, perl, ncurses }: -stdenv.mkDerivation (mylibs.fetchedGithub ./cnagios.json // { +{ stdenv, fetchFromGitHub, perl, ncurses }: +stdenv.mkDerivation (rec { + version = "3bd27fb-master"; + pname = "cnagios"; + name = "${pname}-${version}"; + src = fetchFromGitHub { + owner = "dannywarren"; + repo = "cnagios"; + rev = "3bd27fb40e68f61ffd01bea6234b919a667b6fe4"; + sha256 = "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb"; + fetchSubmodules = true; + }; configureFlags = [ "--with-etc-dir=/etc/cnagios" "--with-var-dir=/var/lib/naemon" diff --git a/pkgs/commento/default.nix b/flakes/mypackages/pkgs/commento/default.nix similarity index 100% rename from pkgs/commento/default.nix rename to flakes/mypackages/pkgs/commento/default.nix diff --git a/pkgs/composer-env/default.nix b/flakes/mypackages/pkgs/composer-env/default.nix similarity index 80% rename from pkgs/composer-env/default.nix rename to flakes/mypackages/pkgs/composer-env/default.nix index 416a61c..772ed73 100644 --- a/pkgs/composer-env/default.nix +++ b/flakes/mypackages/pkgs/composer-env/default.nix @@ -1,41 +1,8 @@ # This file originates from composer2nix -{ stdenv, writeTextFile, fetchurl, php, unzip }: +{ stdenv, lib, writeTextFile, fetchurl, php, unzip, composer ? php.packages.composer }: let - composer = stdenv.mkDerivation { - name = "composer-1.8.0"; - src = fetchurl { - url = https://github.com/composer/composer/releases/download/1.8.0/composer.phar; - sha256 = "19pg9ip2mpyf5cyq34fld7qwl77mshqw3c4nif7sxmpnar6sh089"; - }; - buildInputs = [ php ]; - - # We must wrap the composer.phar because of the impure shebang. - # We cannot use patchShebangs because the executable verifies its own integrity and will detect that somebody has tampered with it. - - buildCommand = '' - # Copy phar file - mkdir -p $out/share/php - cp $src $out/share/php/composer.phar - chmod 755 $out/share/php/composer.phar - - # Create wrapper executable - mkdir -p $out/bin - cat > $out/bin/composer <= 1.4.5, < 2.0.0) + http_parser.rb (>= 0.5.1, < 0.8.0) + msgpack (>= 1.3.1, < 2.0.0) + serverengine (>= 2.2.2, < 3.0.0) + sigdump (~> 0.2.2) + strptime (>= 0.2.2, < 1.0.0) + tzinfo (>= 1.0, < 3.0) + tzinfo-data (~> 1.0) + webrick (>= 1.4.2, < 1.8.0) + yajl-ruby (~> 1.0) + http_parser.rb (0.7.0) + msgpack (1.4.2) + serverengine (2.2.4) + sigdump (~> 0.2.2) + sigdump (0.2.4) + strptime (0.2.5) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2021.1) + tzinfo (>= 1.0.0) + webrick (1.7.0) + yajl-ruby (1.4.1) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + fluentd + +BUNDLED WITH + 2.2.20 diff --git a/flakes/mypackages/pkgs/fluentd/default.nix b/flakes/mypackages/pkgs/fluentd/default.nix new file mode 100644 index 0000000..f6a22f0 --- /dev/null +++ b/flakes/mypackages/pkgs/fluentd/default.nix @@ -0,0 +1,20 @@ +{ ruby, bundlerEnv, bundlerUpdateScript, lib }: + +bundlerEnv { + inherit ruby; + + pname = "fluentd"; + gemdir = ./.; + + passthru.updateScript = bundlerUpdateScript "fluentd"; + + copyGemFiles = true; + + meta = with lib; { + description = "A data collector"; + homepage = "https://www.fluentd.org/"; + license = licenses.asl20; + maintainers = with maintainers; [ offline nicknovitski ]; + platforms = platforms.unix; + }; +} diff --git a/flakes/mypackages/pkgs/fluentd/gemset.nix b/flakes/mypackages/pkgs/fluentd/gemset.nix new file mode 100644 index 0000000..8ee42b6 --- /dev/null +++ b/flakes/mypackages/pkgs/fluentd/gemset.nix @@ -0,0 +1,126 @@ +{ + concurrent-ruby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f"; + type = "gem"; + }; + version = "1.1.9"; + }; + "cool.io" = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dfq4h168wzvs9cvn2mm8648ynkl936pgjva2p8ik34p6d620537"; + type = "gem"; + }; + version = "1.7.1"; + }; + fluentd = { + dependencies = ["cool.io" "http_parser.rb" "msgpack" "serverengine" "sigdump" "strptime" "tzinfo" "tzinfo-data" "webrick" "yajl-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12k9b9903x5fi3lqb41h20qx8s0fwx7chjldbxmyi7j1x6xdm7cv"; + type = "gem"; + }; + version = "1.13.3"; + }; + "http_parser.rb" = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xha614fi6l04wryqjj1xmpalzlmhb6lb9qmlh8mmliycdhvcshp"; + type = "gem"; + }; + version = "0.7.0"; + }; + msgpack = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6"; + type = "gem"; + }; + version = "1.4.2"; + }; + serverengine = { + dependencies = ["sigdump"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gzhggx40a53mnv4f32xag4h6ai0s5m3w06s59b0h6ih7rqvwns9"; + type = "gem"; + }; + version = "2.2.4"; + }; + sigdump = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mqf06iw7rymv54y7rgbmfi6ppddgjjmxzi3hrw658n1amp1gwhb"; + type = "gem"; + }; + version = "0.2.4"; + }; + strptime = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ycs0xz58kymf7yp4h56f0nid2z7g3s18dj7pa3p790pfzzpgvcq"; + type = "gem"; + }; + version = "0.2.5"; + }; + tzinfo = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z"; + type = "gem"; + }; + version = "2.0.4"; + }; + tzinfo-data = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ik16lnsyr2739jzwl4r5sz8q639lqw8f9s68iszwhm2pcq8p4w2"; + type = "gem"; + }; + version = "1.2021.1"; + }; + webrick = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d4cvgmxhfczxiq5fr534lmizkhigd15bsx5719r5ds7k7ivisc7"; + type = "gem"; + }; + version = "1.7.0"; + }; + yajl-ruby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16v0w5749qjp13xhjgr2gcsvjv6mf35br7iqwycix1n2h7kfcckf"; + type = "gem"; + }; + version = "1.4.1"; + }; +} \ No newline at end of file diff --git a/pkgs/gearmand/default.nix b/flakes/mypackages/pkgs/gearmand/default.nix similarity index 77% rename from pkgs/gearmand/default.nix rename to flakes/mypackages/pkgs/gearmand/default.nix index bb3be89..14ef8c2 100644 --- a/pkgs/gearmand/default.nix +++ b/flakes/mypackages/pkgs/gearmand/default.nix @@ -1,10 +1,10 @@ -{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, python3, sqlite, hiredis, postgresql, openssl }: +{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, sqlite, hiredis, postgresql, openssl }: stdenv.mkDerivation rec { pname = "gearmand"; - version = "1.1.19.1"; + version = "1.1.20"; src = fetchurl { url = "https://github.com/gearman/${pname}/releases/download/${version}/${pname}-${version}.tar.gz"; - sha256 = "1yvb2r3n89p43nchsi3d4nwl0f4xsiy8msnacmm4x4hcdb8y19lf"; + sha256 = "sha256-L2D6IH3NcwWV75ap3DyomVZnB8gXYQazxj7PR+3BR6Y="; }; buildInputs = [ boost gperf libevent openssl libmysqlclient libuuid sqlite hiredis postgresql ]; configureFlags = [ diff --git a/pkgs/genius/default.nix b/flakes/mypackages/pkgs/genius/default.nix similarity index 82% rename from pkgs/genius/default.nix rename to flakes/mypackages/pkgs/genius/default.nix index b40d1d0..54a7957 100644 --- a/pkgs/genius/default.nix +++ b/flakes/mypackages/pkgs/genius/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python3, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }: +{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python38, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }: stdenv.mkDerivation rec { name = "genius-${version}"; version = "1.0.24"; @@ -7,7 +7,7 @@ stdenv.mkDerivation rec { sha256 = "772f95f6ae4716d39bb180cd50e8b6b9b074107bee0cd083b825e1e6e55916b6"; }; buildInputs = [ - mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python3 gnome2.gtksourceview + mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python38 gnome2.gtksourceview autoconf automake libtool ncurses readline pkg-config ]; preConfigure = '' diff --git a/flakes/mypackages/pkgs/ical2html/default.nix b/flakes/mypackages/pkgs/ical2html/default.nix new file mode 100644 index 0000000..62e0b95 --- /dev/null +++ b/flakes/mypackages/pkgs/ical2html/default.nix @@ -0,0 +1,11 @@ +{ stdenv, fetchurl, libical }: +stdenv.mkDerivation rec { + pname = "ical2html"; + version = "3.0"; + src= fetchurl { + url = "https://www.w3.org/Tools/Ical2html/${pname}-${version}.tar.gz"; + sha256 = "sha256-1QhE04cmohhPgZ3I8jz28Z7ZnSJkH2aPnRse5/pReEA="; + }; + buildInputs = [ libical ]; + +} diff --git a/pkgs/monitoring-plugins/default.nix b/flakes/mypackages/pkgs/monitoring-plugins/default.nix similarity index 94% rename from pkgs/monitoring-plugins/default.nix rename to flakes/mypackages/pkgs/monitoring-plugins/default.nix index 852d29b..b09d7a4 100644 --- a/pkgs/monitoring-plugins/default.nix +++ b/flakes/mypackages/pkgs/monitoring-plugins/default.nix @@ -1,5 +1,5 @@ { stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl, - bind, openldap, procps-ng, postfix, + bind, openldap, procps, postfix, wrapperDir ? "/run/wrappers/bin" }: stdenv.mkDerivation rec { @@ -29,5 +29,5 @@ stdenv.mkDerivation rec { --with-sudo-command="${wrapperDir}/sudo" ''; - buildInputs = [ perl file hostname iputils openssl openldap procps-ng bind.dnsutils postfix ]; + buildInputs = [ perl file hostname iputils openssl openldap procps bind.dnsutils postfix ]; } diff --git a/pkgs/mtop/default.nix b/flakes/mypackages/pkgs/mtop/default.nix similarity index 90% rename from pkgs/mtop/default.nix rename to flakes/mypackages/pkgs/mtop/default.nix index 3f6b6bc..ca9be2c 100644 --- a/pkgs/mtop/default.nix +++ b/flakes/mypackages/pkgs/mtop/default.nix @@ -1,5 +1,5 @@ -{ buildPerlPackage, fetchurl, perlPackages, lib }: -buildPerlPackage rec { +{ fetchurl, perlPackages, lib }: +perlPackages.buildPerlPackage rec { pname = "mtop"; version = "0.6.6"; src = fetchurl { diff --git a/flakes/mypackages/pkgs/mutt-ics/default.nix b/flakes/mypackages/pkgs/mutt-ics/default.nix new file mode 100644 index 0000000..2d50475 --- /dev/null +++ b/flakes/mypackages/pkgs/mutt-ics/default.nix @@ -0,0 +1,15 @@ +{ python3Packages, fetchFromGitHub }: +with python3Packages; +buildPythonApplication (rec { + version = "d291187-master"; + pname = "mutt-ics"; + name = "${pname}-${version}"; + src = fetchFromGitHub { + owner = "dmedvinsky"; + repo = "mutt-ics"; + rev = "d29118788f291f67d34fefa6eda9f95846a2fe34"; + sha256 = "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92"; + fetchSubmodules = true; + }; + propagatedBuildInputs = [ icalendar ]; +}) diff --git a/pkgs/muttprint/0.73-4.diff.gz b/flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz similarity index 100% rename from pkgs/muttprint/0.73-4.diff.gz rename to flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz diff --git a/pkgs/muttprint/default.nix b/flakes/mypackages/pkgs/muttprint/default.nix similarity index 100% rename from pkgs/muttprint/default.nix rename to flakes/mypackages/pkgs/muttprint/default.nix diff --git a/pkgs/muttprint/regex.patch b/flakes/mypackages/pkgs/muttprint/regex.patch similarity index 100% rename from pkgs/muttprint/regex.patch rename to flakes/mypackages/pkgs/muttprint/regex.patch diff --git a/pkgs/muttprint/two_edge.patch b/flakes/mypackages/pkgs/muttprint/two_edge.patch similarity index 100% rename from pkgs/muttprint/two_edge.patch rename to flakes/mypackages/pkgs/muttprint/two_edge.patch diff --git a/pkgs/naemon-livestatus/default.nix b/flakes/mypackages/pkgs/naemon-livestatus/default.nix similarity index 56% rename from pkgs/naemon-livestatus/default.nix rename to flakes/mypackages/pkgs/naemon-livestatus/default.nix index 46ef51a..623230a 100644 --- a/pkgs/naemon-livestatus/default.nix +++ b/flakes/mypackages/pkgs/naemon-livestatus/default.nix @@ -1,9 +1,18 @@ -{ stdenv, mylibs, autoconf, automake, +{ stdenv, fetchFromGitHub, autoconf, automake, libtool, pkg-config, naemon, varDir ? "/var/lib/naemon", etcDir ? "/etc/naemon" }: -stdenv.mkDerivation (mylibs.fetchedGithub ./naemon-livestatus.json // { +stdenv.mkDerivation ({ + pname = "naemon-livestatus"; + version = "33dbcfe-master"; + src = fetchFromGitHub { + owner = "naemon"; + repo = "naemon-livestatus"; + rev = "33dbcfe18e42158f25c27cff95a1e07b73be53b0"; + sha256 = "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6"; + fetchSubmodules = true; + }; preConfigure = '' ./autogen.sh || true ''; diff --git a/pkgs/naemon/default.nix b/flakes/mypackages/pkgs/naemon/default.nix similarity index 70% rename from pkgs/naemon/default.nix rename to flakes/mypackages/pkgs/naemon/default.nix index 0341296..2a29bdc 100644 --- a/pkgs/naemon/default.nix +++ b/flakes/mypackages/pkgs/naemon/default.nix @@ -1,4 +1,4 @@ -{ stdenv, mylibs, help2man, monitoring-plugins, autoconf, automake, +{ stdenv, fetchFromGitHub, help2man, monitoring-plugins, autoconf, automake, libtool, glib, pkg-config, gperf, varDir ? "/var/lib/naemon", etcDir ? "/etc/naemon", @@ -8,7 +8,16 @@ user ? "naemon", group ? "naemon" }: -stdenv.mkDerivation (mylibs.fetchedGithub ./naemon.json // { +stdenv.mkDerivation ({ + pname = "naemon"; + version = "d7ac1c8-master"; + src = fetchFromGitHub { + owner = "naemon"; + repo = "naemon-core"; + rev = "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54"; + sha256 = "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m"; + fetchSubmodules = true; + }; passthru.status_engine_version = "1-1-0"; preConfigure = '' ./autogen.sh || true diff --git a/flakes/mypackages/pkgs/nagios-cli/default.nix b/flakes/mypackages/pkgs/nagios-cli/default.nix new file mode 100644 index 0000000..99ae843 --- /dev/null +++ b/flakes/mypackages/pkgs/nagios-cli/default.nix @@ -0,0 +1,12 @@ +{ python2Packages, fetchFromGitHub }: +python2Packages.buildPythonApplication rec { + version = "edc51ea-master"; + pname = "nagios-cli"; + src = fetchFromGitHub { + owner = "tehmaze"; + repo = "nagios-cli"; + rev = "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9"; + sha256 = "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp"; + fetchSubmodules = true; + }; +} diff --git a/flakes/mypackages/pkgs/nagnu/default.nix b/flakes/mypackages/pkgs/nagnu/default.nix new file mode 100644 index 0000000..c7a1162 --- /dev/null +++ b/flakes/mypackages/pkgs/nagnu/default.nix @@ -0,0 +1,21 @@ +{ stdenv, fetchFromGitHub, ncurses, curl }: +stdenv.mkDerivation (rec { + pname = "nagnu"; + version = "c7e65fc-master"; + src = fetchFromGitHub { + owner = "frlen"; + repo = "nagnu"; + rev = "c7e65fc02f46a3756a4cc47953ea2f3e57a84728"; + sha256 = "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3"; + fetchSubmodules = true; + }; + buildInputs = [ ncurses curl ]; + installPhase = '' + mkdir -p $out/bin + cp nagnu $out/bin + mkdir -p $out/share/doc/nagnu + cp nagnu.conf.sample $out/share/doc/nagnu + mkdir -p $out/share/man/man8 + cp docs/nagnu.8 $out/share/man/man8 + ''; +}) diff --git a/pkgs/nb/default.nix b/flakes/mypackages/pkgs/nb/default.nix similarity index 80% rename from pkgs/nb/default.nix rename to flakes/mypackages/pkgs/nb/default.nix index 37cc89f..337c286 100644 --- a/pkgs/nb/default.nix +++ b/flakes/mypackages/pkgs/nb/default.nix @@ -1,4 +1,4 @@ -{ pkgs ? import {} }: with pkgs; +{ fetchFromGitHub, stdenv, makeWrapper, lib, file }: stdenv.mkDerivation { pname = "nb"; version = "e0d4e24-master"; @@ -9,11 +9,13 @@ stdenv.mkDerivation { sha256 = "0gpnlzxjlfn3bagw74lsrmfhxj2xzvk6sjj24wp9rjpk42d9mfml"; }; phases = "installPhase"; + buildInputs = [ makeWrapper ]; installPhase = '' mkdir -p $out/bin $out/share/zsh/vendor-completions $out/share/bash-completion/completions cp $src/nb $out/bin/nb chmod +x $out/bin/nb patchShebangs $out/bin/nb + wrapProgram $out/bin/nb --prefix PATH : ${lib.makeBinPath [ file ]} cp $src/etc/nb-completion.zsh $out/share/zsh/vendor-completions/_nb cp $src/etc/nb-completion.bash $out/share/bash-completion/completions/nb ''; diff --git a/pkgs/note/default.nix b/flakes/mypackages/pkgs/note/default.nix similarity index 88% rename from pkgs/note/default.nix rename to flakes/mypackages/pkgs/note/default.nix index d5fcccd..b3b03ef 100644 --- a/pkgs/note/default.nix +++ b/flakes/mypackages/pkgs/note/default.nix @@ -1,5 +1,5 @@ -{ lib, buildPerlPackage, fetchurl, perlPackages }: -buildPerlPackage rec { +{ lib, fetchurl, perlPackages }: +perlPackages.buildPerlPackage rec { pname = "note"; version = "1.3.26"; src = fetchurl { diff --git a/pkgs/notmuch/notmuch-python/default.nix b/flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix similarity index 100% rename from pkgs/notmuch/notmuch-python/default.nix rename to flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix diff --git a/pkgs/notmuch/notmuch-vim/default.nix b/flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix similarity index 100% rename from pkgs/notmuch/notmuch-vim/default.nix rename to flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix diff --git a/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix new file mode 100644 index 0000000..96e9abc --- /dev/null +++ b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix @@ -0,0 +1,48 @@ +{ perlPackages, fetchurl }: +let + TestXML = perlPackages.buildPerlPackage rec { + pname = "Test-XML"; + version = "0.08"; + src = fetchurl { + url = "mirror://cpan/authors/id/S/SE/SEMANTICO/Test-XML-0.08.tar.gz"; + sha256 = "sha256-61TMI83shg062KyKaXy/A40N7JUimRLZdcMBiQyoPuI="; + }; + propagatedBuildInputs = with perlPackages; [ + ModuleBuild XMLSemanticDiff XMLParser + ]; + }; + iCalParserSAX = perlPackages.buildPerlPackage rec { + pname = "iCal-Parser-SAX"; + version = "1.09"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RF/RFRANKEL/iCal-Parser-SAX-1.09.tar.gz"; + sha256 = "sha256-fouAjQ+MTUgwZ/j3dIarOK0rVBZcZy6aOJFor4pLql0="; + }; + propagatedBuildInputs = with perlPackages; [ + ModuleBuild DateTime IOString XMLSAXBase XMLSAXWriter iCalParser + LWPUserAgent + ]; + buildInputs = [ TestXML ]; + doCheck = false; + }; +in +perlPackages.buildPerlPackage rec { + pname = "iCal-Parser-HTML"; + version = "1.07"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RF/RFRANKEL/${pname}-${version}.tar.gz"; + sha256 = "sha256-cxRS2M6aVrCtAXHQae0Y6EtEfGnGx41UuB7z442NSrU="; + }; + patchPhase = '' + sed -i -e "s/qw(week month year)/(qw(week month year))/" lib/iCal/Parser/HTML.pm + ''; + doCheck = false; + postInstall = '' + mkdir -p $out/bin + cp scripts/ical2html $out/bin + chmod +x $out/bin/ical2html + ''; + propagatedBuildInputs = with perlPackages; [ + ModuleBuild XMLLibXML XMLLibXSLT iCalParser iCalParserSAX + ]; +} diff --git a/flakes/mypackages/pkgs/pgpid/default.nix b/flakes/mypackages/pkgs/pgpid/default.nix new file mode 100644 index 0000000..a1fb9c2 --- /dev/null +++ b/flakes/mypackages/pkgs/pgpid/default.nix @@ -0,0 +1,33 @@ +{ lib, stdenv, fetchFromGitHub, makeWrapper, bashInteractive, bash-libs, coreutils, file, gnugrep, texlive, pandoc, aspell, util-linux, findutils, gnused, gnupg, gawk, facedetect, graphicsmagick, qrencode, tesseract4, zbar, cups, vim }: +stdenv.mkDerivation { + pname = "pgpid"; + version = "master"; + src = fetchFromGitHub { + owner = "foopgp"; + repo = "pgpid"; + rev = "26c2137951775652e9e774977639ecaea5845cf7"; + sha256 = "sha256-noXDYWWxUryFnV99pyl0eV7hJLUkSy97Vqylx5dKN9g="; + }; + + buildInputs = [ makeWrapper ]; + phases = [ "installPhase" ]; + installPhase = '' + mkdir -p $out/bin $out/share/pgpid $out/share/doc/pgpid + + cp $src/pgpid-gen $src/pgpid-qrscan $out/bin + cp -r $src/doc $out/share/doc/pgpid + cp -r $src/data $out/share/pgpid + cp -r $src/imgsamples $out/share/pgpid + for i in $out/bin/*; do + patchShebangs $i + sed -i -e "/^TESSDATADIR/d" -e "/^GEOLIST_CENTROID/d" $i + sed -i -e 's@"$(dirname "$BASH_SOURCE")"@${bash-libs}/share/bash-libs/include@' $i + wrapProgram $i --set PATH ${lib.makeBinPath [ + facedetect graphicsmagick qrencode tesseract4 zbar cups gnugrep vim gnupg findutils + pandoc (texlive.combine { scheme-small = texlive.scheme-small; pdfcrop = texlive.pdfcrop; }) + ]}:$(cat ${bash-libs}/nix-support/propagated-build-inputs) \ + --set TESSDATADIR $out/share/pgpid/data \ + --set GEOLIST_CENTROID $out/share/pgpid/data/geolist_centroid.txt + done + ''; +} diff --git a/flakes/mypackages/pkgs/predixy/default.nix b/flakes/mypackages/pkgs/predixy/default.nix new file mode 100644 index 0000000..259d7fd --- /dev/null +++ b/flakes/mypackages/pkgs/predixy/default.nix @@ -0,0 +1,19 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "predixy"; + version = "dacf3fb-master"; + src = fetchFromGitHub { + owner = "joyieldInc"; + repo = "predixy"; + rev = "dacf3fb30c2602dc044040df04e194d44b49c1be"; + sha256 = "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir -p $out/bin + cp src/predixy $out/bin + mkdir -p $out/share + cp -r doc $out/share + cp -r conf $out/share/doc + ''; +}) diff --git a/pkgs/proftpd/default.nix b/flakes/mypackages/pkgs/proftpd/default.nix similarity index 56% rename from pkgs/proftpd/default.nix rename to flakes/mypackages/pkgs/proftpd/default.nix index af9d6c6..8bdf531 100644 --- a/pkgs/proftpd/default.nix +++ b/flakes/mypackages/pkgs/proftpd/default.nix @@ -1,22 +1,21 @@ -{ pkgs ? import {} }: -with pkgs; +{ stdenv, fetchurl, file, openssl, libsodium, ncurses, cyrus_sasl, openldap, pkg-config, libxcrypt }: stdenv.mkDerivation rec { pname = "proftpd"; - version = "1.3.7c"; + version = "1.3.8"; src = fetchurl { url = "https://github.com/proftpd/proftpd/archive/refs/tags/v${version}.tar.gz"; - sha256 = "1nh02j00ly814fk885wn9zx1lb63cqd8qv3mgz719xkckf5rcw3h"; + sha256 = "sha256-9xOec3eiywWbi5sU12pt9fRA4xgcsVrokNQ7vK5XR0g="; }; postPatch = '' sed -i -e "s@/usr/bin/file@${file}/bin/file@" configure ''; dontDisableStatic = 1; - configureFlags = "--enable-openssl --with-modules=mod_ldap:mod_sftp:mod_tls --with-includes=${libsodium.dev}/include --with-libraries=${libsodium}/lib"; + configureFlags = [ "--enable-openssl" "--with-modules=mod_ldap:mod_sftp:mod_tls:mod_site_misc" "--with-includes=${libsodium.dev}/include" "--with-libraries=${libsodium}/lib" ]; preInstall = '' installFlagsArray=(INSTALL_USER=$(id -u) INSTALL_GROUP=$(id -g)) ''; - buildInputs = [ openssl libsodium ncurses cyrus_sasl openldap pkg-config ]; + buildInputs = [ openssl libsodium ncurses cyrus_sasl openldap pkg-config libxcrypt ]; postInstall = '' rmdir $out/var $out/libexec $out/lib/proftpd $out/share/locale ''; diff --git a/pkgs/pure-ftpd/default.nix b/flakes/mypackages/pkgs/pure-ftpd/default.nix similarity index 92% rename from pkgs/pure-ftpd/default.nix rename to flakes/mypackages/pkgs/pure-ftpd/default.nix index 32a7a91..55c698f 100644 --- a/pkgs/pure-ftpd/default.nix +++ b/flakes/mypackages/pkgs/pure-ftpd/default.nix @@ -1,5 +1,5 @@ { ldapFtpId ? null -, stdenv, fetchurl, openssl, postgresql, openldap }: +, stdenv, lib, fetchurl, openssl, postgresql, openldap }: stdenv.mkDerivation rec { name = "pure-ftpd-1.0.47"; @@ -20,7 +20,7 @@ stdenv.mkDerivation rec { configureFlags = [ "--with-everything" "--with-tls" "--with-pgsql" "--with-ldap" ]; - meta = with stdenv.lib; { + meta = with lib; { description = "A free, secure, production-quality and standard-conformant FTP server"; homepage = https://www.pureftpd.org; license = licenses.isc; # with some parts covered by BSD3(?) diff --git a/flakes/mypackages/pkgs/riotkit-do/default.nix b/flakes/mypackages/pkgs/riotkit-do/default.nix new file mode 100644 index 0000000..3ddb1ab --- /dev/null +++ b/flakes/mypackages/pkgs/riotkit-do/default.nix @@ -0,0 +1,60 @@ +{ python3Packages }: +let + tabulate = python3Packages.buildPythonPackage rec { + version = "0.8.7"; + pname = "tabulate"; + + src = python3Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-2ycjog0EvNqFIhZcc+6nwwDtp04M6FLZAi4BWdeJUAc="; + }; + + checkInputs = with python3Packages; [ nose ]; + + doCheck = false; + }; + + python-dotenv = python3Packages.buildPythonPackage rec { + pname = "python-dotenv"; + version = "0.13.0"; + + src = python3Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-O5kJvJaw7cawFYbh7tBecRdO9OBMcdpXhjcM6+pTrXQ="; + }; + + propagatedBuildInputs = with python3Packages; [ click ]; + + checkInputs = with python3Packages; [ + ipython + mock + pytestCheckHook + sh + ]; + + disabledTests = [ + "cli" + ]; + + pythonImportsCheck = [ "dotenv" ]; + }; +in +python3Packages.buildPythonApplication rec { + pname = "rkd"; + version = "2.4.0"; + src = python3Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-WC0FmUYGkV9PFvRtiFW6w6RtP+9Zf6kizl8jGiRb4HQ="; + }; + + propagatedBuildInputs = with python3Packages; [ + pbr + jinja2 + pyyaml + tabulate + psutil + pytest + python-dotenv + jsonschema + ]; +} diff --git a/pkgs/rrsync_sudo/default.nix b/flakes/mypackages/pkgs/rrsync_sudo/default.nix similarity index 100% rename from pkgs/rrsync_sudo/default.nix rename to flakes/mypackages/pkgs/rrsync_sudo/default.nix diff --git a/pkgs/rrsync_sudo/sudo.patch b/flakes/mypackages/pkgs/rrsync_sudo/sudo.patch similarity index 100% rename from pkgs/rrsync_sudo/sudo.patch rename to flakes/mypackages/pkgs/rrsync_sudo/sudo.patch diff --git a/flakes/mypackages/pkgs/shaarli/default.nix b/flakes/mypackages/pkgs/shaarli/default.nix new file mode 100644 index 0000000..23f9937 --- /dev/null +++ b/flakes/mypackages/pkgs/shaarli/default.nix @@ -0,0 +1,24 @@ +{ varDir ? "/var/lib/shaarli", stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "shaarli"; + version = "0.10.2"; + src = fetchurl { + url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz"; + sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78"; + }; + patchPhase = ""; + + outputs = [ "out" "doc" ]; + + patches = [ ./shaarli_ldap.patch ]; + installPhase = '' + rm -r {cache,pagecache,tmp,data}/ + mkdir -p $doc/share/doc + mv doc/ $doc/share/doc/shaarli + mkdir $out/ + cp -R ./* $out + cp .htaccess $out/ + ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/ + ''; +} diff --git a/overlays/shaarli/shaarli_ldap.patch b/flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch similarity index 100% rename from overlays/shaarli/shaarli_ldap.patch rename to flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch diff --git a/pkgs/signaldctl/default.nix b/flakes/mypackages/pkgs/signaldctl/default.nix similarity index 100% rename from pkgs/signaldctl/default.nix rename to flakes/mypackages/pkgs/signaldctl/default.nix diff --git a/pkgs/slang_1/default.nix b/flakes/mypackages/pkgs/slang_1/default.nix similarity index 100% rename from pkgs/slang_1/default.nix rename to flakes/mypackages/pkgs/slang_1/default.nix diff --git a/pkgs/status_engine/host_perfdata.patch b/flakes/mypackages/pkgs/status_engine/host_perfdata.patch similarity index 100% rename from pkgs/status_engine/host_perfdata.patch rename to flakes/mypackages/pkgs/status_engine/host_perfdata.patch diff --git a/pkgs/status_engine/interface.nix b/flakes/mypackages/pkgs/status_engine/interface.nix similarity index 63% rename from pkgs/status_engine/interface.nix rename to flakes/mypackages/pkgs/status_engine/interface.nix index 7ee4889..9c8ff5e 100644 --- a/pkgs/status_engine/interface.nix +++ b/flakes/mypackages/pkgs/status_engine/interface.nix @@ -1,6 +1,9 @@ -{ stdenv, composerEnv, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }: -composerEnv.buildPackage ( - import ./interface_php_packages.nix { inherit composerEnv fetchurl; } // rec { +{ stdenv, composerEnv, php73, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }: +let + composerEnv' = composerEnv.override { php = php73; }; +in +composerEnv'.buildPackage ( + import ./interface_php_packages.nix { composerEnv = composerEnv'; inherit fetchurl; } // rec { pname = "interface"; version = "3.4.0"; name = "${pname}-${version}"; diff --git a/pkgs/status_engine/interface_composer.lock b/flakes/mypackages/pkgs/status_engine/interface_composer.lock similarity index 100% rename from pkgs/status_engine/interface_composer.lock rename to flakes/mypackages/pkgs/status_engine/interface_composer.lock diff --git a/pkgs/status_engine/interface_php_packages.nix b/flakes/mypackages/pkgs/status_engine/interface_php_packages.nix similarity index 100% rename from pkgs/status_engine/interface_php_packages.nix rename to flakes/mypackages/pkgs/status_engine/interface_php_packages.nix diff --git a/flakes/mypackages/pkgs/status_engine/module.nix b/flakes/mypackages/pkgs/status_engine/module.nix new file mode 100644 index 0000000..d3ac03e --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/module.nix @@ -0,0 +1,19 @@ +{ stdenv, fetchFromGitHub, gearmand, json_c, libuuid, libevent, pkgconfig, glib }: +stdenv.mkDerivation ({ + pname = "statusengine-module"; + version = "d461e95-master"; + src = fetchFromGitHub { + owner = "statusengine"; + repo = "module"; + rev = "d461e95a11fffaac604d11ac42d237b5e13071bc"; + sha256 = "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n"; + fetchSubmodules = true; + }; + patches = [ ./host_perfdata.patch ]; + buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ]; + makeFlags = "all"; + installPhase = '' + mkdir -p $out/lib/status-engine + cp -a src/bin/* $out/lib/status-engine + ''; +}) diff --git a/flakes/mypackages/pkgs/status_engine/worker.nix b/flakes/mypackages/pkgs/status_engine/worker.nix new file mode 100644 index 0000000..d8425e1 --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/worker.nix @@ -0,0 +1,37 @@ +{ stdenv, fetchFromGitHub, composerEnv, fetchurl, gearmand, callPackage, php81, config_file ? "/var/lib/status_engine/ui.yml" }: +let + gearman = php81.buildPecl rec { + # git describe + version = "2.1.0-12-g8fb88d5"; + pname = "gearman"; + src = fetchFromGitHub { + owner = "php"; + repo = "pecl-networking-gearman"; + rev = "8fb88d5a97111a7e8f0dc67553c387b49f047e53"; + sha256 = "sha256-VPJX29JfNjh0mHlYY+iYKBHSJGUINbWHvojyYBSkSho="; + }; + configureFlags = [ "--with-gearman=${gearmand}" ]; + nativeBuildInputs = [ gearmand ]; + }; + php = php81.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath iconv])); +in +(composerEnv.override { inherit php; }).buildPackage ( + import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec { + name = "${pname}-${version}"; + pname = "worker"; + version = "master"; + src = fetchFromGitHub { + owner = "statusengine"; + repo = "worker"; + rev = "e20d6b5c83c6b3c6a2030c9506542fa59dcbb551"; + sha256 = "sha256-dcC+SLEqMUubp4JQFSuKNpd6U4VYvGR38Vn1jf6ZvTU="; + fetchSubmodules = true; + }; + passthru.php = php; + postInstall = '' + ln -s ${config_file} $out/etc/config.yml + ''; + preInstall = '' + cp ${./worker_composer.lock} $out/composer.lock + ''; +}) diff --git a/flakes/mypackages/pkgs/status_engine/worker_composer.lock b/flakes/mypackages/pkgs/status_engine/worker_composer.lock new file mode 100644 index 0000000..bba0d2d --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/worker_composer.lock @@ -0,0 +1,2072 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "f61ef94b19969eb2446f52577078d701", + "packages": [ + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-17T14:14:24+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.13.9", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.4.6", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^4.4", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.22.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.9" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-05-02T20:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + }, + "time": "2023-06-03T09:27:29+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:51:15+00:00" + }, + { + "name": "doctrine/migrations", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "28d92a34348fee5daeb80879e56461b2e862fc05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05", + "reference": "28d92a34348fee5daeb80879e56461b2e862fc05", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "doctrine/dbal": "^2.9", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.1 || ^8.0", + "symfony/console": "^3.4||^4.4.16||^5.0", + "symfony/stopwatch": "^3.4||^4.0||^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "doctrine/orm": "^2.6", + "ext-pdo_sqlite": "*", + "jdorn/sql-formatter": "^1.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/cache": "^4.4. || ^5.3", + "symfony/process": "^3.4||^4.0||^5.0", + "symfony/yaml": "^3.4||^4.0||^5.0" + }, + "suggest": { + "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/2.3.5" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2021-10-19T19:55:20+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.16", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2023-05-24T07:17:17+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.7.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "91aabc066d5620428120800c0eafc0411e441a62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62", + "reference": "91aabc066d5620428120800c0eafc0411e441a62", + "shasum": "" + }, + "require": { + "php": ">=7.4, <8.2" + }, + "require-dev": { + "doctrine/annotations": "^1.13.2", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.3.0", + "laminas/laminas-stdlib": "^3.6.1", + "phpunit/phpunit": "^9.5.10", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.13.1" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "files": [ + "polyfill/ReflectionEnumPolyfill.php" + ], + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-11-21T01:32:31+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-amqplib/php-amqplib", + "version": "v3.5.4", + "source": { + "type": "git", + "url": "https://github.com/php-amqplib/php-amqplib.git", + "reference": "1aecbd182b35eb039667c50d7d92d71f105be779" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779", + "reference": "1aecbd182b35eb039667c50d7d92d71f105be779", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-sockets": "*", + "php": "^7.1||^8.0", + "phpseclib/phpseclib": "^2.0|^3.0" + }, + "conflict": { + "php": "7.4.0 - 7.4.1" + }, + "replace": { + "videlalvaro/php-amqplib": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "nategood/httpful": "^0.2.20", + "phpunit/phpunit": "^7.5|^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpAmqpLib\\": "PhpAmqpLib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Alvaro Videla", + "role": "Original Maintainer" + }, + { + "name": "Raúl Araya", + "email": "nubeiro@gmail.com", + "role": "Maintainer" + }, + { + "name": "Luke Bakken", + "email": "luke@bakken.io", + "role": "Maintainer" + }, + { + "name": "Ramūnas Dronga", + "email": "github@ramuno.lt", + "role": "Maintainer" + } + ], + "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", + "homepage": "https://github.com/php-amqplib/php-amqplib/", + "keywords": [ + "message", + "queue", + "rabbitmq" + ], + "support": { + "issues": "https://github.com/php-amqplib/php-amqplib/issues", + "source": "https://github.com/php-amqplib/php-amqplib/tree/v3.5.4" + }, + "time": "2023-07-01T11:25:08+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.21", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1", + "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.21" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2023-07-09T15:24:48+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-19T20:11:33+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:55:41+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-20T17:44:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:58+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee", + "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:03:56+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.23", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.23" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-23T19:33:36+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.2.0", + "ext-redis": "*", + "ext-gearman": "*", + "ext-mbstring": "*", + "ext-bcmath": "*", + "ext-json": "*", + "ext-iconv": "*", + "ext-pdo": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.2.0" +} diff --git a/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix new file mode 100644 index 0000000..47291d2 --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix @@ -0,0 +1,266 @@ +{composerEnv, fetchurl, fetchgit ? null, fetchhg ? null, fetchsvn ? null, noDev ? false}: +{ + packages = + { + "composer/package-versions-deprecated" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "composer-package-versions-deprecated-b4f54f74ef3453349c24a845d22392cd31e65f1d"; + src = fetchurl { + url = "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d"; + sha256 = "1hrjxvk8i14pw9gi7j3qc0gljjy74hwdkv8zwsrg5brgyzhqfwam"; + }; + }; + }; + "doctrine/cache" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-cache-1ca8f21980e770095a31456042471a57bc4c68fb"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb"; + sha256 = "1p8ia9g3mqz71bv4x8q1ng1fgcidmyksbsli1fjbialpgjk9k1ss"; + }; + }; + }; + "doctrine/dbal" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-dbal-c480849ca3ad6706a39c970cdfe6888fa8a058b8"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8"; + sha256 = "15j98h80li6m1aj53p8ddy0lkbkanc5kdy6xrikpdd6zhmsfgq9k"; + }; + }; + }; + "doctrine/deprecations" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-deprecations-612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"; + sha256 = "078w4k0xdywyb44caz5grbcbxsi87iy13g7a270rs9g5f0p245fi"; + }; + }; + }; + "doctrine/event-manager" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-event-manager-95aa4cb529f1e96576f3fda9f5705ada4056a520"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520"; + sha256 = "0xi2s28jmmvrndg1yd0r5s10d9a0q6j2dxdbazvcbws9waf0yrvj"; + }; + }; + }; + "doctrine/migrations" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-migrations-28d92a34348fee5daeb80879e56461b2e862fc05"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05"; + sha256 = "0j5snc96r03vcjlb3k94cx871f69xaq53bza8mm8xs4jk85gr5jg"; + }; + }; + }; + "friendsofphp/proxy-manager-lts" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "friendsofphp-proxy-manager-lts-ecadbdc9052e4ad08c60c8a02268712e50427f7c"; + src = fetchurl { + url = "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c"; + sha256 = "15ch54cm3rvjyvsvqs9ixfn3vnydfxa0knd4g6myapsryirrskvi"; + }; + }; + }; + "laminas/laminas-code" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "laminas-laminas-code-91aabc066d5620428120800c0eafc0411e441a62"; + src = fetchurl { + url = "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62"; + sha256 = "01wsb6ph5h8ga9rnlr0lxd3qwn897ccxqxpbz540lfgz7a1prpb0"; + }; + }; + }; + "paragonie/constant_time_encoding" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "paragonie-constant_time_encoding-58c3f47f650c94ec05a151692652a868995d2938"; + src = fetchurl { + url = "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938"; + sha256 = "0i9km0lzvc7df9758fm1p3y0679pzvr5m9x3mrz0d2hxlppsm764"; + }; + }; + }; + "paragonie/random_compat" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "paragonie-random_compat-996434e5492cb4c3edcb9168db6fbb1359ef965a"; + src = fetchurl { + url = "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a"; + sha256 = "0ky7lal59dihf969r1k3pb96ql8zzdc5062jdbg69j6rj0scgkyx"; + }; + }; + }; + "php-amqplib/php-amqplib" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "php-amqplib-php-amqplib-1aecbd182b35eb039667c50d7d92d71f105be779"; + src = fetchurl { + url = "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779"; + sha256 = "0wwzlf2yhjrc523n0y7qh23pxgn4f2qhkbr0jnxzq9j6mm75hnjm"; + }; + }; + }; + "phpseclib/phpseclib" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "phpseclib-phpseclib-4580645d3fc05c189024eb3b834c6c1e4f0f30a1"; + src = fetchurl { + url = "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1"; + sha256 = "0v3c7n9h99pw4f03bfxjsgni7wpq7xr47nw2hf2hq8yjndw19n3p"; + }; + }; + }; + "psr/container" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "psr-container-c71ecc56dfe541dbd90c5360474fbc405f8d5963"; + src = fetchurl { + url = "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963"; + sha256 = "1mvan38yb65hwk68hl0p7jymwzr4zfnaxmwjbw7nj3rsknvga49i"; + }; + }; + }; + "symfony/console" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-console-b504a3d266ad2bb632f196c0936ef2af5ff6e273"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273"; + sha256 = "0na3lpgzvrsxngyzv2w90k3ykw1y5j4p6v965v3sal03y6rr2w2i"; + }; + }; + }; + "symfony/deprecation-contracts" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-deprecation-contracts-26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"; + sha256 = "1wlaj9ngbyjmgr92gjyf7lsmjfswyh8vpbzq5rdzaxjb6bcsj3dp"; + }; + }; + }; + "symfony/filesystem" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-filesystem-3d49eec03fda1f0fc19b7349fbbe55ebc1004214"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214"; + sha256 = "0dhnyj6m9n6359z5c0xh4pz38n89i9x5c9r1s2dlgxz0daysbbyy"; + }; + }; + }; + "symfony/polyfill-ctype" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-ctype-5bbc823adecdae860bb64756d639ecfec17b050a"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a"; + sha256 = "0vyv70z1yi2is727d1mkb961w5r1pb1v3wy1pvdp30h8ffy15wk6"; + }; + }; + }; + "symfony/polyfill-intl-grapheme" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-intl-grapheme-511a08c03c1960e08a883f4cffcacd219b758354"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354"; + sha256 = "0ifsgsyxf0z0nkynqvr5259dm5dsmbgdpvyi5zfvy8935mi0ki0i"; + }; + }; + }; + "symfony/polyfill-intl-normalizer" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-intl-normalizer-19bd1e4fcd5b91116f14d8533c57831ed00571b6"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6"; + sha256 = "1d80jph5ykiw6ydv8fwd43s0aglh24qc1yrzds2f3aqanpbk1gr2"; + }; + }; + }; + "symfony/polyfill-mbstring" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-mbstring-8ad114f6b39e2c98a8b0e3bd907732c207c2b534"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534"; + sha256 = "1ym84qp609i50lv4vkd4yz99y19kaxd5kmpdnh66mxx1a4a104mi"; + }; + }; + }; + "symfony/polyfill-php73" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-php73-9e8ecb5f92152187c4799efd3c96b78ccab18ff9"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9"; + sha256 = "1p0jr92x323pl4frjbhmziyk5g1zig1g30i1v1p0wfli2sq8h5mb"; + }; + }; + }; + "symfony/polyfill-php80" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-php80-7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"; + sha256 = "16yydk7rsknlasrpn47n4b4js8svvp4rxzw99dkav52wr3cqmcwd"; + }; + }; + }; + "symfony/service-contracts" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-service-contracts-d78d39c1599bd1188b8e26bb341da52c3c6d8a66"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66"; + sha256 = "1cgbn2yx2fyrc3c1d85vdriiwwifr1sdg868f3rhq9bh78f03z99"; + }; + }; + }; + "symfony/stopwatch" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-stopwatch-f83692cd869a6f2391691d40a01e8acb89e76fee"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee"; + sha256 = "1qh49p2jfca5kpcmlcbjx5izgqqvjd91385zy5mipyslsdik2lwg"; + }; + }; + }; + "symfony/string" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-string-d9e72497367c23e08bf94176d2be45b00a9d232a"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a"; + sha256 = "0k4vvcjfdp2dni8gzq4rn8d6n0ivd38sfna70lgsh8vlc8rrlhpf"; + }; + }; + }; + "symfony/yaml" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-yaml-4cd2e3ea301aadd76a4172756296fe552fb45b0b"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b"; + sha256 = "18yirwiqbh11fwlpqypm0wlc0lnx7prgk68xrn607zcg6cxnfhiz"; + }; + }; + }; + }; +} diff --git a/flakes/mypackages/pkgs/telegram-history-dump/default.nix b/flakes/mypackages/pkgs/telegram-history-dump/default.nix new file mode 100644 index 0000000..492e265 --- /dev/null +++ b/flakes/mypackages/pkgs/telegram-history-dump/default.nix @@ -0,0 +1,18 @@ +{ stdenv, ruby, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "telegram-history-dump"; + version = "468ea91-master"; + src = fetchFromGitHub { + owner = "tvdstaaij"; + repo = "telegram-history-dump"; + rev = "468ea91e543529b54bc2c5ea28b1ea17f362fd3e"; + sha256 = "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir -p $out/lib $out/bin + cp -a $src $out/lib/telegram-history-dump + ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump + ''; + buildInputs = [ ruby ]; +}) diff --git a/pkgs/telegramircd/default.nix b/flakes/mypackages/pkgs/telegramircd/default.nix similarity index 62% rename from pkgs/telegramircd/default.nix rename to flakes/mypackages/pkgs/telegramircd/default.nix index 2f1d7ca..d9196a2 100644 --- a/pkgs/telegramircd/default.nix +++ b/flakes/mypackages/pkgs/telegramircd/default.nix @@ -1,11 +1,17 @@ -{ openssl, telethon, python3Packages, mylibs }: +{ openssl, telethon, python3Packages, fetchFromGitHub }: with python3Packages; buildPythonApplication rec { format = "other"; pname = "telegramircd"; version = "master"; propagatedBuildInputs = [ telethon aiohttp ConfigArgParse openssl ]; - src = (mylibs.fetchedGithub ./telegramircd.json).src; + src = fetchFromGitHub { + owner = "MaskRay"; + repo = "telegramircd"; + rev = "40a0c7cf60492bde3f44d43f06f62e3792480139"; + sha256 = "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y"; + fetchSubmodules = true; + }; LD_LIBRARY_PATH = "${openssl.out}/lib"; installPhase = '' install -D $src/telegramircd.py $out/bin/telegramircd diff --git a/pkgs/telethon_sync/default.nix b/flakes/mypackages/pkgs/telethon_sync/default.nix similarity index 100% rename from pkgs/telethon_sync/default.nix rename to flakes/mypackages/pkgs/telethon_sync/default.nix diff --git a/pkgs/terminal-velocity/default.nix b/flakes/mypackages/pkgs/terminal-velocity/default.nix similarity index 94% rename from pkgs/terminal-velocity/default.nix rename to flakes/mypackages/pkgs/terminal-velocity/default.nix index 1a015c0..3ccfcd3 100644 --- a/pkgs/terminal-velocity/default.nix +++ b/flakes/mypackages/pkgs/terminal-velocity/default.nix @@ -1,5 +1,5 @@ -{ python36Packages }: -with python36Packages; +{ python37Packages }: +with python37Packages; buildPythonApplication rec { pname = "terminal-velocity-git"; version = "0.2.0"; diff --git a/pkgs/terminal-velocity/fix_build.patch b/flakes/mypackages/pkgs/terminal-velocity/fix_build.patch similarity index 100% rename from pkgs/terminal-velocity/fix_build.patch rename to flakes/mypackages/pkgs/terminal-velocity/fix_build.patch diff --git a/pkgs/terminal-velocity/python3_support.patch b/flakes/mypackages/pkgs/terminal-velocity/python3_support.patch similarity index 100% rename from pkgs/terminal-velocity/python3_support.patch rename to flakes/mypackages/pkgs/terminal-velocity/python3_support.patch diff --git a/pkgs/terminal-velocity/sort_found_notes.patch b/flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch similarity index 100% rename from pkgs/terminal-velocity/sort_found_notes.patch rename to flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch diff --git a/pkgs/tiv/default.nix b/flakes/mypackages/pkgs/tiv/default.nix similarity index 86% rename from pkgs/tiv/default.nix rename to flakes/mypackages/pkgs/tiv/default.nix index 3e7a56c..2415db9 100644 --- a/pkgs/tiv/default.nix +++ b/flakes/mypackages/pkgs/tiv/default.nix @@ -1,5 +1,5 @@ -{ buildPerlPackage, fetchurl, perlPackages }: -buildPerlPackage rec { +{ fetchurl, perlPackages }: +perlPackages.buildPerlPackage rec { pname = "tiv"; version = "2015"; src = fetchurl { diff --git a/pkgs/tiv/tiv_builder.sh b/flakes/mypackages/pkgs/tiv/tiv_builder.sh similarity index 100% rename from pkgs/tiv/tiv_builder.sh rename to flakes/mypackages/pkgs/tiv/tiv_builder.sh diff --git a/pkgs/twins/default.nix b/flakes/mypackages/pkgs/twins/default.nix similarity index 100% rename from pkgs/twins/default.nix rename to flakes/mypackages/pkgs/twins/default.nix diff --git a/pkgs/umami/build-geo.patch b/flakes/mypackages/pkgs/umami/build-geo.patch similarity index 100% rename from pkgs/umami/build-geo.patch rename to flakes/mypackages/pkgs/umami/build-geo.patch diff --git a/pkgs/umami/default.nix b/flakes/mypackages/pkgs/umami/default.nix similarity index 100% rename from pkgs/umami/default.nix rename to flakes/mypackages/pkgs/umami/default.nix diff --git a/pkgs/unicode/default.nix b/flakes/mypackages/pkgs/unicode/default.nix similarity index 100% rename from pkgs/unicode/default.nix rename to flakes/mypackages/pkgs/unicode/default.nix diff --git a/flakes/mypackages/pkgs/upcmd/default.nix b/flakes/mypackages/pkgs/upcmd/default.nix new file mode 100644 index 0000000..614ae2b --- /dev/null +++ b/flakes/mypackages/pkgs/upcmd/default.nix @@ -0,0 +1,13 @@ +{ buildGoModule, fetchFromGitHub }: +buildGoModule rec { + pname = "upcmd"; + version = "20220112"; + src = fetchFromGitHub { + owner = pname; + repo = "up"; + rev = "rolling-${version}"; + sha256 = "sha256-dCi8p0oqLjEhEazbT4sgH7Sku3f/N79VWj5CO7LbvVA="; + }; + doCheck = false; + vendorSha256 = "sha256-Ve+lEVrxv4rwymrqHSc1V4SL7BWP4wsIHF8ObBWyHE4="; +} diff --git a/flakes/mypackages/pkgs/webapps/adminer/default.nix b/flakes/mypackages/pkgs/webapps/adminer/default.nix new file mode 100644 index 0000000..cd01080 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/adminer/default.nix @@ -0,0 +1,14 @@ +{ stdenv, fetchurl }: +stdenv.mkDerivation rec { + version = "4.8.2"; + pname = "adminer"; + src = fetchurl { + url = "https://github.com/adminerevo/adminerevo/releases/download/v${version}/${pname}-${version}.php"; + sha256 = "sha256-jXcnGLyNQZqJKS0Rs+UY1SxzknBEZwBhcbD0BmJVFKs="; + }; + phases = "installPhase"; + installPhase = '' + mkdir -p $out + cp $src $out/index.php + ''; +} diff --git a/pkgs/webapps/apache-theme/default.nix b/flakes/mypackages/pkgs/webapps/apache-theme/default.nix similarity index 100% rename from pkgs/webapps/apache-theme/default.nix rename to flakes/mypackages/pkgs/webapps/apache-theme/default.nix diff --git a/pkgs/webapps/apache-theme/theme/.htaccess b/flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess similarity index 100% rename from pkgs/webapps/apache-theme/theme/.htaccess rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess diff --git a/pkgs/webapps/apache-theme/theme/footer.html b/flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html similarity index 100% rename from pkgs/webapps/apache-theme/theme/footer.html rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html diff --git a/pkgs/webapps/apache-theme/theme/header.html b/flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html similarity index 100% rename from pkgs/webapps/apache-theme/theme/header.html rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html diff --git a/pkgs/webapps/apache-theme/theme/icons/archive.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/archive.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png diff --git a/pkgs/webapps/apache-theme/theme/icons/audio.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/audio.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png diff --git a/pkgs/webapps/apache-theme/theme/icons/authors.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/authors.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png diff --git a/pkgs/webapps/apache-theme/theme/icons/bin.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/bin.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png diff --git a/pkgs/webapps/apache-theme/theme/icons/blank.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/blank.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png diff --git a/pkgs/webapps/apache-theme/theme/icons/bmp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/bmp.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png diff --git a/pkgs/webapps/apache-theme/theme/icons/c.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/c.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png diff --git a/pkgs/webapps/apache-theme/theme/icons/calc.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/calc.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png diff --git a/pkgs/webapps/apache-theme/theme/icons/cd.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/cd.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png diff --git a/pkgs/webapps/apache-theme/theme/icons/copying.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/copying.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png diff --git a/pkgs/webapps/apache-theme/theme/icons/cpp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/cpp.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png diff --git a/pkgs/webapps/apache-theme/theme/icons/css.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/css.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png diff --git a/pkgs/webapps/apache-theme/theme/icons/deb.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/deb.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png diff --git a/pkgs/webapps/apache-theme/theme/icons/default.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/default.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png diff --git a/pkgs/webapps/apache-theme/theme/icons/diff.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/diff.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png diff --git a/pkgs/webapps/apache-theme/theme/icons/doc.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/doc.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png diff --git a/pkgs/webapps/apache-theme/theme/icons/draw.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/draw.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png diff --git a/pkgs/webapps/apache-theme/theme/icons/eps.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/eps.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png diff --git a/pkgs/webapps/apache-theme/theme/icons/exe.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/exe.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-home.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-home.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-open.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-open.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-page.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-page.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-parent.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png diff --git a/pkgs/webapps/apache-theme/theme/icons/gif.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/gif.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png diff --git a/pkgs/webapps/apache-theme/theme/icons/gzip.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/gzip.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png diff --git a/pkgs/webapps/apache-theme/theme/icons/h.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/h.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png diff --git a/pkgs/webapps/apache-theme/theme/icons/hpp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/hpp.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png diff --git a/pkgs/webapps/apache-theme/theme/icons/html.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/html.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png diff --git a/pkgs/webapps/apache-theme/theme/icons/ico.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/ico.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png diff --git a/pkgs/webapps/apache-theme/theme/icons/image.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/image.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png diff --git a/pkgs/webapps/apache-theme/theme/icons/install.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/install.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png diff --git a/pkgs/webapps/apache-theme/theme/icons/java.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/java.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png diff --git a/pkgs/webapps/apache-theme/theme/icons/jpg.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/jpg.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png diff --git a/pkgs/webapps/apache-theme/theme/icons/js.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/js.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png diff --git a/pkgs/webapps/apache-theme/theme/icons/json.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/json.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png diff --git a/pkgs/webapps/apache-theme/theme/icons/log.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/log.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png diff --git a/pkgs/webapps/apache-theme/theme/icons/makefile.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/makefile.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png diff --git a/pkgs/webapps/apache-theme/theme/icons/markdown.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/markdown.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png diff --git a/pkgs/webapps/apache-theme/theme/icons/package.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/package.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png diff --git a/pkgs/webapps/apache-theme/theme/icons/pdf.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/pdf.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png diff --git a/pkgs/webapps/apache-theme/theme/icons/php.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/php.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png diff --git a/pkgs/webapps/apache-theme/theme/icons/playlist.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/playlist.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png diff --git a/pkgs/webapps/apache-theme/theme/icons/png.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/png.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png diff --git a/pkgs/webapps/apache-theme/theme/icons/pres.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/pres.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png diff --git a/pkgs/webapps/apache-theme/theme/icons/ps.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/ps.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png diff --git a/pkgs/webapps/apache-theme/theme/icons/psd.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/psd.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png diff --git a/pkgs/webapps/apache-theme/theme/icons/py.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/py.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rar.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rar.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rb.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rb.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png diff --git a/pkgs/webapps/apache-theme/theme/icons/readme.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/readme.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rpm.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rpm.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rss.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rss.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rtf.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rtf.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png diff --git a/pkgs/webapps/apache-theme/theme/icons/script.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/script.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png diff --git a/pkgs/webapps/apache-theme/theme/icons/source.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/source.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png diff --git a/pkgs/webapps/apache-theme/theme/icons/sql.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/sql.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png diff --git a/pkgs/webapps/apache-theme/theme/icons/tar.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/tar.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png diff --git a/pkgs/webapps/apache-theme/theme/icons/tex.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/tex.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png diff --git a/pkgs/webapps/apache-theme/theme/icons/text.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/text.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png diff --git a/pkgs/webapps/apache-theme/theme/icons/tiff.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/tiff.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png diff --git a/pkgs/webapps/apache-theme/theme/icons/unknown.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/unknown.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png diff --git a/pkgs/webapps/apache-theme/theme/icons/vcal.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/vcal.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png diff --git a/pkgs/webapps/apache-theme/theme/icons/video.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/video.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png diff --git a/pkgs/webapps/apache-theme/theme/icons/xml.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/xml.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png diff --git a/pkgs/webapps/apache-theme/theme/icons/zip.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/zip.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png diff --git a/pkgs/webapps/apache-theme/theme/style.css b/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css similarity index 97% rename from pkgs/webapps/apache-theme/theme/style.css rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css index 4d25c9f..e46139f 100644 --- a/pkgs/webapps/apache-theme/theme/style.css +++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css @@ -5,7 +5,7 @@ Theme name: Apaxy Theme author: @adamwhitcroft \*------------------------------------*/ -@import url('//fonts.googleapis.com/css?family=Open+Sans'); +@import url('//assets.immae.eu/fonts/OpenSans/font.css'); /* Have to use @import for the font, as you can only specify a single stylesheet */ * { margin:0; diff --git a/pkgs/webapps/awl/default.nix b/flakes/mypackages/pkgs/webapps/awl/default.nix similarity index 100% rename from pkgs/webapps/awl/default.nix rename to flakes/mypackages/pkgs/webapps/awl/default.nix diff --git a/pkgs/webapps/davical/default.nix b/flakes/mypackages/pkgs/webapps/davical/default.nix similarity index 100% rename from pkgs/webapps/davical/default.nix rename to flakes/mypackages/pkgs/webapps/davical/default.nix diff --git a/flakes/mypackages/pkgs/webapps/default.nix b/flakes/mypackages/pkgs/webapps/default.nix new file mode 100644 index 0000000..18a724d --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/default.nix @@ -0,0 +1,24 @@ +{ callPackage, mylibs, composerEnv, sources }: +rec { + adminer = callPackage ./adminer {}; + apache-theme = import ./apache-theme; + awl = callPackage ./awl {}; + davical = callPackage ./davical {}; + dokuwiki = callPackage ./dokuwiki {}; + infcloud = callPackage ./infcloud {}; + mantisbt_2 = callPackage ./mantisbt_2 {}; + nextcloud_25 = callPackage ./nextcloud { nextcloudVersion = 25; }; + nextcloud_26 = callPackage ./nextcloud { nextcloudVersion = 26; }; + nextcloud_27 = callPackage ./nextcloud { nextcloudVersion = 27; }; + nextcloud_25-all = nextcloud_25.withApps (a: builtins.attrValues nextcloud_25.allSupportedApps); + nextcloud_26-all = nextcloud_26.withApps (a: builtins.attrValues nextcloud_26.allSupportedApps); + nextcloud_27-all = nextcloud_27.withApps (a: builtins.attrValues nextcloud_27.allSupportedApps); + phpbb = callPackage ./phpbb {}; + phpldapadmin = callPackage ./phpldapadmin {}; + rompr = callPackage ./rompr {}; + roundcubemail = callPackage ./roundcubemail {}; + spip = callPackage ./spip {}; + ttrss = callPackage ./ttrss { inherit sources; }; + wallabag = callPackage ./wallabag { inherit composerEnv; }; + yourls = callPackage ./yourls {}; +} diff --git a/pkgs/webapps/dokuwiki/default.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix similarity index 79% rename from pkgs/webapps/dokuwiki/default.nix rename to flakes/mypackages/pkgs/webapps/dokuwiki/default.nix index 874f0d8..db8be30 100644 --- a/pkgs/webapps/dokuwiki/default.nix +++ b/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix @@ -1,4 +1,4 @@ -{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, mylibs, writeText }: +{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, fetchFromGitHub, writeText }: let preloadFile = plugins: let preloads = [preload] ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins; @@ -26,7 +26,16 @@ let passthru = toPassthru newDokuwiki (pkg.plugins ++ plugins); }); in newDokuwiki; - package = stdenv.mkDerivation (mylibs.fetchedGithub ./dokuwiki.json // rec { + package = stdenv.mkDerivation (rec { + pname = "dokuwiki"; + version = "release_stable_2018-04-22b"; + src = fetchFromGitHub { + owner = "splitbrain"; + repo = "dokuwiki"; + rev = "871dae1320b40211626c7ec665f5e6d5290aca95"; + sha256 = "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz"; + fetchSubmodules = true; + }; phases = "unpackPhase buildPhase installPhase installPreloadPhase fixupPhase"; buildPhase = '' mv conf conf.dist diff --git a/pkgs/webapps/dokuwiki/plugins/farmer.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix similarity index 100% rename from pkgs/webapps/dokuwiki/plugins/farmer.nix rename to flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix diff --git a/pkgs/webapps/dokuwiki/plugins/todo.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix similarity index 100% rename from pkgs/webapps/dokuwiki/plugins/todo.nix rename to flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix diff --git a/pkgs/webapps/infcloud/default.nix b/flakes/mypackages/pkgs/webapps/infcloud/default.nix similarity index 100% rename from pkgs/webapps/infcloud/default.nix rename to flakes/mypackages/pkgs/webapps/infcloud/default.nix diff --git a/pkgs/webapps/infcloud/infcloud_config.js b/flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js similarity index 100% rename from pkgs/webapps/infcloud/infcloud_config.js rename to flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js diff --git a/pkgs/webapps/mantisbt_2/bug_report.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bug_report.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff diff --git a/pkgs/webapps/mantisbt_2/bug_report_page.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bug_report_page.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff diff --git a/pkgs/webapps/mantisbt_2/bugnote_add.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bugnote_add.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff diff --git a/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff diff --git a/pkgs/webapps/mantisbt_2/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix similarity index 96% rename from pkgs/webapps/mantisbt_2/default.nix rename to flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix index 5aa04d1..466595d 100644 --- a/pkgs/webapps/mantisbt_2/default.nix +++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix @@ -5,6 +5,7 @@ let (name: callPackage (./plugins + "/${name}") {}); toPassthru = pkg: plugins: { inherit plugins allPlugins; + pluginNames = map (n: n.pluginName) plugins; withPlugins = withPlugins pkg; }; withPlugins = pkg: toPlugins: diff --git a/pkgs/webapps/mantisbt_2/plugins/slack/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix similarity index 100% rename from pkgs/webapps/mantisbt_2/plugins/slack/default.nix rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix similarity index 92% rename from pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix index dc6c7de..1ab00c5 100644 --- a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix +++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix @@ -16,6 +16,7 @@ stdenv.mkDerivation rec { cp -a Source* $out/ ''; passthru = { + pluginName = "source-integration"; selector = "Source*"; }; } diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix new file mode 100644 index 0000000..6e7380c --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + audioplayer_3_4_0 = buildApp rec { + appName = "audioplayer"; + version = "3.4.0"; + url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-pog9cll02+AbYHG/jiUztO9odqu7PSEWBUieK32Eqf4="; + }; + versions = { + "25" = audioplayer_3_4_0; + "26" = audioplayer_3_4_0; + "27" = audioplayer_3_4_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app audioplayer") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix new file mode 100644 index 0000000..0503e5b --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + bookmarks_12_1_0 = buildApp rec { + appName = "bookmarks"; + version = "12.1.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-NVyaVeg/UPgFaW/iCZiJkw1l5Vqc+S/4FMfFhHCBUTo="; + }; + bookmarks_13_0_1 = buildApp rec { + appName = "bookmarks"; + version = "13.0.1"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-7Gx8e8C2dDkB/39eAGKOLrP3YkVbGkfPKpQBeCaV/cE="; + }; + versions = { + "25" = bookmarks_12_1_0; + "26" = bookmarks_13_0_1; + "27" = bookmarks_13_0_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app bookmarks") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix new file mode 100644 index 0000000..497d4ba --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + calendar_4_4_4 = buildApp rec { + appName = "calendar"; + version = "4.4.4"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-8UeHOpgbUf2oHHOvLN58v68QvyDYQXkSjsVKn6UGrGU="; + }; + versions = { + "25" = calendar_4_4_4; + "26" = calendar_4_4_4; + "27" = calendar_4_4_4; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app calendar") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix new file mode 100644 index 0000000..05f0928 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + carnet_0_25_2 = buildApp rec { + appName = "carnet"; + version = "0.25.2"; + url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz"; + sha256 = "sha256-HArD+M6UA9BhSsrlpp/gsKWkUTWAoNHl/gr0S3AlKzg="; + }; + versions = { + "25" = carnet_0_25_2; + "26" = carnet_0_25_2; + "27" = carnet_0_25_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app carnet") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix new file mode 100644 index 0000000..f8931b7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + contacts_5_3_2 = buildApp rec { + appName = "contacts"; + version = "5.3.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-1jQ+pyLBPU7I4wSPkmezJq7ukrQh8WPErG4J6Ps3LR4="; + }; + versions = { + "25" = contacts_5_3_2; + "26" = contacts_5_3_2; + "27" = contacts_5_3_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app contacts") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix new file mode 100644 index 0000000..32fdcc0 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + cookbook_0_10_2 = buildApp rec { + appName = "cookbook"; + version = "0.10.2"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/Cookbook-${version}.tar.gz"; + sha256 = "sha256-H7KVeISBnu0/4Q31ihhiXvRtkXz4yLGOAsAj5ERgeCM="; + }; + versions = { + "25" = cookbook_0_10_2; + "26" = cookbook_0_10_2; + "27" = cookbook_0_10_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app cookbook") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix new file mode 100644 index 0000000..c5dd2d3 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + deck_1_8_5 = buildApp rec { + appName = "deck"; + version = "1.8.5"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-KsSSl9orqMEKJlBftHwCi/dh+aMCxZqjS7kPT0uDZlE="; + }; + deck_1_9_2 = buildApp rec { + appName = "deck"; + version = "1.9.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-h1fmT4CCEFDZPBwFDIBLmFGJmO1Wt3a5nVXX5xCk0o0="; + }; + deck_1_10_0 = buildApp rec { + appName = "deck"; + version = "1.10.0"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-W0XVvhTQoCjoK7S2tEd7bvU0MTWtqYt7QiB9H1p1UP8="; + }; + versions = { + "25" = deck_1_8_5; + "26" = deck_1_9_2; + "27" = deck_1_10_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app deck") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix new file mode 100644 index 0000000..c03c479 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix @@ -0,0 +1,24 @@ +{ buildApp, nextcloudVersion }: +let + otherConfig = { + mimetypealiases = { + "application/x-drawio" = "drawio"; + }; + mimetypemapping = { + "drawio" = ["application/x-drawio"]; + }; + }; + drawio_2_1_2 = buildApp rec { + appName = "drawio"; + version = "2.1.2"; + url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-5BrEnS2cMk/vwkAr1lXKtfocqReZAj1+pbDqmi/uG0A="; + inherit otherConfig; + }; + versions = { + "25" = drawio_2_1_2; + "26" = drawio_2_1_2; + "27" = drawio_2_1_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app drawio") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix new file mode 100644 index 0000000..941304a --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + external_5_0_2 = buildApp rec { + appName = "external"; + version = "5.0.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-Bkk9X1tVonKsiA3YlKux2y8K7HdJv4qM/eJ9TP+i17I="; + }; + external_5_1_0 = buildApp rec { + appName = "external"; + version = "5.1.0"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-EMKWSXufw4FMyaN2f37yifrpUm6QBqqpPPFmvLvYYmY="; + }; + external_5_2_0 = buildApp rec { + appName = "external"; + version = "5.2.0"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-XqeJCWS8mncS7CfrnXdhtzdgkFTib/RnursJ/AqyvD8="; + }; + versions = { + "25" = external_5_0_2; + "26" = external_5_1_0; + "27" = external_5_2_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app external") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix new file mode 100644 index 0000000..589115e --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + extract_1_3_6 = buildApp rec { + appName = "extract"; + version = "1.3.6"; + url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz"; + sha256 = "sha256-y1NacOWnCd/f5sOeEOLeZrWnqwi8q/XezOrhT7AzV/o="; + }; + versions = { + "25" = extract_1_3_6; + "26" = extract_1_3_6; + "27" = extract_1_3_6; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app extract") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix new file mode 100644 index 0000000..cf8e179 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + files_markdown_2_4_1 = buildApp rec { + appName = "files_markdown"; + version = "2.4.1"; + url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-6A9IMfRbKcF1+et7pzFF4zlZDmegx562cnyYsOFsVzU="; + }; + versions = { + "25" = files_markdown_2_4_1; + "26" = files_markdown_2_4_1; + "27" = files_markdown_2_4_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_markdown") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix new file mode 100644 index 0000000..fff85d7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + files_mindmap_0_0_28 = buildApp rec { + appName = "files_mindmap"; + version = "0.0.28"; + url = "https://github.com/ACTom/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-VlzqstlsdinaqkbK32NvS1oFoQcFasJGHSlcKxdQwIM="; + }; + versions = { + "25" = files_mindmap_0_0_28; + "26" = files_mindmap_0_0_28; + "27" = files_mindmap_0_0_28; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_mindmap") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix new file mode 100644 index 0000000..97aeaf7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + files_readmemd_2_0_0 = buildApp rec { + appName = "files_readmemd"; + version = "2.0.0"; + url = "https://github.com/mamatt/files_readmemd/releases/download/V${version}/${appName}.tar.gz"; + sha256 = "sha256-vUoSK+b4gj51eJcocrXINO/eFKPRZQoj0q6l0gVBqgw="; + }; + versions = { + "25" = files_readmemd_2_0_0; + "26" = files_readmemd_2_0_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_readmemd") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix new file mode 100644 index 0000000..55f4ba7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + flowupload_1_1_3 = buildApp rec { + appName = "flowupload"; + version = "1.1.3"; + url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; + sha256 = "0d1xvimd4hzd0jpvv1h89zfqv3ajlrrm1xdbggvjhk9bllwqgxng"; + }; + versions = { + "22" = flowupload_1_1_3; + "23" = flowupload_1_1_3; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app flowupload") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix new file mode 100644 index 0000000..be230fd --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix @@ -0,0 +1,22 @@ +{ buildApp, nextcloudVersion }: +let + gpxedit_0_0_14 = buildApp rec { + appName = "gpxedit"; + version = "0.0.14"; + url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/5b184c24f9e767ad19a84e177a9b473c/${appName}-${version}.tar.gz"; + sha256 = "1kgpcxps73l83krrjxdzh4vzacja4m3vwidf9kidgqq505cgzq90"; + otherConfig = { + mimetypealiases = { + "application/gpx+xml" = "gpx"; + }; + mimetypemapping = { + "gpx" = ["application/gpx+xml"]; + }; + }; + }; + versions = { + "22" = gpxedit_0_0_14; + "23" = gpxedit_0_0_14; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxedit") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix new file mode 100644 index 0000000..5a3b7e7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix @@ -0,0 +1,31 @@ +{ buildApp, nextcloudVersion }: +let + otherConfig = { + mimetypealiases = { + "application/gpx+xml" = "gpx"; + }; + mimetypemapping = { + "gpx" = ["application/gpx+xml"]; + }; + }; + gpxpod_5_0_10 = buildApp rec { + appName = "gpxpod"; + version = "5.0.10"; + url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-Ylhl9jdOxG+Qfk5zgNO8FwOtAzrjGHS66y59qmorXPU="; + inherit otherConfig; + }; + gpxpod_5_0_12 = buildApp rec { + appName = "gpxpod"; + version = "5.0.12"; + url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-uhz6AC8opDQkFQDpG4u8H4vkFtzbFAZvb8r32QHj/8I="; + inherit otherConfig; + }; + versions = { + "25" = gpxpod_5_0_10; + "26" = gpxpod_5_0_12; + "27" = gpxpod_5_0_12; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxpod") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix new file mode 100644 index 0000000..b966d3d --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + groupfolders_13_1_5 = buildApp rec { + appName = "groupfolders"; + version = "13.1.5"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-1yf/uSN8TRsYvK3m2pxGaXo9xxHNrI/NjyWJ8rLPQfg="; + }; + groupfolders_14_0_4 = buildApp rec { + appName = "groupfolders"; + version = "14.0.4"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-QzlD8dLI6T7Sex75ZsO2F40nTrg2Ig6tHTG8cslnNME="; + }; + groupfolders_15_0_2 = buildApp rec { + appName = "groupfolders"; + version = "15.0.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-NsTZhmY1XBKHn/1IcIp2Al7BwJzE2xoBzgyBXnmuWls="; + }; + versions = { + "25" = groupfolders_13_1_5; + "26" = groupfolders_14_0_4; + "27" = groupfolders_15_0_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app groupfolders") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix new file mode 100644 index 0000000..afae917 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + impersonate_1_12_1 = buildApp rec { + appName = "impersonate"; + version = "1.12.1"; + url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-xhlWGbLm1CtW4BSa/yQhv05Kn2r1DZJDUoDXQOLpEeQ="; + }; + impersonate_1_13_1 = buildApp rec { + appName = "impersonate"; + version = "1.13.1"; + url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-+tFWW5wQnbHxbgGdnp2GAFzfXnrW+e3eECY4O6ZckCU="; + }; + impersonate_1_14_0 = buildApp rec { + appName = "impersonate"; + version = "1.14.0"; + url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-A1rGJJLaWhiNf9l0YUh6WOB+fKRBRDckE890hq5OB4k="; + }; + versions = { + "25" = impersonate_1_12_1; + "26" = impersonate_1_13_1; + "27" = impersonate_1_14_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app impersonate") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix new file mode 100644 index 0000000..d3834ad --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix @@ -0,0 +1,13 @@ +{ buildApp, nextcloudVersion }: +let + integration_dropbox_2_0_1 = buildApp rec { + appName = "integration_dropbox"; + version = "2.0.1"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-RPCd8+/yKNlIGfEU+ITS8DBIxJDfc//8MGHaIjfYxdQ="; + }; + versions = { + "27" = integration_dropbox_2_0_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app integration_dropbox") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix new file mode 100644 index 0000000..7be8c6b --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix @@ -0,0 +1,24 @@ +{ buildApp, nextcloudVersion }: +let + keeweb_0_6_13 = buildApp rec { + appName = "keeweb"; + version = "0.6.13"; + url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-J9jFVXpmoeAjDI/crsXHVJvPvxCYaimWVuq473nLsNM="; + installPhase = '' + mkdir -p $out + cp -R . $out/ + ''; + otherConfig = { + mimetypemapping = { + "kdbx" = ["application/x-kdbx"]; + }; + }; + }; + versions = { + "25" = keeweb_0_6_13; + "26" = keeweb_0_6_13; + "27" = keeweb_0_6_13; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app keeweb") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix new file mode 100644 index 0000000..1b29173 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + maps_1_1_0 = buildApp rec { + appName = "maps"; + version = "1.1.0"; + url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-Me/V+9wXZyq3UEVx9Nqim6pfPFJaALjKv9f7iUjill8="; + }; + versions = { + "25" = maps_1_1_0; + "26" = maps_1_1_0; + "27" = maps_1_1_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app maps") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix new file mode 100644 index 0000000..0fe7409 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + metadata_0_19_0 = buildApp rec { + appName = "metadata"; + version = "0.19.0"; + url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-XfFxCwRFO0WnBPU4CIejNXySRQdguvzauu62bzUKD44="; + }; + versions = { + "25" = metadata_0_19_0; + "26" = metadata_0_19_0; + "27" = metadata_0_19_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app metadata") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix new file mode 100644 index 0000000..fc96224 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + music_1_8_4 = buildApp rec { + appName = "music"; + version = "1.8.4"; + url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}_${version}_for_nextcloud.tar.gz"; + sha256 = "sha256-WWXMpOyTRxykAVeUj/h6QP5ENqaMvTcPIqPQjhY68KA="; + }; + versions = { + "25" = music_1_8_4; + "26" = music_1_8_4; + "27" = music_1_8_4; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app music") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix new file mode 100644 index 0000000..7677c6c --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + notes_4_8_1 = buildApp rec { + appName = "notes"; + version = "4.8.1"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-BfH1W+7TWKZRuAAhKQEQtlv8ePTtJQvZQVMMu3zULR4="; + }; + versions = { + "25" = notes_4_8_1; + "26" = notes_4_8_1; + "27" = notes_4_8_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app notes") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix new file mode 100644 index 0000000..dcdaad2 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + ocsms_2_2_0 = buildApp rec { + appName = "ocsms"; + version = "2.2.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; + sha256 = "1hjl11lxdflk4w0l8prcjr3jvmsm8njldbrmnqm7yhdy6qcfli28"; + installPhase = '' + mkdir -p $out + cp -R . $out/ + ''; + }; + versions = { + "18" = ocsms_2_2_0; + "19" = ocsms_2_2_0; + "20" = ocsms_2_2_0; + # Beware, 1.10.1 has a too wide range of versions and is not + # compatible with nextcloud > 20! + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app ocsms") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix new file mode 100644 index 0000000..e93df00 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + onlyoffice_7_9_0 = buildApp rec { + appName = "onlyoffice"; + version = "7.9.0"; + url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-GN0edA/aVdOEDR0LF6PgG2vTcULaG9RMj2gIAoxSVAM="; + }; + onlyoffice_8_2_0 = buildApp rec { + appName = "onlyoffice"; + version = "8.2.0"; + url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-DfZKgpkpcogy9I3A3ru0V/WR5wYWBr+wrHe+mQJBPYk="; + }; + versions = { + "25" = onlyoffice_7_9_0; + "26" = onlyoffice_7_9_0; + "27" = onlyoffice_8_2_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app onlyoffice") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix new file mode 100644 index 0000000..5559b22 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + passman_2_4_5 = buildApp rec { + appName = "passman"; + version = "2.4.5"; + url = "https://releases.passman.cc/${appName}_${version}.tar.gz"; + sha256 = "sha256-wcRx1lUEHbJBJBBSKOScGljOgHM7Vpf69OymJoI8S2Y="; + }; + passman_2_4_7 = buildApp rec { + appName = "passman"; + version = "2.4.7"; + url = "https://releases.passman.cc/${appName}_${version}.tar.gz"; + sha256 = "sha256-CeNaN0cioVjcW6ILB//BIvmjQWcbvfK3m8jVQ8LGtyM="; + }; + versions = { + "25" = passman_2_4_5; + "26" = passman_2_4_7; + "27" = passman_2_4_7; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app passman") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix new file mode 100644 index 0000000..a50ac43 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + polls_5_2_0 = buildApp rec { + appName = "polls"; + version = "5.2.0"; + url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-45YNcSeFG9v3mfk7eLbDiy6hFgmfePY0j86JiVS0k14="; + }; + versions = { + "25" = polls_5_2_0; + "26" = polls_5_2_0; + "27" = polls_5_2_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app polls") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix new file mode 100644 index 0000000..da48f91 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix @@ -0,0 +1,16 @@ +{ buildApp, nextcloudVersion }: +let + side_menu_3_10_3 = buildApp rec { + appName = "side_menu"; + version = "3.10.3"; + url = "https://gitnet.fr/attachments/9c9be610-5d3b-414d-a523-396c237c15ef"; + filename = "${appName}-${version}.tar.gz"; + sha256 = "sha256-WKbc6Ln6v3LYyRzwy0xAOmXilbqrWGS8XGWIT+TajdM="; + }; + versions = { + "25" = side_menu_3_10_3; + "26" = side_menu_3_10_3; + "27" = side_menu_3_10_3; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app side_menu") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix new file mode 100644 index 0000000..912b5bf --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + social_0_6_1 = buildApp rec { + appName = "social"; + version = "0.6.1"; + url = "https://github.com/nextcloud-releases/social/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-5mww31ibwgnSiTuTaKo5MngbhPIw8lwLt1tkQySmerY="; + }; + versions = { + "26" = social_0_6_1; + "27" = social_0_6_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app social") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix new file mode 100644 index 0000000..d8a20b9 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + spreed_15_0_7 = buildApp rec { + appName = "spreed"; + version = "15.0.7"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-J9udO7qlRL+TDwTPTbBpYeZLUi4oco42LoqYoHJbIyE="; + }; + spreed_16_0_5 = buildApp rec { + appName = "spreed"; + version = "16.0.5"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-tTDnWqNkP6fMSdCP1c0vPh8f0K7sTFBvRwws5Gln9Mg="; + }; + spreed_17_0_3 = buildApp rec { + appName = "spreed"; + version = "17.0.3"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-vb08DI+q+5f87zz2UguE1y6b0NV2EoICYpaKUGmyF5w="; + }; + versions = { + "25" = spreed_15_0_7; + "26" = spreed_16_0_5; + "27" = spreed_17_0_3; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app spreed") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix new file mode 100644 index 0000000..906719d --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + talk_matterbridge_1_26_0 = buildApp rec { + appName = "talk_matterbridge"; + version = "1.26.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-gD5lfLWBjWOiy2ULf31ngQVIQbMZj3iwu3zuVrEDSks="; + }; + versions = { + "25" = talk_matterbridge_1_26_0; + "26" = talk_matterbridge_1_26_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app talk_matterbridge") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix new file mode 100644 index 0000000..aee7650 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + tasks_0_15_0 = buildApp rec { + appName = "tasks"; + version = "0.15.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-nizJUFByK78FZ6KPJ4zfOU5Z9ClAxhwgQ7d+X5TGnM8="; + }; + versions = { + "25" = tasks_0_15_0; + "26" = tasks_0_15_0; + "27" = tasks_0_15_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app tasks") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/default.nix b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix new file mode 100644 index 0000000..6aeeaed --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix @@ -0,0 +1,84 @@ +{ nextcloudVersion, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl, postInstall ? null }: +let + shasumsAndVersion = { + "25" = { sum = "sha256-alvh0fWESSS5KbfiKI1gaoahisDWnfT/bUhsSEEXfQI="; fullVersion = "25.0.10"; }; # php 7.4 - 8.2 + "26" = { sum = "sha256-nhq0aAY4T1hUZdKJY66ZSlirCSgPQet8YJpciwJw1b4="; fullVersion = "26.0.5"; }; # php 8.0 - 8.2 + "27" = { sum = "sha256-ei3OpDqjuPswM0fv2kxvN3M8yhE8juFt2fDl+2jHIS8="; fullVersion = "27.0.2"; }; # php 8.0 - 8.2 + }; + appNames = [ + "audioplayer" "bookmarks" "calendar" "carnet" + "contacts" "cookbook" "deck" "external" "extract" "files_markdown" "files_mindmap" + "files_readmemd" "flowupload" "gpxedit" "gpxpod" "groupfolders" "impersonate" + "keeweb" "maps" "metadata" "music" "notes" "ocsms" "onlyoffice" "passman" "polls" + "social" "spreed" "talk_matterbridge" "tasks" "drawio" "side_menu" + "integration_dropbox" + ]; + toApp = name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; }; + allSupportedApps = lib.mapAttrs (n: v: v.value) (lib.filterAttrs (n: v: v.success) (lib.genAttrs appNames (name: builtins.tryEval (toApp name)))); + allApps = lib.genAttrs appNames toApp; + buildApp = { appName, version, filename ? null, url, sha256, installHook ? (n: ""), otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }: + stdenv.mkDerivation rec { + name = "nextcloud-app-${appName}-${version}"; + inherit version; + phases = "unpackPhase installPhase"; + inherit installPhase; + src = fetchurl ({ inherit url sha256; } // lib.optionalAttrs (filename != null) { name = filename; }); + passthru = { + inherit appName otherConfig installHook; + }; + }; + toPassthru = pkg: apps: otherConfig: { + inherit apps otherConfig allApps allSupportedApps buildApp; + withApps = withApps pkg; + }; + withApps = pkg: toApps: + let + apps = toApps allApps; + toInstallApp = n: '' + if [ -e $out/apps/${n.appName} ]; then + echo "${n.appName} already exists" + false + fi + ln -sf ${n} $out/apps/${n.appName} + '' + (n.installHook n); + zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps); + appConfigs = with lib.attrsets; with lib.lists; { + mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []); + mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or [])); + }; + newNextcloud = pkg.overrideAttrs(old: { + installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps); + passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs; + }); + in newNextcloud; + package = stdenv.mkDerivation rec { + name = "nextcloud-${version}"; + version = shasumsAndVersion."${builtins.toString nextcloudVersion}".fullVersion; + + src = fetchurl { + url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2"; + sha256 = shasumsAndVersion."${builtins.toString nextcloudVersion}".sum; + }; + + inherit postInstall; + installPhase = '' + mkdir -p $out/ + cp -R . $out/ + sed -i -e "/'appDirsWithDifferentOwner'/d" $out/apps/settings/lib/Controller/CheckSetupController.php + mv $out/config $out/config.example + runHook postInstall + ''; + + noAuditTmpdir = true; + dontPatchELF = true; + dontStrip = true; + passthru = toPassthru package [] otherConfig; + meta = { + description = "Sharing solution for files, calendars, contacts and more"; + homepage = https://nextcloud.com; + maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ]; + license = lib.licenses.agpl3Plus; + platforms = with lib.platforms; unix; + }; + }; +in package diff --git a/pkgs/webapps/phpbb/default.nix b/flakes/mypackages/pkgs/webapps/phpbb/default.nix similarity index 100% rename from pkgs/webapps/phpbb/default.nix rename to flakes/mypackages/pkgs/webapps/phpbb/default.nix diff --git a/pkgs/webapps/phpbb/extensions/adduser.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/adduser.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix diff --git a/pkgs/webapps/phpbb/extensions/autosubscribe.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/autosubscribe.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix diff --git a/pkgs/webapps/phpbb/extensions/mailinglist.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/mailinglist.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix diff --git a/pkgs/webapps/phpbb/extensions/markdown.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/markdown.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix diff --git a/pkgs/webapps/phpbb/extensions/mchat.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/mchat.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix diff --git a/pkgs/webapps/phpbb/extensions/monitoranswers.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/monitoranswers.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix diff --git a/pkgs/webapps/phpbb/langs/fr.nix b/flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix similarity index 100% rename from pkgs/webapps/phpbb/langs/fr.nix rename to flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix diff --git a/pkgs/webapps/phpldapadmin/default.nix b/flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix similarity index 100% rename from pkgs/webapps/phpldapadmin/default.nix rename to flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix diff --git a/pkgs/webapps/phpldapadmin/ldap-align-button.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch similarity index 100% rename from pkgs/webapps/phpldapadmin/ldap-align-button.patch rename to flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch diff --git a/pkgs/webapps/phpldapadmin/ldap-fix-password.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch similarity index 100% rename from pkgs/webapps/phpldapadmin/ldap-fix-password.patch rename to flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch diff --git a/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch similarity index 100% rename from pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch rename to flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch diff --git a/flakes/mypackages/pkgs/webapps/rompr/default.nix b/flakes/mypackages/pkgs/webapps/rompr/default.nix new file mode 100644 index 0000000..5b3e7e0 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/rompr/default.nix @@ -0,0 +1,17 @@ +{ varDir ? "/var/lib/rompr", stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "rompr"; + version = "1.24"; + src = fetchFromGitHub { + owner = "fatg3erman"; + repo = "RompR"; + rev = "0d8f597027ac71b320963fe3f33f461a136312ad"; + sha256 = "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2"; + fetchSubmodules = true; + }; + installPhase = '' + cp -a . $out + ln -sf ${varDir}/prefs $out/prefs + ln -sf ${varDir}/albumart $out/albumart + ''; +}) diff --git a/pkgs/webapps/roundcubemail/add_all.patch b/flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch similarity index 100% rename from pkgs/webapps/roundcubemail/add_all.patch rename to flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch diff --git a/pkgs/webapps/roundcubemail/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/carddav/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/carddav/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix diff --git a/pkgs/webapps/spip/default.nix b/flakes/mypackages/pkgs/webapps/spip/default.nix similarity index 100% rename from pkgs/webapps/spip/default.nix rename to flakes/mypackages/pkgs/webapps/spip/default.nix diff --git a/pkgs/webapps/spip/spip_ldap_patch.patch b/flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch similarity index 100% rename from pkgs/webapps/spip/spip_ldap_patch.patch rename to flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch diff --git a/pkgs/webapps/spip/spip_mes_options.php b/flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php similarity index 100% rename from pkgs/webapps/spip/spip_mes_options.php rename to flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php diff --git a/pkgs/webapps/ttrss/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/default.nix similarity index 93% rename from pkgs/webapps/ttrss/default.nix rename to flakes/mypackages/pkgs/webapps/ttrss/default.nix index aeb573c..fa2453e 100644 --- a/pkgs/webapps/ttrss/default.nix +++ b/flakes/mypackages/pkgs/webapps/ttrss/default.nix @@ -21,9 +21,9 @@ let in newTtrss; package = stdenv.mkDerivation rec { pname = "tt-rss"; - version = sources.webapps-ttrss.version; + version = "${sources.tools.ttrss.shortRev}-master"; name = "${pname}-${version}"; - src = sources.webapps-ttrss; + src = sources.tools.ttrss; buildPhase = '' rm -rf lock feed-icons cache ln -sf ${varDir}/{lock,feed-icons,cache} . diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix new file mode 100644 index 0000000..39f9e0e --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix @@ -0,0 +1,18 @@ +{ patched ? false, stdenv, fetchFromGitHub, lib }: +stdenv.mkDerivation ({ + pname = "ttrss-af_feedmod"; + version = "0ea2092-master"; + src = fetchFromGitHub { + owner = "mbirth"; + repo = "ttrss_plugin-af_feedmod"; + rev = "0ea2092dd34067ecd898802cfca3570023d1ecfe"; + sha256 = "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv"; + fetchSubmodules = true; + }; + patches = lib.optionals patched [ ./type_replace.patch ]; + installPhase = '' + mkdir $out + cp init.php $out + ''; + passthru.pluginName = "af_feedmod"; +}) diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch similarity index 100% rename from pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch rename to flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix new file mode 100644 index 0000000..d283160 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "ttrss-auth-ldap"; + version = "4d751b0-master"; + src = fetchFromGitHub { + owner = "hydrian"; + repo = "TTRSS-Auth-LDAP"; + rev = "4d751b095c29a8dbe2dc7bb07777742956136e94"; + sha256 = "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir $out + cp plugins/auth_ldap/init.php $out + ''; + passthru.pluginName = "auth_ldap"; +}) diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix new file mode 100644 index 0000000..2f86416 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix @@ -0,0 +1,18 @@ +{ patched ? false, stdenv, fetchFromGitHub, lib }: +stdenv.mkDerivation ({ + pname = "ttrss-feediron"; + version = "407168c-master"; + src = fetchFromGitHub { + owner = "m42e"; + repo = "ttrss_plugin-feediron"; + rev = "407168c628880b5ced572cc549db6d50e866d3c8"; + sha256 = "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r"; + fetchSubmodules = true; + }; + patches = lib.optionals patched [ ./json_reformat.patch ]; + installPhase = '' + mkdir $out + cp -a . $out + ''; + passthru.pluginName = "feediron"; +}) diff --git a/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch similarity index 100% rename from pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch rename to flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix new file mode 100644 index 0000000..f0df588 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "ttrss-ff_instagram"; + version = "0366ffb-master"; + src = fetchFromGitHub { + owner = "wltb"; + repo = "ff_instagram"; + rev = "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8"; + sha256 = "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir $out + cp -a . $out + ''; + passthru.pluginName = "ff_instagram"; +}) diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix new file mode 100644 index 0000000..072b6c3 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "ttrss-tumblr_gdpr_ua"; + version = "287c584-master"; + src = fetchFromGitHub { + owner = "hkockerbeck"; + repo = "ttrss-tumblr-gdpr-ua"; + rev = "287c584e68845d524f920156bff0b2eaa6f65117"; + sha256 = "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir $out + cp -a . $out + ''; + passthru.pluginName = "tumblr_gdpr_ua"; +}) diff --git a/pkgs/webapps/wallabag/default.nix b/flakes/mypackages/pkgs/webapps/wallabag/default.nix similarity index 100% rename from pkgs/webapps/wallabag/default.nix rename to flakes/mypackages/pkgs/webapps/wallabag/default.nix diff --git a/pkgs/webapps/wallabag/ldap.patch b/flakes/mypackages/pkgs/webapps/wallabag/ldap.patch similarity index 100% rename from pkgs/webapps/wallabag/ldap.patch rename to flakes/mypackages/pkgs/webapps/wallabag/ldap.patch diff --git a/pkgs/webapps/yourls/default.nix b/flakes/mypackages/pkgs/webapps/yourls/default.nix similarity index 63% rename from pkgs/webapps/yourls/default.nix rename to flakes/mypackages/pkgs/webapps/yourls/default.nix index d940c54..8001a60 100644 --- a/pkgs/webapps/yourls/default.nix +++ b/flakes/mypackages/pkgs/webapps/yourls/default.nix @@ -1,8 +1,8 @@ -{ yourls_config ? "/etc/yourls/config.php", mylibs, callPackage, lib, stdenv }: +{ yourls_config ? "/etc/yourls/config.php", fetchFromGitHub, callPackage, lib, stdenv }: let pluginNames = [ "ldap" ]; allPlugins = lib.attrsets.genAttrs pluginNames - (name: callPackage (./plugins + "/${name}") { inherit mylibs; }); + (name: callPackage (./plugins + "/${name}") {}); toPassthru = pkg: plugins: { inherit plugins allPlugins; withPlugins = withPlugins pkg; @@ -16,7 +16,16 @@ let passthru = toPassthru newYourls (pkg.plugins ++ plugins); }); in newYourls; - package = stdenv.mkDerivation (mylibs.fetchedGithub ./yourls.json // rec { + package = stdenv.mkDerivation (rec { + pname = "yourls"; + version = "1.7.3"; + src = fetchFromGitHub { + owner = "YOURLS"; + repo = "YOURLS"; + rev = "077018822d3594229daa8343310d0b40804b9ddc"; + sha256 = "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd"; + fetchSubmodules = true; + }; installPhase = '' mkdir -p $out cp -a */ *.php $out/ diff --git a/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix new file mode 100644 index 0000000..5870faa --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation (rec { + pname = "yourls-ldap-plugin"; + version = "2a3cb03-master"; + src = fetchFromGitHub { + owner = "k3a"; + repo = "yourls-ldap-plugin"; + rev = "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615"; + sha256 = "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir -p $out + cp plugin.php $out + ''; + passthru.pluginName = "ldap"; +}) diff --git a/flakes/myuids/flake.nix b/flakes/myuids/flake.nix index cc6dc66..ff33651 100644 --- a/flakes/myuids/flake.nix +++ b/flakes/myuids/flake.nix @@ -6,6 +6,7 @@ # Check that there is no clash with nixos/modules/misc/ids.nix uids = { cryptpad = 386; + openldap = 99; # commented in the ids file postfixscripts = 387; acme = 388; backup = 389; @@ -21,6 +22,7 @@ }; gids = { nagios = 11; # commented in the ids file + openldap = 99; # commented in the ids file cryptpad = 386; acme = 388; backup = 389; @@ -35,10 +37,20 @@ mastodon = 399; }; }; - nixosModule = { ... }: { + nixosModule = { config, lib, ... }: { config = { ids.uids = self.lib.uids; ids.gids = self.lib.gids; + assertions = [ + { + assertion = builtins.length (builtins.attrValues config.ids.gids) == builtins.length (lib.unique (builtins.attrValues config.ids.gids)); + message = "Non-unique list of gids"; + } + { + assertion = builtins.length (builtins.attrValues config.ids.uids) == builtins.length (lib.unique (builtins.attrValues config.ids.uids)); + message = "Non-unique list of uids"; + } + ]; }; }; }; diff --git a/flakes/naemon/flake.nix b/flakes/naemon/flake.nix new file mode 100644 index 0000000..9b2ace5 --- /dev/null +++ b/flakes/naemon/flake.nix @@ -0,0 +1,191 @@ +{ + outputs = { self }: { + nixosModule = self.nixosModules.naemon; + nixosModules.naemon = { config, lib, pkgs, ... }: + with lib; + + let + cfg = config.services.naemon; + + naemonConfig = pkgs.runCommand "naemon-config" { + objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs; + resourceFile = config.secrets.fullPaths."naemon/resources.cfg"; + extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig; + inherit (cfg) logDir varDir runDir cacheDir; + } '' + substituteAll ${./naemon.cfg} $out + cat $extraConfig >> $out + ''; + in + { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + + options = { + services.naemon = { + enable = mkOption { + default = false; + description = " + Whether to use Naemon to monitor + your system or network. + "; + }; + + objectDefs = mkOption { + type = types.lines; + default = ""; + description = " + A list of Naemon object configuration that must define + the hosts, host groups, services and contacts for the + network that you want Naemon to monitor. + "; + }; + + extraResource = mkOption { + type = types.lines; + default = ""; + example = '' + # Sets $USER2$ to be the path to event handlers + #$USER2$=/usr/lib/monitoring-plugins/eventhandlers + + # Store some usernames and passwords (hidden from the CGIs) + #$USER3$=someuser + #$USER4$=somepassword + ''; + description = " + Lines to add to the resource file + # You can define $USERx$ macros in this file, which can in turn be used + # in command definitions in your host config file(s). $USERx$ macros are + # useful for storing sensitive information such as usernames, passwords, + # etc. They are also handy for specifying the path to plugins and + # event handlers - if you decide to move the plugins or event handlers to + # a different directory in the future, you can just update one or two + # $USERx$ macros, instead of modifying a lot of command definitions. + # + # Naemon supports up to 256 $USERx$ macros ($USER1$ through $USER256$) + # + # Resource files may also be used to store configuration directives for + # external data sources like MySQL... + # + "; + }; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = " + Extra config to append to main config + "; + }; + + user = mkOption { + type = types.str; + default = "naemon"; + description = "User for naemon"; + }; + + group = mkOption { + type = types.str; + default = "naemon"; + description = "Group for naemon"; + }; + + varDir = mkOption { + type = types.path; + default = "/var/lib/naemon"; + description = "The directory where naemon stores its data"; + }; + + cacheDir = mkOption { + type = types.path; + default = "/var/cache/naemon"; + description = "The directory where naemon stores its cache"; + }; + + runDir = mkOption { + type = types.path; + default = "/run/naemon"; + description = "The directory where naemon stores its runtime files"; + }; + + logDir = mkOption { + type = types.path; + default = "/var/log/naemon"; + description = "The directory where naemon stores its log files"; + }; + + package = mkOption { + type = types.package; + default = pkgs.naemon.override { + inherit (cfg) varDir cacheDir logDir runDir user group; + }; + description = '' + Naemon package to use + ''; + }; + }; + }; + + + config = mkIf cfg.enable { + secrets.keys = { + "naemon/resources.cfg" = { + user = cfg.user; + group = cfg.group; + permissions = "0400"; + text = '' + $USER1$=${pkgs.monitoring-plugins}/libexec + ${cfg.extraResource} + ''; + keyDependencies = [ pkgs.monitoring-plugins ]; + }; + }; + + users.users = optionalAttrs (cfg.user == "naemon") { + naemon = { + group = cfg.group; + uid = config.ids.uids.nagios; + extraGroups = [ "keys" ]; + }; + }; + users.groups = optionalAttrs (cfg.user == "naemon") { + naemon = { + gid = config.ids.gids.nagios; + }; + }; + + services.filesWatcher.naemon = { + paths = [ config.secrets.fullPaths."naemon/resources.cfg" ]; + }; + systemd.services.naemon = { + description = "Naemon monitoring daemon"; + path = [ cfg.package ]; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + preStart = "${cfg.package}/bin/naemon -vp ${naemonConfig}"; + script = "${cfg.package}/bin/naemon --daemon ${naemonConfig}"; + reload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID"; + serviceConfig = { + User = cfg.user; + Restart = "always"; + RestartSec = 2; + StandardOutput = "journal"; + StandardError = "inherit"; + PIDFile = "${cfg.runDir}/naemon.pid"; + LogsDirectory = assert lib.strings.hasPrefix "/var/log/" cfg.logDir; + lib.strings.removePrefix "/var/log/" cfg.logDir; + CacheDirectory = assert lib.strings.hasPrefix "/var/cache/" cfg.cacheDir; + let unprefixed = lib.strings.removePrefix "/var/cache/" cfg.cacheDir; + in [ unprefixed "${unprefixed}/checkresults" ]; + StateDirectory = assert lib.strings.hasPrefix "/var/lib/" cfg.varDir; + lib.strings.removePrefix "/var/lib/" cfg.varDir; + RuntimeDirectory = assert lib.strings.hasPrefix "/run/" cfg.runDir; + lib.strings.removePrefix "/run/" cfg.runDir; + }; + }; + }; + }; + }; +} diff --git a/modules/naemon/naemon.cfg b/flakes/naemon/naemon.cfg similarity index 100% rename from modules/naemon/naemon.cfg rename to flakes/naemon/naemon.cfg diff --git a/flakes/openarc/flake.lock b/flakes/openarc/flake.lock index e0b78a8..a9e5e81 100644 --- a/flakes/openarc/flake.lock +++ b/flakes/openarc/flake.lock @@ -17,19 +17,14 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { diff --git a/flakes/openarc/flake.nix b/flakes/openarc/flake.nix index 6fd45bf..17a3fdd 100644 --- a/flakes/openarc/flake.nix +++ b/flakes/openarc/flake.nix @@ -2,9 +2,7 @@ description = "Open source ARC implementation"; inputs.myuids = { - url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; - type = "git"; - dir = "flakes/myuids"; + url = "path:../myuids"; }; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs"; @@ -66,6 +64,8 @@ defaultSock = "/run/openarc/openarc.sock"; args = [ "-f" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ]; in { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options = { services.openarc = { enable = lib.mkOption { diff --git a/flakes/opendmarc/flake.lock b/flakes/opendmarc/flake.lock index 4503c79..e0cbe17 100644 --- a/flakes/opendmarc/flake.lock +++ b/flakes/opendmarc/flake.lock @@ -17,19 +17,14 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { diff --git a/flakes/opendmarc/flake.nix b/flakes/opendmarc/flake.nix index 277fd25..70b8cd7 100644 --- a/flakes/opendmarc/flake.nix +++ b/flakes/opendmarc/flake.nix @@ -2,9 +2,7 @@ description = "Open source ARC implementation"; inputs.myuids = { - url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; - type = "git"; - dir = "flakes/myuids"; + url = "path:../myuids"; }; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs"; @@ -51,7 +49,9 @@ defaultSock = "/run/opendmarc/opendmarc.sock"; args = [ "-f" "-l" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ]; in { - options = { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + options = { services.opendmarc = { enable = lib.mkOption { type = lib.types.bool; diff --git a/flakes/openfoodnetwork/default.nix b/flakes/openfoodnetwork/default.nix new file mode 100644 index 0000000..dd68177 --- /dev/null +++ b/flakes/openfoodnetwork/default.nix @@ -0,0 +1,39 @@ +{ bundlerEnv, defaultGemConfig, writeShellScript, v8, stdenv }: + +let + gems = bundlerEnv { + name = "openfoodnetwork"; + gemfile = ./Gemfile; + lockfile = ./Gemfile.lock; + gemset = import ./gemset.nix; + gemConfig = defaultGemConfig // { + libv8-node = attrs: { + dontBuild = false; + postPatch = let + noopScript = writeShellScript "noop" "exit 0"; + linkFiles = writeShellScript "link-files" '' + cd ../.. + + mkdir -p vendor/v8/out.gn/libv8/obj/ + ln -s "${v8}/lib/libv8.a" vendor/v8/out.gn/libv8/obj/libv8_monolith.a + + ln -s ${v8}/include vendor/v8/include + + mkdir -p ext/libv8-node + echo '--- !ruby/object:Libv8::Node::Location::Vendor {}' >ext/libv8-node/.location.yml + ''; + in '' + cp ${noopScript} libexec/build-libv8 + cp ${noopScript} libexec/build-monolith + cp ${noopScript} libexec/download-node + cp ${noopScript} libexec/extract-node + cp ${linkFiles} libexec/inject-libv8 + ''; + }; + }; + }; +in + stdenv.mkDerivation { + name = "openfoodnetwork"; + inherit + } diff --git a/flakes/openfoodnetwork/gemset.nix b/flakes/openfoodnetwork/gemset.nix new file mode 100644 index 0000000..2f212b8 --- /dev/null +++ b/flakes/openfoodnetwork/gemset.nix @@ -0,0 +1,2896 @@ +{ + actioncable = { + dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ilq5mniarm0zlvnkagqj9n9p73ljrhphciz02aymrpfxxxclz2x"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionmailbox = { + dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16azdnjws215clb056b9mabglx4b8f61hr82hv7hm80dmn89zqq6"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionmailer = { + dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00s07l2ac5igch1g2rpa0linmiq7mhgk6v6wxkckg8gbiqijb592"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionpack = { + dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xgysqnibjsy6kdz10x2xb3kwa6lssiqhh0zggrbgs31ypwhlpia"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionpack-action_caching = { + dependencies = ["actionpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bxaz8sdhqkdjqwk58icy9668s0yxpgm28gdkdmxl3g41m94b8id"; + type = "gem"; + }; + version = "1.2.2"; + }; + actiontext = { + dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m4fy4qqh09vnzbhx383vjdfid6fzbs49bzzg415x05nmmjkx582"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionview = { + dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yf4ic5kl324rs0raralpwx24s6hvvdzxfhinafylf8f3x7jj23z"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + active_model_serializers = { + dependencies = ["activemodel"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k3mgia2ahh7mbk30hjq9pzqbk0kh281s91kq2z6p555nv9y6l3k"; + type = "gem"; + }; + version = "0.8.4"; + }; + activejob = { + dependencies = ["activesupport" "globalid"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1q7c0i0kwarxgcbxk71wa9jnlg45grbxmhlrh7dk9bgcv7r7r7hn"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activemerchant = { + dependencies = ["activesupport" "builder" "i18n" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ajmcgc4idxmvh8sghyb1ngxsc9x6r5yfi4r1z22d6a4j7b1yjzj"; + type = "gem"; + }; + version = "1.123.0"; + }; + activemodel = { + dependencies = ["activesupport"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16ixam4lni8b5lgx0whnax0imzh1dh10fy5r9pxs52n83yz5nbq3"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activerecord = { + dependencies = ["activemodel" "activesupport"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ccgvlj767ybps3pxlaa4iw77n7wbriw2sr8754id3ngjfap08ja"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activerecord-import = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17ydad9gcsh0c9ny68fyvxmh6rbld4pyvyabnc7882678dnvfy8i"; + type = "gem"; + }; + version = "1.2.0"; + }; + activerecord-postgresql-adapter = { + dependencies = ["pg"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wdfd1mkns28ilr6nm18x69h651mjxwb8p2zk8pb6cjgx7c26axl"; + type = "gem"; + }; + version = "0.0.1"; + }; + activerecord-session_store = { + dependencies = ["actionpack" "activerecord" "multi_json" "rack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ddhz1b2yg72iv09n48gcd3ix5da7hxlzi7vvj13nrps2qwlffg"; + type = "gem"; + }; + version = "2.0.0"; + }; + activestorage = { + dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17knzz9fvqg4x582vy0xmlgjkxfb13xyzl2rgw19qfma86hxsvvi"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activesupport = { + dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19gx1jcq46x9d1pi1w8xq0bgvvfw239y4lalr8asm291gj3q3ds4"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + acts-as-taggable-on = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kfnyix173bazjswab21bx7hmqmik71awj2kz090fsa2nv58c4mw"; + type = "gem"; + }; + version = "8.1.0"; + }; + acts_as_list = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12p22h59c45dnccb51pqk275ziyi502azf9w3qcnkcsq827ma5jm"; + type = "gem"; + }; + version = "1.0.4"; + }; + addressable = { + dependencies = ["public_suffix"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "022r3m9wdxljpbya69y2i3h9g3dhhfaqzidf95m6qjzms792jvgp"; + type = "gem"; + }; + version = "2.8.0"; + }; + afm = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06kj9hgd0z8pj27bxp2diwqh6fv7qhwwm17z64rhdc4sfn76jgn8"; + type = "gem"; + }; + version = "0.2.2"; + }; + angular-rails-templates = { + dependencies = ["railties" "sprockets" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0aja8b2bjj8af29zagkm6pv48s0933l0d38j5b4wgxipf0c0mjxq"; + type = "gem"; + }; + version = "1.1.0"; + }; + angular_rails_csrf = { + dependencies = ["railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08g6xwz98apbfxwd0kbsxl7ll4bms11m563rjl4mavm1dnf3nsgh"; + type = "gem"; + }; + version = "4.5.0"; + }; + angularjs-file-upload-rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07s0b8bwdp8asc16rp16q78p17cl5qnw8svqarbcsv0b1fkxiqbd"; + type = "gem"; + }; + version = "2.4.1"; + }; + angularjs-rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01blhjrzg82l76s5fj7jcgnykxxdj61m5swwy9x0wxnxhid81rgx"; + type = "gem"; + }; + version = "1.8.0"; + }; + Ascii85 = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ds4v9xgsyvijnlflak4dzf1qwmda9yd5bv8jwsb56nngd399rlw"; + type = "gem"; + }; + version = "1.1.0"; + }; + ast = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y"; + type = "gem"; + }; + version = "2.4.2"; + }; + awesome_nested_set = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ggf81dy8wkds0b37xgx065b325fm0c6i6g1k0ml4ai8jwphm6r"; + type = "gem"; + }; + version = "3.4.0"; + }; + awesome_print = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vkq6c8y2jvaw03ynds5vjzl1v9wg608cimkd3bidzxc0jvk56z9"; + type = "gem"; + }; + version = "1.9.2"; + }; + aws-sdk = { + dependencies = ["aws-sdk-resources"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xfan8fpiy019zp32l2a8smwfbii5m9hy49d8b8gvww2qcy5m3pr"; + type = "gem"; + }; + version = "2.2.0"; + }; + aws-sdk-core = { + dependencies = ["jmespath"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f8diki6xvz048i0lhkxqngirgmqqj50jda8vjw0xxgv3qzklq4r"; + type = "gem"; + }; + version = "2.2.0"; + }; + aws-sdk-resources = { + dependencies = ["aws-sdk-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06y7sj2371pjw9vgsfipbz2g3pw3i4asdz27h1lb7pny8gwndkzk"; + type = "gem"; + }; + version = "2.2.0"; + }; + bcrypt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02r1c3isfchs5fxivbq99gc3aq4vfyn8snhcy707dal1p8qz12qb"; + type = "gem"; + }; + version = "3.1.16"; + }; + bigdecimal = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0fxl2hybnfij668h7133p28f8b13jaj13wyyniqdiy8m3s6b1pcb"; + type = "gem"; + }; + version = "3.0.2"; + }; + bindex = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zmirr3m02p52bzq4xgksq4pn8j641rx5d4czk68pv9rqnfwq7kv"; + type = "gem"; + }; + version = "0.8.1"; + }; + bootsnap = { + dependencies = ["msgpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ndjra3h86dq28njm2swmaw6n3vsywrycrf7i5iy9l8hrhfhv4x2"; + type = "gem"; + }; + version = "1.9.1"; + }; + bugsnag = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19yz4s0sw2w8jywkdf445zpdkg3s9869hmxcs7w68xvykpx0ickb"; + type = "gem"; + }; + version = "6.24.0"; + }; + builder = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"; + type = "gem"; + }; + version = "3.2.4"; + }; + bullet = { + dependencies = ["activesupport" "uniform_notifier"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01xachwsyykmp153514vz2khanbsz1n27j09za5gcxj54srh5l4p"; + type = "gem"; + }; + version = "6.1.5"; + }; + byebug = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194"; + type = "gem"; + }; + version = "11.1.3"; + }; + cable_ready = { + dependencies = ["rails" "thread-local"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06lqnv1b3zxgn189v7df6avf3zrk1snfxkbm1ax0fz129k997hak"; + type = "gem"; + }; + version = "5.0.0.pre2"; + }; + cancancan = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05kb459laaw339n7mas37v4k83nwz228bfpaghgybza347341x85"; + type = "gem"; + }; + version = "1.15.0"; + }; + capybara = { + dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1viqcpsngy9fqjd68932m43ad6xj656d1x33nx9565q57chgi29k"; + type = "gem"; + }; + version = "3.35.3"; + }; + catalog = { + groups = ["default"]; + platforms = []; + source = { + path = engines/catalog; + type = "path"; + }; + version = "0.0.1"; + }; + childprocess = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ic028k8xgm2dds9mqnvwwx3ibaz32j8455zxr9f4bcnviyahya5"; + type = "gem"; + }; + version = "3.0.0"; + }; + chronic = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn"; + type = "gem"; + }; + version = "0.10.2"; + }; + chunky_png = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9"; + type = "gem"; + }; + version = "1.4.0"; + }; + climate_control = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q11v0iabvr6rif0d025xh078ili5frrihlj0m04zfg7lgvagxji"; + type = "gem"; + }; + version = "0.2.0"; + }; + cliver = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "096f4rj7virwvqxhkavy0v55rax10r4jqf8cymbvn4n631948xc7"; + type = "gem"; + }; + version = "0.3.2"; + }; + cocaine = { + dependencies = ["climate_control"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01kk5xd7lspbkdvn6nyj0y51zhvia3z6r4nalbdcqw5fbsywwi7d"; + type = "gem"; + }; + version = "0.5.8"; + }; + codecov = { + dependencies = ["simplecov"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pi2dmqxjw5wsn65yx5qz5ks5msqflj0zxvk11r3cxwgacvj3hys"; + type = "gem"; + }; + version = "0.6.0"; + }; + coderay = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw"; + type = "gem"; + }; + version = "1.1.3"; + }; + coffee-rails = { + dependencies = ["coffee-script" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "170sp4y82bf6nsczkkkzypzv368sgjg6lfrkib4hfjgxa6xa3ajx"; + type = "gem"; + }; + version = "5.0.0"; + }; + coffee-script = { + dependencies = ["coffee-script-source" "execjs"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rc7scyk7mnpfxqv5yy4y5q1hx3i7q3ahplcp4bq2g5r24g2izl2"; + type = "gem"; + }; + version = "2.4.1"; + }; + coffee-script-source = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1907v9q1zcqmmyqzhzych5l7qifgls2rlbnbhy5vzyr7i7yicaz1"; + type = "gem"; + }; + version = "1.12.2"; + }; + combine_pdf = { + dependencies = ["ruby-rc4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bxakrrip0sg5gxy50wdn7lr3h2w7rd590cjhnj4qi477cvi1qgg"; + type = "gem"; + }; + version = "1.0.21"; + }; + compass = { + dependencies = ["chunky_png" "compass-core" "compass-import-once" "rb-fsevent" "rb-inotify" "sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lfi83w8z75czr0pf0rmj9hda22082h3cmvczl8r1ma9agf88y2c"; + type = "gem"; + }; + version = "1.0.3"; + }; + compass-core = { + dependencies = ["multi_json" "sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yaspqwdmzwdcqviclbs3blq7an16pysrfzylz8q1gxmmd6bpj3a"; + type = "gem"; + }; + version = "1.0.3"; + }; + compass-import-once = { + dependencies = ["sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bn7gwbfz7jvvdd0qdfqlx67fcb83gyvxqc7dr9fhcnks3z8z5rq"; + type = "gem"; + }; + version = "1.0.5"; + }; + compass-rails = { + dependencies = ["compass" "sass-rails" "sprockets"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y1gi9lcmxzn0xvx2pf4xzj8n0s6rl0vbycyjk1kpcvycyjnbjgr"; + type = "gem"; + }; + version = "4.0.0"; + }; + concurrent-ruby = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f"; + type = "gem"; + }; + version = "1.1.9"; + }; + connection_pool = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ffdxhgirgc86qb42yvmfj6v1v0x4lvi0pxn9zhghkff44wzra0k"; + type = "gem"; + }; + version = "2.2.5"; + }; + crack = { + dependencies = ["rexml"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r"; + type = "gem"; + }; + version = "0.4.5"; + }; + crass = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw"; + type = "gem"; + }; + version = "1.0.6"; + }; + css_parser = { + dependencies = ["addressable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xs4ind9xd099rb52b73pch8ha143dl8bhivqsbba4wrvxpbx751"; + type = "gem"; + }; + version = "1.9.0"; + }; + cuprite = { + dependencies = ["capybara" "ferrum"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gz7min595pq4xkzm1nvn538i7plg7jwfc1pw6w8f4apfh94fv56"; + type = "gem"; + }; + version = "0.13"; + }; + custom_error_message = { + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "3a8ec9dddc7a5b0aab7c69a6060596de300c68f4"; + sha256 = "1r2yah8dzng7i0000xfdksv3cj2z65x1nr4vjrnsv9sm7fj7bbld"; + type = "git"; + url = "https://github.com/jeremydurham/custom-err-msg.git"; + }; + version = "1.1.1"; + }; + dalli = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0br39scmr187w3ifl5gsddl2fhq6ahijgw6358plqjdzrizlg764"; + type = "gem"; + }; + version = "2.7.11"; + }; + database_cleaner = { + dependencies = ["database_cleaner-active_record"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x4r22rnpwnm9yln88vhzqj4cl3sbd26c4j50g9k6wp7y01rln4w"; + type = "gem"; + }; + version = "2.0.1"; + }; + database_cleaner-active_record = { + dependencies = ["activerecord" "database_cleaner-core"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jg7jd7w65hdarzbi8f252la3qgsnd2sjavhlmc82kwzfx37k38m"; + type = "gem"; + }; + version = "2.0.0"; + }; + database_cleaner-core = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0v44bn386ipjjh4m2kl53dal8g4d41xajn2jggnmjbhn6965fil6"; + type = "gem"; + }; + version = "2.0.1"; + }; + db2fog = { + dependencies = ["activerecord" "fog-core" "rails"]; + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "5b63343847452f52aa42f7fc169d6ab3af57cda3"; + sha256 = "02fc3v81sx6rnvc492bdg057fs67qpsf83y25bsdqz83k21xmzyl"; + type = "git"; + url = "https://github.com/openfoodfoundation/db2fog.git"; + }; + version = "0.9.2"; + }; + ddtrace = { + dependencies = ["ffi" "msgpack"]; + groups = ["production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0p7d6r2zpy9mqmd26ni9cpgc2yas4jira66rxx92l87amypkvasc"; + type = "gem"; + }; + version = "0.53.0"; + }; + debugger-linecache = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iwyx190fd5vfwj1gzr8pg3m374kqqix4g4fc4qw29sp54d3fpdz"; + type = "gem"; + }; + version = "1.2.0"; + }; + devise = { + dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ag0skzk3h7bhmf1n2zwa7cg6kx5k5inxmq0kf5qpm7917ffm0mz"; + type = "gem"; + }; + version = "4.8.0"; + }; + devise-encryptable = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dh9gl7qa1a8x091xk9dc6lwc5jw6lqmiw7sii1hq0w4jknwlq4q"; + type = "gem"; + }; + version = "0.2.0"; + }; + devise-i18n = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11knkl0b40pyjz8934pmr3apzsmvvaj09w5ks8xzppd5agid2r6f"; + type = "gem"; + }; + version = "1.10.0"; + }; + devise-token_authenticatable = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ss9wcmjghl6s2kyqrgjn5z4bw1gxmlbqv0in2kirn56428w239f"; + type = "gem"; + }; + version = "1.1.0"; + }; + dfc_provider = { + dependencies = ["active_model_serializers" "jwt" "rspec"]; + groups = ["default"]; + platforms = []; + source = { + path = engines/dfc_provider; + type = "path"; + }; + version = "0.0.1"; + }; + diff-lcs = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m925b8xc6kbpnif9dldna24q1szg4mk0fvszrki837pfn46afmz"; + type = "gem"; + }; + version = "1.4.4"; + }; + docile = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lxqxgq71rqwj1lpl9q1mbhhhhhhdkkj7my341f2889pwayk85sz"; + type = "gem"; + }; + version = "1.4.0"; + }; + dotenv = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94"; + type = "gem"; + }; + version = "2.7.6"; + }; + dotenv-rails = { + dependencies = ["dotenv" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1my2jdmgmpf32rfxffkb9cyxh7ayis4q5ygpwjqj4vpp25y3a70c"; + type = "gem"; + }; + version = "2.7.6"; + }; + e2mmap = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n8gxjb63dck3vrmsdcqqll7xs7f3wk78mw8w0gdk9wp5nx6pvj5"; + type = "gem"; + }; + version = "0.1.0"; + }; + erubi = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09l8lz3j00m898li0yfsnb6ihc63rdvhw3k5xczna5zrjk104f2l"; + type = "gem"; + }; + version = "1.10.0"; + }; + et-orbi = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xr8i8ql4xzx17d12590i3j299hj6vc0ja2j29dy12i5nlchxrvp"; + type = "gem"; + }; + version = "1.2.4"; + }; + excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19g5nvkycnkzqq4mqn1zjznq9adrlv2jz0dr9w10cbn42hhqpiz7"; + type = "gem"; + }; + version = "0.81.0"; + }; + execjs = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1"; + type = "gem"; + }; + version = "2.7.0"; + }; + factory_bot = { + dependencies = ["activesupport"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04vxmjr200akcil9fqxc9ghbb9q0lyrh2q03xxncycd5vln910fi"; + type = "gem"; + }; + version = "6.2.0"; + }; + factory_bot_rails = { + dependencies = ["factory_bot" "railties"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18fhcihkc074gk62iwqgbdgc3ymim4fm0b4p3ipffy5hcsb9d2r7"; + type = "gem"; + }; + version = "6.2.0"; + }; + faraday = { + dependencies = ["faraday-excon" "faraday-net_http" "faraday-net_http_persistent" "multipart-post" "ruby2_keywords"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q646m07lfahakx5jdq77j004rcgfj6lkg13c0f84993gi78dhvi"; + type = "gem"; + }; + version = "1.4.1"; + }; + faraday-excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh"; + type = "gem"; + }; + version = "1.1.0"; + }; + faraday-net_http = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j"; + type = "gem"; + }; + version = "1.0.1"; + }; + faraday-net_http_persistent = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l2c835wl7gv34xp49fhd1bl4czkpw2g3ahqsak2251iqv5589ka"; + type = "gem"; + }; + version = "1.1.0"; + }; + ferrum = { + dependencies = ["addressable" "cliver" "concurrent-ruby" "websocket-driver"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17c2bryyzpdx3mj6rig4aym3wy24g2212zm0jz2gisbymhv9adbl"; + type = "gem"; + }; + version = "0.11"; + }; + ffaker = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gif76bq11qz73qm8hv050wf642f9zwawra78bnpnj5kpqhjg3dl"; + type = "gem"; + }; + version = "2.20.0"; + }; + ffi = { + groups = ["default" "production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ssxcywmb3flxsjdg13is6k01807zgzasdhj4j48dm7ac59cmksn"; + type = "gem"; + }; + version = "1.15.4"; + }; + flipper = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gdnd7j12a560r4pi22v1z2cy0nymwr340922rfj9qkpj7h46371"; + type = "gem"; + }; + version = "0.20.4"; + }; + flipper-active_record = { + dependencies = ["activerecord" "flipper"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "042x64rr11ia7n4db2y6vjbfjv2ip0jp2m2mlyb6d9srbxvvkiif"; + type = "gem"; + }; + version = "0.20.4"; + }; + flipper-ui = { + dependencies = ["erubi" "flipper" "rack" "rack-protection"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0sf9giwiwrncvvac48rgc56xgj6s8scs7a9ahr6b2hqbyr1nja9l"; + type = "gem"; + }; + version = "0.20.4"; + }; + fog-aws = { + dependencies = ["fog-core" "fog-json" "fog-xml" "ipaddress"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00skbbgvhqzq6gpgzmw0957n0wf1y3vjgrdyq3sib0ghpyfgmig3"; + type = "gem"; + }; + version = "2.0.1"; + }; + fog-core = { + dependencies = ["builder" "excon" "formatador"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02449kh2x3zj9xxszm02vy8zpbsrykvjrg5gj3kqcy2yizy2bhp3"; + type = "gem"; + }; + version = "1.45.0"; + }; + fog-json = { + dependencies = ["fog-core" "multi_json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx"; + type = "gem"; + }; + version = "1.2.0"; + }; + fog-xml = { + dependencies = ["fog-core" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "043lwdw2wsi6d55ifk0w3izi5l1d1h0alwyr3fixic7b94kc812n"; + type = "gem"; + }; + version = "0.1.3"; + }; + foreman = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0szgxvnzwkzrfbq5dkwa98mig78aqglfy6irdsvq1gq045pbq9r7"; + type = "gem"; + }; + version = "0.87.2"; + }; + formatador = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0"; + type = "gem"; + }; + version = "0.2.5"; + }; + foundation-icons-sass-rails = { + dependencies = ["railties" "sass-rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1z3bp0kcz7csid9r6h8z8asywh8mn2fwcm71b4v4qjca13qf4n2w"; + type = "gem"; + }; + version = "3.0.0"; + }; + foundation-rails = { + dependencies = ["railties" "sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dizpi3k3bb2arnf96rxx1qx3x3rwqshbdzb3l8ycj1laddrhwnl"; + type = "gem"; + }; + version = "5.5.2.1"; + }; + fugit = { + dependencies = ["et-orbi" "raabro"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jhbmc1l94vz25byfbmgi783lrwsh74xvslqzxd0pjf8i9xsxv49"; + type = "gem"; + }; + version = "1.4.5"; + }; + fuubar = { + dependencies = ["rspec-core" "ruby-progressbar"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1028vn7j3kc5qqwswrf3has3qm4j9xva70xmzb3n29i89f0afwmj"; + type = "gem"; + }; + version = "2.5.1"; + }; + geocoder = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0is3xss043nxvckqrbk0r881950q4khigrh41qqqjff44gm24bs3"; + type = "gem"; + }; + version = "1.6.7"; + }; + globalid = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k6ww3shk3mv119xvr9m99l6ql0czq91xhd66hm8hqssb18r2lvm"; + type = "gem"; + }; + version = "0.5.2"; + }; + gmaps4rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0avwx3ygmq2krkawyplw76q4bm05v56rwp1vdwfpvsd8bh4vzhq9"; + type = "gem"; + }; + version = "2.1.2"; + }; + good_migrations = { + dependencies = ["activerecord" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0f613j6gkdkipzhw6r9kngqk3g2zi6hwmscy1sdf5snfjpamhvin"; + type = "gem"; + }; + version = "0.1.0"; + }; + haml = { + dependencies = ["temple" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "035fgbfr20m08w4603ls2lwqbggr0vy71mijz0p68ib1am394xbf"; + type = "gem"; + }; + version = "5.2.2"; + }; + hashdiff = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"; + type = "gem"; + }; + version = "1.0.1"; + }; + hashery = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qj8815bf7q6q7llm5rzdz279gzmpqmqqicxnzv066a020iwqffj"; + type = "gem"; + }; + version = "2.1.2"; + }; + highline = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d"; + type = "gem"; + }; + version = "2.0.3"; + }; + hiredis = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04jj8k7lxqxw24sp0jiravigdkgsyrpprxpxm71ba93x1wr2w1bz"; + type = "gem"; + }; + version = "0.6.3"; + }; + i18n = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0g2fnag935zn2ggm5cn6k4s4xvv53v2givj1j90szmvavlpya96a"; + type = "gem"; + }; + version = "1.8.10"; + }; + i18n-js = { + dependencies = ["i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xiq65q0rhafp3aknj602nbj7i016yjfvw28y83hg8ddqlqvc9x0"; + type = "gem"; + }; + version = "3.9.0"; + }; + immigrant = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15jf08h8if3wyq0kdgijcknqzmgfw4rqnyln68mydg1c5bn4s5cw"; + type = "gem"; + }; + version = "0.3.6"; + }; + ipaddress = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45"; + type = "gem"; + }; + version = "0.8.3"; + }; + jmespath = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf"; + type = "gem"; + }; + version = "1.4.0"; + }; + jquery-rails = { + dependencies = ["rails-dom-testing" "railties" "thor"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dkhm8lan1vnyl3ll0ks2q06576pdils8a1dr354vfc1y5dqw15i"; + type = "gem"; + }; + version = "4.4.0"; + }; + jquery-ui-rails = { + dependencies = ["railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1garrnqwh35acj2pp4sp6fpm2g881h23y644lzbic2qmcrq9wd2v"; + type = "gem"; + }; + version = "4.2.1"; + }; + json = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci"; + type = "gem"; + }; + version = "2.5.1"; + }; + json-schema = { + dependencies = ["addressable"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5"; + type = "gem"; + }; + version = "2.8.1"; + }; + json_spec = { + dependencies = ["multi_json" "rspec"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03yiravv6q8lp37rip2i25w2qd63mwwi4jmw7ymf51y7j9xbjxvs"; + type = "gem"; + }; + version = "1.1.5"; + }; + jwt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bg8pjx0mpvl10k6d8a6gc8dzlv2z5jkqcjbjcirnk032iriq838"; + type = "gem"; + }; + version = "2.3.0"; + }; + knapsack = { + dependencies = ["rake"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f42akjbdkrg1ihwvls9pkkvz8vikaapzgxl82dd128rfn42chm9"; + type = "gem"; + }; + version = "4.0.0"; + }; + launchy = { + dependencies = ["addressable"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xdyvr5j0gjj7b10kgvh8ylxnwk3wx19my42wqn9h82r4p246hlm"; + type = "gem"; + }; + version = "2.5.0"; + }; + letter_opener = { + dependencies = ["launchy"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09a7kgsmr10a0hrc9bwxglgqvppjxij9w8bxx91mnvh0ivaw0nq9"; + type = "gem"; + }; + version = "1.7.0"; + }; + libv8-node = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xx217hrkpcm41p41inmy05kb7g8p9w5fwabgjgmpvz0d60j2862"; + type = "gem"; + }; + version = "15.14.0.1"; + }; + loofah = { + dependencies = ["crass" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nqcya57x2n58y1dify60i0dpla40n4yir928khp4nj5jrn9mgmw"; + type = "gem"; + }; + version = "2.12.0"; + }; + mail = { + dependencies = ["mini_mime"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc"; + type = "gem"; + }; + version = "2.7.1"; + }; + marcel = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bp001p687nsa4a8sp3q1iv8pfhs24w7s3avychjp64sdkg6jxq3"; + type = "gem"; + }; + version = "1.0.1"; + }; + method_source = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"; + type = "gem"; + }; + version = "1.0.0"; + }; + mime-types = { + dependencies = ["mime-types-data"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh"; + type = "gem"; + }; + version = "3.3.1"; + }; + mime-types-data = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1phcq7z0zpipwd7y4fbqmlaqghv07fjjgrx99mwq3z3n0yvy7fmi"; + type = "gem"; + }; + version = "3.2021.0225"; + }; + mimemagic = { + dependencies = ["nokogiri" "rake"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17ycgsmz2229jh224ws77yg974cz326flgc401xrdkfpw90jvb08"; + type = "gem"; + }; + version = "0.4.3"; + }; + mini_mime = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih"; + type = "gem"; + }; + version = "1.1.0"; + }; + mini_portile2 = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lvxm91hi0pabnkkg47wh1siv56s6slm2mdq1idfm86dyfidfprq"; + type = "gem"; + }; + version = "2.6.1"; + }; + mini_racer = { + dependencies = ["libv8-node"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0334q46gi3il9izw7k4z32fj06nm8pznqdkr9r51033lnwwy9zy3"; + type = "gem"; + }; + version = "0.4.0"; + }; + minitest = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19z7wkhg59y8abginfrm2wzplz7py3va8fyngiigngqvsws6cwgl"; + type = "gem"; + }; + version = "5.14.4"; + }; + monetize = { + dependencies = ["money"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cna2myxdbwfq0gn6k2hgrh368dq7wld3jklm96443ysykd0difn"; + type = "gem"; + }; + version = "1.11.0"; + }; + money = { + dependencies = ["i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11fk7i1w3qjb1br7507z748g1rh3mcmnvpm4jach0i4hsc2wrb5k"; + type = "gem"; + }; + version = "6.14.1"; + }; + msgpack = { + groups = ["default" "production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6"; + type = "gem"; + }; + version = "1.4.2"; + }; + multi_json = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; + type = "gem"; + }; + version = "1.15.0"; + }; + multi_xml = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj"; + type = "gem"; + }; + version = "0.6.0"; + }; + multipart-post = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj"; + type = "gem"; + }; + version = "2.1.1"; + }; + nio4r = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xk64wghkscs6bv2n22853k2nh39d131c6rfpnlw12mbjnnv9v1v"; + type = "gem"; + }; + version = "2.5.8"; + }; + nokogiri = { + dependencies = ["mini_portile2" "racc"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1v02g7k7cxiwdcahvlxrmizn3avj2q6nsjccgilq1idc89cr081b"; + type = "gem"; + }; + version = "1.12.5"; + }; + oauth2 = { + dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1q6q2kgpxmygk8kmxqn54zkw8cs57a34zzz5cxpsh1bj3ag06rk3"; + type = "gem"; + }; + version = "1.4.7"; + }; + ofn-qz = { + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "467f6ea1c44529c7c91cac4c8211bbd863588c0b"; + sha256 = "1rm2r2gfbc8cbv9gd4619ivv3qvklwpdayvklyd7w5k9c110fm7j"; + type = "git"; + url = "https://github.com/openfoodfoundation/ofn-qz.git"; + }; + version = "0.1.0"; + }; + order_management = { + groups = ["default"]; + platforms = []; + source = { + path = engines/order_management; + type = "path"; + }; + version = "0.0.1"; + }; + orm_adapter = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda"; + type = "gem"; + }; + version = "0.5.0"; + }; + pagy = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "010z4lmpj7ld8k6hcpsyd2m0iicycaaabyzscgvnir8cklx1w9cw"; + type = "gem"; + }; + version = "4.11.0"; + }; + paper_trail = { + dependencies = ["activerecord" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hvz0fdzginyyx2x8c755aibdhfvmpjfb9666pdk6ccr9nkb7w1k"; + type = "gem"; + }; + version = "12.1.0"; + }; + paperclip = { + dependencies = ["activemodel" "activerecord" "activesupport" "cocaine" "mime-types"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12acd9ambpsq25x4mi4anmsz9p442zhqkba2f4hgml01njxpn8y9"; + type = "gem"; + }; + version = "3.4.2"; + }; + parallel = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hkfpm78c2vs1qblnva3k1grijvxh87iixcnyd83s3lxrxsjvag4"; + type = "gem"; + }; + version = "1.21.0"; + }; + paranoia = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02plzv9qygzxa3fryz6cgap64jqrzwprjsm7r467g15mhaa4fzxi"; + type = "gem"; + }; + version = "2.4.3"; + }; + parser = { + dependencies = ["ast"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ma6w87ph8lnc9z4hi40ynmcdnjv0p8x53x0s3fjkz4q2p6sxh5"; + type = "gem"; + }; + version = "3.0.2.0"; + }; + paypal-sdk-core = { + dependencies = ["multi_json" "xml-simple"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zjqykpxn6snv92wn8a179xyn1vbj327x91dh75lld3myfjz0b0l"; + type = "gem"; + }; + version = "0.3.4"; + }; + paypal-sdk-merchant = { + dependencies = ["paypal-sdk-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0v8gqhn7s53xdf5583hcf3ph22n81hniwli3s1jprak7nx5453f7"; + type = "gem"; + }; + version = "1.117.2"; + }; + pdf-reader = { + dependencies = ["Ascii85" "afm" "hashery" "ruby-rc4" "ttfunk"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "14cxj3ra9nnn334qpm2vsx9s0zk3095s8ih6cwcp47h3hv03c73y"; + type = "gem"; + }; + version = "2.5.0"; + }; + pg = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13mfrysrdrh8cka1d96zm0lnfs59i5x2g6ps49r2kz5p3q81xrzj"; + type = "gem"; + }; + version = "1.2.3"; + }; + power_assert = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01z44m715rb6nzfrc90c5rkkdiy42dv3q94jw1q8baf9dg33nwi5"; + type = "gem"; + }; + version = "2.0.1"; + }; + pry = { + dependencies = ["coderay" "method_source"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iyw4q4an2wmk8v5rn2ghfy2jaz9vmw2nk8415nnpx2s866934qk"; + type = "gem"; + }; + version = "0.13.1"; + }; + pry-byebug = { + dependencies = ["byebug" "pry"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "096y5vmzpyy4x9h4ky4cs4y7d19vdq9vbwwrqafbh5gagzwhifiv"; + type = "gem"; + }; + version = "3.9.0"; + }; + public_suffix = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9"; + type = "gem"; + }; + version = "4.0.6"; + }; + puma = { + dependencies = ["nio4r"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ahk9a2a05985m0037gqlpha5vdkvmwhyk8v1shkbnwkkm30k0mq"; + type = "gem"; + }; + version = "5.5.0"; + }; + raabro = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl"; + type = "gem"; + }; + version = "1.4.0"; + }; + racc = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "178k7r0xn689spviqzhvazzvxfq6fyjldxb3ywjbgipbfi4s8j1g"; + type = "gem"; + }; + version = "1.5.2"; + }; + rack = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16"; + type = "gem"; + }; + version = "2.2.3"; + }; + rack-mini-profiler = { + dependencies = ["rack"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03hcvjw9nrv0w6yjy2zkv4ivin9xg2wr7xfcvx7rc2msv1gmjb6z"; + type = "gem"; + }; + version = "2.3.3"; + }; + rack-protection = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "159a4j4kragqh0z0z8vrpilpmaisnlz3n7kgiyf16bxkwlb3qlhz"; + type = "gem"; + }; + version = "2.1.0"; + }; + rack-proxy = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jdr2r5phr3q7d6k9cnxjwlkaps0my0n43wq9mzw3xdqhg9wa3d6"; + type = "gem"; + }; + version = "0.7.0"; + }; + rack-rewrite = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0milw71dv96wnc6i48vbzypws51dgf415kkp8c4air0mkdhpj838"; + type = "gem"; + }; + version = "1.5.1"; + }; + rack-ssl = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0c21xqkjyl10fngq6dy8082vmn2png8cwkiyzv83ymixq5cx7ygp"; + type = "gem"; + }; + version = "1.4.1"; + }; + rack-test = { + dependencies = ["rack"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m"; + type = "gem"; + }; + version = "1.1.0"; + }; + rack-timeout = { + groups = ["production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16ahj3qz3xhfrwvqb4nf6cfzvliigg0idfsp5jyr8qwk676d2f30"; + type = "gem"; + }; + version = "0.6.0"; + }; + rails = { + dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y59m2x8rdc581bjgyyr9dabi3vk3frqhhpbb5ldpbj622kxfpbz"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + rails-controller-testing = { + dependencies = ["actionpack" "actionview" "activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l"; + type = "gem"; + }; + version = "1.0.5"; + }; + rails-dom-testing = { + dependencies = ["activesupport" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i"; + type = "gem"; + }; + version = "2.0.3"; + }; + rails-html-sanitizer = { + dependencies = ["loofah"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09qrfi3pgllxb08r024lln9k0qzxs57v0slsj8616xf9c0cwnwbk"; + type = "gem"; + }; + version = "1.4.2"; + }; + rails-i18n = { + dependencies = ["i18n" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05mcgv748vppnm3fnml37wjy3dw61wj8vfw14ldaj1yx1bmkhb07"; + type = "gem"; + }; + version = "6.0.0"; + }; + rails_safe_tasks = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06bl9cgj8jyc04qdm4jp02ph2vlarapy119lagk6cq1hadzdw7n2"; + type = "gem"; + }; + version = "1.0.0"; + }; + railties = { + dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kwpm068cqys34p2g0j3l1g0cd5f3kxnsay5v7lmbd0sgarac0vy"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + rainbow = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk"; + type = "gem"; + }; + version = "3.0.0"; + }; + rake = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w"; + type = "gem"; + }; + version = "13.0.6"; + }; + ransack = { + dependencies = ["activerecord" "activesupport" "i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z25sv93lfiyjjm9fgkmnjkc9kjdlpkd7wairk2vqj7dxklv7yvs"; + type = "gem"; + }; + version = "2.4.2"; + }; + rb-fsevent = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qsx9c4jr11vr3a9s5j83avczx9qn9rjaf32gxpc2v451hvbc0is"; + type = "gem"; + }; + version = "0.11.0"; + }; + rb-inotify = { + dependencies = ["ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005"; + type = "gem"; + }; + version = "0.10.1"; + }; + redcarpet = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bvk8yyns5s1ls437z719y5sdv9fr8kfs8dmr6g8s761dv5n8zvi"; + type = "gem"; + }; + version = "3.5.1"; + }; + redis = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ig832dp0xmpp6a934nifzaj7wm9lzjxzasw911fagycs8p6m720"; + type = "gem"; + }; + version = "4.4.0"; + }; + regexp_parser = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vg7imjnfcqjx7kw94ccj5r78j4g190cqzi1i59sh4a0l940b9cr"; + type = "gem"; + }; + version = "2.1.1"; + }; + request_store = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cx74kispmnw3ljwb239j65a2j14n8jlsygy372hrsa8mxc71hxi"; + type = "gem"; + }; + version = "1.5.0"; + }; + responders = { + dependencies = ["actionpack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "14kjykc6rpdh24sshg9savqdajya2dislc1jmbzg91w9967f4gv1"; + type = "gem"; + }; + version = "3.0.1"; + }; + rexml = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53"; + type = "gem"; + }; + version = "3.2.5"; + }; + roadie = { + dependencies = ["css_parser" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01kld3drqfiih5x8c13cvr6dpvdl7jml0v9bcw4fsy322lax3kn0"; + type = "gem"; + }; + version = "4.0.0"; + }; + roadie-rails = { + dependencies = ["railties" "roadie"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jjcqnp37z65dksykzwjiz149kx65nw70lyx8dkw1fm5x7yraqvh"; + type = "gem"; + }; + version = "2.2.0"; + }; + roo = { + dependencies = ["nokogiri" "rubyzip"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1z2nbf1w48ip2akf1ql86y6569aizi53d6ickjbplkga12n0isf8"; + type = "gem"; + }; + version = "2.8.3"; + }; + rspec = { + dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dwai7jnwmdmd7ajbi2q0k0lx1dh88knv5wl7c34wjmf94yv8w5q"; + type = "gem"; + }; + version = "3.10.0"; + }; + rspec-core = { + dependencies = ["rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wwnfhxxvrlxlk1a3yxlb82k2f9lm0yn0598x7lk8fksaz4vv6mc"; + type = "gem"; + }; + version = "3.10.1"; + }; + rspec-expectations = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sz9bj4ri28adsklnh257pnbq4r5ayziw02qf67wry0kvzazbb17"; + type = "gem"; + }; + version = "3.10.1"; + }; + rspec-mocks = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d13g6kipqqc9lmwz5b244pdwc97z15vcbnbq6n9rlf32bipdz4k"; + type = "gem"; + }; + version = "3.10.2"; + }; + rspec-rails = { + dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "152yz205p8zi5nxxhs8z581rjdvvqsfjndklkvn11f2vi50nv7n9"; + type = "gem"; + }; + version = "5.0.2"; + }; + rspec-retry = { + dependencies = ["rspec-core"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n6qc0d16h6bgh1xarmc8vc58728mgjcsjj8wcd822c8lcivl0b1"; + type = "gem"; + }; + version = "0.6.2"; + }; + rspec-support = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15j52parvb8cgvl6s0pbxi2ywxrv6x0764g222kz5flz0s4mycbl"; + type = "gem"; + }; + version = "3.10.2"; + }; + rswag = { + dependencies = ["rswag-api" "rswag-specs" "rswag-ui"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w7dc4ipxaf6dagj6zbn4j7r384gh4zhdb2i7dvpqahrszf6cc7r"; + type = "gem"; + }; + version = "2.4.0"; + }; + rswag-api = { + dependencies = ["railties"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1s8wc2m4xngbdm5ms2xskpykzbmr9cvapxpjv4k6yirv71lqdxqc"; + type = "gem"; + }; + version = "2.4.0"; + }; + rswag-specs = { + dependencies = ["activesupport" "json-schema" "railties"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dma3j5vfjhyclg8y0gsp44vs4wn9chf4jgfhc9r6ws018xrbxzd"; + type = "gem"; + }; + version = "2.4.0"; + }; + rswag-ui = { + dependencies = ["actionpack" "railties"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08f7g0cmz5gyzsszaqwmy4mrj2xh6krnd03jw9yi80gqayda4rkr"; + type = "gem"; + }; + version = "2.4.0"; + }; + rubocop = { + dependencies = ["parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19jg2mm4xj044j06asqv7v0bmq1axikl9pskf35riz54rskv8wci"; + type = "gem"; + }; + version = "1.22.1"; + }; + rubocop-ast = { + dependencies = ["parser"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0x0xfq2mpg194rcanbjrgvjbh94s9kq72jynxx61789s628kxy59"; + type = "gem"; + }; + version = "1.12.0"; + }; + rubocop-rails = { + dependencies = ["activesupport" "rack" "rubocop"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mq3x7jpmp49wwa2r880dcmn27arqc9ln8v2y0dv3ha7s5g8mzrn"; + type = "gem"; + }; + version = "2.12.3"; + }; + ruby-progressbar = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02nmaw7yx9kl7rbaan5pl8x5nn0y4j5954mzrkzi9i3dhsrps4nc"; + type = "gem"; + }; + version = "1.11.0"; + }; + ruby-rc4 = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00vci475258mmbvsdqkmqadlwn6gj9m01sp7b5a3zd90knil1k00"; + type = "gem"; + }; + version = "0.1.5"; + }; + ruby2_keywords = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15wfcqxyfgka05v2a7kpg64x57gl1y4xzvnc9lh60bqx5sf1iqrs"; + type = "gem"; + }; + version = "0.0.4"; + }; + rubyzip = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz"; + type = "gem"; + }; + version = "2.3.2"; + }; + rufus-scheduler = { + dependencies = ["fugit"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x1cr9hd3phshgrrh796ql37339j5i6w7i7skxjkyygigdzl5kjy"; + type = "gem"; + }; + version = "3.7.0"; + }; + sass = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kfpcwh8dgw4lc81qglkvjl73689jy3g7196zkxm4fpskg1p5lkw"; + type = "gem"; + }; + version = "3.4.25"; + }; + sass-rails = { + dependencies = ["railties" "sass" "sprockets" "sprockets-rails" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19bcs1ya3bkx36qaz21kgiz28s9h678m3rszcw7aany2lsis56y7"; + type = "gem"; + }; + version = "5.0.8"; + }; + sd_notify = { + groups = ["production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0c9imnjbakx25r2n7widfp00s19ndzmmwax761mx5vbwm9nariyb"; + type = "gem"; + }; + version = "0.1.1"; + }; + select2-rails = { + dependencies = ["sass-rails" "thor"]; + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "fc240e85fbdf1878ff3c39d972c0cd9a312f5ed4"; + sha256 = "0lflvygxgmm4yqhnx66h77g742g01x7jajjjn33a4hm0n7lgdq5y"; + type = "git"; + url = "https://github.com/openfoodfoundation/select2-rails.git"; + }; + version = "3.4.9"; + }; + selenium-webdriver = { + dependencies = ["childprocess" "rubyzip"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0adcvp86dinaqq3nhf8p3m0rl2g6q0a4h52k0i7kdnsg1qz9k86y"; + type = "gem"; + }; + version = "3.142.7"; + }; + semantic_range = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dlp97vg95plrsaaqj7x8l7z9vsjbhnqk4rw1l30gy26lmxpfrih"; + type = "gem"; + }; + version = "3.0.0"; + }; + shoulda-matchers = { + dependencies = ["activesupport"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z6v2acldnvqrnvfk70f9xq39ppw5j03kbz2hpz7s17lgnn21vx8"; + type = "gem"; + }; + version = "5.0.0"; + }; + sidekiq = { + dependencies = ["connection_pool" "rack" "redis"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "104a97cl94aclg71ngrr097zjbdf6cibnz4q3rqjb88izmd7cfk6"; + type = "gem"; + }; + version = "6.2.2"; + }; + sidekiq-scheduler = { + dependencies = ["e2mmap" "redis" "rufus-scheduler" "sidekiq" "thwait" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k686psrg8rd902yyqi38vys11zb07192skzx8zyyvyz2l9vrzds"; + type = "gem"; + }; + version = "3.1.0"; + }; + simplecov = { + dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hrv046jll6ad1s964gsmcq4hvkr3zzr6jc7z1mns22mvfpbc3cr"; + type = "gem"; + }; + version = "0.21.2"; + }; + simplecov-html = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb"; + type = "gem"; + }; + version = "0.12.3"; + }; + simplecov_json_formatter = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19r15hyvh52jx7fmsrcflb58xh8l7l0zx4sxkh3hqzhq68y81pjl"; + type = "gem"; + }; + version = "0.1.3"; + }; + spring = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12kyz3jdnaarhf2jbykmd9mqg085gxsx00c16la5q7czxvpb2x2r"; + type = "gem"; + }; + version = "3.0.0"; + }; + spring-commands-rspec = { + dependencies = ["spring"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2"; + type = "gem"; + }; + version = "1.0.4"; + }; + sprockets = { + dependencies = ["concurrent-ruby" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay"; + type = "gem"; + }; + version = "3.7.2"; + }; + sprockets-rails = { + dependencies = ["actionpack" "activesupport" "sprockets"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0mwmz36265646xqfyczgr1mhkm1hfxgxxvgdgr4xfcbf2g72p1k2"; + type = "gem"; + }; + version = "3.2.2"; + }; + state_machines = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00mi16hg3rhkxz4y58s173cbnjlba41y9bfcim90p4ja6yfj9ri3"; + type = "gem"; + }; + version = "0.5.0"; + }; + state_machines-activemodel = { + dependencies = ["activemodel" "state_machines"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b4dffzlj38adin6gm0ky72r5c507qdb1jprnm7h9gnlj2qxlcp9"; + type = "gem"; + }; + version = "0.8.0"; + }; + state_machines-activerecord = { + dependencies = ["activerecord" "state_machines-activemodel"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dmaf4f4cg3gamzgga3gamp0kv9lvianqzr9103dw0xbp00vfbq7"; + type = "gem"; + }; + version = "0.8.0"; + }; + stringex = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15ns7j5smw04w6w7bqd5mm2qcl7w9lhwykyb974i4isgg9yc23ys"; + type = "gem"; + }; + version = "2.8.5"; + }; + stripe = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b2savy5h9shdzr6fkfqyrpmpx1a82gn4j47895zwc279dhwnlrh"; + type = "gem"; + }; + version = "5.38.0"; + }; + temple = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "060zzj7c2kicdfk6cpnn40n9yjnhfrr13d0rsbdhdij68chp2861"; + type = "gem"; + }; + version = "0.8.2"; + }; + test-prof = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vg0zjfgibdcgkzb4c25v0f4v6v8mvpzvgcag194rwglmkkyrwkx"; + type = "gem"; + }; + version = "1.0.7"; + }; + test-unit = { + dependencies = ["power_assert"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03pn837vgza8v550ggzhcxbvb80d6qivqnhv3n39lrfnsc8xgi7m"; + type = "gem"; + }; + version = "3.4.7"; + }; + thor = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18yhlvmfya23cs3pvhr1qy38y41b6mhr5q9vwv5lrgk16wmf3jna"; + type = "gem"; + }; + version = "1.1.0"; + }; + thread-local = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ryjgfwcsbkxph1l24x87p1yabnnbqy958s57w37iwhf3z9nid9g"; + type = "gem"; + }; + version = "1.1.0"; + }; + thwait = { + dependencies = ["e2mmap"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q0fqlh0668j66z0g3s5yhqs39368az2ycxyphsx4c5nib5r4kak"; + type = "gem"; + }; + version = "0.2.0"; + }; + tilt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rn8z8hda4h41a64l0zhkiwz2vxw9b1nb70gl37h1dg2k874yrlv"; + type = "gem"; + }; + version = "2.0.10"; + }; + timecop = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fw3nzycvd15qa7sxy9dxb4hqyizy1s8f7q3d50smbzyyvr8fvia"; + type = "gem"; + }; + version = "0.9.4"; + }; + ttfunk = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15iaxz9iak5643bq2bc0jkbjv8w2zn649lxgvh5wg48q9d4blw13"; + type = "gem"; + }; + version = "1.7.0"; + }; + tzinfo = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z"; + type = "gem"; + }; + version = "2.0.4"; + }; + uglifier = { + dependencies = ["execjs"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wgh7bzy68vhv9v68061519dd8samcy8sazzz0w3k8kqpy3g4s5f"; + type = "gem"; + }; + version = "4.2.0"; + }; + unicode-display_width = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0csjm9shhfik0ci9mgimb7hf3xgh7nx45rkd9rzgdz6vkwr8rzxn"; + type = "gem"; + }; + version = "2.1.0"; + }; + uniform_notifier = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1614dqnky0f9f1znj0lih8i184vfps86md93dw0kxrg3af9gnqb4"; + type = "gem"; + }; + version = "1.14.2"; + }; + valid_email2 = { + dependencies = ["activemodel" "mail"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l4xkwvx7aj5z18h6vzp0wsfjbcrl76ixp0x95wwlrhn03qab6hs"; + type = "gem"; + }; + version = "4.0.0"; + }; + view_component = { + dependencies = ["activesupport" "method_source"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qygf9dfn42q8y3i2g04zqqmw1bjklmsxgdcpfk07nbnpjh391i9"; + type = "gem"; + }; + version = "2.40.0"; + }; + view_component_storybook = { + dependencies = ["view_component"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yslfpcw58mqqaig83b2h98mf04i19ck37m270d8naxr69iv9h0n"; + type = "gem"; + }; + version = "0.10.1"; + }; + warden = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26"; + type = "gem"; + }; + version = "1.2.9"; + }; + web = { + groups = ["default"]; + platforms = []; + source = { + path = engines/web; + type = "path"; + }; + version = "0.0.1"; + }; + web-console = { + dependencies = ["actionview" "activemodel" "bindex" "railties"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d9hk929cmisix2l1w9kkh05b57ih9yvnh4wv52axxw41scnv2d9"; + type = "gem"; + }; + version = "4.1.0"; + }; + webdrivers = { + dependencies = ["nokogiri" "rubyzip" "selenium-webdriver"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1naymcfmm9pkf0f67xd99d9f6dpv477ggyvc1c04gxifirynfydp"; + type = "gem"; + }; + version = "4.6.1"; + }; + webmock = { + dependencies = ["addressable" "crack" "hashdiff"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l8vh8p0g92cqcvv0ra3mblsa4nczh0rz8nbwbkc3g3yzbva85xk"; + type = "gem"; + }; + version = "3.14.0"; + }; + webpacker = { + dependencies = ["activesupport" "rack-proxy" "railties" "semantic_range"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cq6m5qwm3bmi7hkjfmbg2cs4qjq4wswlrwcfk8l1svfqbi135v3"; + type = "gem"; + }; + version = "5.4.3"; + }; + websocket-driver = { + dependencies = ["websocket-extensions"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052"; + type = "gem"; + }; + version = "0.7.5"; + }; + websocket-extensions = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw"; + type = "gem"; + }; + version = "0.1.5"; + }; + whenever = { + dependencies = ["chronic"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0im2x9rgr752hb9f1nnfj486k96bfiqj0xsv2bmzaq1rqhbi9dyr"; + type = "gem"; + }; + version = "1.0.0"; + }; + wicked_pdf = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0i7ifpb5ynvg7m6i1bivmvnaz29vjfwf6f4qj9gs7nq4yyxflqr6"; + type = "gem"; + }; + version = "2.1.0"; + }; + wkhtmltopdf-binary = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ksmryizimmw60k5siciv3xfxx9q797bh5a1rga7hqban98rv0c2"; + type = "gem"; + }; + version = "0.12.6.5"; + }; + xml-simple = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1flpmghcbil6qbl3f6w67kpjrnjbw86x7h6g5n4m5ff0cg4sylrv"; + type = "gem"; + }; + version = "1.1.8"; + }; + xpath = { + dependencies = ["nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd"; + type = "gem"; + }; + version = "3.2.0"; + }; + zeitwerk = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1746czsjarixq0x05f7p3hpzi38ldg6wxnxxw74kbjzh1sdjgmpl"; + type = "gem"; + }; + version = "2.4.2"; + }; +} \ No newline at end of file diff --git a/flakes/paste/flake.nix b/flakes/paste/flake.nix index 08d0681..97e31c8 100644 --- a/flakes/paste/flake.nix +++ b/flakes/paste/flake.nix @@ -45,6 +45,8 @@ let cfg = config.services.paste; in { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options = { services.paste = { enable = lib.mkOption { diff --git a/flakes/paste/paste/paste.py b/flakes/paste/paste/paste.py index 86666b8..3172de5 100644 --- a/flakes/paste/paste/paste.py +++ b/flakes/paste/paste/paste.py @@ -10,9 +10,32 @@ import mimetypes magic = magic.Magic(mime=True) +mit_license = """ +Copyright (c) 2022 Immae + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + config = { "directory": os.environ["PASTE_DIRECTORY"], "self_paste_id": "abcd123", + "license_paste_id": "license", "max_content_length": 16 * 1000 * 1000 } @@ -33,6 +56,8 @@ def read_paste(paste_id): if mime.startswith("text/x-script."): mime="text/plain" return (content, mime) + elif paste_id == config["license_paste_id"]: + return (mit_license, "text/plain") else: abort(404) @@ -69,9 +94,11 @@ $ curl -X POST --data-binary @{self} {host} -> GET {paste}/download force download of file -Get the source +Get the source
+Software licensed under the terms of the MIT license '''.format(host=url_for('post_paste', _external=True, _scheme="https"), paste=url_for('get_paste', _external=True, _scheme="https", paste_id=config["self_paste_id"]), + license=url_for('get_paste', _external=True, _scheme="https", paste_id=config["license_paste_id"]), self=os.path.basename(__file__) ), mimetype="text/html") diff --git a/flakes/peertube/flake.lock b/flakes/peertube/flake.lock index 6187115..eeb516a 100644 --- a/flakes/peertube/flake.lock +++ b/flakes/peertube/flake.lock @@ -17,19 +17,14 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { diff --git a/flakes/peertube/flake.nix b/flakes/peertube/flake.nix index 2f9c8c1..e8153eb 100644 --- a/flakes/peertube/flake.nix +++ b/flakes/peertube/flake.nix @@ -1,9 +1,7 @@ { description = "A free software to take back control of your videos"; inputs.myuids = { - url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; - type = "git"; - dir = "flakes/myuids"; + url = "path:../myuids"; }; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs"; @@ -166,10 +164,10 @@ nixosModule = { lib, pkgs, config, ... }: let name = "peertube"; - cfg = config.services.peertube; + cfg = config.immaeServices.peertube; in { - options.services.peertube = { + options.immaeServices.peertube = { enable = lib.mkEnableOption "Enable Peertube’s service"; user = lib.mkOption { type = lib.types.str; @@ -239,6 +237,8 @@ environment.NODE_CONFIG_DIR = "${cfg.dataDir}/config"; environment.NODE_ENV = "production"; + environment.NPM_CONFIG_LOGS_DIR = "${cfg.dataDir}/npm_logs"; + environment.NPM_CONFIG_CACHE = "${cfg.dataDir}/npm_cache"; environment.HOME = cfg.package; path = [ pkgs.nodejs pkgs.yarn pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ]; diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/bower.nix b/flakes/private/buildbot/buildslist/bower.nix similarity index 100% rename from pkgs/python-packages/buildbot/plugins/buildslist/bower.nix rename to flakes/private/buildbot/buildslist/bower.nix diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix b/flakes/private/buildbot/buildslist/default.nix similarity index 88% rename from pkgs/python-packages/buildbot/plugins/buildslist/default.nix rename to flakes/private/buildbot/buildslist/default.nix index 4ab4c54..7f72503 100644 --- a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix +++ b/flakes/private/buildbot/buildslist/default.nix @@ -1,16 +1,15 @@ -{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, libsass, python, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, sources }: +{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, buildslist_src }: let yarn2nix-moretea' = yarn2nix-moretea.override({ yarn = yarn.override({ nodejs = nodejs-10_x; }); nodejs = nodejs-10_x; }); - buildslist_src = sources.buildbot-plugin-buildslist; packagejson = runCommand "package.json" { buildInputs = [ jq ]; } '' cat ${buildslist_src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"|.license= "MIT"' > $out ''; nodeHeaders = fetchurl { url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz"; - sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c"; + sha256 = "sha256-LEk6BOW/vwdUXGAialDOoyFIkZ81k6ADy6MhMfRiE5Y="; }; buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec { name = "buildslist-yarn-modules"; @@ -21,7 +20,7 @@ let yarnNix = ./yarn-packages.nix; pkgConfig = { node-sass = { - buildInputs = [ libsass python ]; + buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ]; postInstall = '' node scripts/build.js --tarball=${nodeHeaders} diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix b/flakes/private/buildbot/buildslist/yarn-packages.nix similarity index 100% rename from pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix rename to flakes/private/buildbot/buildslist/yarn-packages.nix diff --git a/modules/private/buildbot/common/build_helpers.py b/flakes/private/buildbot/common/build_helpers.py similarity index 62% rename from modules/private/buildbot/common/build_helpers.py rename to flakes/private/buildbot/common/build_helpers.py index acea905..77e6c07 100644 --- a/modules/private/buildbot/common/build_helpers.py +++ b/flakes/private/buildbot/common/build_helpers.py @@ -3,9 +3,12 @@ from buildbot_buildslist import BuildsList from shutil import which __all__ = [ - "force_scheduler", "deploy_scheduler", "hook_scheduler", - "clean_branch", "package_and_upload", "SlackStatusPush", - "XMPPStatusPush", "NixShellCommand" + "force_scheduler", "deploy_scheduler", "git_hook_scheduler", + "clean_branch", "package_and_upload", "AppriseStatusPush", + "XMPPStatusPush", "NixShellCommand", + "all_builder_names", "compute_build_infos", "deploy_ssh_command", + "configure_apprise_push", + "configure_xmpp_push", "deploy_hook_scheduler", ] # Small helpers" @@ -19,22 +22,21 @@ def clean_branch(props): def package_and_upload(package, package_dest, package_url): return [ steps.ShellCommand(name="build package", - logEnviron=False, haltOnFailure=True, workdir="source", + logEnviron=False, haltOnFailure=True, command=["git", "archive", "HEAD", "-o", package]), steps.FileUpload(name="upload package", workersrc=package, - workdir="source", masterdest=package_dest, + masterdest=package_dest, url=package_url, mode=0o644), steps.ShellCommand(name="cleanup package", logEnviron=False, - haltOnFailure=True, workdir="source", alwaysRun=True, + haltOnFailure=True, alwaysRun=True, command=["rm", "-f", package]), ] # Steps class NixShellCommand(steps.ShellCommand): - def __init__(self, command=None, pure=True, nixfile=None, **kwargs): - assert(isinstance(command, str)) + def __init__(self, command=None, nixPackages=[], pure=True, nixFile=None, nixIncludes={}, nixArgs={}, **kwargs): oldpath = kwargs.get("env", {}).get("PATH", None) if which("nix-shell", path=oldpath) is None: kwargs["env"] = kwargs.get("env", {}) @@ -43,23 +45,37 @@ class NixShellCommand(steps.ShellCommand): elif isinstance(oldpath, list): kwargs["env"]["PATH"] = ["/run/current-system/sw/bin"] + oldpath nixcommand = ["nix-shell"] + for k, v in nixArgs.items(): + nixcommand.append("--arg") + nixcommand.append(k) + nixcommand.append(v) if pure: nixcommand.append("--pure") + for k, v in nixIncludes.items(): + nixcommand.append("-I") + nixcommand.append("{}={}".format(k, v)) nixcommand.append("--run") nixcommand.append(command) - if nixfile is not None: - nixcommand.append(nixfile) + if len(nixPackages) > 0: + nixcommand.append("-p") + nixcommand += nixPackages + elif nixFile is not None: + nixcommand.append(nixFile) super().__init__(command=nixcommand, **kwargs) # Schedulers -def force_scheduler(name, builders): +def force_scheduler(name, builders, nobranch=False): + if nobranch: + branch = util.FixedParameter(name="branch", default="") + else: + branch=util.StringParameter(name="branch", label="Git reference (tag, branch)", required=True) + return schedulers.ForceScheduler(name=name, label="Force build", buttonName="Force build", reason=util.StringParameter(name="reason", label="Reason", default="Force build"), codebases=[ util.CodebaseParameter("", - branch=util.StringParameter( - name="branch", label="Git reference (tag, branch)", required=True), + branch=branch, revision=util.FixedParameter(name="revision", default=""), repository=util.FixedParameter(name="repository", default=""), project=util.FixedParameter(name="project", default=""), @@ -88,50 +104,51 @@ def deploy_scheduler(name, builders): ] ) -def hook_scheduler(project, timer=10): +def git_hook_scheduler(project, builders=[], timer=1): + if len(builders) == 0: + builders = ["{}_build".format(project)] + return schedulers.AnyBranchScheduler( + change_filter=util.ChangeFilter(category="gitolite-hooks", project=project), + name="{}_git_hook".format(project), treeStableTimer=timer, builderNames=builders) + +def deploy_hook_scheduler(project, builders, timer=1): return schedulers.AnyBranchScheduler( - change_filter=util.ChangeFilter(category="hooks", project=project), - name=project, treeStableTimer=timer, builderNames=["{}_build".format(project)]) + change_filter=util.ChangeFilter(category="deploy_webhook", project=project), + name="{}_deploy".format(project), treeStableTimer=timer, builderNames=builders) -# Slack/XMPP status push +# Builders +def all_builder_names(c): + return [builder.name for builder in c['builders']] + +# Apprise/XMPP status push from buildbot.reporters.http import HttpStatusPushBase from twisted.internet import defer from twisted.python import log -from buildbot.util import httpclientservice from buildbot.reporters import utils from buildbot.process import results from twisted.words.protocols.jabber.jid import JID from wokkel import client, xmppim from functools import partial +import apprise -class SlackStatusPush(HttpStatusPushBase): - name = "SlackStatusPush" +class AppriseStatusPush(HttpStatusPushBase): + name = "AppriseStatusPush" @defer.inlineCallbacks - def reconfigService(self, serverUrl, **kwargs): + def reconfigService(self, appriseUrls, **kwargs): + self.appriseUrls = appriseUrls yield HttpStatusPushBase.reconfigService(self, **kwargs) - self._http = yield httpclientservice.HTTPClientService.getService( - self.master, serverUrl) @defer.inlineCallbacks def send(self, build): yield utils.getDetailsForBuild(self.master, build, wantProperties=True) - response = yield self._http.post("", json=self.format(build)) - if response.code != 200: - log.msg("%s: unable to upload status: %s" % - (response.code, response.content)) + appobject = apprise.Apprise() + message = self.format(build) + for url in self.appriseUrls: + appobject.add(url.format(**message)) + yield appobject.notify(title=message["title"], body=message["text"]) def format(self, build): - colors = [ - "#36A64F", # success - "#F1E903", # warnings - "#DA0505", # failure - "#FFFFFF", # skipped - "#000000", # exception - "#FFFFFF", # retry - "#D02CA9", # cancelled - ] - if "environment" in build["properties"]: msg = "{} environment".format(build["properties"]["environment"][0]) if "build" in build["properties"]: @@ -152,67 +169,31 @@ class SlackStatusPush(HttpStatusPushBase): else: duration = "{}s".format(seconds) - text = "Build <{}|{}> of {}'s {} was {} in {}.".format( - build["url"], build["buildid"], + text = "Build {} ({}) of {}'s {} was {} in {}.".format( + build["number"], build["url"], build["builder"]["name"], msg, results.Results[build["results"]], duration, ) - fields = [ - { - "title": "Build", - "value": "<{}|{}>".format(build["url"], build["buildid"]), - "short": True, - }, - { - "title": "Project", - "value": build["builder"]["name"], - "short": True, - }, - { - "title": "Build status", - "value": results.Results[build["results"]], - "short": True, - }, - { - "title": "Build duration", - "value": duration, - "short": True, - }, - ] - if "environment" in build["properties"]: - fields.append({ - "title": "Environment", - "value": build["properties"]["environment"][0], - "short": True, - }) - if "build" in build["properties"]: - fields.append({ - "title": "Archive", - "value": build["properties"]["build"][0], - "short": True, - }) - attachments = [{ - "fallback": "", - "color": colors[build["results"]], - "fields": fields - }] else: - text = "Build <{}|{}> of {}'s {} started.".format( - build["url"], build["buildid"], + text = "Build {} ({}) of {}'s {} started.".format( + build["number"], build["url"], build["builder"]["name"], msg, ) - attachments = [] - return { "username": "Buildbot", - "icon_url": "http://docs.buildbot.net/current/_static/icon.png", + "image_url": "http://docs.buildbot.net/current/_static/icon.png", "text": text, - "attachments": attachments, + "title": "", } +def configure_apprise_push(c, secrets_file, builders): + c['services'].append(AppriseStatusPush( + name="apprise_status", builders=builders, + appriseUrls=open(secrets_file + "/apprise_webhooks", "r").read().split("\n"))) + class XMPPStatusPush(HttpStatusPushBase): name = "XMPPStatusPush" @@ -261,7 +242,7 @@ class XMPPStatusPush(HttpStatusPushBase): duration = "{}s".format(seconds) text = "Build {} ( {} ) of {}'s {} was {} in {}.".format( - build["buildid"], build["url"], + build["number"], build["url"], build["builder"]["name"], msg, results.Results[build["results"]], @@ -269,9 +250,44 @@ class XMPPStatusPush(HttpStatusPushBase): ) else: text = "Build {} ( {} ) of {}'s {} started.".format( - build["buildid"], build["url"], + build["number"], build["url"], build["builder"]["name"], msg, ) return text + +def configure_xmpp_push(c, secrets_file, builders, recipients): + c['services'].append(XMPPStatusPush( + name="xmpp_status", builders=builders, recipients=recipients, + password=open(secrets_file + "/notify_xmpp_password", "r").read().rstrip())) + +# LDAP edit +from buildbot.process.buildstep import FAILURE +from buildbot.process.buildstep import SUCCESS +from buildbot.process.buildstep import BuildStep + +def compute_build_infos(prefix, release_path): + @util.renderer + def compute(props): + import re, hashlib + build_file = props.getProperty("build") + package_dest = "{}/{}".format(release_path, build_file) + version = re.match(r"{0}_(.*).tar.gz".format(prefix), build_file).group(1) + with open(package_dest, "rb") as f: + sha = hashlib.sha256(f.read()).hexdigest() + return { + "build_version": version, + "build_hash": sha, + } + return compute + +def deploy_ssh_command(ssh_key_path, deploy_hosts): + @util.renderer + def compute(props): + environment = props["environment"] if props.hasProperty("environment") else "integration" + ssh_command = [ + "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", + "-i", ssh_key_path ] + return ssh_command + deploy_hosts.get(environment, ["host.invalid"]) + return compute diff --git a/modules/private/buildbot/common/libvirt.py b/flakes/private/buildbot/common/libvirt.py similarity index 100% rename from modules/private/buildbot/common/libvirt.py rename to flakes/private/buildbot/common/libvirt.py diff --git a/modules/private/buildbot/common/master.cfg b/flakes/private/buildbot/common/master.cfg similarity index 67% rename from modules/private/buildbot/common/master.cfg rename to flakes/private/buildbot/common/master.cfg index abe08e0..0357f2a 100644 --- a/modules/private/buildbot/common/master.cfg +++ b/flakes/private/buildbot/common/master.cfg @@ -22,6 +22,27 @@ class CustomBase(webhooks.base): return ([args], None) +class GitoliteHook(webhooks.base): + def getChanges(self, request): + try: + branch = request.args[b"branch"][0].decode("utf-8") + project = request.args[b"project"][0].decode("utf-8") + repository = request.args[b"repository"][0].decode("utf-8") + author = request.args[b"author"][0].decode("utf-8") + except Exception as e: + raise ValueError("Error missing key in request: " + str(e)) + + args = { + "author": "gitolite for " + author, + "category": "gitolite-hooks", + "comments": "gitolite post-receive hook", + "branch": branch, + "project": project, + "repository": repository, + } + + return ([args], None) + userInfoProvider = util.LdapUserInfo( uri=E.LDAP_URL, bindUser=E.LDAP_ADMIN_USER, @@ -52,7 +73,10 @@ c = BuildmasterConfig = { secrets.SecretInAFile(E.SECRETS_FILE), ], "www": { - "change_hook_dialects": { "base": { "custom_class": CustomBase } }, + "change_hook_dialects": { + "base": { "custom_class": CustomBase }, + "gitolite": { "custom_class": GitoliteHook }, + }, "plugins": { "waterfall_view": {}, "console_view": {}, diff --git a/flakes/private/buildbot/flake.lock b/flakes/private/buildbot/flake.lock new file mode 100644 index 0000000..8952f75 --- /dev/null +++ b/flakes/private/buildbot/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/buildbot/flake.nix b/flakes/private/buildbot/flake.nix new file mode 100644 index 0000000..8b3c704 --- /dev/null +++ b/flakes/private/buildbot/flake.nix @@ -0,0 +1,74 @@ +{ + description = "The continuous integration framework"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.buildslist = { + url = "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"; + type = "git"; + flake = false; + }; + outputs = { self, nixpkgs, flake-utils, buildslist }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + python = pkgs.python38; + wokkel = python.pkgs.buildPythonPackage rec { + pname = "wokkel"; + version = "18.0.0"; + src = python.pkgs.fetchPypi { + inherit pname version; + sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016"; + }; + propagatedBuildInputs = with python.pkgs; [ twisted.extras.tls twisted incremental dateutil ]; + doCheck = false; + }; + buildbot_common = python.pkgs.buildPythonPackage { + name = "buildbot_common"; + src = ./common; + format = "other"; + installPhase = '' + mkdir -p $out/${python.sitePackages} + cp -a $src $out/${python.sitePackages}/buildbot_common + ''; + }; + buildbot-full = python.pkgs.buildbot-full.withPlugins [ buildslist-plugin ] // { + inherit buildbot_common; + buildbot_config = project: python.pkgs.buildPythonPackage (rec { + name = "buildbot_config-${project.name}"; + src = if project.name == "test" then ./test_project else project.src; + format = "other"; + installPhase = '' + mkdir -p $out/${python.sitePackages} + cp -a $src $out/${python.sitePackages}/buildbot_config + ''; + }); + common_packages = pkgs: [ + (pkgs.apprise.overridePythonAttrs(old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ pkgs.sleekxmpp ]; })) pkgs.libvirt pkgs.treq pkgs.ldap3 + buildbot-full pkgs.buildbot-worker pkgs.pip buildbot_common + wokkel + ]; + }; + buildslist-plugin = pkgs.callPackage ./buildslist { + pythonPackages = python.pkgs; + buildslist_src = buildslist; + }; + in rec { + packages = { + buildslist = buildslist-plugin; + buildbot-full = buildbot-full; + buildbot_common = buildbot_common; + }; + defaultPackage = packages.buildbot-full; + legacyPackages = packages; + checks = packages; + }) // rec { + overlays = { + immae-buildbot = final: prev: { + immae-buildbot = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.immae-buildbot; + }; +} diff --git a/flakes/private/buildbot/test_project/__init__.py b/flakes/private/buildbot/test_project/__init__.py new file mode 100644 index 0000000..d5893fd --- /dev/null +++ b/flakes/private/buildbot/test_project/__init__.py @@ -0,0 +1,121 @@ +from buildbot.plugins import * +from buildbot_common.build_helpers import * +import buildbot_common.libvirt as ilibvirt +import os +from buildbot.util import bytes2unicode +import json + +__all__ = [ "configure", "E" ] + +class E(): + PROJECT = "test" + BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) + SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) + PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"] + WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET) + RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) + RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) + GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git" + SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" + LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH + XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") + + # master.cfg + SECRETS_FILE = os.getcwd() + "/secrets" + LDAP_URL = "ldaps://ldap.immae.eu:636" + LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" + LDAP_BASE = "dc=immae,dc=eu" + LDAP_PATTERN = "(uid=%(username)s)" + LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" + TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary" + TITLE = "Test project" + +class CustomBase(webhooks.base): + def getChanges(self, request): + try: + content = request.content.read() + args = json.loads(bytes2unicode(content)) + except Exception as e: + raise ValueError("Error loading JSON: " + str(e)) + + args.setdefault("comments", "") + args.setdefault("repository", "") + args.setdefault("author", args.get("who", "unknown")) + + if args["category"] == "deploy_webhook": + args = { + "category": "deploy_webhook", + "comments": "", + "repository": "", + "author": "unknown", + "project": "TestProject", + "properties": { + "environment": args.get("environment", "integration"), + "build": "test_{}.tar.gz".format(args.get("branch", "master")) + } + } + + return ([args], None) + +def configure(c): + c["buildbotURL"] = E.BUILDBOT_URL + c["www"]["port"] = E.SOCKET + + c["www"]["change_hook_dialects"]["base"] = { "custom_class": CustomBase } + + configure_build(c) + configure_deploy(c) + + configure_apprise_push(c, E.SECRETS_FILE, all_builder_names(c)) + configure_xmpp_push(c, E.SECRETS_FILE, all_builder_names(c), E.XMPP_RECIPIENTS) + +def configure_build(c): + builder_name = "TestProject_build" + worker_name = "test-build" + c['schedulers'].append(force_scheduler("force_test", [builder_name])) + c['schedulers'].append(git_hook_scheduler("TestProject", [builder_name])) + c['workers'].append(libvirt_worker(worker_name)) + c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=build_factory())) + +def configure_deploy(c): + builder_name = "TestProject_deploy" + worker_name = "test-deploy" + c['workers'].append(libvirt_worker(worker_name)) + c['schedulers'].append(deploy_hook_scheduler("TestProject", [builder_name])) + c['schedulers'].append(deploy_scheduler("deploy_test", [builder_name])) + c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=deploy_factory())) + +def libvirt_worker(name): + return ilibvirt.LibVirtWorker(name, + open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(), + ilibvirt.Connection(E.LIBVIRT_URL), + E.WORKER_HOST) + +def build_factory(): + package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch) + package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch) + package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch) + + factory = util.BuildFactory() + factory.addStep(steps.Git(logEnviron=False, + repourl=E.GIT_URL, mode="full", method="fresh")) + factory.addStep(steps.ShellCommand(name="env", + logEnviron=False, command=["env"])) + factory.addStep(steps.ShellCommand(name="pwd", + logEnviron=False, command=["pwd"])) + factory.addStep(steps.ShellCommand(name="true", + logEnviron=False, command=["true"])) + factory.addStep(steps.ShellCommand(name="echo", + logEnviron=False, command=["echo", package])) + factory.addSteps(package_and_upload(package, package_dest, package_url)) + + return factory + +def deploy_factory(): + package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH)) + + factory = util.BuildFactory() + factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) + factory.addStep(steps.SetProperties(properties=compute_build_infos("test", E.RELEASE_PATH))) + factory.addStep(steps.MasterShellCommand(command=deploy_ssh_command(E.SSH_KEY_PATH, {}))) + return factory diff --git a/flakes/private/chatons/flake.lock b/flakes/private/chatons/flake.lock new file mode 100644 index 0000000..39ed484 --- /dev/null +++ b/flakes/private/chatons/flake.lock @@ -0,0 +1,23 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/chatons/flake.nix b/flakes/private/chatons/flake.nix new file mode 100644 index 0000000..70fb02d --- /dev/null +++ b/flakes/private/chatons/flake.nix @@ -0,0 +1,142 @@ +{ + inputs.environment.url = "path:../environment"; + outputs = { self, environment }: { + nixosModule = self.nixosModules.chatons; + nixosModules.chatons = { config, lib, pkgs, nodes, ... }: + let + concatValue = value: if lib.isList value then builtins.concatStringsSep "," value else builtins.toString value; + toProperties = properties: builtins.concatStringsSep "\n" ( + lib.collect + (p: !(lib.isAttrs p)) + (lib.mapAttrsRecursive + (path: value: builtins.concatStringsSep "." (builtins.filter (f: f != "") path) + " = " + (concatValue value)) + properties)); + before = name: { + "${name}" = { + status.level = "OK"; + status.description = "OK"; + install.type = "PACKAGE"; + registration.load = "OPEN"; + }; + host = { + name = "Hetzner"; + server.type = "PHYSICAL"; + provider.type = "HOSTEDSERVER"; + server.distribution = "NixOS"; + country.name = "Allemagne"; + country.code = "DE"; + }; + }; + after = name: { + file = { + class = name; + protocol = "ChatonsInfos-0.5"; + generator = "Nix derivation"; + }; + "${name}" = { + legal.url = "https://www.immae.eu/mentions.html"; + guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/"; + contact.url = "https://www.immae.eu/contacts_fr.html"; + contact.email = config.myEnv.tools.contact; + startdate = "01/01/2019"; + }; + }; + organization = { + file = { + class = "organization"; + protocol = "ChatonsInfos-0.5"; + datetime = "2021-01-11T22:23:00"; + generator = "Nix derivation"; + }; + organization = { + country.name = "France"; + country.code = "FR"; + name = "ImmaeEu"; + description = "ImmaeEu est un CHATONS des Alpes-Maritimes"; + website = "https://www.immae.eu"; + logo = "https://assets.immae.eu/logo.jpg"; + socialnetworks = { + diaspora = "https://diaspora.immae.eu/people/1a185f29cc76cb35"; + facebook = "https://www.facebook.com/ismael.bouya"; + mastodon = "https://mastodon.immae.eu/@immae"; + peertube = "https://peertube.immae.eu/accounts/immae/"; + twitter = "https://twitter.com/_immae"; + }; + chatrooms = { + xmpp = "ismael@immae.fr"; + irc = "immae@freenode"; + matrix = "#support:immae.eu"; + }; + contact.url = "https://www.immae.eu/contacts_fr.html"; + contact.email = config.myEnv.tools.contact; + legal.url = "https://www.immae.eu/mentions.html"; + guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/"; + guide.user = "https://www.immae.eu/docs"; + status.level = "ACTIVE"; + status.description = "En activité"; + startdate = "01/01/2019"; + type = "COMPANY"; + owner = { + logo = "https://assets.immae.eu/logo.jpg"; + name = "Ismaël Bouya"; + website = "https://www.immae.eu"; + }; + memberof.chatons = { + startdate = "01/07/2019"; + status.level = "ACTIVE"; + status.description = "Participe au collectif"; + }; + }; + }; + subname = v: if v.published or true then "subs" else "subs-hidden"; + toOrganizationProperties = name: pkgs.writeText name (toProperties organization + "\n" + ( + builtins.concatStringsSep "\n" (lib.mapAttrsToList + (n: v: "${subname v}.${n} = https://www.immae.eu/.well-known/chatonsinfos/service-${n}.properties") mergedServices + )) + "\n" + ( + builtins.concatStringsSep "\n" (lib.mapAttrsToList + (n: v: "subs.hosting-${n} = https://www.immae.eu/.well-known/chatonsinfos/hosting-${n}.properties") mergedHostings + ))); + toHostingProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "hosting") (lib.recursiveUpdate content (after "hosting")))); + toServiceProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "service") (lib.recursiveUpdate content (after "service")))); + + cfg = config.myServices.chatonsProperties; + mergedServices = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.services else {}) nodes); + mergedHostings = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.hostings else {}) nodes); + in { + imports = [ + environment.nixosModule + ]; + options.myServices.chatonsProperties.organization = lib.mkOption { + type = lib.types.attrsOf lib.types.unspecified; + default = {}; + description = '' + nested attrs of strings or arrays of strings + ''; + }; + options.myServices.chatonsProperties.services = lib.mkOption { + type = lib.types.attrsOf lib.types.unspecified; + default = {}; + description = '' + nested attrs of strings or arrays of strings + ''; + }; + options.myServices.chatonsProperties.hostings = lib.mkOption { + type = lib.types.attrsOf lib.types.unspecified; + default = {}; + description = '' + nested attrs of strings or arrays of strings + ''; + }; + options.myServices.chatonsProperties.propertiesPath = lib.mkOption { + type = lib.types.package; + readOnly = true; + default = pkgs.runCommand "chatons" {} '' + mkdir -p $out + cp ${toOrganizationProperties "immae-eu"} $out/immae-eu.properties + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toHostingProperties n c} $out/hosting-${n}.properties") mergedHostings)} + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toServiceProperties n c} $out/service-${n}.properties") mergedServices)} + ''; + }; + }; + }; +} diff --git a/flakes/private/environment-dummy/flake.nix b/flakes/private/environment-dummy/flake.nix new file mode 100644 index 0000000..5ebc27f --- /dev/null +++ b/flakes/private/environment-dummy/flake.nix @@ -0,0 +1,18 @@ +{ + description = '' + A dummy flake that contains a compatible structure to the one stored at + git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets + It is used as default value in "public" configurations + ''; + outputs = { self }: { + vars-file = ./vars.yml; + ldap-conf = ./ldap.conf; + environment-file = ./environment.nix; + nixosModule = self.nixosModules.my-environment; + nixosModules.my-environment = { ... }: { + config.myEnv = import self.environment-file; + }; + nixosModules.users-config-eldiron = { ... }: {}; + }; +} + diff --git a/flakes/private/environment-dummy/ldap.conf b/flakes/private/environment-dummy/ldap.conf new file mode 100644 index 0000000..064a4be --- /dev/null +++ b/flakes/private/environment-dummy/ldap.conf @@ -0,0 +1,13 @@ +# Indices to maintain +index objectClass eq +index uid pres,eq +index mail pres,sub,eq +index cn pres,sub,eq +index sn pres,sub,eq +index dc eq +index krbPrincipalName eq +index member eq +index memberOf eq + +access to * + by * none diff --git a/flakes/private/environment-dummy/vars.yml b/flakes/private/environment-dummy/vars.yml new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/flakes/private/environment-dummy/vars.yml @@ -0,0 +1 @@ +{} diff --git a/flakes/private/environment/flake.nix b/flakes/private/environment/flake.nix new file mode 100644 index 0000000..15c079a --- /dev/null +++ b/flakes/private/environment/flake.nix @@ -0,0 +1,1135 @@ +{ + outputs = { self }: { + nixosModule = self.nixosModules.environment; + nixosModules.environment = { config, lib, name, ... }: + with lib; + with types; + with lists; + let + ldapOptions = { + base = mkOption { description = "Base of the LDAP tree"; type = str; }; + host = mkOption { description = "Host to access LDAP"; type = str; }; + root_dn = mkOption { description = "DN of the root user"; type = str; }; + root_pw = mkOption { description = "Hashed password of the root user"; type = str; }; + replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; }; + replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; }; + }; + mkLdapOptions = name: more: mkOption { + description = "${name} LDAP configuration"; + type = submodule { + options = ldapOptions // { + dn = mkOption { description = "DN of the ${name} user"; type = str; }; + password = mkOption { description = "password of the ${name} user"; type = str; }; + filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; }; + } // more; + }; + }; + mysqlOptions = { + host = mkOption { description = "Host to access Mysql"; type = str; }; + remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; }; + port = mkOption { description = "Port to access Mysql"; type = int; }; + socket = mkOption { description = "Socket to access Mysql"; type = path; }; + systemUsers = mkOption { + description = "Attrs of user-passwords allowed to access mysql"; + type = attrsOf str; + }; + pam = mkOption { + description = "PAM configuration for mysql"; + type = submodule { + options = { + dn = mkOption { description = "DN to connect as to check users"; type = str; }; + password = mkOption { description = "DN password to connect as to check users"; type = str; }; + filter = mkOption { description = "filter to match users"; type = str; }; + }; + }; + }; + }; + mkMysqlOptions = name: more: mkOption { + description = "${name} mysql configuration"; + type = submodule { + options = mysqlOptions // { + database = mkOption { description = "${name} database"; type = str; }; + user = mkOption { description = "${name} user"; type = str; }; + password = mkOption { description = "mysql password of the ${name} user"; type = str; }; + } // more; + }; + }; + psqlOptions = { + host = mkOption { description = "Host to access Postgresql"; type = str; }; + port = mkOption { description = "Port to access Postgresql"; type = str; }; + socket = mkOption { description = "Socket to access Postgresql"; type = path; }; + pam = mkOption { + description = "PAM configuration for psql"; + type = submodule { + options = { + dn = mkOption { description = "DN to connect as to check users"; type = str; }; + password = mkOption { description = "DN password to connect as to check users"; type = str; }; + filter = mkOption { description = "filter to match users"; type = str; }; + }; + }; + }; + }; + mkPsqlOptions = name: mkOption { + description = "${name} psql configuration"; + type = submodule { + options = psqlOptions // { + database = mkOption { description = "${name} database"; type = str; }; + schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; }; + user = mkOption { description = "${name} user"; type = str; }; + password = mkOption { description = "psql password of the ${name} user"; type = str; }; + }; + }; + }; + redisOptions = { + host = mkOption { description = "Host to access Redis"; type = str; }; + port = mkOption { description = "Port to access Redis"; type = str; }; + socket = mkOption { description = "Socket to access Redis"; type = path; }; + dbs = mkOption { + description = "Attrs of db number. Each number should be unique to avoid collision!"; + type = attrsOf str; + }; + spiped_key = mkOption { + type = str; + description = '' + Key to use with spiped to make a secure channel to replication + ''; + }; + predixy = mkOption { + description = "Predixy configuration. Unused yet"; + type = submodule { + options = { + read = mkOption { type = str; description = "Read password"; }; + }; + }; + }; + }; + mkRedisOptions = name: mkOption { + description = "${name} redis configuration"; + type = submodule { + options = redisOptions // { + db = mkOption { description = "${name} database"; type = str; }; + }; + }; + }; + smtpOptions = { + host = mkOption { description = "Host to access SMTP"; type = str; }; + port = mkOption { description = "Port to access SMTP"; type = str; }; + }; + mkSmtpOptions = name: mkOption { + description = "${name} smtp configuration"; + type = submodule { + options = smtpOptions // { + email = mkOption { description = "${name} email"; type = str; }; + password = mkOption { description = "SMTP password of the ${name} user"; type = str; }; + }; + }; + }; + hostEnv = submodule { + options = { + fqdn = mkOption { + description = "Host FQDN"; + type = str; + }; + hostKey = mkOption { + type = nullOr str; + default = null; + description = '' + ssh host key + ''; + }; + isVm = mkEnableOption "The host is a vm"; + users = mkOption { + type = unspecified; + default = pkgs: []; + description = '' + Sublist of users from realUsers. Function that takes pkgs as + argument and gives an array as a result + ''; + }; + emails = mkOption { + default = []; + description = "List of e-mails that the server can be a sender of"; + type = listOf str; + }; + ldap = mkOption { + description = '' + LDAP credentials for the host + ''; + type = submodule { + options = { + password = mkOption { type = str; description = "Password for the LDAP connection"; }; + dn = mkOption { type = str; description = "DN for the LDAP connection"; }; + }; + }; + }; + mx = mkOption { + description = "subdomain and priority for MX server"; + default = { enable = false; }; + type = submodule { + options = { + enable = mkEnableOption "Enable MX"; + subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; }; + priority = mkOption { type = nullOr int; description = "Priority"; }; + }; + }; + }; + ips = mkOption { + description = '' + attrs of ip4/ip6 grouped by section + ''; + type = attrsOf (submodule { + options = { + alias = mkOption { + type = nullOr str; + default = null; + description = '' + alias to use in DNS for that group + ''; + }; + ip4 = mkOption { + type = listOf str; + default = []; + description = '' + ip4 addresses of the host + ''; + }; + ip6 = mkOption { + type = listOf str; + default = []; + description = '' + ip6 addresses of the host + ''; + }; + }; + }); + }; + }; + }; + in + { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + + options.myEnv = { + servers = mkOption { + description = '' + Attrs of servers information in the cluster (not necessarily handled by nixops) + ''; + default = {}; + type = attrsOf hostEnv; + }; + hetznerCloud = mkOption { + description = '' + Hetzner Cloud credential information + ''; + type = submodule { + options = { + authToken = mkOption { + type = str; + description = '' + The API auth token. + ''; + }; + }; + }; + }; + hetzner = mkOption { + description = '' + Hetzner credential information + ''; + type = submodule { + options = { + user = mkOption { type = str; description = "User"; }; + pass = mkOption { type = str; description = "Password"; }; + }; + }; + }; + sshd = mkOption { + description = '' + sshd service credential information + ''; + type = submodule { + options = { + rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; }; + ldap = mkOption { + description = '' + LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn + ''; + type = submodule { + options = { + password = mkOption { description = "Password"; type = str; }; + }; + }; + }; + psql = mkOption { + description = '' + PSQL credentials for immae_auth_read + ''; + type = submodule { + options = { + password = mkOption { description = "Password"; type = str; }; + }; + }; + }; + }; + }; + }; + ports = mkOption { + description = '' + non-standard reserved ports. Must be unique! + ''; + type = attrsOf port; + default = {}; + apply = let + noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x)); + in + x: if isAttrs x && noDupl x then x else throw "Non unique values for ports"; + }; + httpd = mkOption { + description = '' + httpd service credential information + ''; + type = submodule { + options = { + ldap = mkOption { + description = '' + LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn + ''; + type = submodule { + options = { + password = mkOption { description = "Password"; type = str; }; + }; + }; + }; + }; + }; + }; + smtp = mkOption { + type = submodule { options = smtpOptions; }; + description = "SMTP configuration"; + }; + ldap = mkOption { + description = '' + LDAP server configuration + ''; + type = submodule { + options = ldapOptions; + }; + }; + databases = mkOption { + description = "Databases configuration"; + type = submodule { + options = { + mysql = mkOption { + type = submodule { options = mysqlOptions; }; + description = "Mysql configuration"; + }; + redis = mkOption { + type = submodule { options = redisOptions; }; + description = "Redis configuration"; + }; + postgresql = mkOption { + type = submodule { options = psqlOptions; }; + description = "Postgresql configuration"; + }; + }; + }; + }; + jabber = mkOption { + description = "Jabber configuration"; + type = submodule { + options = { + postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; }; + ldap = mkLdapOptions "Jabber" {}; + postgresql = mkPsqlOptions "Jabber"; + }; + }; + }; + realUsers = mkOption { + description = '' + Attrset of function taking pkgs as argument. + Real users settings, should provide a subattr of users.users. + with at least: name, (hashed)Password, shell + ''; + type = attrsOf unspecified; + }; + users = mkOption { + description = "System and regular users uid/gid"; + type = attrsOf (submodule { + options = { + uid = mkOption { + description = "user uid"; + type = int; + }; + gid = mkOption { + description = "user gid"; + type = int; + }; + }; + }); + }; + dns = mkOption { + description = "DNS configuration"; + type = submodule { + options = { + ns = mkOption { + description = "Attrs of NS servers group"; + example = { + foo = { + "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ]; + "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ]; + }; + }; + type = attrsOf (attrsOf (listOf str)); + }; + }; + }; + }; + backup = mkOption { + description = '' + Remote backup with duplicity + ''; + type = submodule { + options = { + password = mkOption { type = str; description = "Password for encrypting files"; }; + remotes = mkOption { + type = attrsOf (submodule { + options = { + remote = mkOption { + type = functionTo str; + example = literalExample '' + bucket: "s3://some_host/${bucket}"; + ''; + description = '' + Function. + Takes a bucket name as argument and returns a url + ''; + }; + accessKeyId = mkOption { type = str; description = "Remote access-key"; }; + secretAccessKey = mkOption { type = str; description = "Remote access secret"; }; + }; + }); + }; + }; + }; + }; + zrepl_backup = mkOption { + type = submodule { + options = { + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + mysql = mkMysqlOptions "Zrepl" {}; + certs = mkOption { + description = "Certificates"; + type = attrsOf (submodule { + options = { + key = mkOption { type = str; description = "Key"; }; + certificate = mkOption { type = str; description = "Certificate"; }; + }; + }); + }; + }; + }; + }; + rsync_backup = mkOption { + description ='' + Rsync backup configuration from controlled host + ''; + type = submodule { + options = { + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + profiles = mkOption { + description = "Attrs of profiles to backup"; + default = {}; + type = attrsOf (submodule { + options = { + keep = mkOption { type = int; description = "Number of backups to keep"; }; + check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; }; + login = mkOption { type = str; description = "Login to connect to host"; }; + port = mkOption { type = str; default = "22"; description = "Port to connect to host"; }; + host = mkOption { type = str; description = "Host to connect to"; }; + host_key = mkOption { type = str; description = "Host key"; }; + host_key_type = mkOption { type = str; description = "Host key type"; }; + parts = mkOption { + description = "Parts to backup for this host"; + type = attrsOf (submodule { + options = { + remote_folder = mkOption { type = path; description = "Remote folder to backup";}; + exclude_from = mkOption { + type = listOf path; + default = []; + description = "List of folders/files to exclude from the backup"; + }; + files_from = mkOption { + type = listOf path; + default = []; + description = "List of folders/files to backup in the base folder"; + }; + args = mkOption { + type = nullOr str; + default = null; + description = "Extra arguments to pass to rsync"; + }; + }; + }); + }; + }; + }); + }; + }; + }; + }; + monitoring = mkOption { + description = "Monitoring configuration"; + type = submodule { + options = { + status_url = mkOption { type = str; description = "URL to push status to"; }; + status_token = mkOption { type = str; description = "Token for the status url"; }; + http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; }; + email = mkOption { type = str; description = "Admin E-mail"; }; + ssh_public_key = mkOption { type = str; description = "SSH public key"; }; + ssh_secret_key = mkOption { type = str; description = "SSH secret key"; }; + imap_login = mkOption { type = str; description = "IMAP login"; }; + imap_password = mkOption { type = str; description = "IMAP password"; }; + eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; }; + ovh_sms = mkOption { + description = "OVH credentials for sms script"; + type = submodule { + options = { + endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; }; + application_key = mkOption { type = str; description = "Application key"; }; + application_secret = mkOption { type = str; description = "Application secret"; }; + consumer_key = mkOption { type = str; description = "Consumer key"; }; + account = mkOption { type = str; description = "Account"; }; + }; + }; + }; + nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; }; + apprise_urls = mkOption { type = str; description = "Apprise space-separated urls to push status update"; }; + netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; }; + netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; }; + immae_contact = mkOption { type = str; description = "Immae Contact e-mail"; }; + email_check = mkOption { + description = "Emails services to check"; + type = attrsOf (submodule { + options = { + local = mkOption { type = bool; default = false; description = "Use local configuration"; }; + port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; }; + login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; }; + targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; }; + mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; }; + mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; }; + }; + }); + }; + }; + }; + }; + mpd = mkOption { + description = "MPD configuration"; + type = submodule { + options = { + folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; }; + password = mkOption { type = str; description = "Password to connect to the MPD instance"; }; + host = mkOption { type = str; description = "Host to connect to the MPD instance"; }; + port = mkOption { type = str; description = "Port to connect to the MPD instance"; }; + }; + }; + }; + ftp = mkOption { + description = "FTP configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "FTP" { + proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; }; + pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; }; + }; + }; + }; + }; + vpn = mkOption { + description = "VPN configuration"; + type = attrsOf (submodule { + options = { + prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; }; + privateKey = mkOption { type = str; description = "Private key for the host"; }; + publicKey = mkOption { type = str; description = "Public key for the host"; }; + }; + }); + }; + mail = mkOption { + description = "Mail configuration"; + type = submodule { + options = { + dmarc = mkOption { + description = "DMARC configuration"; + type = submodule { + options = { + ignore_hosts = mkOption { + type = lines; + description = '' + Hosts to ignore when checking for dmarc + ''; + }; + }; + }; + }; + dkim = mkOption { + description = "DKIM configuration"; + type = attrsOf (submodule { + options = { + public = mkOption { + type = attrsOf str; + example = literalExample '' + { + v = "DKIM1"; + k = "rsa"; + p = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB"; + } + ''; + description = "Public entry to put in DNS TXT field"; + }; + private = mkOption { type = nullOr str; default = null; description = "Private key"; }; + }; + }); + }; + postfix = mkOption { + description = "Postfix configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "Postfix" { + password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; }; + }; + admins = mkOption { + description = '' + List of admins meant to receive common aliases + ''; + type = listOf str; + }; + common_aliases = mkOption { + description = '' + List of aliases common to all hosts, to forward to admins + ''; + type = listOf str; + }; + other_aliases = mkOption { + description = '' + Other list of aliases, to forward to admins + ''; + type = listOf str; + }; + }; + }; + }; + dovecot = mkOption { + description = "Dovecot configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Dovecot" { + pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; }; + user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; }; + iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; }; + iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; }; + postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; }; + }; + }; + }; + }; + rspamd = mkOption { + description = "rspamd configuration"; + type = submodule { + options = { + redis = mkRedisOptions "Redis"; + read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; }; + write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; }; + read_password = mkOption { + type = str; + description = "Read password for rspamd. Unused"; + apply = x: ""; + }; + write_password = mkOption { + type = str; + description = "Write password for rspamd. Unused"; + apply = x: ""; + }; + }; + }; + }; + sympa = mkOption { + description = "Sympa configuration"; + type = submodule { + options = { + listmasters = mkOption { + type = listOf str; + description = "Listmasters"; + }; + postgresql = mkPsqlOptions "Sympa"; + data_sources = mkOption { + type = attrsOf str; + default = {}; + description = "Data sources to make available to sympa"; + }; + scenari = mkOption { + type = attrsOf str; + default = {}; + description = "Scenari to make available to sympa"; + }; + }; + }; + }; + }; + }; + }; + coturn = mkOption { + description = "Coturn configuration"; + type = submodule { + options = { + auth_access_key = mkOption { type = str; description = "key to access coturn"; }; + }; + }; + }; + buildbot = mkOption { + description = "Buildbot configuration"; + type = submodule { + options = { + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + workerPassword = mkOption { description = "Buildbot worker password"; type = str; }; + user = mkOption { + description = "Buildbot user"; + type = submodule { + options = { + uid = mkOption { + description = "user uid"; + type = int; + }; + gid = mkOption { + description = "user gid"; + type = int; + }; + }; + }; + }; + ldap = mkOption { + description = "Ldap configuration for buildbot"; + type = submodule { + options = { + password = mkOption { type = str; description = "Buildbot password"; }; + }; + }; + }; + projects = mkOption { + description = "Projects to make a buildbot for"; + type = attrsOf (submodule { + options = { + name = mkOption { type = str; description = "Project name"; }; + src = mkOption { type = path; description = "source of the project configuration"; }; + packages = mkOption { + type = listOf package; + example = literalExample '' + [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ]; + ''; + description = '' + Builds packages list to make available to buildbot project. + ''; + }; + pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; }; + workerPort = mkOption { type = port; description = "Port for the worker"; }; + secrets = mkOption { + type = attrsOf lines; + description = "Secrets for the project to dump as files"; + }; + secretsDeps = mkOption { + type = listOf package; + default = []; + description = "Dependencies of file that will land in secrets"; + }; + environment = mkOption { + type = attrsOf str; + description = '' + Environment variables for the project. + BUILDBOT_ is prefixed to the variable names + ''; + }; + activationScript = mkOption { + type = lines; + description = '' + Activation script to run during deployment + ''; + }; + webhookTokens = mkOption { + type = nullOr (listOf str); + default = null; + description = '' + List of tokens allowed to push to project’s change_hook/base endpoint + ''; + }; + }; + }); + }; + }; + }; + }; + tools = mkOption { + description = "Tools configurations"; + type = submodule { + options = { + contact = mkOption { type = str; description = "Contact e-mail address"; }; + assets = mkOption { + default = {}; + type = attrsOf (submodule { + options = { + assetType = mkOption { type = enum ["tgz" "url" "googleFont"]; default = "url"; description = "Type of asset"; }; + tgzRemoveComponents = mkOption { type = int; default = 0; description = "Remove components when extracting"; }; + url = mkOption { type = str; description = "URL to fetch"; }; + sha256 = mkOption { type = str; description = "Hash of the url"; }; + }; + }); + description = "Assets to provide on assets.immae.eu"; + }; + davical = mkOption { + description = "Davical configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Davical"; + ldap = mkLdapOptions "Davical" {}; + }; + }; + }; + diaspora = mkOption { + description = "Diaspora configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Diaspora"; + redis = mkRedisOptions "Diaspora"; + ldap = mkLdapOptions "Diaspora" {}; + secret_token = mkOption { type = str; description = "Secret token"; }; + }; + }; + }; + dmarc_reports = mkOption { + description = "DMARC reports configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "DMARC" {}; + anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; }; + }; + }; + }; + etherpad-lite = mkOption { + description = "Etherpad configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Etherpad"; + ldap = mkLdapOptions "Etherpad" { + group_filter = mkOption { type = str; description = "Filter for groups"; }; + }; + adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; }; + session_key = mkOption { type = str; description = "Session key"; }; + api_key = mkOption { type = str; description = "API key"; }; + }; + }; + }; + gitolite = mkOption { + description = "Gitolite configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Gitolite" {}; + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + }; + }; + }; + landing = mkOption { + description = "Landing configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Landing"; + }; + }; + }; + kanboard = mkOption { + description = "Kanboard configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Kanboard"; + ldap = mkLdapOptions "Kanboard" { + admin_dn = mkOption { type = str; description = "Admin DN"; }; + }; + }; + }; + }; + mantisbt = mkOption { + description = "Mantisbt configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Mantisbt"; + ldap = mkLdapOptions "Mantisbt" {}; + master_salt = mkOption { type = str; description = "Master salt for password hash"; }; + }; + }; + }; + mastodon = mkOption { + description = "Mastodon configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Mastodon"; + redis = mkRedisOptions "Mastodon"; + ldap = mkLdapOptions "Mastodon" {}; + paperclip_secret = mkOption { type = str; description = "Paperclip secret"; }; + otp_secret = mkOption { type = str; description = "OTP secret"; }; + secret_key_base = mkOption { type = str; description = "Secret key base"; }; + vapid = mkOption { + description = "vapid key"; + type = submodule { + options = { + private = mkOption { type = str; description = "Private key"; }; + public = mkOption { type = str; description = "Public key"; }; + }; + }; + }; + }; + }; + }; + mediagoblin = mkOption { + description = "Mediagoblin configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Mediagoblin"; + redis = mkRedisOptions "Mediagoblin"; + ldap = mkLdapOptions "Mediagoblin" {}; + }; + }; + }; + nextcloud = mkOption { + description = "Nextcloud configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Nextcloud"; + redis = mkRedisOptions "Nextcloud"; + password_salt = mkOption { type = str; description = "Password salt"; }; + instance_id = mkOption { type = str; description = "Instance ID"; }; + secret = mkOption { type = str; description = "App secret"; }; + }; + }; + }; + peertube = mkOption { + description = "Peertube configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + postgresql = mkPsqlOptions "Peertube"; + redis = mkRedisOptions "Peertube"; + ldap = mkLdapOptions "Peertube" {}; + }; + }; + }; + phpldapadmin = mkOption { + description = "phpLdapAdmin configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "phpldapadmin" {}; + }; + }; + }; + rompr = mkOption { + description = "Rompr configuration"; + type = submodule { + options = { + mpd = mkOption { + description = "MPD configuration"; + type = submodule { + options = { + host = mkOption { type = str; description = "Host for MPD"; }; + port = mkOption { type = port; description = "Port to access MPD host"; }; + }; + }; + }; + }; + }; + }; + roundcubemail = mkOption { + description = "Roundcubemail configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "TT-RSS"; + secret = mkOption { type = str; description = "Secret"; }; + }; + }; + }; + shaarli = mkOption { + description = "Shaarli configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Shaarli" {}; + }; + }; + }; + status_engine = mkOption { + description = "Status Engine configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "StatusEngine" {}; + ldap = mkLdapOptions "StatusEngine" {}; + }; + }; + }; + task = mkOption { + description = "Taskwarrior configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Taskwarrior" {}; + taskwarrior-web = mkOption { + description = "taskwarrior-web profiles"; + default = {}; + type = attrsOf (submodule { + options = { + uid = mkOption { + type = listOf str; + description = "List of ldap uids having access to this profile"; + }; + org = mkOption { type = str; description = "Taskd organisation"; }; + key = mkOption { type = str; description = "Taskd key"; }; + date = mkOption { type = str; description = "Preferred date format"; }; + }; + }); + }; + }; + }; + }; + ttrss = mkOption { + description = "TT-RSS configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "TT-RSS"; + ldap = mkLdapOptions "TT-RSS" {}; + }; + }; + }; + wallabag = mkOption { + description = "Wallabag configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Wallabag"; + ldap = mkLdapOptions "Wallabag" { + admin_filter = mkOption { type = str; description = "Admin users filter"; }; + }; + redis = mkRedisOptions "Wallabag"; + secret = mkOption { type = str; description = "App secret"; }; + }; + }; + }; + webhooks = mkOption { + type = attrsOf str; + description = "Mapping 'name'.php => script for webhooks"; + }; + csp_reports = mkOption { + description = "CSP report configuration"; + type = submodule { + options = { + report_uri = mkOption { type = str; description = "URI to report CSP violations to"; }; + policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; }; + }; + }; + }; + commento = mkOption { + description = "Commento configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + postgresql = mkPsqlOptions "Commento"; + smtp = mkSmtpOptions "Commento"; + }; + }; + }; + cryptpad = mkOption { + description = "Cryptpad configuration"; + type = submodule { + options = { + email = mkOption { type = str; description = "Admin e-mail"; }; + admins = mkOption { type = listOf str; description = "Instance admin public keys"; }; + port = mkOption { type = port; description = "Port to listen to"; }; + }; + }; + }; + ympd = mkOption { + description = "Ympd configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + mpd = mkOption { + description = "MPD configuration"; + type = submodule { + options = { + password = mkOption { type = str; description = "Password to access MPD host"; }; + host = mkOption { type = str; description = "Host for MPD"; }; + port = mkOption { type = port; description = "Port to access MPD host"; }; + }; + }; + }; + }; + }; + }; + umami = mkOption { + description = "Umami configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + postgresql = mkPsqlOptions "Umami"; + hashSalt = mkOption { type = str; description = "Hash salt"; }; + }; + }; + }; + yourls = mkOption { + description = "Yourls configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "Yourls" {}; + ldap = mkLdapOptions "Yourls" {}; + cookieKey = mkOption { type = str; description = "Cookie key"; }; + }; + }; + }; + }; + }; + }; + serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; }; + }; + options.hostEnv = mkOption { + readOnly = true; + type = hostEnv; + default = config.myEnv.servers."${name}"; + description = "Host environment"; + }; + }; + }; +} diff --git a/modules/private/mail/filter-rewrite-from.py b/flakes/private/mail-relay/filter-rewrite-from.py similarity index 100% rename from modules/private/mail/filter-rewrite-from.py rename to flakes/private/mail-relay/filter-rewrite-from.py diff --git a/flakes/private/mail-relay/flake.lock b/flakes/private/mail-relay/flake.lock new file mode 100644 index 0000000..bbb2011 --- /dev/null +++ b/flakes/private/mail-relay/flake.lock @@ -0,0 +1,36 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/mail-relay/flake.nix b/flakes/private/mail-relay/flake.nix new file mode 100644 index 0000000..639bd06 --- /dev/null +++ b/flakes/private/mail-relay/flake.nix @@ -0,0 +1,58 @@ +{ + inputs.environment.url = "path:../environment"; + inputs.secrets.url = "path:../../secrets"; + + outputs = { self, environment, secrets }: { + nixosModule = self.nixosModules.mail-relay; + nixosModules.mail-relay = { lib, pkgs, config, name, ... }: + { + imports = [ + environment.nixosModule + secrets.nixosModule + ]; + options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services"; + config = lib.mkIf config.myServices.mailRelay.enable { + secrets.keys."opensmtpd/creds" = { + user = "smtpd"; + group = "smtpd"; + permissions = "0400"; + text = '' + eldiron ${name}:${config.hostEnv.ldap.password} + ''; + }; + users.users.smtpd.extraGroups = [ "keys" ]; + services.opensmtpd = { + enable = true; + serverConfiguration = let + filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" { + buildInputs = [ pkgs.python38 ]; + } '' + cp ${./filter-rewrite-from.py} $out + patchShebangs $out + ''; + in '' + table creds \ + "${config.secrets.fullPaths."opensmtpd/creds"}" + # FIXME: filtering requires 6.6, uncomment following lines when + # upgrading + # filter "fixfrom" \ + # proc-exec "${filter-rewrite-from} ${name}@immae.eu" + # listen on socket filter "fixfrom" + action "relay-rewrite-from" relay \ + helo ${config.hostEnv.fqdn} \ + host smtp+tls://eldiron@eldiron.immae.eu:587 \ + auth \ + mail-from ${name}@immae.eu + action "relay" relay \ + helo ${config.hostEnv.fqdn} \ + host smtp+tls://eldiron@eldiron.immae.eu:587 \ + auth + match for any !mail-from "@immae.eu" action "relay-rewrite-from" + match for any mail-from "@immae.eu" action "relay" + ''; + }; + environment.systemPackages = [ config.services.opensmtpd.package ]; + }; + }; + }; +} diff --git a/flakes/private/milters/flake.lock b/flakes/private/milters/flake.lock new file mode 100644 index 0000000..1a0c138 --- /dev/null +++ b/flakes/private/milters/flake.lock @@ -0,0 +1,186 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/milters/flake.nix b/flakes/private/milters/flake.nix new file mode 100644 index 0000000..c4de5b6 --- /dev/null +++ b/flakes/private/milters/flake.nix @@ -0,0 +1,106 @@ +{ + inputs.secrets.url = "path:../../secrets"; + inputs.environment.url = "path:../environment"; + inputs.files-watcher.url = "path:../../files-watcher"; + inputs.opendmarc.url = "path:../../opendmarc"; + inputs.openarc.url = "path:../../openarc"; + outputs = { self, secrets, environment, opendmarc, openarc, files-watcher }: { + nixosModule = self.nixosModules.milters; + nixosModules.milters = { lib, pkgs, config, nodes, ... }: + { + imports = [ + secrets.nixosModule + environment.nixosModule + files-watcher.nixosModule + opendmarc.nixosModule + openarc.nixosModule + ]; + options.myServices.mail.milters.enable = lib.mkEnableOption "enable Mail milters"; + options.myServices.mail.milters.sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + opendkim = "/run/opendkim/opendkim.sock"; + opendmarc = config.services.opendmarc.socket; + openarc = config.services.openarc.socket; + }; + readOnly = true; + description = '' + milters sockets + ''; + }; + config = lib.mkIf config.myServices.mail.milters.enable { + secrets.keys = { + "opendkim" = { + isDir = true; + user = config.services.opendkim.user; + group = config.services.opendkim.group; + permissions = "0550"; + }; + "opendkim/eldiron.private" = { + user = config.services.opendkim.user; + group = config.services.opendkim.group; + permissions = "0400"; + text = config.myEnv.mail.dkim.eldiron.private; + }; + }; + users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ]; + services.opendkim = { + enable = true; + socket = "local:${config.myServices.mail.milters.sockets.opendkim}"; + domains = + let + getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies; + bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones; + domains' = lib.flatten (builtins.attrValues bydomain); + in + builtins.concatStringsSep "," domains'; + keyPath = config.secrets.fullPaths."opendkim"; + selector = "eldiron"; + configFile = pkgs.writeText "opendkim.conf" '' + SubDomains yes + UMask 002 + AlwaysAddARHeader yes + ''; + group = config.services.postfix.group; + }; + systemd.services.opendkim.serviceConfig.Slice = "mail.slice"; + systemd.services.opendkim.preStart = lib.mkBefore '' + # Skip the prestart script as keys are handled in secrets + exit 0 + ''; + services.filesWatcher.opendkim = { + restart = true; + paths = [ + config.secrets.fullPaths."opendkim/eldiron.private" + ]; + }; + + systemd.services.milter_verify_from = { + description = "Verify from milter"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Slice = "mail.slice"; + User = "postfix"; + Group = "postfix"; + ExecStart = let + pymilter = with pkgs.python38Packages; buildPythonPackage rec { + pname = "pymilter"; + version = "1.0.4"; + src = fetchPypi { + inherit pname version; + sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k"; + }; + doCheck = false; + buildInputs = [ pkgs.libmilter ]; + }; + python = pkgs.python38.withPackages (p: [ pymilter ]); + in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock"; + RuntimeDirectory = "milter_verify_from"; + }; + }; + }; + }; + }; +} diff --git a/modules/private/mail/verify_from.py b/flakes/private/milters/verify_from.py similarity index 100% rename from modules/private/mail/verify_from.py rename to flakes/private/milters/verify_from.py diff --git a/flakes/private/monitoring/flake.lock b/flakes/private/monitoring/flake.lock new file mode 100644 index 0000000..2e156fb --- /dev/null +++ b/flakes/private/monitoring/flake.lock @@ -0,0 +1,67 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "environment": "environment", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/monitoring/flake.nix b/flakes/private/monitoring/flake.nix new file mode 100644 index 0000000..b7c3997 --- /dev/null +++ b/flakes/private/monitoring/flake.nix @@ -0,0 +1,267 @@ +{ + inputs = { + environment.url = "path:../environment"; + secrets.url = "path:../../secrets"; + naemon.url = "path:../../naemon"; + nixpkgs-lib.url = "github:NixOS/nixpkgs?dir=lib"; + }; + outputs = { self, environment, nixpkgs-lib, secrets, naemon }: { + nagios-cli-config = ./nagios-cli.cfg; + lib = rec { + expandedObject = kind: object: objects: + if object ? "use" + then expandedObject kind objects.templates.${kind}.${object.use} objects // object + else object; + + objectsCommon = import ./objects_common.nix; + toObjects = import ./to_objects.nix { inherit (nixpkgs-lib) lib; }; + + toMasterPassiveObject = svcTemplate: freshnessThresholdMultiplier: objects: + { + service = with nixpkgs-lib.lib; map (s: + { + host_name = (expandedObject "service" s objects).host_name; + use = svcTemplate; + retry_interval = "1"; + freshness_threshold = let + fs = expandedObject "service" s objects; + in if builtins.isInt fs.check_interval + then builtins.ceil (freshnessThresholdMultiplier * 60 * fs.check_interval) + else fs.check_interval; + } + // filterAttrs (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_") s + // mapAttrs' + (n: nameValuePair (removePrefix "__passive_" n)) + (filterAttrs (k: _: hasPrefix "__passive_" k) s) + ) objects.service; + host = objects.host; + }; + + emailCheck = allCfg: host: hostFQDN: let + cfg = allCfg."${host}"; + reverseTargets = builtins.attrNames (nixpkgs-lib.lib.filterAttrs (k: v: builtins.elem host v.targets) allCfg); + to_email = cfg': host': + let sep = if nixpkgs-lib.lib.hasInfix "+" cfg'.mail_address then "_" else "+"; + in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}"; + mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets); + mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets); + command = if cfg.local + then + [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ] + else + [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ]; + in + { + service_description = "${hostFQDN} email service is active"; + use = "mail-service"; + host_name = hostFQDN; + servicegroups = "webstatus-email"; + check_command = command; + }; + }; + nixosModule = self.nixosModules.monitoring; + nixosModules.monitoring = { config, pkgs, lib, ... }: + let + cfg = config.myServices.monitoring; + allPluginsConfig = import ./myplugins.nix { + inherit pkgs lib config; + sudo = "/run/wrappers/bin/sudo"; + }; + mypluginsConfig = lib.mapAttrs (n: v: + if builtins.isFunction v + then v (cfg.pluginsArgs."${n}" or {}) + else v + ) (lib.getAttrs cfg.activatedPlugins allPluginsConfig); + myplugins = let + mypluginsChunk = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig); + in pkgs.runCommand "buildplugins" { + buildInputs = [ pkgs.makeWrapper pkgs.perl ]; + } '' + mkdir $out + ${mypluginsChunk} + ''; + objectsModule = with lib.types; submodule { + options = { + command = lib.mkOption { + type = attrsOf str; + default = {}; + description = "Command definitions"; + }; + + host = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Host definitions"; + }; + hostgroup = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Host group definitions"; + }; + hostdependency = lib.mkOption { + type = listOf (attrsOf str); + default = []; + description = "Host dependency definitions"; + }; + + service = lib.mkOption { + type = listOf (attrsOf (oneOf [ str (listOf str) int ])); + # str -> string + # listOf str -> list to be concatenated with "!" + # int -> toString + default = []; + description = "Service definitions"; + }; + servicegroup = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Service group definitions"; + }; + servicedependency = lib.mkOption { + type = listOf (attrsOf str); + default = []; + description = "Service dependency definitions"; + }; + + contact = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Contact definitions"; + }; + contactgroup = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Contact group definitions"; + }; + + timeperiod = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Time period definitions"; + }; + + templates = lib.mkOption { + description = "Template definitions"; + default = {}; + type = submodule { + options = { + service = lib.mkOption { type = attrsOf (attrsOf (either str int)); default = {}; }; + contact = lib.mkOption { type = attrsOf (attrsOf str); default = {}; }; + host = lib.mkOption { type = attrsOf (attrsOf str); default = {}; }; + }; + }; + }; + }; + }; + in + { + options = { + myServices.monitoring = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to enable monitoring. + ''; + }; + master = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + This instance is the master instance + ''; + }; + pluginsArgs = lib.mkOption { + default = {}; + description = "Arguments to pass to the naemon plugin configuration"; + type = lib.types.attrsOf (lib.types.attrsOf lib.types.unspecified); + }; + activatedPlugins = lib.mkOption { + default = []; + description = "List of naemon plugins to activate"; + type = lib.types.listOf (lib.types.enum (builtins.attrNames allPluginsConfig)); + }; + fromMasterActivatedPlugins = lib.mkOption { + default = []; + description = "List of naemon plugins to activate from master"; + type = lib.types.listOf (lib.types.str); + }; + resources = lib.mkOption { + default = {}; + description = "List of additionnal resources elements"; + type = lib.types.attrsOf (lib.types.str); + }; + objects = lib.mkOption { + default = {}; + description = "Object definitions"; + type = objectsModule; + }; + fromMasterObjects = lib.mkOption { + default = {}; + description = "Object definitions of checks that should be executed from master"; + type = objectsModule; + }; + }; + }; + + imports = [ + environment.nixosModule + secrets.nixosModule + naemon.nixosModule + ]; + config = lib.mkIf cfg.enable { + myServices.monitoring.objects.command = + lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig); + + security.sudo.extraRules = let + pluginsSudo = lib.lists.remove null (lib.mapAttrsToList (k: v: + if (v ? sudo) + then ({ users = [ "naemon" ]; } // (v.sudo myplugins)) + else null) mypluginsConfig); + in pluginsSudo; + + environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios"; + environment.systemPackages = let + nagios-cli = pkgs.writeScriptBin "nagios-cli" '' + #!${pkgs.stdenv.shell} + sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${self.nagios-cli-config} + ''; + in [ + pkgs.cnagios + nagios-cli + ]; + secrets.keys = { + "naemon/id_rsa" = { + user = "naemon"; + group = "naemon"; + permissions = "0400"; + text = config.myEnv.monitoring.ssh_secret_key; + }; + "naemon/resources.cfg".keyDependencies = [ myplugins ]; + }; + services.naemon = { + enable = true; + extraConfig = '' + use_syslog=1 + log_initial_states=1 + date_format=iso8601 + admin_email=${config.myEnv.monitoring.email} + '' + lib.optionalString (!cfg.master) '' + obsess_over_services=1 + ocsp_command=notify-master + ''; + extraResource = let + resources = [cfg.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig); + joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources; + joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined); + in '' + $USER2$=${myplugins} + ${joinedStr} + ''; + objectDefs = + self.lib.toObjects cfg.objects; + }; + }; + }; + }; +} diff --git a/modules/private/monitoring/myplugins.nix b/flakes/private/monitoring/myplugins.nix similarity index 88% rename from modules/private/monitoring/myplugins.nix rename to flakes/private/monitoring/myplugins.nix index e59ddc4..35730bb 100644 --- a/modules/private/monitoring/myplugins.nix +++ b/flakes/private/monitoring/myplugins.nix @@ -21,31 +21,24 @@ in }; notify-primary = { resources = { - USER206 = config.myEnv.monitoring.slack_channel; - USER207 = config.myEnv.monitoring.slack_url; - USER210 = config.myEnv.monitoring.eban.user; - USER211 = config.myEnv.monitoring.eban.password; + USER210 = config.myEnv.monitoring.apprise_urls; }; commands = { # $OVE is to force naemon to run via shell instead of execve which fails here notify-host-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_email host \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE"; # $OVE is to force naemon to run via shell instead of execve which fails here notify-service-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_email service \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE"; - notify-by-slack = "HOST=\"$HOSTALIAS$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_slack \"$ARG1$\" \"$ARG2$\""; - notify-host-eban-url = "STATUS_NAME=\"Server\" USER=\"$USER210$\" PASSWORD=\"$USER211$\" HOSTSTATE=\"$HOSTSTATE$\" $USER2$/notify_eban_url"; - notify-service-eban-url = "STATUS_NAME=\"$_SERVICEWEBSTATUS_NAME$\" USER=\"$USER210$\" PASSWORD=\"$USER211$\" SERVICESTATE=\"$SERVICESTATE$\" $USER2$/notify_eban_url"; + notify-host-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_apprise host \"$ARG1$\""; + notify-service-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_apprise service \"$ARG1$\""; }; chunk = '' - cp ${./plugins}/{notify_by_email,notify_by_slack,notify_eban_url} $out - patchShebangs $out/{notify_by_email,notify_by_slack,notify_eban_url} + cp ${./plugins}/{notify_by_email,notify_by_apprise} $out + patchShebangs $out/{notify_by_email,notify_by_apprise} wrapProgram $out/notify_by_email --prefix PATH : ${lib.makeBinPath [ pkgs.mailutils ]} - wrapProgram $out/notify_by_slack --prefix PATH : ${lib.makeBinPath [ - pkgs.curl pkgs.jq - ]} - wrapProgram $out/notify_eban_url --prefix PATH : ${lib.makeBinPath [ - pkgs.curl + wrapProgram $out/notify_by_apprise --prefix PATH : ${lib.makeBinPath [ + pkgs.apprise ]} ''; }; @@ -79,6 +72,28 @@ in check_external_dns = "$USER1$/check_dns -H $ARG2$ -s $ARG1$ $ARG3$"; }; }; + mdadm = { + commands = { + check_mdadm = "$USER2$/check_command -c \"${pkgs.mdadm}/bin/mdadm --monitor --scan -1\" -s 0 -o \"^$\" -r root"; + }; + sudo = _: { + commands = [ + { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; } + ]; + runAs = "root"; + }; + }; + postfix = { + commands = { + check_mailq = "$USER1$/check_mailq -s -w 1 -c 2"; + }; + sudo = _: { + commands = [ + { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; } + ]; + runAs = "root"; + }; + }; emails = { resources = { USER203 = config.secrets.fullPaths."naemon/id_rsa"; @@ -120,7 +135,7 @@ in cp ${./plugins}/check_eriomem $out/ patchShebangs $out/check_eriomem wrapProgram $out/check_eriomem --prefix PATH : ${lib.makeBinPath [ - pkgs.s3cmd pkgs.python3 + pkgs.s3cmd pkgs.python38 ]} cp ${./plugins}/check_backup_age $out/check_backup_eriomem_age patchShebangs $out/check_backup_eriomem_age @@ -178,6 +193,8 @@ in commands = { check_http = "$USER1$/check_http --sni -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; check_https = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; + check_https_4 = "$USER1$/check_http -4 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; + check_https_6 = "$USER1$/check_http -6 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; check_https_auth = "$USER1$/check_http --sni --ssl -a \"$USER202$\" -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; check_https_certificate = "$USER1$/check_http --sni --ssl -H \"$ARG1$\" -C 21,15"; check_https_code = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -e \"$ARG3$\" -r \"$ARG4$\""; @@ -240,7 +257,7 @@ in cp ${./plugins}/check_mem.sh $out/ patchShebangs $out/check_mem.sh wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [ - pkgs.gnugrep pkgs.gawk pkgs.procps-ng + pkgs.gnugrep pkgs.gawk pkgs.procps ]} ''; }; @@ -303,31 +320,25 @@ in cp ${./plugins}/check_ovh_sms $out/ patchShebangs $out/check_ovh_sms wrapProgram $out/check_ovh_sms --prefix PATH : ${lib.makeBinPath [ - (pkgs.python3.withPackages (ps: [ps.ovh])) + (pkgs.python38.withPackages (ps: [ps.ovh])) ]} ''; }; - postgresql = { + postgresql = { package }: { commands = { check_postgresql_replication = "${sudo} -u postgres $USER2$/check_postgres_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\""; check_postgresql_database_count = "$USER2$/check_postgres_database_count \"$ARG1$\" \"$ARG2$\" \"$ARG3$\""; }; - chunk = let - postgresqlBinary = if config.myServices.databasesReplication.postgresql.enable - then config.myServices.databasesReplication.postgresql.mainPackage - else if config.myServices.databases.enable - then config.myServices.databases.postgresql.package - else pkgs.postgresql; - in '' + chunk = '' cp ${./plugins}/check_postgres_replication $out/ patchShebangs $out/check_postgres_replication wrapProgram $out/check_postgres_replication --prefix PATH : ${lib.makeBinPath [ - postgresqlBinary + package ]} cp ${./plugins}/check_postgres_database_count $out/ patchShebangs $out/check_postgres_database_count wrapProgram $out/check_postgres_database_count --prefix PATH : ${lib.makeBinPath [ - postgresqlBinary + package ]} ''; diff --git a/modules/private/monitoring/nagios-cli.cfg b/flakes/private/monitoring/nagios-cli.cfg similarity index 100% rename from modules/private/monitoring/nagios-cli.cfg rename to flakes/private/monitoring/nagios-cli.cfg diff --git a/modules/private/monitoring/objects_common.nix b/flakes/private/monitoring/objects_common.nix similarity index 82% rename from modules/private/monitoring/objects_common.nix rename to flakes/private/monitoring/objects_common.nix index 7c9f642..1da7764 100644 --- a/modules/private/monitoring/objects_common.nix +++ b/flakes/private/monitoring/objects_common.nix @@ -9,23 +9,9 @@ , loadAlert ? "1.0" , load5Alert ? loadAlert , load15Alert ? load5Alert -, mdadm , master -, lib -, mypluginsConfig , ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in { host = { "${hostFQDN}" = { @@ -39,13 +25,12 @@ in }; service = [ { - passiveInfo = defaultPassiveInfo; service_description = "Size on root partition"; use = "local-service"; check_command = ["check_local_disk" "20%" "10%" "/"]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Total number of process"; use = "local-service"; check_command = [ @@ -54,12 +39,12 @@ in processAlert "RSZDT" ]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Network bandwidth"; use = "local-service"; - check_interval = "2"; + check_interval = 2; max_check_attempts = "20"; retry_interval = "2"; check_command = [ @@ -68,9 +53,9 @@ in "20480" # kb/s "51200" # kb/s ]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Average load"; use = "local-service"; check_command = [ @@ -78,44 +63,33 @@ in "${loadWarn},${load5Warn},${load15Warn}" "${loadAlert},${load5Alert},${load15Alert}" ]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Swap usage"; use = "local-service"; check_command = ["check_local_swap" "20" "10"]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Memory usage"; use = "local-service"; check_command = ["check_memory" "80" "90"]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "NTP is activated and working"; use = "local-service"; check_command = ["check_ntp"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "No mdadm array is degraded"; - use = "local-service"; - check_command = [ - "check_command_output" - "${mdadm}/bin/mdadm --monitor --scan -1" - "^$" - "-s 0 -r root" - ]; + __passive_servicegroups = "webstatus-resources"; } ]; - command = lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig) // { + command = { check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$"; check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$"; check_local_load = "$USER1$/check_load -r -w $ARG1$ -c $ARG2$"; check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$"; check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org"; - check_mailq = "$USER1$/check_mailq -s -w 1 -c 2"; check_smtp = "$USER1$/check_smtp -H $HOSTADDRESS$ -p 25 -S -D 21,15"; check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5"; @@ -157,7 +131,7 @@ in generic-service = { active_checks_enabled = "1"; check_freshness = "0"; - check_interval = "10"; + check_interval = 10; check_period = "24x7"; contact_groups = "admins"; event_handler_enabled = "1"; @@ -179,38 +153,38 @@ in local-service = { use = "generic-service"; host_name = hostFQDN; - check_interval = "5"; + check_interval = 5; max_check_attempts = "4"; retry_interval = "1"; servicegroups = "webstatus-resources"; }; external-service = { use = "generic-service"; - check_interval = "5"; + check_interval = 5; max_check_attempts = "4"; retry_interval = "1"; }; web-service = { use = "generic-service"; - check_interval = "20"; + check_interval = 20; max_check_attempts = "2"; retry_interval = "1"; }; external-web-service = { use = "generic-service"; - check_interval = "20"; + check_interval = 20; max_check_attempts = "2"; retry_interval = "1"; }; mail-service = { use = "generic-service"; - check_interval = "15"; + check_interval = 15; max_check_attempts = "1"; retry_interval = "1"; }; dns-service = { use = "generic-service"; - check_interval = "120"; + check_interval = 120; notification_interval = "120"; max_check_attempts = "5"; retry_interval = "5"; diff --git a/modules/private/monitoring/plugins/check_backup_age b/flakes/private/monitoring/plugins/check_backup_age similarity index 100% rename from modules/private/monitoring/plugins/check_backup_age rename to flakes/private/monitoring/plugins/check_backup_age diff --git a/modules/private/monitoring/plugins/check_bandwidth b/flakes/private/monitoring/plugins/check_bandwidth similarity index 95% rename from modules/private/monitoring/plugins/check_bandwidth rename to flakes/private/monitoring/plugins/check_bandwidth index 53c5d85..21d01f5 100755 --- a/modules/private/monitoring/plugins/check_bandwidth +++ b/flakes/private/monitoring/plugins/check_bandwidth @@ -110,8 +110,7 @@ avg_tx=$(bc <<< "scale=2;$sum_tx/$counter") if [ $(bc <<< "$avg_rx > $critical || $avg_tx > $critical") -eq 1 ]; then - echo "$interface CRITICAL - AVG_RX: $avg_rx kb/s, AVG_TX: - $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;" + echo "$interface CRITICAL - AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;" exit $STATE_CRITICAL elif [ $(bc <<< "$avg_rx > $warning || $avg_tx > $warning") -eq 1 ]; then echo "$interface WARNING - AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;" diff --git a/modules/private/monitoring/plugins/check_command b/flakes/private/monitoring/plugins/check_command similarity index 100% rename from modules/private/monitoring/plugins/check_command rename to flakes/private/monitoring/plugins/check_command diff --git a/modules/private/monitoring/plugins/check_emails b/flakes/private/monitoring/plugins/check_emails similarity index 100% rename from modules/private/monitoring/plugins/check_emails rename to flakes/private/monitoring/plugins/check_emails diff --git a/modules/private/monitoring/plugins/check_eriomem b/flakes/private/monitoring/plugins/check_eriomem similarity index 100% rename from modules/private/monitoring/plugins/check_eriomem rename to flakes/private/monitoring/plugins/check_eriomem diff --git a/modules/private/monitoring/plugins/check_ftp_database b/flakes/private/monitoring/plugins/check_ftp_database similarity index 100% rename from modules/private/monitoring/plugins/check_ftp_database rename to flakes/private/monitoring/plugins/check_ftp_database diff --git a/modules/private/monitoring/plugins/check_git b/flakes/private/monitoring/plugins/check_git similarity index 100% rename from modules/private/monitoring/plugins/check_git rename to flakes/private/monitoring/plugins/check_git diff --git a/modules/private/monitoring/plugins/check_imap_connection b/flakes/private/monitoring/plugins/check_imap_connection similarity index 100% rename from modules/private/monitoring/plugins/check_imap_connection rename to flakes/private/monitoring/plugins/check_imap_connection diff --git a/modules/private/monitoring/plugins/check_last_file_date b/flakes/private/monitoring/plugins/check_last_file_date similarity index 100% rename from modules/private/monitoring/plugins/check_last_file_date rename to flakes/private/monitoring/plugins/check_last_file_date diff --git a/modules/private/monitoring/plugins/check_mem.sh b/flakes/private/monitoring/plugins/check_mem.sh similarity index 56% rename from modules/private/monitoring/plugins/check_mem.sh rename to flakes/private/monitoring/plugins/check_mem.sh index cc97ae2..3a29040 100755 --- a/modules/private/monitoring/plugins/check_mem.sh +++ b/flakes/private/monitoring/plugins/check_mem.sh @@ -1,21 +1,23 @@ -#!/bin/bash +#!/usr/bin/env bash if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then - FreeM=`free -m` + FreeM=`free -m -w` memTotal_m=`echo "$FreeM" |grep Mem |awk '{print $2}'` memUsed_m=`echo "$FreeM" |grep Mem |awk '{print $3}'` memFree_m=`echo "$FreeM" |grep Mem |awk '{print $4}'` + memShared_m=`echo "$FreeM" |grep Mem |awk '{print $5}'` memBuffer_m=`echo "$FreeM" |grep Mem |awk '{print $6}'` memCache_m=`echo "$FreeM" |grep Mem |awk '{print $7}'` - memUsedPrc=`echo $((($memUsed_m*100)/$memTotal_m))||cut -d. -f1` + memAvailable_m=`echo "$FreeM" |grep Mem |awk '{print $8}'` + memUsedPrc=`echo $((($memUsed_m-$memBuffer_m-$memCache_m)*100/$memTotal_m))||cut -d. -f1` if [ "$memUsedPrc" -ge "$4" ]; then - echo "Memory: CRITICAL Total: $memTotal_m MB - Used: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; CACHE=$memCache_m;;;; BUFFER=$memBuffer_m;;;;" + echo "Memory: CRITICAL Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;" exit 2 elif [ "$memUsedPrc" -ge "$2" ]; then - echo "Memory: WARNING Total: $memTotal_m MB - Used: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; CACHE=$memCache_m;;;; BUFFER=$memBuffer_m;;;;" + echo "Memory: WARNING Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;" exit 1 else - echo "Memory: OK Total: $memTotal_m MB - Used: $memUsed_m MB - $memUsedPrc% used|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; CACHE=$memCache_m;;;; BUFFER=$memBuffer_m;;;;" + echo "Memory: OK Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;" exit 0 fi else # If inputs are not as expected, print help. diff --git a/modules/private/monitoring/plugins/check_mysql_replication b/flakes/private/monitoring/plugins/check_mysql_replication similarity index 100% rename from modules/private/monitoring/plugins/check_mysql_replication rename to flakes/private/monitoring/plugins/check_mysql_replication diff --git a/modules/private/monitoring/plugins/check_openldap_replication b/flakes/private/monitoring/plugins/check_openldap_replication similarity index 100% rename from modules/private/monitoring/plugins/check_openldap_replication rename to flakes/private/monitoring/plugins/check_openldap_replication diff --git a/modules/private/monitoring/plugins/check_ovh_sms b/flakes/private/monitoring/plugins/check_ovh_sms similarity index 100% rename from modules/private/monitoring/plugins/check_ovh_sms rename to flakes/private/monitoring/plugins/check_ovh_sms diff --git a/modules/private/monitoring/plugins/check_postgres_database_count b/flakes/private/monitoring/plugins/check_postgres_database_count similarity index 100% rename from modules/private/monitoring/plugins/check_postgres_database_count rename to flakes/private/monitoring/plugins/check_postgres_database_count diff --git a/modules/private/monitoring/plugins/check_postgres_replication b/flakes/private/monitoring/plugins/check_postgres_replication similarity index 100% rename from modules/private/monitoring/plugins/check_postgres_replication rename to flakes/private/monitoring/plugins/check_postgres_replication diff --git a/modules/private/monitoring/plugins/check_redis_replication b/flakes/private/monitoring/plugins/check_redis_replication similarity index 100% rename from modules/private/monitoring/plugins/check_redis_replication rename to flakes/private/monitoring/plugins/check_redis_replication diff --git a/modules/private/monitoring/plugins/check_zfs_snapshot b/flakes/private/monitoring/plugins/check_zfs_snapshot similarity index 100% rename from modules/private/monitoring/plugins/check_zfs_snapshot rename to flakes/private/monitoring/plugins/check_zfs_snapshot diff --git a/flakes/private/monitoring/plugins/notify_by_apprise b/flakes/private/monitoring/plugins/notify_by_apprise new file mode 100755 index 0000000..82bc5a3 --- /dev/null +++ b/flakes/private/monitoring/plugins/notify_by_apprise @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +APPRISE_USERNAME="Naemon" +APPRISE_USERICON="https://assets.immae.eu/monitoring.png" +APPRISE_URLS=$(echo "$2" | sed -e "s/{username}/$APPRISE_USERNAME/g" -e "s@{image_url}@$APPRISE_USERICON@g") + +if [ "$SERVICESTATE" = "CRITICAL" ]; then + ICON="❗" +elif [ "$SERVICESTATE" = "WARNING" ]; then + ICON="⚠️:" +elif [ "$SERVICESTATE" = "OK" ]; then + ICON="✅" +elif [ "$SERVICESTATE" = "UNKNOWN" ]; then + ICON="❓" +elif [ "$HOSTSTATE" = "UP" ]; then + ICON="✅" +elif [ "$HOSTSTATE" = "DOWN" ]; then + ICON="❗" +elif [ "$HOSTSTATE" = "UNKNOWN" ]; then + ICON="❓" +elif [ "$HOSTSTATE" = "UNREACHABLE" ]; then + ICON="❓" +else + ICON="◻" +fi + +if [ "$1" = "host" ]; then + apprise --title "${ICON} ${NOTIFICATIONTYPE} ${HOST} is ${HOSTSTATE}" --body "$HOSTOUTPUT" $APPRISE_URLS +else + apprise --title "${ICON} ${NOTIFICATIONTYPE} ${SERVICEDESC} on ${HOST} is ${SERVICESTATE}" --body "$SERVICEOUTPUT" $APPRISE_URLS +fi diff --git a/modules/private/monitoring/plugins/notify_by_email b/flakes/private/monitoring/plugins/notify_by_email similarity index 100% rename from modules/private/monitoring/plugins/notify_by_email rename to flakes/private/monitoring/plugins/notify_by_email diff --git a/modules/private/monitoring/plugins/notify_by_slack b/flakes/private/monitoring/plugins/notify_by_slack similarity index 100% rename from modules/private/monitoring/plugins/notify_by_slack rename to flakes/private/monitoring/plugins/notify_by_slack diff --git a/modules/private/monitoring/plugins/send_nrdp.sh b/flakes/private/monitoring/plugins/send_nrdp.sh similarity index 100% rename from modules/private/monitoring/plugins/send_nrdp.sh rename to flakes/private/monitoring/plugins/send_nrdp.sh diff --git a/modules/private/monitoring/send_mails b/flakes/private/monitoring/send_mails similarity index 100% rename from modules/private/monitoring/send_mails rename to flakes/private/monitoring/send_mails diff --git a/modules/private/monitoring/to_objects.nix b/flakes/private/monitoring/to_objects.nix similarity index 88% rename from modules/private/monitoring/to_objects.nix rename to flakes/private/monitoring/to_objects.nix index 12721d2..57a71ad 100644 --- a/modules/private/monitoring/to_objects.nix +++ b/flakes/private/monitoring/to_objects.nix @@ -11,13 +11,13 @@ let toStr = k: v: if k == "check_command" && builtins.isList v then builtins.concatStringsSep "!" v - else v; + else builtins.toString v; toService = service: '' define service { ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v: " ${pad 30 k} ${toStr k v}" - ) (filterAttrs (k: v: ! builtins.elem k ["passiveInfo" "filter"]) service))} + ) (filterAttrs (k: v: ! hasPrefix "__passive_" k) service))} } ''; toServices = services: builtins.concatStringsSep "\n" (map toService services); @@ -53,7 +53,7 @@ let ${pad 30 "name"} ${k} ${pad 30 "register"} 0 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv: - " ${pad 30 kk} ${vv}" + " ${pad 30 kk} ${builtins.toString vv}" ) v)} } ''; @@ -69,9 +69,9 @@ let then toTemplates v else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"] then toOthers keyname v - else if builtins.elem keyname ["servicedependency"] + else if builtins.elem keyname ["servicedependency" "hostdependency"] then toOthersArray keyname v - else ""; + else builtins.trace ("Warning: unknown object type " + keyname) ""; toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v); in toObjects diff --git a/flakes/private/openarc/flake.lock b/flakes/private/openarc/flake.lock index be75993..60b0fdf 100644 --- a/flakes/private/openarc/flake.lock +++ b/flakes/private/openarc/flake.lock @@ -2,7 +2,8 @@ "nodes": { "files-watcher": { "locked": { - "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", "path": "../../files-watcher", "type": "path" }, @@ -26,68 +27,19 @@ "type": "github" } }, - "my-lib": { - "inputs": { - "nixpkgs": "nixpkgs" - }, + "myuids": { "locked": { - "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", - "path": "../../lib", + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", "type": "path" }, "original": { - "path": "../../lib", + "path": "../myuids", "type": "path" } }, - "myuids": { - "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - }, - "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - } - }, - "nix-lib": { - "locked": { - "lastModified": 1633008342, - "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6eae8a116011f4db0aa5146f364820024411d6bb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs": { - "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { "locked": { "lastModified": 1597943282, "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", @@ -106,11 +58,12 @@ "inputs": { "flake-utils": "flake-utils", "myuids": "myuids", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "openarc": "openarc_2" }, "locked": { - "narHash": "sha256-ilrfNs6jpi1OceDE3y1atkovECx6PKNWubwLc0Sjx+s=", + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", "path": "../../openarc", "type": "path" }, @@ -138,15 +91,14 @@ "root": { "inputs": { "files-watcher": "files-watcher", - "my-lib": "my-lib", - "nix-lib": "nix-lib", "openarc": "openarc", "secrets": "secrets" } }, "secrets": { "locked": { - "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", "path": "../../secrets", "type": "path" }, diff --git a/flakes/private/openarc/flake.nix b/flakes/private/openarc/flake.nix index b4ab4c8..56c3a1a 100644 --- a/flakes/private/openarc/flake.nix +++ b/flakes/private/openarc/flake.nix @@ -1,63 +1,47 @@ { - inputs.openarc = { - path = "../../openarc"; - type = "path"; - }; - inputs.secrets = { - path = "../../secrets"; - type = "path"; - }; - inputs.files-watcher = { - path = "../../files-watcher"; - type = "path"; - }; - inputs.my-lib = { - path = "../../lib"; - type = "path"; - }; - inputs.nix-lib.url = "github:NixOS/nixpkgs"; + inputs.openarc.url = "path:../../openarc"; + inputs.secrets.url = "path:../../secrets"; + inputs.files-watcher.url = "path:../../files-watcher"; description = "Private configuration for openarc"; - outputs = { self, nix-lib, my-lib, files-watcher, openarc, secrets }: - let - cfg = name': { config, lib, pkgs, name, ... }: { - imports = [ - (my-lib.lib.withNarKey files-watcher "nixosModule") - (my-lib.lib.withNarKey openarc "nixosModule") - (my-lib.lib.withNarKey secrets "nixosModule") - ]; - config = lib.mkIf (name == name') { - services.openarc = { - enable = true; - user = "opendkim"; - socket = "/run/openarc/openarc.sock"; - group = config.services.postfix.group; - configFile = pkgs.writeText "openarc.conf" '' - AuthservID mail.immae.eu - Domain mail.immae.eu - KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"} - Mode sv - Selector eldiron - SoftwareHeader yes - Syslog Yes - ''; - }; - systemd.services.openarc.serviceConfig.Slice = "mail.slice"; - systemd.services.openarc.postStart = '' - while [ ! -S ${config.services.openarc.socket} ]; do - sleep 0.5 - done - chmod g+w ${config.services.openarc.socket} + outputs = { self, files-watcher, openarc, secrets }: { + nixosModule = self.nixosModules.openarc; + nixosModules.openarc = { config, pkgs, ... }: { + imports = [ + files-watcher.nixosModule + openarc.nixosModule + secrets.nixosModule + ]; + config = { + services.openarc = { + enable = true; + user = "opendkim"; + socket = "/run/openarc/openarc.sock"; + group = config.services.postfix.group; + configFile = pkgs.writeText "openarc.conf" '' + AuthservID mail.immae.eu + Domain mail.immae.eu + KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"} + Mode sv + Selector eldiron + SoftwareHeader yes + Syslog Yes ''; - services.filesWatcher.openarc = { - restart = true; - paths = [ - config.secrets.fullPaths."opendkim/eldiron.private" - ]; - }; + }; + systemd.services.openarc.serviceConfig.Slice = "mail.slice"; + systemd.services.openarc.postStart = '' + while [ ! -S ${config.services.openarc.socket} ]; do + sleep 0.5 + done + chmod g+w ${config.services.openarc.socket} + ''; + services.filesWatcher.openarc = { + restart = true; + paths = [ + config.secrets.fullPaths."opendkim/eldiron.private" + ]; }; }; - in - openarc.outputs // - { nixosModules = openarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; }; + }; + }; } diff --git a/flakes/private/opendmarc/flake.lock b/flakes/private/opendmarc/flake.lock index f40e1a9..fdd4d64 100644 --- a/flakes/private/opendmarc/flake.lock +++ b/flakes/private/opendmarc/flake.lock @@ -1,8 +1,21 @@ { "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, "files-watcher": { "locked": { - "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", "path": "../../files-watcher", "type": "path" }, @@ -26,68 +39,19 @@ "type": "github" } }, - "my-lib": { - "inputs": { - "nixpkgs": "nixpkgs" - }, + "myuids": { "locked": { - "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", - "path": "../../lib", + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", "type": "path" }, "original": { - "path": "../../lib", + "path": "../myuids", "type": "path" } }, - "myuids": { - "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - }, - "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - } - }, - "nix-lib": { - "locked": { - "lastModified": 1633008342, - "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6eae8a116011f4db0aa5146f364820024411d6bb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs": { - "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { "locked": { "lastModified": 1597943282, "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", @@ -106,10 +70,11 @@ "inputs": { "flake-utils": "flake-utils", "myuids": "myuids", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs" }, "locked": { - "narHash": "sha256-7jup/d3+WXXWsNMB7Sp5Py4rJQV30Z5+PJITBISbQ9o=", + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", "path": "../../opendmarc", "type": "path" }, @@ -120,16 +85,16 @@ }, "root": { "inputs": { + "environment": "environment", "files-watcher": "files-watcher", - "my-lib": "my-lib", - "nix-lib": "nix-lib", "opendmarc": "opendmarc", "secrets": "secrets" } }, "secrets": { "locked": { - "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", "path": "../../secrets", "type": "path" }, diff --git a/flakes/private/opendmarc/flake.nix b/flakes/private/opendmarc/flake.nix index e2575e7..7e9e8eb 100644 --- a/flakes/private/opendmarc/flake.nix +++ b/flakes/private/opendmarc/flake.nix @@ -1,77 +1,62 @@ { - inputs.opendmarc = { - path = "../../opendmarc"; - type = "path"; - }; - inputs.secrets = { - path = "../../secrets"; - type = "path"; - }; - inputs.files-watcher = { - path = "../../files-watcher"; - type = "path"; - }; - inputs.my-lib = { - path = "../../lib"; - type = "path"; - }; - inputs.nix-lib.url = "github:NixOS/nixpkgs"; + inputs.opendmarc.url = "path:../../opendmarc"; + inputs.environment.url = "path:../environment"; + inputs.secrets.url = "path:../../secrets"; + inputs.files-watcher.url = "path:../../files-watcher"; description = "Private configuration for opendmarc"; - outputs = { self, nix-lib, opendmarc, my-lib, files-watcher, secrets }: - let - cfg = name': { config, lib, pkgs, name, ... }: { - imports = [ - (my-lib.lib.withNarKey files-watcher "nixosModule") - (my-lib.lib.withNarKey opendmarc "nixosModule") - (my-lib.lib.withNarKey secrets "nixosModule") - ]; - config = lib.mkIf (name == name') { - users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ]; - systemd.services.opendmarc.serviceConfig.Slice = "mail.slice"; - services.opendmarc = { - enable = true; - socket = "/run/opendmarc/opendmarc.sock"; - configFile = pkgs.writeText "opendmarc.conf" '' - AuthservID HOSTNAME - FailureReports false - FailureReportsBcc postmaster@immae.eu - FailureReportsOnNone true - FailureReportsSentBy postmaster@immae.eu - IgnoreAuthenticatedClients true - IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"} - SoftwareHeader true - SPFIgnoreResults true - SPFSelfValidate true - UMask 002 - ''; - group = config.services.postfix.group; - }; - services.filesWatcher.opendmarc = { - restart = true; - paths = [ - config.secrets.fullPaths."opendmarc/ignore.hosts" - ]; - }; - secrets.keys = { - "opendmarc/ignore.hosts" = { - user = config.services.opendmarc.user; - group = config.services.opendmarc.group; - permissions = "0400"; - text = let - mxes = lib.attrsets.filterAttrs - (n: v: v.mx.enable) - config.myEnv.servers; - in - builtins.concatStringsSep "\n" ([ - config.myEnv.mail.dmarc.ignore_hosts - ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes); - }; + outputs = { self, environment, opendmarc, files-watcher, secrets }: { + nixosModule = self.nixosModules.opendmarc; + nixosModules.opendmarc = { config, lib, pkgs, ... }: { + imports = [ + environment.nixosModule + files-watcher.nixosModule + opendmarc.nixosModule + secrets.nixosModule + ]; + config = { + users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ]; + systemd.services.opendmarc.serviceConfig.Slice = "mail.slice"; + services.opendmarc = { + enable = true; + socket = "/run/opendmarc/opendmarc.sock"; + configFile = pkgs.writeText "opendmarc.conf" '' + AuthservID HOSTNAME + FailureReports false + FailureReportsBcc postmaster@immae.eu + FailureReportsOnNone true + FailureReportsSentBy postmaster@immae.eu + IgnoreAuthenticatedClients true + IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"} + SoftwareHeader true + SPFIgnoreResults true + SPFSelfValidate true + UMask 002 + ''; + group = config.services.postfix.group; + }; + services.filesWatcher.opendmarc = { + restart = true; + paths = [ + config.secrets.fullPaths."opendmarc/ignore.hosts" + ]; + }; + secrets.keys = { + "opendmarc/ignore.hosts" = { + user = config.services.opendmarc.user; + group = config.services.opendmarc.group; + permissions = "0400"; + text = let + mxes = lib.attrsets.filterAttrs + (n: v: v.mx.enable) + config.myEnv.servers; + in + builtins.concatStringsSep "\n" ([ + config.myEnv.mail.dmarc.ignore_hosts + ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes); }; }; }; - in - opendmarc.outputs // - { nixosModules = opendmarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; }; + }; + }; } - diff --git a/flakes/private/openldap/flake.nix b/flakes/private/openldap/flake.nix new file mode 100644 index 0000000..130312d --- /dev/null +++ b/flakes/private/openldap/flake.nix @@ -0,0 +1,6 @@ +{ + outputs = { self }: { + immae-schema = ./immae.schema; + immae-ldif = ./immae.ldif; + }; +} diff --git a/flakes/private/openldap/immae.ldif b/flakes/private/openldap/immae.ldif new file mode 100644 index 0000000..f1b4cb7 --- /dev/null +++ b/flakes/private/openldap/immae.ldif @@ -0,0 +1,83 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 22130f5f +dn: cn=immae,cn=schema,cn=config +objectClass: olcSchemaConfig +cn: immae +olcObjectIdentifier: {0}Immaeroot 1.3.6.1.4.1.50071 +olcObjectIdentifier: {1}Immae Immaeroot:2 +olcObjectIdentifier: {2}ImmaeattributeType Immae:3 +olcObjectIdentifier: {3}ImmaeobjectClass Immae:4 +olcAttributeTypes: {0}( ImmaeattributeType:1 NAME 'immaeTtrssLogin' DESC 'lo + gin for TTRSS' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY + NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {1}( ImmaeattributeType:2 NAME 'immaeFtpDirectory' DESC ' + home directory for ftp' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466. + 115.121.1.26 ) +olcAttributeTypes: {2}( ImmaeattributeType:3 NAME 'immaeFtpUid' DESC 'user i + d for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) +olcAttributeTypes: {3}( ImmaeattributeType:4 NAME 'immaeFtpGid' DESC 'group + id for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) +olcAttributeTypes: {4}( ImmaeattributeType:5 NAME 'immaeSshKey' DESC 'OpenSS + H Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.4 + 0 ) +olcAttributeTypes: {5}( ImmaeattributeType:6 NAME 'immaeAccessDn' EQUALITY d + istinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {6}( ImmaeattributeType:17 NAME 'immaeAccessWriteDn' EQUA + LITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {7}( ImmaeattributeType:18 NAME 'immaeAccessReadSubtree' + EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {8}( ImmaeattributeType:7 NAME 'immaeXmppUid' DESC 'user + part for Xmpp' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY + NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {9}( ImmaeattributeType:8 NAME 'immaePostfixAddress' DESC + 'the dovecot address to match as username' EQUALITY caseIgnoreIA5Match SUB + STR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} + ) +olcAttributeTypes: {10}( ImmaeattributeType:9 NAME 'immaePostfixHome' DESC ' + the postfix home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1 + 466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: {11}( ImmaeattributeType:10 NAME 'immaePostfixMail' DESC + 'the dovecot mail location' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1 + 466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: {12}( ImmaeattributeType:11 NAME 'immaePostfixUid' DESC ' + the dovecot uid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121 + .1.26 SINGLE-VALUE ) +olcAttributeTypes: {13}( ImmaeattributeType:12 NAME 'immaePostfixGid' DESC ' + the dovecot gid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121 + .1.26 SINGLE-VALUE ) +olcAttributeTypes: {14}( ImmaeattributeType:16 NAME 'immaePuppetJson' DESC ' + Puppet hiera json' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.12 + 1.1.40 ) +olcAttributeTypes: {15}( ImmaeattributeType:19 NAME 'immaeTaskId' DESC 'Task + warrior server Org:Name:Key' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubs + tringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {16}( ImmaeattributeType:20 NAME 'immaePeertubeId' DESC ' + login for Peertube' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat + ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcObjectClasses: {0}( ImmaeobjectClass:1 NAME 'immaeTtrssClass' DESC 'Expan + sion of the existing object classes for ttrss' SUP top AUXILIARY MUST immae + TtrssLogin ) +olcObjectClasses: {1}( ImmaeobjectClass:2 NAME 'immaeFtpClass' DESC 'Expansi + on of the existing object classes for ftp' SUP top AUXILIARY MUST ( immaeFt + pDirectory $ immaeFtpGid $ immaeFtpUid ) ) +olcObjectClasses: {2}( ImmaeobjectClass:3 NAME 'immaeSshClass' DESC 'OpenSSH + class' SUP top AUXILIARY MAY immaeSSHKey ) +olcObjectClasses: {3}( ImmaeobjectClass:4 NAME 'immaeAccessClass' DESC 'Acce + ss class' SUP top AUXILIARY MAY ( immaeAccessDn $ immaeAccessWriteDn $ imma + eAccessReadSubtree ) ) +olcObjectClasses: {4}( ImmaeobjectClass:5 NAME 'immaeXmppClass' DESC 'Expans + ion of the existing object classes for XMPP' SUP top AUXILIARY MUST immaeXm + ppUid ) +olcObjectClasses: {5}( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Exp + ansion of the existing object classes for Postfix' SUP top AUXILIARY MAY ( + immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) M + UST ( immaePostfixAddress ) ) +olcObjectClasses: {6}( ImmaeobjectClass:8 NAME 'immaePuppetClass' DESC 'Expa + nsion of the existing object classes for Puppet' SUP top AUXILIARY MUST imm + aePuppetJson ) +olcObjectClasses: {7}( ImmaeobjectClass:9 NAME 'immaeTaskClass' DESC 'Expans + ion of the existing object classes for Task' SUP top AUXILIARY MUST immaeTa + skId ) +olcObjectClasses: {8}( ImmaeobjectClass:10 NAME 'immaePeertubeClass' DESC 'E + xpansion of the existing object classes for peertube' SUP top AUXILIARY MUS + T immaePeertubeId ) diff --git a/modules/private/databases/openldap/immae.schema b/flakes/private/openldap/immae.schema similarity index 98% rename from modules/private/databases/openldap/immae.schema rename to flakes/private/openldap/immae.schema index d2ef972..7b3b587 100644 --- a/modules/private/databases/openldap/immae.schema +++ b/flakes/private/openldap/immae.schema @@ -110,8 +110,8 @@ attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid' objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Expansion of the existing object classes for Postfix' SUP top AUXILIARY - MUST ( immaePostfixAddress $ immaePostfixHome $ - immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) + MAY ( immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) + MUST ( immaePostfixAddress ) ) # Tinc informations diff --git a/flakes/private/paste/flake.lock b/flakes/private/paste/flake.lock index 6ad428c..e81b9ee 100644 --- a/flakes/private/paste/flake.lock +++ b/flakes/private/paste/flake.lock @@ -15,35 +15,6 @@ "type": "github" } }, - "my-lib": { - "inputs": { - "nixpkgs": "nixpkgs" - }, - "locked": { - "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", - "path": "../../lib", - "type": "path" - }, - "original": { - "path": "../../lib", - "type": "path" - } - }, - "nix-lib": { - "locked": { - "lastModified": 1632955135, - "narHash": "sha256-MyOBftnLv5UcPCL4AzvlyNEDwGD2cGGM9HMEOno/MZw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a4d96cd808f13d924988938ecf9a46b2a2787fa3", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1631570365, @@ -59,28 +30,14 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "paste": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs" }, "locked": { - "narHash": "sha256-2ylI42ZHfzW6oCsxfFyHf5zVnDsPMwvJCACtcdErtPg=", + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", "path": "../../paste", "type": "path" }, @@ -91,8 +48,6 @@ }, "root": { "inputs": { - "my-lib": "my-lib", - "nix-lib": "nix-lib", "paste": "paste" } } diff --git a/flakes/private/paste/flake.nix b/flakes/private/paste/flake.nix index 23f8cd3..97853ea 100644 --- a/flakes/private/paste/flake.nix +++ b/flakes/private/paste/flake.nix @@ -1,30 +1,20 @@ { - inputs.paste = { - path = "../../paste"; - type = "path"; - }; - inputs.my-lib = { - path = "../../lib"; - type = "path"; - }; - inputs.nix-lib.url = "github:NixOS/nixpkgs"; + inputs.paste.url = "path:../../paste"; description = "Private configuration for paste"; - outputs = { self, my-lib, nix-lib, paste }: - let - cfg = name': { config, lib, pkgs, name, ... }: { - imports = [ - (my-lib.lib.withNarKey paste "nixosModule") - ]; - config = lib.mkIf (name == name') { - services.paste = { - enable = true; - webDirectory = "/paste"; - }; + outputs = { self, paste }: { + nixosModule = self.nixosModules.paste; + nixosModules.paste = { ... }: { + imports = [ + paste.nixosModule + ]; + config = { + services.paste = { + enable = true; + webDirectory = "/paste"; }; }; - in - paste.outputs // - { nixosModules = paste.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron"] cfg; }; + }; + }; } diff --git a/flakes/private/peertube/flake.lock b/flakes/private/peertube/flake.lock index 4944da7..0ecec47 100644 --- a/flakes/private/peertube/flake.lock +++ b/flakes/private/peertube/flake.lock @@ -32,36 +32,26 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "myuids_2": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { @@ -97,12 +87,13 @@ "peertube": { "flake": false, "locked": { - "lastModified": 1610436329, - "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", - "owner": "Chocobozzz", - "repo": "PeerTube", - "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", - "type": "github" + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" }, "original": { "owner": "Chocobozzz", @@ -114,21 +105,21 @@ "peertube_2": { "flake": false, "locked": { - "lastModified": 1611184594, - "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", - "ref": "gitolite_local/syden", - "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", - "revCount": 6316, - "type": "git", - "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" }, "original": { - "ref": "gitolite_local/syden", - "type": "git", - "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" } }, - "peertube_origin": { + "peertube_open_instance": { "inputs": { "flake-utils": "flake-utils", "myuids": "myuids", @@ -136,16 +127,17 @@ "peertube": "peertube" }, "locked": { - "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", - "path": "../../peertube", + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", "type": "path" }, "original": { - "path": "../../peertube", + "path": "./../../peertube", "type": "path" } }, - "peertube_syden": { + "peertube_origin": { "inputs": { "flake-utils": "flake-utils_2", "myuids": "myuids_2", @@ -153,19 +145,20 @@ "peertube": "peertube_2" }, "locked": { - "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", - "path": "../../peertube", + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", "type": "path" }, "original": { - "path": "../../peertube", + "path": "./../../peertube", "type": "path" } }, "root": { "inputs": { - "peertube_origin": "peertube_origin", - "peertube_syden": "peertube_syden" + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" } } }, diff --git a/flakes/private/peertube/flake.nix b/flakes/private/peertube/flake.nix index e0e0d54..8eb81e9 100644 --- a/flakes/private/peertube/flake.nix +++ b/flakes/private/peertube/flake.nix @@ -1,27 +1,25 @@ { description = "Patched peertube"; inputs.peertube_origin = { - path = "../../peertube"; - type = "path"; + url = "path:./../../peertube"; }; - inputs.peertube_syden = { - path = "../../peertube"; - type = "path"; + inputs.peertube_open_instance = { + url = "path:./../../peertube"; inputs.peertube = { url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git"; - ref = "gitolite_local/syden"; + ref = "gitolite_local/open_instance"; flake = false; type = "git"; }; }; - outputs = { self, peertube_origin, peertube_syden }: { + outputs = { self, peertube_origin, peertube_open_instance }: { overlays = { - peertube_syden = final: prev: { peertube_syden = peertube_syden.defaultPackage."${final.system}"; }; + peertube_open_instance = final: prev: { peertube_open_instance = peertube_open_instance.defaultPackage."${final.system}"; }; peertube_origin = final: prev: { peertube_origin = peertube_origin.defaultPackage."${final.system}"; }; }; packages.x86_64-linux.peertube = peertube_origin.packages.x86_64-linux.peertube; - packages.x86_64-linux.peertube_syden = peertube_syden.packages.x86_64-linux.peertube; + packages.x86_64-linux.peertube_open_instance = peertube_open_instance.packages.x86_64-linux.peertube; defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux; nixosModule = peertube_origin.nixosModule; }; diff --git a/flakes/private/php/flake.lock b/flakes/private/php/flake.lock new file mode 100644 index 0000000..c9af933 --- /dev/null +++ b/flakes/private/php/flake.lock @@ -0,0 +1,62 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "nixpkgs-4": "nixpkgs-4" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/php/flake.nix b/flakes/private/php/flake.nix new file mode 100644 index 0000000..a730b68 --- /dev/null +++ b/flakes/private/php/flake.nix @@ -0,0 +1,40 @@ +{ + description = "Php old versions"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.nixpkgs-4 = { + url = "github:NixOS/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026"; + flake = false; + }; + outputs = { self, nixpkgs, nixpkgs-4, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + in rec { + packages = { + php72 = pkgs.php72; + php73 = pkgs.php73; + php74 = (import nixpkgs-4 { inherit system; overlays = []; }).php74; + cryptpad = (import nixpkgs-4 { inherit system; overlays = []; }).cryptpad; + python37 = (import nixpkgs-4 { inherit system; overlays = []; }).python37; + python37Packages = (import nixpkgs-4 { inherit system; overlays = []; }).python37Packages; + telegram-purple = (import nixpkgs-4 { inherit system; overlays = []; }).telegram-purple; + }; + defaultPackage = packages.php73; + legacyPackages = packages; + }) // rec { + overlays = { + php = final: prev: { + php72 = self.packages."${final.system}".php72; + php73 = self.packages."${final.system}".php73; + php74 = self.packages."${final.system}".php74; + cryptpad = self.packages."${final.system}".cryptpad; + python37 = self.packages."${final.system}".python37; + telegram-purple = self.packages."${final.system}".telegram-purple; + }; + }; + overlay = overlays.php; + }; +} diff --git a/flakes/private/ssh/flake.lock b/flakes/private/ssh/flake.lock new file mode 100644 index 0000000..bbb2011 --- /dev/null +++ b/flakes/private/ssh/flake.lock @@ -0,0 +1,36 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/ssh/flake.nix b/flakes/private/ssh/flake.nix new file mode 100644 index 0000000..0ca6d67 --- /dev/null +++ b/flakes/private/ssh/flake.nix @@ -0,0 +1,107 @@ +{ + inputs.environment.url = "path:../environment"; + inputs.secrets.url = "path:../../secrets"; + outputs = { self, environment, secrets }: { + nixosModule = self.nixosModules.ssh; + nixosModules.ssh = { lib, pkgs, config, ... }: + let + cfg = config.myServices.ssh; + in + { + imports = [ + environment.nixosModule + secrets.nixosModule + ]; + options.myServices.ssh = let + module = lib.types.submodule { + options = { + vars = lib.mkOption { + type = lib.types.attrsOf lib.types.lines; + default = {}; + description = '' + variables to interpolate in the script. A `name_` prefix will be prepended + ''; + }; + snippet = lib.mkOption { + type = lib.types.lines; + description = '' + Snippet to use + ''; + }; + dependencies = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = []; + description = '' + Dependencies of the package + ''; + }; + }; + }; + in { + modules = lib.mkOption { + type = lib.types.attrsOf module; + default = {}; + description = '' + List of modules to enable + ''; + }; + }; + config = lib.mkIf (builtins.length (builtins.attrValues cfg.modules) > 0) { + + services.openssh.extraConfig = '' + AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys + AuthorizedKeysCommandUser nobody + ''; + + secrets.keys."ssh-ldap" = { + user = "nobody"; + group = "nogroup"; + permissions = "0400"; + text = config.myEnv.sshd.ldap.password; + }; + secrets.keys."ssh-psql" = { + user = "nobody"; + group = "nogroup"; + permissions = "0400"; + text = config.myEnv.sshd.psql.password; + }; + system.activationScripts.sshd = { + deps = [ "secrets" ]; + text = '' + install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password + install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-psql"} /etc/ssh/psql_password + ''; + }; + # ssh is strict about parent directory having correct rights, don't + # move it in the nix store. + environment.etc."ssh/ldap_authorized_keys" = let + deps = lib.lists.unique ( + [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.postgresql ] + ++ lib.flatten (map (v: v.dependencies) (builtins.attrValues cfg.modules)) + ); + vars = lib.concatMapAttrs (n: v: ( + lib.mapAttrs' (n': lib.nameValuePair "${n}_${n'}") v.vars + )) cfg.modules; + fullScript = pkgs.runCommand "ldap_authorized_keys" (vars // { + snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) (builtins.attrValues cfg.modules)); + }) '' + substituteAll ${./ldap_authorized_keys.sh} $out + # Second call for the included snippets + substituteAllInPlace $out + chmod a+x $out + ''; + ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" { + buildInputs = [ pkgs.makeWrapper ]; + } '' + makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps} + ''; + in { + enable = true; + mode = "0755"; + user = "root"; + source = ldap_authorized_keys; + }; + }; + }; + }; +} diff --git a/modules/private/ssh/ldap_authorized_keys.sh b/flakes/private/ssh/ldap_authorized_keys.sh similarity index 71% rename from modules/private/ssh/ldap_authorized_keys.sh rename to flakes/private/ssh/ldap_authorized_keys.sh index 402f283..f4395be 100755 --- a/modules/private/ssh/ldap_authorized_keys.sh +++ b/flakes/private/ssh/ldap_authorized_keys.sh @@ -4,8 +4,14 @@ LDAPSEARCH=ldapsearch KEY="immaeSshKey" LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu" LDAP_PASS=$(cat /etc/ssh/ldap_password) -LDAP_HOST="ldap.immae.eu" +LDAP_HOST="ldap://ldap.immae.eu" LDAP_BASE="dc=immae,dc=eu" +USER_LDAP_BASE="ou=users,dc=immae,dc=eu" + +PSQL_BASE="immae" +PSQL_HOST="localhost" +PSQL_USER="immae_auth_read" +PSQL_PASS=$(cat /etc/ssh/psql_password) suitable_for() { type_for="$1" @@ -41,7 +47,11 @@ clean_key_line() { } ldap_search() { - $LDAPSEARCH -h $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@" + $LDAPSEARCH -H $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@" +} + +psql_search() { + PGPASSWORD="$PSQL_PASS" psql -U "$PSQL_USER" -h "$PSQL_HOST" -X -A -t -d "$PSQL_BASE" -c "$@" } ldap_keys() { diff --git a/flakes/private/system/flake.lock b/flakes/private/system/flake.lock new file mode 100644 index 0000000..3602f00 --- /dev/null +++ b/flakes/private/system/flake.lock @@ -0,0 +1,185 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "root": { + "inputs": { + "backports": "backports", + "environment": "environment", + "mypackages": "mypackages", + "myuids": "myuids", + "secrets-public": "secrets-public" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/system/flake.nix b/flakes/private/system/flake.nix new file mode 100644 index 0000000..04ebbc7 --- /dev/null +++ b/flakes/private/system/flake.nix @@ -0,0 +1,168 @@ +{ + inputs.environment.url = "path:../environment"; + inputs.secrets-public.url = "path:../../secrets"; + inputs.mypackages.url = "path:../../mypackages"; + inputs.myuids.url = "path:../../myuids"; + inputs.backports.url = "path:../../backports"; + outputs = { self, secrets-public, mypackages, backports, environment, myuids }: { + nixosModule = self.nixosModules.system; + nixosModules.system = { pkgs, lib, config, name, nodes, secrets, options, ... }: + { + imports = [ + secrets.nixosModules.users-config-common + environment.nixosModule + secrets-public.nixosModule + ]; + config = { + myEnv = import secrets.environment-file; + networking.hostName = name; + deployment.keys."vars.yml" = { + keyCommand = [ pkgs.stdenv.shell "-c" "cat ${secrets.vars-file}" ]; + user = "root"; + group = "root"; + permissions = "0400"; + }; + + networking.extraHosts = builtins.concatStringsSep "\n" + (lib.mapAttrsToList (n: v: "${lib.head v.config.hostEnv.ips.main.ip4} ${n}") nodes); + + users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ]; + secrets.deleteSecretsVars = true; + secrets.gpgKeys = [ + ./public_keys/Immae.pub + ]; + secrets.secretsVars = "/run/keys/vars.yml"; + + services.openssh.enable = true; + + nixpkgs.overlays = + builtins.attrValues mypackages.overlays ++ + builtins.attrValues backports.overlays ++ + [ + (self: super: { + postgresql = self.postgresql_pam; + mariadb = self.mariadb_106.overrideAttrs(old: { + passthru = old.passthru // { mysqlVersion = "5.7"; }; + }); + }) # don’t put them as generic overlay because of home-manager + ]; + + services.journald.extraConfig = '' + #Should be "warning" but disabled for now, it prevents anything from being stored + MaxLevelStore=info + MaxRetentionSec=1year + ''; + + users.groups.acme.gid = myuids.lib.gids.acme; + users.users = + builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({ + isNormalUser = true; + home = "/home/${x.name}"; + createHome = true; + linger = true; + # Enable in latest unstable homeMode = "755"; + } // x)) (config.hostEnv.users pkgs)) + // { + acme.uid = myuids.lib.uids.acme; + }; + environment.systemPackages = [ + pkgs.inetutils + pkgs.htop + pkgs.iftop + pkgs.bind.dnsutils + pkgs.httpie + pkgs.iotop + pkgs.whois + pkgs.ngrep + pkgs.tcpdump + pkgs.wireshark-cli + pkgs.tcpflow + pkgs.mitmproxy + pkgs.nmap + pkgs.p0f + pkgs.socat + pkgs.lsof + pkgs.psmisc + pkgs.openssl + pkgs.wget + + pkgs.pv + pkgs.smartmontools + + pkgs.git + pkgs.vim + pkgs.rsync + pkgs.strace + pkgs.sqlite + + pkgs.jq + pkgs.yq + ]; + + users.mutableUsers = lib.mkDefault false; + + systemd.services."vars.yml-key".enable = lib.mkForce false; + systemd.targets.maintenance = { + description = "Maintenance target with only sshd"; + after = [ "network-online.target" "sshd.service" ]; + requires = [ "network-online.target" "sshd.service" ]; + unitConfig.AllowIsolate = "yes"; + }; + + security.acme.acceptTerms = true; + security.acme.preliminarySelfsigned = true; + + security.acme.certs = { + "${name}" = { + domain = config.hostEnv.fqdn; + }; + }; + security.acme.defaults = { + email = "ismael@bouya.org"; + webroot = "/var/lib/acme/acme-challenges"; + postRun = builtins.concatStringsSep "\n" [ + (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service") + ]; + extraLegoRenewFlags = [ "--reuse-key" ]; + keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121 + #extraLegoRunFlags = [ "--reuse-key" "--preferred-chain" "ISRG Root X1"]; + #extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"]; + }; + + services.nginx = { + recommendedTlsSettings = true; + virtualHosts = { + "${config.hostEnv.fqdn}" = { + acmeRoot = config.security.acme.defaults.webroot; + useACMEHost = name; + forceSSL = true; + }; + }; + }; + + services.fail2ban.jails.DEFAULT = { + settings.bantime = "12h"; + settings.findtime = "12h"; + }; + services.fail2ban = { + enable = true; + #findtime = "12h"; + #bantime = "12h"; + bantime-increment = { + enable = true; # Enable increment of bantime after each violation + formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)"; + #multipliers = "1 2 4 8 16 32 64"; + maxtime = "168h"; # Do not ban for more than 1 week + overalljails = true; # Calculate the bantime based on all the violations + }; + maxretry = 10; + ignoreIP = let + ip4s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip4 or []) v.ips)) (config.myEnv.servers)); + ip6s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip6 or []) v.ips)) (config.myEnv.servers)); + in + ip4s ++ ip6s; + }; + }; + }; + }; +} diff --git a/nixops/public_keys/Immae.pub b/flakes/private/system/public_keys/Immae.pub similarity index 100% rename from nixops/public_keys/Immae.pub rename to flakes/private/system/public_keys/Immae.pub diff --git a/flakes/rsync_backup/flake.nix b/flakes/rsync_backup/flake.nix index 6d359e5..d81d176 100644 --- a/flakes/rsync_backup/flake.nix +++ b/flakes/rsync_backup/flake.nix @@ -183,7 +183,7 @@ if [ "$skip" != "$DEST" ]; then ''; backup_profile_tail = name: profile: '' - ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -i ${ssh_key} -p $PORT $DEST sh -c "date > .cache/last_backup" + ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -i ${ssh_key} -p $PORT $DEST sh -c "date > .cache/last_backup" || true fi # [ "$skip" != "$DEST" ] ##### End ${name} ##### ''; @@ -228,7 +228,7 @@ ]; programs.ssh.knownHosts = lib.attrsets.mapAttrs' (name: profile: lib.attrsets.nameValuePair name { - hostNames = [ profile.host ]; + extraHostNames = [ profile.host ]; publicKey = "${profile.host_key_type} ${profile.host_key}"; }) cfg.profiles; diff --git a/flakes/secrets/flake.nix b/flakes/secrets/flake.nix index ef74a30..7bf04a4 100644 --- a/flakes/secrets/flake.nix +++ b/flakes/secrets/flake.nix @@ -3,6 +3,8 @@ outputs = { self }: { nixosModule = { config, lib, pkgs, ... }: { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options.secrets = with lib; { keys = mkOption { type = types.attrsOf (types.submodule { @@ -36,11 +38,38 @@ type = types.str; description = "Content of the entry"; }; + keyDependencies = mkOption { + default = []; + type = types.listOf (types.either types.path types.package); + description = '' + (public) system dependencies that needs to be + uploaded with the key. + + keyDependencies + ignoredKeyDependencies should + contain the exhaustive list of the text context. + + A warning will be thrown if there are remaning + dependencies from the text. + ''; + }; + ignoredKeyDependencies = mkOption { + default = []; + type = types.listOf (types.either types.path types.package); + description = '' + dependencies that must not be sent along with the key. + + keyDependencies + ignoredKeyDependencies should + contain the exhaustive list of the text context. + + A warning will be thrown if there are remaning + dependencies from the text. + ''; + }; }; }); default = {}; description = "Keys attrs to upload to the server"; - apply = lib.mapAttrsToList (dest: v: v // { inherit dest; }); + apply = builtins.mapAttrs (dest: v: v // { inherit dest; }); }; gpgKeys = mkOption { type = types.listOf types.path; @@ -74,8 +103,8 @@ # Read-only variables fullPaths = mkOption { type = types.attrsOf types.path; - default = builtins.listToAttrs - (map (v: { name = v.dest; value = "${config.secrets.location}/${v.dest}"; }) config.secrets.keys); + default = builtins.mapAttrs + (n: v: "${config.secrets.location}/${n}") config.secrets.keys; readOnly = true; description = "set of full paths to secrets"; }; @@ -83,7 +112,7 @@ config = let location = config.secrets.location; - keys = config.secrets.keys; + keys = builtins.attrValues config.secrets.keys; empty = pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out && touch $out/done"; fpath = v: "secrets/${v.dest}${lib.optionalString v.isTemplated ".gucci.tpl"}"; dumpKey = v: @@ -125,7 +154,24 @@ exclPath = builtins.concatStringsSep " -o " (map (d: " -path $TMP/${d.dest}") dirs); in lib.optionalString (builtins.length dirs > 0) " -not \\( ${exclPath} \\) "; + + checkKeyDependencies = key: + let + allDeps = builtins.map (n: if builtins.isPath n then "${n}" else n.drvPath) (key.keyDependencies ++ key.ignoredKeyDependencies); + context = builtins.attrNames (builtins.getContext key.text); + missing = builtins.foldl' (o: n: lib.remove n o) context allDeps; + in + lib.optional (!key.isDir && builtins.length missing > 0) + '' + Key ${key.dest} has non declared dependencies in its context: ${builtins.concatStringsSep " " missing} + Add them to ignoredKeyDependencies to ignore + ''; in lib.mkIf (builtins.length keys > 0) { + warnings = lib.concatMap checkKeyDependencies keys; + # FIXME: Use lib.concatMap (k: k.keyDependencies) keys in latest nixpkgs + system.extraDependencies = lib.concatMap (k: builtins.map (dep: + if builtins.isPath dep then pkgs.writeText "extra-dep" "${dep}" else dep + ) k.keyDependencies) keys; system.activationScripts.secrets = { deps = [ "users" "wrappers" ]; text = '' @@ -133,13 +179,11 @@ TMP=$(${pkgs.coreutils}/bin/mktemp -d) TMPWORK=$(${pkgs.coreutils}/bin/mktemp -d) chmod go-rwx $TMPWORK - if [ -n "$TMP" -a -n "$TMPWORK" ]; then + if [ -n "$TMP" -a -n "$TMPWORK" -a -f ${config.secrets.secretsVars} ]; then install -m0750 -o root -g keys -d $TMP ${pkgs.ssh-to-age}/bin/ssh-to-age -private-key -i ${config.secrets.decryptKey} -o $TMPWORK/keys.txt SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${secrets} | ${pkgs.gnutar}/bin/tar --strip-components 1 -C $TMP -x - if [ -f ${config.secrets.secretsVars} ]; then - SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${config.secrets.secretsVars} > $TMPWORK/vars.yml - fi + SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${config.secrets.secretsVars} > $TMPWORK/vars.yml if [ -f $TMPWORK/vars.yml ]; then find $TMP -name "*.gucci.tpl" -exec \ /bin/sh -c 'f="{}"; ${pkgs.gucci}/bin/gucci -f '$TMPWORK'/vars.yml "$f" > "''${f%.gucci.tpl}"; touch --reference "$f" ''${f%.gucci.tpl} ; chmod --reference="$f" ''${f%.gucci.tpl} ; chown --reference="$f" ''${f%.gucci.tpl}' \; diff --git a/pkgs/webapps/surfer/default.nix b/flakes/surfer/default.nix similarity index 71% rename from pkgs/webapps/surfer/default.nix rename to flakes/surfer/default.nix index 9a04da5..7a25199 100644 --- a/pkgs/webapps/surfer/default.nix +++ b/flakes/surfer/default.nix @@ -1,9 +1,9 @@ -{ callPackage, mylibs, sources }: +{ callPackage, nodeEnv, src }: # built using node2nix -l package-lock.json # and changing "./." to "src" (callPackage ./node-packages.nix { - src = sources.webapps-surfer; - nodeEnv = callPackage mylibs.nodeEnv {}; + inherit src; + nodeEnv = callPackage nodeEnv {}; }).package.overrideAttrs(old: { postInstall = '' mkdir -p $out/bin diff --git a/flakes/surfer/flake.lock b/flakes/surfer/flake.lock new file mode 100644 index 0000000..66bea60 --- /dev/null +++ b/flakes/surfer/flake.lock @@ -0,0 +1,149 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "mypackages": "mypackages", + "nixpkgs": "nixpkgs_2", + "surfer": "surfer" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/surfer/flake.nix b/flakes/surfer/flake.nix new file mode 100644 index 0000000..996104c --- /dev/null +++ b/flakes/surfer/flake.nix @@ -0,0 +1,36 @@ +{ + description = "Surfer is a Simple static file server"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.surfer = { + url = "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"; + type = "git"; + rev = "476177380452c9c7c5b1624805feedc824c5995e"; + flake = false; + }; + inputs.mypackages.url = "path:../mypackages"; + outputs = { self, nixpkgs, surfer, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + nodeEnv = mypackages.mylibs.nodeEnv; + inherit (pkgs) callPackage; + in rec { + packages.surfer = callPackage ./. { inherit nodeEnv; src = surfer; }; + defaultPackage = packages.surfer; + legacyPackages.surfer = packages.surfer; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + surfer = final: prev: { + surfer = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.surfer; + }; +} diff --git a/pkgs/webapps/surfer/node-packages.nix b/flakes/surfer/node-packages.nix similarity index 100% rename from pkgs/webapps/surfer/node-packages.nix rename to flakes/surfer/node-packages.nix diff --git a/pkgs/webapps/taskwarrior-web/Gemfile.lock b/flakes/taskwarrior-web/Gemfile.lock similarity index 100% rename from pkgs/webapps/taskwarrior-web/Gemfile.lock rename to flakes/taskwarrior-web/Gemfile.lock diff --git a/pkgs/webapps/taskwarrior-web/default.nix b/flakes/taskwarrior-web/default.nix similarity index 75% rename from pkgs/webapps/taskwarrior-web/default.nix rename to flakes/taskwarrior-web/default.nix index d5368c5..7678b3c 100644 --- a/pkgs/webapps/taskwarrior-web/default.nix +++ b/flakes/taskwarrior-web/default.nix @@ -1,4 +1,4 @@ -{ ruby_2_6, bundlerEnv, mylibs, stdenv }: +{ ruby_2_6, bundlerEnv, src, stdenv }: let gems = bundlerEnv { name = "taskwarrior-web-env"; @@ -8,7 +8,10 @@ let gemdir = package.out; groups = [ "default" "local" "development" ]; }; - package = stdenv.mkDerivation (mylibs.fetchedGithub ./taskwarrior-web.json // rec { + package = stdenv.mkDerivation { + pname = "taskwarrior-web"; + version = src.shortRev; + inherit src; phases = [ "unpackPhase" "patchPhase" "installPhase" ]; patches = [ ./fixes.patch ./thin.patch ]; installPhase = '' @@ -18,5 +21,5 @@ let passthru = { inherit gems; }; - }); + }; in package diff --git a/pkgs/webapps/taskwarrior-web/fixes.patch b/flakes/taskwarrior-web/fixes.patch similarity index 56% rename from pkgs/webapps/taskwarrior-web/fixes.patch rename to flakes/taskwarrior-web/fixes.patch index 851f9f0..c4cea34 100644 --- a/pkgs/webapps/taskwarrior-web/fixes.patch +++ b/flakes/taskwarrior-web/fixes.patch @@ -11,6 +11,25 @@ index 212aed7..94c57df 100644 def format_date(timestamp) format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y' Time.parse(timestamp).localtime.strftime(format) +diff --git a/lib/taskwarrior-web/model/task.rb b/lib/taskwarrior-web/model/task.rb +index 212aed7..94c57df 100644 +--- a/lib/taskwarrior-web/model/task.rb ++++ b/lib/taskwarrior-web/model/task.rb +@@ -15,8 +15,14 @@ + + def initialize(attributes = {}) + attributes.each do |attr, value| ++ if attr == "uuid" ++ next ++ end + send("#{attr}=", value) if respond_to?(attr.to_sym) + end ++ if attributes.has_key? "uuid" ++ send("uuid=", attributes["uuid"]) ++ end + + @_errors = [] + @tags = [] if @tags.nil? diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb index 58d246e..8f716ac 100644 --- a/lib/taskwarrior-web/services/builder/base.rb @@ -24,6 +43,44 @@ index 58d246e..8f716ac 100644 :tags => '_tags', :sync => 'sync' } +@@ -21,7 +21,7 @@ + substitute_parts if @command_string =~ /:id/ + end + parse_params +- @built = "#{@command_string}#{@params}" ++ @built = "#{@params}#{@command_string}" + end + + def task_command +@@ -43,23 +43,23 @@ + + def parse_params + string = '' +- string << %( #{@params.delete(:description).shellescape}) if @params.has_key?(:description) ++ string << %(#{@params.delete(:description).shellescape} ) if @params.has_key?(:description) + + if tags = @params.delete(:tags) + tag_indicator = TaskwarriorWeb::Config.property('tag.indicator') || '+' +- tags.each { |tag| string << %( #{tag_indicator}#{tag.to_s.shellescape}) } ++ tags.each { |tag| string << %(#{tag_indicator}#{tag.to_s.shellescape} ) } + end + + if tags = @params.delete(:remove_tags) +- tags.each { |tag| string << %( -#{tag.to_s.shellescape}) } ++ tags.each { |tag| string << %(-#{tag.to_s.shellescape} ) } + end + + @params.each do |attr, value| + if @command != :update or attr != :uuid + if value.respond_to? :each +- value.each { |val| string << %( #{attr.to_s}:\\"#{val.to_s.shellescape}\\") } ++ value.each { |val| string << %(#{attr.to_s}:\\"#{val.to_s.shellescape}\\" ) } + else +- string << %( #{attr.to_s}:\\"#{value.to_s.shellescape}\\") ++ string << %(#{attr.to_s}:\\"#{value.to_s.shellescape}\\" ) + end + end + end diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb index 789e7a1..fa08698 100644 --- a/lib/taskwarrior-web/views/tasks/_form.erb diff --git a/flakes/taskwarrior-web/flake.lock b/flakes/taskwarrior-web/flake.lock new file mode 100644 index 0000000..ce87931 --- /dev/null +++ b/flakes/taskwarrior-web/flake.lock @@ -0,0 +1,62 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "taskwarrior-web": "taskwarrior-web" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/taskwarrior-web/flake.nix b/flakes/taskwarrior-web/flake.nix new file mode 100644 index 0000000..b08290a --- /dev/null +++ b/flakes/taskwarrior-web/flake.nix @@ -0,0 +1,33 @@ +{ + description = "A web interface for the Taskwarrior todo application. Because being a neckbeard is only fun sometimes."; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.taskwarrior-web = { + url = "github:theunraveler/taskwarrior-web/a79cfe2b42791b62364118e58b21b892fff6ded8"; + flake = false; + }; + + outputs = { self, nixpkgs, taskwarrior-web, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + inherit (pkgs) callPackage; + in rec { + packages.taskwarrior-web = callPackage ./. { src = taskwarrior-web; }; + defaultPackage = packages.taskwarrior-web; + legacyPackages.taskwarrior-web = packages.taskwarrior-web; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + taskwarrior-web = final: prev: { + taskwarrior-web = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.taskwarrior-web; + }; +} diff --git a/pkgs/webapps/taskwarrior-web/gemset.nix b/flakes/taskwarrior-web/gemset.nix similarity index 100% rename from pkgs/webapps/taskwarrior-web/gemset.nix rename to flakes/taskwarrior-web/gemset.nix diff --git a/pkgs/webapps/taskwarrior-web/thin.patch b/flakes/taskwarrior-web/thin.patch similarity index 100% rename from pkgs/webapps/taskwarrior-web/thin.patch rename to flakes/taskwarrior-web/thin.patch diff --git a/lib/default.nix b/lib/default.nix deleted file mode 100644 index 7b392f1..0000000 --- a/lib/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ pkgs }: -with pkgs; -rec { - flakeCompat = import ./flake-compat.nix; - nodeEnv = import ./node-env.nix; - - fetchedGithub = path: - let - json = lib.importJSON path; - in rec { - version = json.tag; - pname = json.meta.name; - name = "${pname}-${version}"; - src = fetchFromGitHub json.github; - }; -} // (if builtins.pathExists ./private then callPackage ./private {} else {}) diff --git a/lib/flake-compat-patched.nix b/lib/flake-compat-patched.nix deleted file mode 100644 index 217a99f..0000000 --- a/lib/flake-compat-patched.nix +++ /dev/null @@ -1,190 +0,0 @@ -# Compatibility function to allow flakes to be used by -# non-flake-enabled Nix versions. Given a source tree containing a -# 'flake.nix' and 'flake.lock' file, it fetches the flake inputs and -# calls the flake's 'outputs' function. It then returns an attrset -# containing 'defaultNix' (to be used in 'default.nix'), 'shellNix' -# (to be used in 'shell.nix'). - -{ src, system ? builtins.currentSystem or "unknown-system" }: - -let - - lockFilePath = src + "/flake.lock"; - - lockFile = builtins.fromJSON (builtins.readFile lockFilePath); - - fetchTree = - info: - if info.type == "github" then - { outPath = fetchTarball "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}"; - rev = info.rev; - shortRev = builtins.substring 0 7 info.rev; - lastModified = info.lastModified; - lastModifiedDate = formatSecondsSinceEpoch info.lastModified; - narHash = info.narHash; - } - else if info.type == "git" then - { outPath = - builtins.fetchGit - ({ url = info.url; } - // (if info ? rev then { inherit (info) rev; } else {}) - // (if info ? ref then { inherit (info) ref; } else {}) - ); - lastModified = info.lastModified; - lastModifiedDate = formatSecondsSinceEpoch info.lastModified; - narHash = info.narHash; - } // (if info ? rev then { - rev = info.rev; - shortRev = builtins.substring 0 7 info.rev; - } else { - }) - else if info.type == "path" then - { outPath = builtins.path { path = - if builtins.substring 0 1 info.path == "." - then builtins.toString src + "/" + info.path - else info.path; - }; - narHash = info.narHash; - } - else if info.type == "tarball" then - { outPath = fetchTarball info.url; - narHash = info.narHash; - } - else if info.type == "gitlab" then - { inherit (info) rev narHash lastModified; - outPath = fetchTarball "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; - shortRev = builtins.substring 0 7 info.rev; - } - else - # FIXME: add Mercurial, tarball inputs. - throw "flake input has unsupported input type '${info.type}'"; - - callFlake4 = flakeSrc: locks: - let - flake = import (flakeSrc + "/flake.nix"); - - inputs = builtins.mapAttrs (n: v: - if v.flake or true - then callFlake4 (fetchTree (v.locked // v.info)) v.inputs - else fetchTree (v.locked // v.info)) locks; - - outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;})); - in - assert flake.edition == 201909; - outputs; - - callLocklessFlake = flakeSrc: - let - flake = import (flakeSrc + "/flake.nix"); - outputs = flakeSrc // (flake.outputs ({ self = outputs; })); - in outputs; - - rootSrc = let - # Try to clean the source tree by using fetchGit, if this source - # tree is a valid git repository. - tryFetchGit = src: - if isGit && !isShallow - then - let res = builtins.fetchGit src; - in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"] else res - else { outPath = src; }; - # NB git worktrees have a file for .git, so we don't check the type of .git - isGit = builtins.pathExists (src + "/.git"); - isShallow = builtins.pathExists (src + "/.git/shallow"); - - in - { lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; } - // (if src ? outPath then src else tryFetchGit src); - - # Format number of seconds in the Unix epoch as %Y%m%d%H%M%S. - formatSecondsSinceEpoch = t: - let - rem = x: y: x - x / y * y; - days = t / 86400; - secondsInDay = rem t 86400; - hours = secondsInDay / 3600; - minutes = (rem secondsInDay 3600) / 60; - seconds = rem t 60; - - # Courtesy of https://stackoverflow.com/a/32158604. - z = days + 719468; - era = (if z >= 0 then z else z - 146096) / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = mp + (if mp < 10 then 3 else -9); - y' = y + (if m <= 2 then 1 else 0); - - pad = s: if builtins.stringLength s < 2 then "0" + s else s; - in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}"; - - allNodes = - builtins.mapAttrs - (key: node: - let - sourceInfo = - if key == lockFile.root - then rootSrc - else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]); - - subdir = if key == lockFile.root then "" else node.locked.dir or ""; - - flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix"); - - inputs = builtins.mapAttrs - (inputName: inputSpec: allNodes.${resolveInput inputSpec}) - (node.inputs or {}); - - # Resolve a input spec into a node name. An input spec is - # either a node name, or a 'follows' path from the root - # node. - resolveInput = inputSpec: - if builtins.isList inputSpec - then getInputByPath lockFile.root inputSpec - else inputSpec; - - # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the - # root node, returning the final node. - getInputByPath = nodeName: path: - if path == [] - then nodeName - else - getInputByPath - # Since this could be a 'follows' input, call resolveInput. - (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path}) - (builtins.tail path); - - outputs = flake.outputs (inputs // { self = result; }); - - result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; }; - in - if node.flake or true then - assert builtins.isFunction flake.outputs; - result - else - sourceInfo - ) - lockFile.nodes; - - result = - if !(builtins.pathExists lockFilePath) - then callLocklessFlake rootSrc - else if lockFile.version == 4 - then callFlake4 rootSrc (lockFile.inputs) - else if lockFile.version >= 5 && lockFile.version <= 7 - then allNodes.${lockFile.root} - else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}"; - -in - rec { - defaultNix = - result - // (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {}); - - shellNix = - defaultNix - // (if result ? devShell.${system} then { default = result.devShell.${system}; } else {}); - } diff --git a/lib/flake-compat.nix b/lib/flake-compat.nix deleted file mode 100644 index d3daa10..0000000 --- a/lib/flake-compat.nix +++ /dev/null @@ -1,8 +0,0 @@ -src: -(import ./flake-compat-patched.nix { inherit src; }).defaultNix -# Until https://github.com/edolstra/flake-compat/pull/18 is accepted -# (import ( -# fetchTarball { -# url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; -# sha256 = "0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; -# }) { inherit src; }).defaultNix diff --git a/modules/default.nix b/modules/default.nix deleted file mode 100644 index 2f06eb1..0000000 --- a/modules/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -let - flakeCompat = import ../lib/flake-compat.nix; - flakeLib = (flakeCompat ../flakes/lib).lib; -in -{ - myids = (flakeCompat ../flakes/myuids).nixosModule; - secrets = flakeLib.withNarKeyCompat flakeCompat ../flakes/secrets "nixosModule"; - filesWatcher = flakeLib.withNarKeyCompat flakeCompat ../flakes/files-watcher "nixosModule"; - - webstats = ./webapps/webstats; - diaspora = ./webapps/diaspora.nix; - etherpad-lite = ./webapps/etherpad-lite.nix; - mastodon = ./webapps/mastodon.nix; - mediagoblin = ./webapps/mediagoblin.nix; - peertube = (flakeCompat ../flakes/peertube).nixosModule; - fiche = flakeLib.withNarKeyCompat flakeCompat ../flakes/fiche "nixosModule"; - paste = flakeLib.withNarKeyCompat flakeCompat ../flakes/paste "nixosModule"; - - opendmarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/opendmarc "nixosModule"; - openarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/openarc "nixosModule"; - - duplyBackup = ./duply_backup; - rsyncBackup = flakeLib.withNarKeyCompat flakeCompat ../flakes/rsync_backup "nixosModule"; - naemon = ./naemon; - - php-application = ./websites/php-application.nix; - zrepl = ./zrepl.nix; - websites = ./websites; -} // (if builtins.pathExists ./private then import ./private else {}) diff --git a/modules/naemon/default.nix b/modules/naemon/default.nix deleted file mode 100644 index 60a75b3..0000000 --- a/modules/naemon/default.nix +++ /dev/null @@ -1,183 +0,0 @@ -{ config, lib, pkgs, ... }: - -with lib; - -let - cfg = config.services.naemon; - - naemonConfig = pkgs.runCommand "naemon-config" { - objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs; - resourceFile = config.secrets.fullPaths."naemon/resources.cfg"; - extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig; - inherit (cfg) logDir varDir runDir cacheDir; - } '' - substituteAll ${./naemon.cfg} $out - cat $extraConfig >> $out - ''; -in -{ - options = { - services.naemon = { - enable = mkOption { - default = false; - description = " - Whether to use Naemon to monitor - your system or network. - "; - }; - - objectDefs = mkOption { - type = types.lines; - default = ""; - description = " - A list of Naemon object configuration that must define - the hosts, host groups, services and contacts for the - network that you want Naemon to monitor. - "; - }; - - extraResource = mkOption { - type = types.lines; - default = ""; - example = '' - # Sets $USER2$ to be the path to event handlers - #$USER2$=/usr/lib/monitoring-plugins/eventhandlers - - # Store some usernames and passwords (hidden from the CGIs) - #$USER3$=someuser - #$USER4$=somepassword - ''; - description = " - Lines to add to the resource file - # You can define $USERx$ macros in this file, which can in turn be used - # in command definitions in your host config file(s). $USERx$ macros are - # useful for storing sensitive information such as usernames, passwords, - # etc. They are also handy for specifying the path to plugins and - # event handlers - if you decide to move the plugins or event handlers to - # a different directory in the future, you can just update one or two - # $USERx$ macros, instead of modifying a lot of command definitions. - # - # Naemon supports up to 256 $USERx$ macros ($USER1$ through $USER256$) - # - # Resource files may also be used to store configuration directives for - # external data sources like MySQL... - # - "; - }; - - extraConfig = mkOption { - type = types.lines; - default = ""; - description = " - Extra config to append to main config - "; - }; - - user = mkOption { - type = types.str; - default = "naemon"; - description = "User for naemon"; - }; - - group = mkOption { - type = types.str; - default = "naemon"; - description = "Group for naemon"; - }; - - varDir = mkOption { - type = types.path; - default = "/var/lib/naemon"; - description = "The directory where naemon stores its data"; - }; - - cacheDir = mkOption { - type = types.path; - default = "/var/cache/naemon"; - description = "The directory where naemon stores its cache"; - }; - - runDir = mkOption { - type = types.path; - default = "/run/naemon"; - description = "The directory where naemon stores its runtime files"; - }; - - logDir = mkOption { - type = types.path; - default = "/var/log/naemon"; - description = "The directory where naemon stores its log files"; - }; - - package = mkOption { - type = types.package; - default = pkgs.naemon.override { - inherit (cfg) varDir cacheDir logDir runDir user group; - }; - description = '' - Naemon package to use - ''; - }; - }; - }; - - - config = mkIf cfg.enable { - secrets.keys = { - "naemon/resources.cfg" = { - user = cfg.user; - group = cfg.group; - permissions = "0400"; - text = '' - $USER1$=${pkgs.monitoring-plugins}/libexec - ${cfg.extraResource} - ''; - }; - }; - - users.users = optionalAttrs (cfg.user == "naemon") { - naemon = { - group = cfg.group; - uid = config.ids.uids.nagios; - extraGroups = [ "keys" ]; - }; - }; - users.groups = optionalAttrs (cfg.user == "naemon") { - naemon = { - gid = config.ids.gids.nagios; - }; - }; - - services.filesWatcher.naemon = { - paths = [ config.secrets.fullPaths."naemon/resources.cfg" ]; - }; - systemd.services.naemon = { - description = "Naemon monitoring daemon"; - path = [ cfg.package pkgs.monitoring-plugins ]; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - preStart = "${cfg.package}/bin/naemon -vp ${naemonConfig}"; - script = "${cfg.package}/bin/naemon --daemon ${naemonConfig}"; - reload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID"; - serviceConfig = { - User = cfg.user; - Restart = "always"; - RestartSec = 2; - StandardOutput = "journal"; - StandardError = "inherit"; - PIDFile = "${cfg.runDir}/naemon.pid"; - LogsDirectory = assert lib.strings.hasPrefix "/var/log/" cfg.logDir; - lib.strings.removePrefix "/var/log/" cfg.logDir; - CacheDirectory = assert lib.strings.hasPrefix "/var/cache/" cfg.cacheDir; - let unprefixed = lib.strings.removePrefix "/var/cache/" cfg.cacheDir; - in [ unprefixed "${unprefixed}/checkresults" ]; - StateDirectory = assert lib.strings.hasPrefix "/var/lib/" cfg.varDir; - lib.strings.removePrefix "/var/lib/" cfg.varDir; - RuntimeDirectory = assert lib.strings.hasPrefix "/run/" cfg.runDir; - lib.strings.removePrefix "/run/" cfg.runDir; - }; - }; - }; -} diff --git a/modules/private/buildbot/projects/caldance/__init__.py b/modules/private/buildbot/projects/caldance/__init__.py deleted file mode 100644 index 2074d9e..0000000 --- a/modules/private/buildbot/projects/caldance/__init__.py +++ /dev/null @@ -1,198 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "caldance" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) - RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) - GIT_URL = "gitolite@git.immae.eu:perso/simon_descarpentries/www.cal-dance.com" - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF" - LDAP_HOST = "ldap.immae.eu" - LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu" - XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") - - PUPPET_HOST = { - "integration": [ "-p8022", "root@caldance.cs.immae.dev"], - } - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=caldance,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://caldance.cs.immae.dev" - TITLE = "Caldance" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - if args["category"] == "deploy_webhook": - args = { - "category": "deploy_webhook", - "comments": "", - "repository": "", - "author": "webhook", - "project": "Caldance", - "properties": { - "environment": args.get("environment", "integration"), - "build": "caldance_{}.tar.gz".format(args.get("build", "master")) - } - } - - return ([args], None) - -def deploy_hook_scheduler(project, timer=1): - return schedulers.AnyBranchScheduler( - change_filter=util.ChangeFilter(category="deploy_webhook", project=project), - name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)]) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(worker.LocalWorker("generic-worker")) - c['workers'].append(worker.LocalWorker("deploy-worker")) - - db_lock = util.MasterLock("deploy_after_build") - - c['schedulers'].append(hook_scheduler("Caldance", timer=1)) - c['schedulers'].append(force_scheduler("force_caldance", ["Caldance_build"])) - c['schedulers'].append(deploy_scheduler("deploy_caldance", ["Caldance_deploy"])) - c['schedulers'].append(deploy_hook_scheduler("Caldance", timer=1)) - - c['builders'].append(factory("caldance", locks=[db_lock.access('exclusive')])) - - c['builders'].append(deploy_factory("caldance", locks=[db_lock.access('exclusive')])) - - c['services'].append(SlackStatusPush( - name="slack_status_caldance", - builders=["Caldance_build", "Caldance_deploy"], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - c['services'].append(XMPPStatusPush( - name="xmpp_status_caldance", - builders=["Caldance_build", "Caldance_deploy"], - recipients=E.XMPP_RECIPIENTS, - password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip())) - -def factory(project, locks=[], ignore_fails=False): - release_file = "{1}/{0}_%(kw:clean_branch)s.tar.gz" - - package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch) - package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch) - package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch) - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.GIT_URL, - sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addSteps(package_and_upload(package, package_dest, package_url)) - - return util.BuilderConfig( - name="{}_build".format(project.capitalize()), - locks=locks, - workernames=["generic-worker"], factory=factory) - -def compute_build_infos(project): - @util.renderer - def compute(props): - import re, hashlib - build_file = props.getProperty("build") - package_dest = "{1}/{0}".format(build_file, E.RELEASE_PATH) - version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1) - with open(package_dest, "rb") as f: - sha = hashlib.sha256(f.read()).hexdigest() - return { - "build_version": version, - "build_hash": sha, - } - return compute - -@util.renderer -def puppet_ssh_command(props): - environment = props["environment"] if props.hasProperty("environment") else "integration" - ssh_command = [ - "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", - "-i", E.SSH_KEY_PATH ] - return ssh_command + E.PUPPET_HOST.get(environment, ["host.invalid"]) - -def deploy_factory(project, locks=[]): - package_dest = util.Interpolate("{0}/%(prop:build)s".format(E.RELEASE_PATH)) - - factory = util.BuildFactory() - factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) - factory.addStep(steps.SetProperties(properties=compute_build_infos(project))) - factory.addStep(LdapPush(environment=util.Property("environment"), - project=project, build_version=util.Property("build_version"), - build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap"))) - factory.addStep(steps.MasterShellCommand(command=puppet_ssh_command)) - return util.BuilderConfig( - name="{}_deploy".format(project.capitalize()), - locks=locks, - workernames=["deploy-worker"], factory=factory) - -from twisted.internet import defer -from buildbot.process.buildstep import FAILURE -from buildbot.process.buildstep import SUCCESS -from buildbot.process.buildstep import BuildStep - -class LdapPush(BuildStep): - name = "LdapPush" - renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"] - - def __init__(self, **kwargs): - self.environment = kwargs.pop("environment") - self.project = kwargs.pop("project") - self.build_version = kwargs.pop("build_version") - self.build_hash = kwargs.pop("build_hash") - self.ldap_password = kwargs.pop("ldap_password") - self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST) - super().__init__(**kwargs) - - def run(self): - import json - from ldap3 import Reader, Writer, Server, Connection, ObjectDef - server = Server(self.ldap_host) - conn = Connection(server, - user=E.LDAP_DN, - password=self.ldap_password) - conn.bind() - obj = ObjectDef("immaePuppetClass", conn) - r = Reader(conn, obj, - "cn=caldance.{},{}".format(self.environment, E.LDAP_ROLES_BASE)) - r.search() - if len(r) > 0: - w = Writer.from_cursor(r) - for value in w[0].immaePuppetJson.values: - config = json.loads(value) - if "role::caldance::{}_version".format(self.project) in config: - config["role::caldance::{}_version".format(self.project)] = self.build_version - config["role::caldance::{}_sha256".format(self.project)] = self.build_hash - w[0].immaePuppetJson -= value - w[0].immaePuppetJson += json.dumps(config, indent=" ") - w.commit() - return defer.succeed(SUCCESS) - return defer.succeed(FAILURE) diff --git a/modules/private/buildbot/projects/cryptoportfolio/__init__.py b/modules/private/buildbot/projects/cryptoportfolio/__init__.py deleted file mode 100644 index 5d70f95..0000000 --- a/modules/private/buildbot/projects/cryptoportfolio/__init__.py +++ /dev/null @@ -1,169 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "cryptoportfolio" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) - RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) - GIT_URL = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/{0}.git" - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - LDAP_HOST = "ldap.immae.eu" - LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu" - - PUPPET_HOST = { - "production": "root@cryptoportfolio.immae.eu", - "integration": "root@cryptoportfolio-dev.immae.eu" - } - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=cryptoportfolio,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://git.immae.eu" - TITLE = "Cryptoportfolio" - -# eval .. dans .zshrc_local -# mkdir -p $BUILD/go -# export GOPATH=$BUILD/go -# go get -u github.com/golang/dep/cmd/dep -# export PATH=$PATH:$BUILD/go/bin -# go get git.immae.eu/Cryptoportfolio/Front.git -# cd $BUILD/go/src/git.immae.eu/Cryptoportfolio/Front.git -# git checkout dev -# dep ensure -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c['workers'].append(worker.LocalWorker("generic-worker")) - c['workers'].append(worker.LocalWorker("deploy-worker")) - - c['schedulers'].append(hook_scheduler("Trader")) - c['schedulers'].append(hook_scheduler("Front")) - c['schedulers'].append(force_scheduler( - "force_cryptoportfolio", ["Trader_build", "Front_build"])) - c['schedulers'].append(deploy_scheduler("deploy_cryptoportfolio", - ["Trader_deploy", "Front_deploy"])) - - c['builders'].append(factory("trader")) - c['builders'].append(factory("front", ignore_fails=True)) - - c['builders'].append(deploy_factory("trader")) - c['builders'].append(deploy_factory("front")) - - c['services'].append(SlackStatusPush( - name="slack_status_cryptoportfolio", - builders=["Front_build", "Trader_build", "Front_deploy", "Trader_deploy"], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - -def factory(project, ignore_fails=False): - release_file = "{1}/{0}/{0}_%(kw:clean_branch)s.tar.gz" - - url = E.GIT_URL.format(project.capitalize()) - - package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch) - package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch) - package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch) - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=url, - mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="make install", - logEnviron=False, haltOnFailure=(not ignore_fails), - warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails), - command=["make", "install"])) - factory.addStep(steps.ShellCommand(name="make test", - logEnviron=False, haltOnFailure=(not ignore_fails), - warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails), - command=["make", "test"])) - factory.addSteps(package_and_upload(package, package_dest, package_url)) - - return util.BuilderConfig( - name="{}_build".format(project.capitalize()), - workernames=["generic-worker"], factory=factory) - -def compute_build_infos(project): - @util.renderer - def compute(props): - import re, hashlib - build_file = props.getProperty("build") - package_dest = "{2}/{0}/{1}".format(project, build_file, E.RELEASE_PATH) - version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1) - with open(package_dest, "rb") as f: - sha = hashlib.sha256(f.read()).hexdigest() - return { - "build_version": version, - "build_hash": sha, - } - return compute - -@util.renderer -def puppet_host(props): - environment = props["environment"] if props.hasProperty("environment") else "integration" - return E.PUPPET_HOST.get(environment, "host.invalid") - -def deploy_factory(project): - package_dest = util.Interpolate("{1}/{0}/%(prop:build)s".format(project, E.RELEASE_PATH)) - - factory = util.BuildFactory() - factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) - factory.addStep(steps.SetProperties(properties=compute_build_infos(project))) - factory.addStep(LdapPush(environment=util.Property("environment"), - project=project, build_version=util.Property("build_version"), - build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap"))) - factory.addStep(steps.MasterShellCommand(command=[ - "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host])) - return util.BuilderConfig(name="{}_deploy".format(project.capitalize()), workernames=["deploy-worker"], factory=factory) - -from twisted.internet import defer -from buildbot.process.buildstep import FAILURE -from buildbot.process.buildstep import SUCCESS -from buildbot.process.buildstep import BuildStep - -class LdapPush(BuildStep): - name = "LdapPush" - renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"] - - def __init__(self, **kwargs): - self.environment = kwargs.pop("environment") - self.project = kwargs.pop("project") - self.build_version = kwargs.pop("build_version") - self.build_hash = kwargs.pop("build_hash") - self.ldap_password = kwargs.pop("ldap_password") - self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST) - super().__init__(**kwargs) - - def run(self): - import json - from ldap3 import Reader, Writer, Server, Connection, ObjectDef - server = Server(self.ldap_host) - conn = Connection(server, - user=E.LDAP_DN, - password=self.ldap_password) - conn.bind() - obj = ObjectDef("immaePuppetClass", conn) - r = Reader(conn, obj, - "cn=cryptoportfolio.{},{}".format(self.environment, E.LDAP_ROLES_BASE)) - r.search() - if len(r) > 0: - w = Writer.from_cursor(r) - for value in w[0].immaePuppetJson.values: - config = json.loads(value) - if "role::cryptoportfolio::{}_version".format(self.project) in config: - config["role::cryptoportfolio::{}_version".format(self.project)] = self.build_version - config["role::cryptoportfolio::{}_sha256".format(self.project)] = self.build_hash - w[0].immaePuppetJson -= value - w[0].immaePuppetJson += json.dumps(config, indent=" ") - w.commit() - return defer.succeed(SUCCESS) - return defer.succeed(FAILURE) diff --git a/modules/private/buildbot/projects/denise/__init__.py b/modules/private/buildbot/projects/denise/__init__.py deleted file mode 100644 index abeba3c..0000000 --- a/modules/private/buildbot/projects/denise/__init__.py +++ /dev/null @@ -1,186 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "denise" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF" - - BINGO_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/bingo" - BINGO_BETA_PATH = "/var/lib/buildbot/outputs/denise/bingo_beta" - BINGO_GIT_URL = "gitolite@git.immae.eu:perso/Denise/bingo" - - OMS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/oms" - OMS_BETA_PATH = "/var/lib/buildbot/outputs/denise/oms_beta" - OMS_GIT_URL = "gitolite@git.immae.eu:perso/Denise/oms" - - AVENTURIERS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/aventuriers" - AVENTURIERS_GIT_URL = "https://git.immae.eu/perso/Denise/aventuriers.git" - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=denise,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://oms.syanni.eu" - TITLE = "Syanni website" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - return ([args], None) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(worker.LocalWorker("generic-worker-denise")) - - c['schedulers'].append(hook_scheduler("DeniseBingo", timer=1)) - c['schedulers'].append(hook_scheduler("DeniseOMS", timer=1)) - c['schedulers'].append(hook_scheduler("DeniseAventuriers", timer=1)) - c['schedulers'].append(force_scheduler("force_denise", [ - "DeniseBingo_build", "DeniseOMS_build", "DeniseAventuriers_build" - ])) - - c['builders'].append(denise_oms_factory()) - c['builders'].append(denise_bingo_factory()) - c['builders'].append(denise_aventuriers_factory()) - -def denise_bingo_factory(): - @util.renderer - def bingo_run_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "/run/denise_bingo/gunicorn.pid" - else: - return "/run/denise_bingo_beta/gunicorn.pid" - - @util.renderer - def bingo_systemd_service(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "denise-bingo" - else: - return "denise-bingo-beta" - - @util.renderer - def bingo_url(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "https://bingo.syanni.eu" - else: - return "https://beta.bingo.syanni.eu" - - @util.renderer - def bingo_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return E.BINGO_RELEASE_PATH - else: - return E.BINGO_BETA_PATH - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.BINGO_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:bingo_path)s", bingo_path=bingo_path))) - factory.addStep(steps.DirectoryUpload(workersrc="../source", - masterdest=bingo_path, - url=bingo_url)) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:bingo_path)s", bingo_path=bingo_path))) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:bingo_service)s.service", bingo_service=bingo_systemd_service))) - - return util.BuilderConfig(name="DeniseBingo_build", workernames=["generic-worker-denise"], factory=factory) - -def denise_oms_factory(): - @util.renderer - def oms_run_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "/run/denise_oms/gunicorn.pid" - else: - return "/run/denise_oms_beta/gunicorn.pid" - - @util.renderer - def oms_systemd_service(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "denise-oms" - else: - return "denise-oms-beta" - - @util.renderer - def oms_url(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "https://oms.syanni.eu" - else: - return "https://beta.oms.syanni.eu" - - @util.renderer - def oms_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return E.OMS_RELEASE_PATH - else: - return E.OMS_BETA_PATH - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.OMS_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:oms_path)s", oms_path=oms_path))) - factory.addStep(steps.DirectoryUpload(workersrc="../source", - masterdest=oms_path, - url=oms_url)) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:oms_path)s", oms_path=oms_path))) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:oms_service)s.service", oms_service=oms_systemd_service))) - - return util.BuilderConfig(name="DeniseOMS_build", workernames=["generic-worker-denise"], factory=factory) - -def denise_aventuriers_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Aventuriers"] + ":${PATH}", - "TZ": "Europe/Paris", - } - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.AVENTURIERS_GIT_URL, - submodules=True, mode="full", method="fresh")) - factory.addStep(steps.ShellCommand(name="build files", - logEnviron=False, haltOnFailure=True, workdir="build", - env=path_env, command=["make", "tout", "encyclo"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.AVENTURIERS_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../build/html", - masterdest=E.AVENTURIERS_RELEASE_PATH, - url="https://aventuriers.syanni.eu")) - factory.addStep(steps.FileUpload(name="upload epub file", workersrc="aventuriers.epub", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.epub", - url="https://aventuriers.syanni.eu/aventuriers.epub", mode=0o644)) - factory.addStep(steps.FileUpload(name="upload mobi file", workersrc="aventuriers.mobi", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.mobi", - url="https://aventuriers.syanni.eu/aventuriers.mobi", mode=0o644)) - factory.addStep(steps.FileUpload(name="upload pdf file", workersrc="aventuriers.pdf", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.pdf", - url="https://aventuriers.syanni.eu/aventuriers.pdf", mode=0o644)) - factory.addStep(steps.FileUpload(name="upload encyclo pdf file", workersrc="encyclo.pdf", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/encyclo.pdf", - url="https://aventuriers.syanni.eu/encyclo.pdf", mode=0o644)) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.AVENTURIERS_RELEASE_PATH))) - - return util.BuilderConfig(name="DeniseAventuriers_build", workernames=["generic-worker-denise"], factory=factory) diff --git a/modules/private/buildbot/projects/immaeEu/__init__.py b/modules/private/buildbot/projects/immaeEu/__init__.py deleted file mode 100644 index 83265cd..0000000 --- a/modules/private/buildbot/projects/immaeEu/__init__.py +++ /dev/null @@ -1,314 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "immaeEu" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF" - XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") - - BIP39_GIT_URL = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/BIP39.git" - IMMAE_EU_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Blog" - HISTORY_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/History" - RECETTES_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Recettes" - COURS_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Cours" - DOCS_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Docs" - NORMALESUP_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Projets/Sites/Normalesup" - - COURS_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/cours" - COURS_TARBALL_PATH = "/var/lib/ftp/release.immae.eu/cours" - COURS_TARBALL_URL = "https://release.immae.eu/cours" - BIP39_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/bip39" - HISTORY_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/history" - IMMAE_EU_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/blog" - DOCS_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/docs" - RECETTES_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recettes" - NORMALESUP_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recherche" - GSMCELLS_RELEASE_PATH = "/var/lib/ftp/release.immae.eu/gsm_cells" - GSMCELLS_RELEASE_URL = "https://release.immae.eu/gsm_cells" - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://www.immae.eu" - TITLE = "Immae website" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - return ([args], None) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(worker.LocalWorker("generic-worker-immae-eu")) - - c['schedulers'].append(hook_scheduler("ImmaeEu", timer=1)) - c['schedulers'].append(hook_scheduler("Normalesup", timer=1)) - c['schedulers'].append(hook_scheduler("Cours", timer=1)) - c['schedulers'].append(hook_scheduler("Recettes", timer=1)) - c['schedulers'].append(hook_scheduler("Docs", timer=1)) - c['schedulers'].append(hook_scheduler("History", timer=1)) - c['schedulers'].append(hook_scheduler("BIP39", timer=1)) - c['schedulers'].append(schedulers.Nightly(name="GSMCells-weekly", - builderNames=["GSMCells_build"], dayOfWeek=6, hour=3)) - c['schedulers'].append(force_scheduler("force_immae_eu", [ - "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build", - "Recettes_build", "History_build", "BIP39_build" - ])) - c['schedulers'].append(schedulers.ForceScheduler( - name="GSMCells-force", label="Force build", - buttonName="Force build", - reason=util.StringParameter(name="reason", label="Reason", default="Force build"), - codebases=[ - util.CodebaseParameter("", - branch=util.FixedParameter(name="branch", default=""), - revision=util.FixedParameter(name="revision", default=""), - repository=util.FixedParameter(name="repository", default=""), - project=util.FixedParameter(name="project", default=""), - ), - ], - username=util.FixedParameter(name="username", default="Web button"), - builderNames=["GSMCells_build"] - )) - - c['builders'].append(immae_eu_factory()) - c['builders'].append(normalesup_factory()) - c['builders'].append(cours_factory()) - c['builders'].append(gsm_cells_factory()) - c['builders'].append(recettes_factory()) - c['builders'].append(docs_factory()) - c['builders'].append(history_factory()) - c['builders'].append(bip39_factory()) - - c['services'].append(SlackStatusPush( - name="slack_status_immae_eu_project", - builders=[ - "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build", - "GSMCells_build", "Recettes_build", "History_build", - "BIP39_build" - ], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - c['services'].append(XMPPStatusPush( - name="xmpp_status_immae_eu_project", - builders=[ - "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build", - "GSMCells_build", "Recettes_build", "History_build", - "BIP39_build" - ], - recipients=E.XMPP_RECIPIENTS, - password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip())) - -def history_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_History"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.HISTORY_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["jekyll", "build"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.HISTORY_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/_site", - masterdest=E.HISTORY_RELEASE_PATH, - url="https://www.immae.eu/history")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.HISTORY_RELEASE_PATH))) - - return util.BuilderConfig(name="History_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def docs_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Docs"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.DOCS_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["make", "clean", "html"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.DOCS_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/_build/html", - masterdest=E.DOCS_RELEASE_PATH, - url="https://www.immae.eu/docs")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.DOCS_RELEASE_PATH))) - - return util.BuilderConfig(name="Docs_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def recettes_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Recettes"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.RECETTES_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(NixShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command="jekyll build --trace --baseurl /recettes")) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.RECETTES_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/_site", - masterdest=E.RECETTES_RELEASE_PATH, - url="https://www.immae.eu/recettes")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.RECETTES_RELEASE_PATH))) - - return util.BuilderConfig(name="Recettes_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def bip39_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_BIP39"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.BIP39_GIT_URL, - submodules=True, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build file", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["python", "compile.py"])) - factory.addStep(steps.FileUpload(name="upload file", workersrc="bip39-standalone.html", - workdir="source", masterdest=E.BIP39_RELEASE_PATH + "/index.html", - url="https://tools.immae.eu/BIP39", mode=0o644)) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.BIP39_RELEASE_PATH))) - - return util.BuilderConfig(name="BIP39_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def immae_eu_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_ImmaeEu"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.IMMAE_EU_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["make", "html"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.IMMAE_EU_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/output", - masterdest=E.IMMAE_EU_RELEASE_PATH, - url="https://www.immae.eu")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.IMMAE_EU_RELEASE_PATH))) - - return util.BuilderConfig(name="ImmaeEu_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def cours_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Cours"] + ":${PATH}", - "CI": "yes" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.COURS_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["make", "build"], env=path_env)) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.COURS_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/build", - masterdest=E.COURS_RELEASE_PATH, - url="https://www.immae.eu/cours")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.COURS_RELEASE_PATH))) - - factory.addStep(steps.ShellCommand(name="build pdfs", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["make", "pdfs"], env=path_env)) - - package = util.Interpolate("cours_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch) - release_file = "{0}/cours_%(kw:clean_branch)s.tar.gz" - package_dest = util.Interpolate(release_file.format(E.COURS_TARBALL_PATH), clean_branch=clean_branch) - package_url = util.Interpolate(release_file.format(E.COURS_TARBALL_URL), clean_branch=clean_branch) - factory.addStep(steps.ShellCommand(name="build pdf tarball", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["tar", "-cvf", package, "-C", "pdfs", "mp", "mpsi"], env=path_env)) - factory.addStep(steps.FileUpload(name="upload package", workersrc=package, - workdir="source", masterdest=package_dest, - url=package_url, mode=0o644)) - - return util.BuilderConfig(name="Cours_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def normalesup_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Normalesup"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.NORMALESUP_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["make", "build"], env=path_env)) - factory.addStep(steps.ShellCommand(name="give read access to all files", - logEnviron=False, haltOnFailure=True, workdir="source", - command="chmod -R a+rX build", env=path_env)) - factory.addStep(steps.ShellCommand(name="synchronize with phare", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=[ - "rsync", "-av", "--delete", - "-e", "ssh -i {} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no".format(E.SSH_KEY_PATH), - "build/", - os.environ["BUILDBOT_NORMALESUP_HOST"] - ])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.NORMALESUP_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/build", masterdest=E.NORMALESUP_RELEASE_PATH, - url="https://www.immae.eu/recherche")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.NORMALESUP_RELEASE_PATH))) - - return util.BuilderConfig(name="Normalesup_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def gsm_cells_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_GSMCells"] + ":${PATH}", - "IN_BUILDBOT": "yes", - } - master_env = { - "HTACCESS": ''' - Options +FollowSymLinks - IndexIgnore * - ''' - } - for k, v in os.environ.items(): - if k.startswith("BUILDBOT_GSM_CELLS_"): - path_env[k[len("BUILDBOT_GSM_CELLS_"):]] = v - - script = os.environ["BUILDBOT_PROJECT_DIR"] + "/scripts/lacells_download" - factory = util.BuildFactory() - factory.addStep(steps.ShellCommand(name="download files", - logEnviron=False, haltOnFailure=True, command=[script], env=path_env)) - factory.addStep(steps.ShellCommand(name="give read access to all files", - logEnviron=False, haltOnFailure=True, - command="chmod a+r lacells.db", env=path_env)) - factory.addStep(steps.FileUpload(workersrc="lacells.db", - masterdest=(E.GSMCELLS_RELEASE_PATH+"/lacells.db"), url=(E.GSMCELLS_RELEASE_URL+"/lacells.db"))) - factory.addStep(steps.MasterShellCommand(command="touch {}/.duplicity-ignore".format(E.GSMCELLS_RELEASE_PATH))) - factory.addStep(steps.MasterShellCommand(command='echo "$HTACCESS" > {}/.htaccess'.format(E.GSMCELLS_RELEASE_PATH), - env=master_env)) - factory.addStep(steps.MasterShellCommand(command="ln -sf lacells.db {}/lacells.db.new".format(E.GSMCELLS_RELEASE_PATH))) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.GSMCELLS_RELEASE_PATH))) - - return util.BuilderConfig(name="GSMCells_build", workernames=["generic-worker-immae-eu"], factory=factory) diff --git a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download b/modules/private/buildbot/projects/immaeEu/scripts/lacells_download deleted file mode 100755 index 1193cf3..0000000 --- a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env bash - -# FLG - Fast Lacells.db Generator -# -# Simple script to quickly download and generate lacells.db for LocalGSMBackend by n76 -# https://github.com/n76/Local-GSM-Backend -# Uses Mozilla Location Service, OpenCellID and radiocells.org databases as source -# Based on lacells-creator by wvengen and n76 -# -# Licensed under GPLv3 or later -# (C)2016 Sebastian Obrusiewicz -# sobrus@o2.pl - -if [ -z "$IN_BUILDBOT" ]; then -#DEFAULT_CONFIG_BEGIN -ENABLE_OCI=1 #enable OpenCellID data source -ENABLE_MOZ=1 #enable Mozilla Location Services (MLS) data source -ENABLE_RCO=0 #enable radiocells.org data source (it can be quite slow) - -# See https://en.wikipedia.org/wiki/Mobile_country_code -# 208 France -MCC="" #contry codes separated with "|", for example "260|262". Leave dot+asterisk ".*" for all countries -RCO_SRC_FILE="fr.sqlite" #radiocells.org source database file, set "openbmap.sqlite" for entire world database, see https://radiocells.org/downloads for smaller country specific files, for example "pl.sqlite" for Poland -RADIO="" #you can remove LTE if your phone does not support it -TOKEN="" #your OCID token, required to download from OpenCellID. Get your free token at https://opencellid.org/ -fi -TMPDIR='.' #for temporary files only, use disk if you don't have enough RAM, AND remember to have enough disk space in /var/tmp for sqlite temporary files -KEEP_FILES=1 #whether to keep (1) or delete (0) the CSV files after processing - -#do not edit following variables, unless you know what you're doing -EMPTY=',,,,,,,,,,,,,' #dummy empty file for disabled sources -OCI_FILE=$TMPDIR"/ocid.csv" #opencellid temporary file -MOZ_FILE=$TMPDIR"/mozilla.csv" #mozilla temporary file -RCO_FILE=$TMPDIR"/rco.csv" #radiocells.org temporary file -#DEFAULT_CONFIG_END - -#USER_CONFIG_BEGIN -BINDIR=$( dirname "$(readlink -f "$0")" ) #" -if [[ -f "${BINDIR}/config" ]]; then - . "${BINDIR}/config" -fi -#USER_CONFIG_END - -function manage_backup -{ - file=$1 - if [ -s $file ] - then - if [ $KEEP_FILES == "1" ] - then - gzip -kf $file - fi - elif [ -s $file".gz" ] && [ "${file##*.}" == "csv" ] - then - echo "Using" $file".gz backup file" - gzip -dkf $file".gz" - fi -} - - -function download_ocid -{ - URL="https://opencellid.org/ocid/downloads?token=${TOKEN}&type=full&file=cell_towers.csv.gz" - if [ $ENABLE_OCI == "1" ] - then - wget -qO- "$URL" | gunzip | egrep "^($RADIO),($MCC)," > $OCI_FILE - manage_backup $OCI_FILE - else - echo $EMPTY > $OCI_FILE - fi -} - -function download_mozilla -{ - if [ $ENABLE_MOZ == "1" ] - then - NW=`date -u "+%Y-%m-%d"` - wget -qO- "https://d17pt8qph6ncyq.cloudfront.net/export/MLS-full-cell-export-${NW}T000000.csv.gz" | gunzip | egrep "^($RADIO),($MCC)," > $MOZ_FILE - manage_backup $MOZ_FILE - else - echo $EMPTY > $MOZ_FILE - fi -} - -function download_radiocells -{ - if [ $ENABLE_RCO == "1" ] - then - RCO_SELECT="SELECT technology, mcc, mnc, area, cid, NULL, longitude, latitude, 1000 accuracy, measurements, NULL, NULL, NULL, NULL FROM cell_zone;" - wget -qO- "https://cdn.radiocells.org/"$RCO_SRC_FILE > $TMPDIR"/"$RCO_SRC_FILE - sqlite3 -header -csv $TMPDIR"/"$RCO_SRC_FILE "$RCO_SELECT" | egrep "^($RADIO),($MCC)," > $RCO_FILE - rm $TMPDIR"/"$RCO_SRC_FILE - manage_backup $RCO_FILE - else - echo $EMPTY > $RCO_FILE - fi -} - -echo "Downloading data" - -download_ocid & -OP=$! -download_mozilla & -MO=$! -download_radiocells & -RO=$! - -wait $OP -wait $MO -wait $RO - -if [ -s $MOZ_FILE ] && [ -s $OCI_FILE ] && [ -s $RCO_FILE ] -then - -manage_backup lacells.db -rm lacells.db - -echo "Generating database" - -sqlite3 lacells.db <<-SQL -PRAGMA synchronous = OFF; -PRAGMA journal_mode = OFF; - -CREATE TEMP TABLE cells_import (radio TEXT,mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,unit STRING,longitude NUMERIC,latitude NUMERIC,accuracy INTEGER,samples INTEGER,changeable BOOLEAN,created INTEGER,updated INTEGER, avgSignal INTEGER); -CREATE TABLE cells (mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,longitude REAL,latitude REAL,altitude REAL,accuracy REAL,samples INTEGER); - -.header on -.mode csv - -.import "$OCI_FILE" cells_import -.import "$MOZ_FILE" cells_import -.import "$RCO_FILE" cells_import - -UPDATE cells_import SET samples=1 WHERE samples IS NULL OR samples < 1; - -INSERT INTO cells -SELECT mcc, mnc, lac, cid, - sum(longitude * samples) / sum(samples) as longitude, - sum(latitude * samples) / sum(samples) as latitude, - -1 as altitude, - sum(accuracy * samples) / sum(samples) as accuracy, - sum(samples) as samples -FROM cells_import -GROUP BY mcc, mnc, lac, cid; - -DROP TABLE cells_import; - -UPDATE cells SET accuracy=500 WHERE accuracy < 500; -UPDATE cells SET accuracy=100000 WHERE accuracy > 100000; - -CREATE INDEX _idx1 ON cells (mcc, mnc, lac, cid); -CREATE INDEX _idx2 ON cells (lac, cid); - -VACUUM; -SQL - -else - echo "Download error" -fi - -rm $OCI_FILE -rm $MOZ_FILE -rm $RCO_FILE diff --git a/modules/private/buildbot/projects/test/__init__.py b/modules/private/buildbot/projects/test/__init__.py deleted file mode 100644 index e2f6f82..0000000 --- a/modules/private/buildbot/projects/test/__init__.py +++ /dev/null @@ -1,197 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import buildbot_common.libvirt as ilibvirt -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "test" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"] - WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET) - RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) - RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) - GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git" - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH - PUPPET_HOST = "root@backup-1.v.immae.eu" - LDAP_HOST = "ldap.immae.eu" - LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu" - XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary" - TITLE = "Test project" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - if args["category"] == "deploy_webhook": - args = { - "category": "deploy_webhook", - "comments": "", - "repository": "", - "author": "unknown", - "project": "TestProject", - "properties": { - "environment": args.get("environment", "integration"), - "build": "test_{}.tar.gz".format(args.get("branch", "master")) - } - } - - return ([args], None) - -def deploy_hook_scheduler(project, timer=1): - return schedulers.AnyBranchScheduler( - change_filter=util.ChangeFilter(category="deploy_webhook", project=project), - name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)]) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(ilibvirt.LibVirtWorker("test-build", - open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(), - ilibvirt.Connection(E.LIBVIRT_URL), - E.WORKER_HOST)) - c['workers'].append(ilibvirt.LibVirtWorker("test-deploy", - open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(), - ilibvirt.Connection(E.LIBVIRT_URL), - E.WORKER_HOST)) - - c['schedulers'].append(hook_scheduler("TestProject", timer=1)) - c['schedulers'].append(force_scheduler("force_test", ["TestProject_build"])) - c['schedulers'].append(deploy_scheduler("deploy_test", ["TestProject_deploy"])) - c['schedulers'].append(deploy_hook_scheduler("TestProject", timer=1)) - - c['builders'].append(factory()) - c['builders'].append(deploy_factory()) - - c['services'].append(SlackStatusPush( - name="slack_status_test_project", - builders=["TestProject_build", "TestProject_deploy"], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - c['services'].append(XMPPStatusPush( - name="xmpp_status_test_project", - builders=["TestProject_build", "TestProject_deploy"], - recipients=E.XMPP_RECIPIENTS, - password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip())) - -def factory(): - package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch) - package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch) - package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch) - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, - repourl=E.GIT_URL, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="env", - logEnviron=False, command=["env"])) - factory.addStep(steps.ShellCommand(name="pwd", - logEnviron=False, command=["pwd"])) - factory.addStep(steps.ShellCommand(name="true", - logEnviron=False, command=["true"])) - factory.addStep(steps.ShellCommand(name="echo", - logEnviron=False, command=["echo", package])) - factory.addSteps(package_and_upload(package, package_dest, package_url)) - - return util.BuilderConfig(name="TestProject_build", workernames=["test-build"], factory=factory) - - -def compute_build_infos(): - @util.renderer - def compute(props): - import re, hashlib - build_file = props.getProperty("build") - package_dest = "{}/{}".format(E.RELEASE_PATH, build_file) - version = re.match(r"{0}_(.*).tar.gz".format("test"), build_file).group(1) - with open(package_dest, "rb") as f: - sha = hashlib.sha256(f.read()).hexdigest() - return { - "build_version": version, - "build_hash": sha, - } - return compute - -@util.renderer -def puppet_host(props): - return E.PUPPET_HOST - -def deploy_factory(): - package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH)) - - factory = util.BuildFactory() - factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) - factory.addStep(steps.SetProperties(properties=compute_build_infos())) - factory.addStep(LdapPush(environment=util.Property("environment"), - build_version=util.Property("build_version"), - build_hash=util.Property("build_hash"), - ldap_password=util.Secret("ldap"))) - factory.addStep(steps.MasterShellCommand(command=[ - "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host])) - return util.BuilderConfig(name="TestProject_deploy", workernames=["test-deploy"], factory=factory) - -from twisted.internet import defer -from buildbot.process.buildstep import FAILURE -from buildbot.process.buildstep import SUCCESS -from buildbot.process.buildstep import BuildStep - -class LdapPush(BuildStep): - name = "LdapPush" - renderables = ["environment", "build_version", "build_hash", "ldap_password"] - - def __init__(self, **kwargs): - self.environment = kwargs.pop("environment") - self.build_version = kwargs.pop("build_version") - self.build_hash = kwargs.pop("build_hash") - self.ldap_password = kwargs.pop("ldap_password") - self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST) - super().__init__(**kwargs) - - def run(self): - import json - from ldap3 import Reader, Writer, Server, Connection, ObjectDef - server = Server(self.ldap_host) - conn = Connection(server, - user=E.LDAP_DN, - password=self.ldap_password) - conn.bind() - obj = ObjectDef("immaePuppetClass", conn) - r = Reader(conn, obj, - "cn=test.{},{}".format(self.environment, E.LDAP_ROLES_BASE)) - r.search() - if len(r) > 0: - w = Writer.from_cursor(r) - for value in w[0].immaePuppetJson.values: - config = json.loads(value) - if "test_version" in config: - config["test_version"] = self.build_version - config["test_sha256"] = self.build_hash - w[0].immaePuppetJson -= value - w[0].immaePuppetJson += json.dumps(config, indent=" ") - w.commit() - return defer.succeed(SUCCESS) - return defer.succeed(FAILURE) diff --git a/modules/private/certificates.nix b/modules/private/certificates.nix deleted file mode 100644 index 9879946..0000000 --- a/modules/private/certificates.nix +++ /dev/null @@ -1,199 +0,0 @@ -{ lib, pkgs, config, name, ... }: -{ - options.myServices.certificates = { - enable = lib.mkEnableOption "enable certificates"; - webroot = lib.mkOption { - readOnly = true; - default = "/var/lib/acme/acme-challenges"; - }; - certConfig = lib.mkOption { - default = { - webroot = lib.mkForce null; # avoids creation of tmpfiles - email = "ismael@bouya.org"; - postRun = builtins.concatStringsSep "\n" [ - (lib.optionalString config.services.httpd.Prod.enable "systemctl reload httpdProd.service") - (lib.optionalString config.services.httpd.Tools.enable "systemctl reload httpdTools.service") - (lib.optionalString config.services.httpd.Inte.enable "systemctl reload httpdInte.service") - (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service") - ]; - extraLegoRenewFlags = [ "--reuse-key" ]; - keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121 - }; - description = "Default configuration for certificates"; - }; - }; - - config = lib.mkIf config.myServices.certificates.enable { - services.nginx = { - recommendedTlsSettings = true; - virtualHosts = { - "${config.hostEnv.fqdn}" = { - acmeRoot = config.myServices.certificates.webroot; - useACMEHost = name; - forceSSL = true; - }; - }; - }; - services.websites.certs = config.myServices.certificates.certConfig; - myServices.databasesCerts = config.myServices.certificates.certConfig; - myServices.ircCerts = config.myServices.certificates.certConfig; - - security.acme.acceptTerms = true; - security.acme.preliminarySelfsigned = true; - - security.acme.certs = { - "${name}" = config.myServices.certificates.certConfig // { - domain = config.hostEnv.fqdn; - }; - }; - - users.users.acme = { - uid = config.ids.uids.acme; - group = "acme"; - description = "Acme user"; - }; - users.groups.acme = { - gid = config.ids.gids.acme; - }; - - systemd.services = lib.attrsets.mapAttrs' (k: v: - lib.attrsets.nameValuePair "acme-selfsigned-${k}" { - wantedBy = [ "acme-selfsigned-certificates.target" ]; - script = lib.mkAfter '' - cp $workdir/server.crt ${config.security.acme.certs."${k}".directory}/cert.pem - chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/cert.pem - chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/cert.pem - - cp $workdir/ca.crt ${config.security.acme.certs."${k}".directory}/chain.pem - chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/chain.pem - chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/chain.pem - ''; - } - ) config.security.acme.certs // - lib.attrsets.mapAttrs' (k: data: - lib.attrsets.nameValuePair "acme-${k}" { - after = lib.mkAfter [ "bind.service" ]; - serviceConfig = - let - cfg = config.security.acme; - hashOptions = let - domains = builtins.concatStringsSep "," ( - [ data.domain ] ++ (builtins.attrNames data.extraDomains) - ); - certOptions = builtins.concatStringsSep "," [ - (if data.ocspMustStaple then "must-staple" else "no-must-staple") - ]; - in - builtins.hashString "sha256" (builtins.concatStringsSep ";" [ data.keyType domains certOptions ]); - accountsDir = "accounts-${data.keyType}"; - lpath = "acme/${k}"; - apath = "/var/lib/${lpath}"; - spath = "/var/lib/acme/.lego/${k}"; - fileMode = if data.allowKeysForGroup then "640" else "600"; - dirFileMode = if data.allowKeysForGroup then "750" else "700"; - globalOpts = [ "-d" data.domain "--email" data.email "--path" "." "--key-type" data.keyType ] - ++ lib.optionals (cfg.acceptTerms) [ "--accept-tos" ] - ++ lib.optionals (data.dnsProvider != null && !data.dnsPropagationCheck) [ "--dns.disable-cp" ] - ++ lib.concatLists (lib.mapAttrsToList (name: root: [ "-d" name ]) data.extraDomains) - ++ (if data.dnsProvider != null then [ "--dns" data.dnsProvider ] else [ "--http" "--http.webroot" config.myServices.certificates.webroot ]) - ++ lib.optionals (cfg.server != null || data.server != null) ["--server" (if data.server == null then cfg.server else data.server)]; - certOpts = lib.optionals data.ocspMustStaple [ "--must-staple" ]; - runOpts = lib.escapeShellArgs (globalOpts ++ [ "run" ] ++ certOpts); - renewOpts = lib.escapeShellArgs (globalOpts ++ - [ "renew" "--days" (builtins.toString cfg.validMinDays) ] ++ - certOpts ++ data.extraLegoRenewFlags); - forceRenewOpts = lib.escapeShellArgs (globalOpts ++ - [ "renew" "--days" "999" ] ++ - certOpts ++ data.extraLegoRenewFlags); - keyName = builtins.replaceStrings ["*"] ["_"] data.domain; - in { - User = lib.mkForce "acme"; - Group = lib.mkForce "acme"; - WorkingDirectory = lib.mkForce spath; - StateDirectory = lib.mkForce "acme/.lego/${k} acme/.lego/${accountsDir}"; - ExecStartPre = - let - script = pkgs.writeScript "acme-prestart" '' - #!${pkgs.runtimeShell} -e - install -m 0755 -o acme -g acme -d ${config.myServices.certificates.webroot} - ''; - in - lib.mkForce "+${script}"; - ExecStart = lib.mkForce (pkgs.writeScript "acme-start" '' - #!${pkgs.runtimeShell} -e - # lego doesn't check key type after initial creation, we - # need to check for him - if [ -L ${spath}/accounts -o -d ${spath}/accounts ]; then - if [ -L ${spath}/accounts -a "$(readlink ${spath}/accounts)" != ../${accountsDir} ]; then - ln -sfn ../${accountsDir} ${spath}/accounts - mv -f ${spath}/certificates/${keyName}.key ${spath}/certificates/${keyName}.key.old - fi - else - ln -s ../${accountsDir} ${spath}/accounts - fi - # check if domain changed: lego doesn't check by itself - if [ ! -e ${spath}/certificates/${keyName}.crt -o ! -e ${spath}/certificates/${keyName}.key -o ! -e "${spath}/accounts/acme-v02.api.letsencrypt.org/${data.email}/account.json" ]; then - ${pkgs.lego}/bin/lego ${runOpts} - elif [ ! -f ${spath}/currentDomains -o "$(cat ${spath}/currentDomains)" != "${hashOptions}" ]; then - ${pkgs.lego}/bin/lego ${forceRenewOpts} - else - ${pkgs.lego}/bin/lego ${renewOpts} - fi - ''); - ExecStartPost = - let - ISRG_Root_X1 = pkgs.fetchurl { - url = "https://letsencrypt.org/certs/isrgrootx1.pem"; - sha256 = "1la36n2f31j9s03v847ig6ny9lr875q3g7smnq33dcsmf2i5gd92"; - }; - fix_ISRG_Root_X1 = pkgs.writeScript "fix-pem" '' - for file in chain fullchain full; do - if grep -q MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA "$file.pem"; then - cat ${ISRG_Root_X1} | grep -v " CERTIFICATE" | \ - sed -i.bak -ne "/MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ {r /dev/stdin" -e ":a; n; /Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5/ { b }; ba };p" $file.pem - fi - done - ''; - script = pkgs.writeScript "acme-post-start" '' - #!${pkgs.runtimeShell} -e - install -m 0755 -o root -g root -d /var/lib/acme - install -m 0${dirFileMode} -o ${data.user} -g ${data.group} -d /var/lib/acme/${k} - cd /var/lib/acme/${k} - - # Test that existing cert is older than new cert - KEY=${spath}/certificates/${keyName}.key - KEY_CHANGED=no - if [ -e $KEY -a $KEY -nt key.pem ]; then - KEY_CHANGED=yes - cp -p ${spath}/certificates/${keyName}.key key.pem - cp -p ${spath}/certificates/${keyName}.crt fullchain.pem - cp -p ${spath}/certificates/${keyName}.issuer.crt chain.pem - ln -sf fullchain.pem cert.pem - cat key.pem fullchain.pem > full.pem - echo -n "${hashOptions}" > ${spath}/currentDomains - fi - - ${fix_ISRG_Root_X1} - chmod ${fileMode} *.pem - chown '${data.user}:${data.group}' *.pem - - if [ "$KEY_CHANGED" = "yes" ]; then - : # noop in case postRun is empty - ${data.postRun} - fi - ''; - in - lib.mkForce "+${script}"; - }; - } - ) config.security.acme.certs // - { - httpdProd = lib.mkIf config.services.httpd.Prod.enable - { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; }; - httpdTools = lib.mkIf config.services.httpd.Tools.enable - { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; }; - httpdInte = lib.mkIf config.services.httpd.Inte.enable - { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; }; - }; - }; -} diff --git a/modules/private/databases/openldap/default.nix b/modules/private/databases/openldap/default.nix deleted file mode 100644 index d35aca0..0000000 --- a/modules/private/databases/openldap/default.nix +++ /dev/null @@ -1,147 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.databases.openldap; - ldapConfig = let - eldiron_schemas = pkgs.callPackage ./eldiron_schemas.nix {}; - in '' - ${eldiron_schemas} - - pidfile ${cfg.pids.pid} - argsfile ${cfg.pids.args} - - moduleload back_hdb - backend hdb - - TLSCertificateFile ${config.security.acme.certs.ldap.directory}/cert.pem - TLSCertificateKeyFile ${config.security.acme.certs.ldap.directory}/key.pem - TLSCACertificateFile ${config.security.acme.certs.ldap.directory}/fullchain.pem - TLSCACertificatePath ${pkgs.cacert.unbundled}/etc/ssl/certs/ - #This makes openldap crash - #TLSCipherSuite DEFAULT - - sasl-host kerberos.immae.eu - ''; -in -{ - options.myServices.databases = { - openldap = { - enable = lib.mkOption { - default = false; - example = true; - description = "Whether to enable ldap"; - type = lib.types.bool; - }; - baseDn = lib.mkOption { - type = lib.types.str; - description = '' - Base DN for LDAP - ''; - }; - rootDn = lib.mkOption { - type = lib.types.str; - description = '' - Root DN - ''; - }; - rootPw = lib.mkOption { - type = lib.types.str; - description = '' - Root (Hashed) password - ''; - }; - accessFile = lib.mkOption { - type = lib.types.path; - description = '' - The file path that defines the access - ''; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/openldap"; - description = '' - The directory where Openldap stores its data. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/slapd"; - description = '' - The directory where Openldap puts sockets and pid files. - ''; - }; - # Output variables - pids = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - pid = "${cfg.socketsDir}/slapd.pid"; - args = "${cfg.socketsDir}/slapd.args"; - }; - readOnly = true; - description = '' - Slapd pid files - ''; - }; - }; - }; - - config = lib.mkIf cfg.enable { - secrets.keys = { - "ldap/password" = { - permissions = "0400"; - user = "openldap"; - group = "openldap"; - text = "rootpw ${cfg.rootPw}"; - }; - "ldap/access" = { - permissions = "0400"; - user = "openldap"; - group = "openldap"; - text = builtins.readFile cfg.accessFile; - }; - "ldap" = { - permissions = "0500"; - user = "openldap"; - group = "openldap"; - isDir = true; - }; - }; - users.users.openldap.extraGroups = [ "keys" ]; - networking.firewall.allowedTCPPorts = [ 636 389 ]; - - security.acme.certs."ldap" = config.myServices.databasesCerts // { - user = "openldap"; - group = "openldap"; - domain = "ldap.immae.eu"; - postRun = '' - systemctl restart openldap.service - ''; - }; - - services.filesWatcher.openldap = { - restart = true; - paths = [ config.secrets.fullPaths."ldap" ]; - }; - - services.openldap = { - enable = true; - dataDir = cfg.dataDir; - urlList = [ "ldap://" "ldaps://" ]; - logLevel = "none"; - extraConfig = ldapConfig; - extraDatabaseConfig = '' - moduleload memberof - overlay memberof - - moduleload syncprov - overlay syncprov - syncprov-checkpoint 100 10 - - include ${config.secrets.fullPaths."ldap/access"} - ''; - rootpwFile = config.secrets.fullPaths."ldap/password"; - suffix = cfg.baseDn; - rootdn = cfg.rootDn; - database = "hdb"; - }; - }; -} diff --git a/modules/private/databases/openldap/eldiron_schemas.nix b/modules/private/databases/openldap/eldiron_schemas.nix deleted file mode 100644 index cf45ebe..0000000 --- a/modules/private/databases/openldap/eldiron_schemas.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ fetchurl, openldap }: -let - kerberosSchema = fetchurl { - url = "https://raw.githubusercontent.com/krb5/krb5/0bdd3b8058ed4ec9acc050e316bea86f6830b15f/src/plugins/kdb/ldap/libkdb_ldap/kerberos.schema"; - sha256 = "17fnkkf6s3lznsl7wp6914pqsc78d038rh38l638big8z608ksww"; - }; - puppetSchema = fetchurl { - url = "https://raw.githubusercontent.com/puppetlabs/puppet/bf7c108825ffdb5ea89cf3e500d55d27ab64b8d2/ext/ldap/puppet.schema"; - sha256 = "11bjf5zfvqlim7p9vddcafs0wiq3v8ys77x8h6fbp9c6bdfh0awh"; - }; - schemas = [ - #"${openldap}/etc/schema/core.schema" - #"${openldap}/etc/schema/cosine.schema" - #"${openldap}/etc/schema/inetorgperson.schema" - #"${openldap}/etc/schema/nis.schema" - puppetSchema - kerberosSchema - ./immae.schema - ]; -in - builtins.concatStringsSep "\n" (map (v: "include ${v}") schemas) diff --git a/modules/private/default.nix b/modules/private/default.nix deleted file mode 100644 index 9108a92..0000000 --- a/modules/private/default.nix +++ /dev/null @@ -1,136 +0,0 @@ -let -set = { - # adatped from nixpkgs/nixos/modules/services/web-servers/apache-httpd/default.nix - httpdInte = import ../websites/httpd-service-builder.nix { httpdName = "Inte"; withUsers = false; }; - httpdProd = import ../websites/httpd-service-builder.nix { httpdName = "Prod"; withUsers = false; }; - httpdTools = import ../websites/httpd-service-builder.nix { httpdName = "Tools"; withUsers = true; }; - - databases = ./databases; - mariadb = ./databases/mariadb.nix; - openldap = ./databases/openldap; - postgresql = ./databases/postgresql.nix; - redis = ./databases/redis.nix; - postgresqlReplication = ./databases/postgresql_replication.nix; - mariadbReplication = ./databases/mariadb_replication.nix; - redisReplication = ./databases/redis_replication.nix; - openldapReplication = ./databases/openldap_replication.nix; - - websites = ./websites; - gemini = ./gemini; - - - # Personal websites - bakeerCloud = ./websites/bakeer/cloud.nix; - - capitainesLandingPages = ./websites/capitaines/landing_pages.nix; - - chloeInte = ./websites/chloe/integration.nix; - chloeProd = ./websites/chloe/production.nix; - - cipcaSympa = ./websites/cip-ca/sympa.nix; - - connexionswingInte = ./websites/connexionswing/integration.nix; - connexionswingProd = ./websites/connexionswing/production.nix; - - deniseDenisejeromeProd = ./websites/denise/denisejerome.nix; - deniseEvariste = ./websites/denise/evariste.nix; - deniseOMS = ./websites/denise/oms.nix; - deniseBingo = ./websites/denise/bingo.nix; - deniseAventuriers = ./websites/denise/aventuriers.nix; - deniseProduction = ./websites/denise/production.nix; - - emiliaMoodle = ./websites/emilia/moodle.nix; - emiliaAtelierFringant = ./websites/emilia/atelierfringant.nix; - - florianApp = ./websites/florian/app.nix; - florianInte = ./websites/florian/integration.nix; - florianProd = ./websites/florian/production.nix; - - immaeProd = ./websites/immae/production.nix; - immaeRelease = ./websites/immae/release.nix; - immaeTemp = ./websites/immae/temp.nix; - - isabelleAtenInte = ./websites/isabelle/aten_integration.nix; - isabelleAtenProd = ./websites/isabelle/aten_production.nix; - isabelleIridologie = ./websites/isabelle/iridologie.nix; - - jeromeNaturaloutil = ./websites/jerome/naturaloutil.nix; - - leilaProd = ./websites/leila/production.nix; - - ludivineInte = ./websites/ludivine/integration.nix; - ludivineProd = ./websites/ludivine/production.nix; - - nassimeProd = ./websites/nassime/production.nix; - - nathVillon = ./websites/nath/villon.nix; - - papaMaisonBbc = ./websites/papa/maison_bbc.nix; - papaSurveillance = ./websites/papa/surveillance.nix; - - patrickFodellaEcolyeu = ./websites/patrick_fodella/ecolyeu.nix; - patrickFodellaAltermondia = ./websites/patrick_fodella/altermondia.nix; - - piedsjalouxInte = ./websites/piedsjaloux/integration.nix; - piedsjalouxProd = ./websites/piedsjaloux/production.nix; - - ressourcerieBanonProd = ./websites/ressourcerie_banon/production.nix; - ressourcerieBanonCloud = ./websites/ressourcerie_banon/cloud.nix; - ressourcerieBanonCryptpad = ./websites/ressourcerie_banon/cryptpad.nix; - - richieProd = ./websites/richie/production.nix; - - sydenPeertube = ./websites/syden/peertube.nix; - - teliotortayProd = ./websites/telio_tortay/production.nix; - - # Tools - assetsTools = ./websites/tools/assets; - cloudTool = ./websites/tools/cloud; - cloudFarmTool = ./websites/tools/cloud/farm.nix; - cryptpadTool = ./websites/tools/cryptpad; - cryptpadFarmTool = ./websites/tools/cryptpad/farm.nix; - commentoTool = ./websites/tools/commento; - davTool = ./websites/tools/dav; - vpnTool = ./websites/tools/vpn; - dbTool = ./websites/tools/db; - diasporaTool = ./websites/tools/diaspora; - etherTool = ./websites/tools/ether; - gitTool = ./websites/tools/git; - imTool = ./websites/tools/im; - mastodonTool = ./websites/tools/mastodon; - mgoblinTool = ./websites/tools/mgoblin; - peertubeTool = ./websites/tools/peertube; - performanceTool = ./websites/tools/performance; - toolsTool = ./websites/tools/tools; - mailTool = ./websites/tools/mail; - statsTool = ./websites/tools/stats; - - # Games - codenamesGame = ./websites/tools/games/codenames; - terraformingMarsGame = ./websites/tools/games/terraforming-mars; - - mail = ./mail; - - buildbot = ./buildbot; - certificates = ./certificates.nix; - gitolite = ./gitolite; - irc = ./irc.nix; - pub = ./pub; - tasks = ./tasks; - dns = ./dns.nix; - ftp = ./ftp.nix; - mpd = ./mpd.nix; - ejabberd = ./ejabberd; - ssh = ./ssh; - monitoring = ./monitoring; - status = ./monitoring/status.nix; - status_engine = ./monitoring/status_engine.nix; - vpn = ./vpn; - - environment = ./environment.nix; - system = ./system.nix; - loginctl-linger = ./loginctl-linger.nix; -}; -in -builtins.listToAttrs (map (attr: { name = "priv${attr}"; value = set.${attr}; }) (builtins.attrNames set)) diff --git a/modules/private/dns.nix b/modules/private/dns.nix deleted file mode 100644 index 1d7fd52..0000000 --- a/modules/private/dns.nix +++ /dev/null @@ -1,197 +0,0 @@ -{ lib, pkgs, config, ... }: -{ - options.myServices.dns.enable = lib.mkEnableOption "enable DNS resolver"; - config = let - # taken from unstable - cartesianProductOfSets = attrsOfLists: with lib; - lib.foldl' (listOfAttrs: attrName: - concatMap (attrs: - map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName} - ) listOfAttrs - ) [{}] (attrNames attrsOfLists); - cfg = config.services.bind; - keyIncludes = builtins.concatStringsSep "\n" (map (v: "include \"${config.secrets.fullPaths."bind/${v}.key"}\";") (builtins.attrNames config.myEnv.dns.keys)); - cartProduct = lib.foldr - (s: servers: servers // { ${s.masters} = lib.unique ((servers.${s.masters} or []) ++ [s.keys]); }) - {} - (lib.unique (lib.concatMap (z: cartesianProductOfSets { masters = z.masters or []; keys = z.keys or []; }) config.myEnv.dns.slaveZones)); - toKeyList = servers: keys: builtins.concatStringsSep "\n" (map (s: '' - server ${s} { - keys { ${builtins.concatStringsSep ";" keys}; }; - }; - '') servers); - serverIncludes = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: toKeyList (lib.flatten (builtins.attrValues config.myEnv.dns.ns."${n}"))) cartProduct); - configFile = pkgs.writeText "named.conf" '' - include "/etc/bind/rndc.key"; - controls { - inet 127.0.0.1 allow {localhost;} keys {"rndc-key";}; - }; - - acl cachenetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.cacheNetworks} }; - acl badnetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.blockedNetworks} }; - - options { - listen-on { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOn} }; - listen-on-v6 { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOnIpv6} }; - allow-query { cachenetworks; }; - blackhole { badnetworks; }; - forward first; - forwarders { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.forwarders} }; - directory "/var/run/named"; - pid-file "/var/run/named/named.pid"; - ${cfg.extraOptions} - }; - - ${keyIncludes} - ${serverIncludes} - - ${cfg.extraConfig} - - ${ lib.concatMapStrings - ({ name, file, master ? true, extra ? "", slaves ? [], masters ? [] }: - '' - zone "${name}" { - type ${if master then "master" else "slave"}; - file "${file}"; - ${ if lib.lists.length slaves > 0 then - '' - allow-transfer { - ${lib.concatMapStrings (ip: "${ip};\n") slaves} - }; - '' else ""} - ${ if lib.lists.length masters > 0 then - '' - masters { - ${lib.concatMapStrings (ip: "${ip};\n") masters} - }; - '' else ""} - allow-query { any; }; - ${extra} - }; - '') - cfg.zones } - ''; - mxes = lib.attrsets.filterAttrs - (n: v: v.mx.enable) - config.myEnv.servers; - ip4mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList - (n: v: "${v.mx.subdomain} IN A ${v.ips.main.ip4}") - mxes); - ip6mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList - (n: v: builtins.concatStringsSep "\n" (map (i: "${v.mx.subdomain} IN AAAA ${i}") v.ips.main.ip6)) - mxes); - mxmxes = n: conf: builtins.concatStringsSep "\n" (lib.mapAttrsToList - (_: v: "${n} IN MX ${v.mx.priority} ${v.mx.subdomain}.${conf.name}.") - mxes); - in lib.mkIf config.myServices.dns.enable { - networking.firewall.allowedUDPPorts = [ 53 ]; - networking.firewall.allowedTCPPorts = [ 53 ]; - users.users.named.extraGroups = [ "keys" ]; - secrets.keys = lib.mapAttrs' (k: v: - lib.nameValuePair "bind/${k}.key" { - permissions = "0400"; - user = "named"; - text = '' - key "${k}" - { - algorithm ${v.algorithm}; - secret "${v.secret}"; - }; - ''; - } - ) config.myEnv.dns.keys; - services.bind = { - enable = true; - cacheNetworks = ["any"]; - configFile = configFile; - extraOptions = '' - allow-recursion { 127.0.0.1; }; - allow-transfer { none; }; - - notify-source ${config.myEnv.servers.eldiron.ips.main.ip4}; - notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6}; - version none; - hostname none; - server-id none; - ''; - zones = with config.myEnv.dns; - assert (builtins.substring ((builtins.stringLength soa.email)-1) 1 soa.email) != "."; - assert (builtins.substring ((builtins.stringLength soa.primary)-1) 1 soa.primary) != "."; - (map (conf: { - name = conf.name; - master = false; - file = "/var/run/named/${conf.name}.zone"; - masters = if lib.attrsets.hasAttr "masters" conf - then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.masters) - else []; - }) slaveZones) - ++ (map (conf: { - name = conf.name; - master = true; - extra = if lib.attrsets.hasAttr "extra" conf then conf.extra else ""; - slaves = if lib.attrsets.hasAttr "slaves" conf - then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.slaves) - else []; - file = pkgs.writeText "${conf.name}.zone" '' - $TTL 10800 - @ IN SOA ${soa.primary}. ${builtins.replaceStrings ["@"] ["."] soa.email}. ${soa.serial} ${soa.refresh} ${soa.retry} ${soa.expire} ${soa.ttl} - - ${lib.concatStringsSep "\n" (map (x: "@ IN NS ${x}.") (lib.concatMap (n: lib.attrsets.mapAttrsToList (k: v: k) ns.${n}) conf.ns))} - ${lib.optionalString (conf.withCAA != null) '' - ${conf.name}. IN CAA 0 issue "${conf.withCAA}" - ''} - - ${conf.entries} - - ${if lib.attrsets.hasAttr "withEmail" conf && lib.lists.length conf.withEmail > 0 then '' - ${ip4mxes} - ${ip6mxes} - ${lib.concatStringsSep "\n\n" (map (e: - let - n = if e.domain == "" then "@" else "${e.domain} "; - suffix = if e.domain == "" then "" else ".${e.domain}"; - in - '' - ; ------------------ mail: ${n} --------------------------- - ${mxmxes n conf} - - ; https://tools.ietf.org/html/rfc6186 - _submission._tcp${suffix} SRV 0 1 587 smtp.immae.eu. - _submissions._tcp${suffix} SRV 0 1 465 smtp.immae.eu. - _imap._tcp${suffix} SRV 0 1 143 imap.immae.eu. - _imaps._tcp${suffix} SRV 0 1 993 imap.immae.eu. - _pop3._tcp${suffix} SRV 10 1 110 pop3.immae.eu. - _pop3s._tcp${suffix} SRV 10 1 995 pop3.immae.eu. - _sieve._tcp${suffix} SRV 0 1 4190 imap.immae.eu. - - ; MTA-STS - ; https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/ - ; https://support.google.com/a/answer/9261504 - _mta-sts${suffix} IN TXT "v=STSv1;id=20200109150200Z" - _smtp._tls${suffix} IN TXT "v=TLSRPTv1;rua=mailto:postmaster+mta-sts@immae.eu" - mta-sts${suffix} IN A ${config.myEnv.servers.eldiron.ips.main.ip4} - ${builtins.concatStringsSep "\n" (map (i: "mta-sts${suffix} IN AAAA ${i}") config.myEnv.servers.eldiron.ips.main.ip6)} - - ; Mail sender authentications - ${n} IN TXT "v=spf1 mx ~all" - _dmarc${suffix} IN TXT "v=DMARC1; p=none; adkim=r; aspf=r; fo=1; rua=mailto:postmaster+rua@immae.eu; ruf=mailto:postmaster+ruf@immae.eu;" - ${if e.send then '' - immae_eu._domainkey${suffix} IN TXT ( "v=DKIM1; k=rsa; s=email; " - "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl3vLd8W5YAuumC5+ZT9OV7/14Pmh5JYtwyqKI3cfe9NnAqInt3xO4bZ7oqIxRKWN4SD39vm7O/QOvFdBt00ENOOzdP90s5gKw6eIP/4+vPTh0IWltAsmu9B2agzdtWUE7t2xFKIzEn8l9niRE2QYbVaqZv4sub98vY55fIgFoHtjkmNC7325S8fjDJGp6OPbyhAs6Xl5/adjF" - "0ko4Y2p6RaxLQfjlS0bxmK4Qg6C14pIXHtzVeqOuWrwApqt5+AULSn97iUtqV/IJlEEjC6DUR44t3C/G0G/k46iFclCqRRi0hdPrOHCtZDbtMubnTN9eaUiNpkXh1WnCflHwtjQwIDAQAB" ) - eldiron._domainkey${suffix} IN TXT ${config.myEnv.mail.dkim.eldiron.public} - '' else ""} - '') conf.withEmail)} - '' + (if conf.name == "immae.eu" then '' - ; ----------------- Accept DMARC reports ------------------- - ${lib.concatStringsSep "\n" ( - lib.flatten ( - map (z: map (e: "${e.domain}${if builtins.stringLength e.domain > 0 then "." else ""}${z.name}._report._dmarc IN TXT \"v=DMARC1;\"") (z.withEmail or [])) masterZones - ) - )} - '' else "") else ""} - ''; - }) masterZones); - }; - }; -} diff --git a/modules/private/environment.nix b/modules/private/environment.nix deleted file mode 100644 index 837d24b..0000000 --- a/modules/private/environment.nix +++ /dev/null @@ -1,1492 +0,0 @@ -{ config, lib, name, ... }: -with lib; -with types; -with lists; -let - ldapOptions = { - base = mkOption { description = "Base of the LDAP tree"; type = str; }; - host = mkOption { description = "Host to access LDAP"; type = str; }; - root_dn = mkOption { description = "DN of the root user"; type = str; }; - root_pw = mkOption { description = "Hashed password of the root user"; type = str; }; - replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; }; - replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; }; - }; - mkLdapOptions = name: more: mkOption { - description = "${name} LDAP configuration"; - type = submodule { - options = ldapOptions // { - dn = mkOption { description = "DN of the ${name} user"; type = str; }; - password = mkOption { description = "password of the ${name} user"; type = str; }; - filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; }; - } // more; - }; - }; - mysqlOptions = { - host = mkOption { description = "Host to access Mysql"; type = str; }; - remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; }; - port = mkOption { description = "Port to access Mysql"; type = str; }; - socket = mkOption { description = "Socket to access Mysql"; type = path; }; - systemUsers = mkOption { - description = "Attrs of user-passwords allowed to access mysql"; - type = attrsOf str; - }; - pam = mkOption { - description = "PAM configuration for mysql"; - type = submodule { - options = { - dn = mkOption { description = "DN to connect as to check users"; type = str; }; - password = mkOption { description = "DN password to connect as to check users"; type = str; }; - filter = mkOption { description = "filter to match users"; type = str; }; - }; - }; - }; - }; - mkMysqlOptions = name: more: mkOption { - description = "${name} mysql configuration"; - type = submodule { - options = mysqlOptions // { - database = mkOption { description = "${name} database"; type = str; }; - user = mkOption { description = "${name} user"; type = str; }; - password = mkOption { description = "mysql password of the ${name} user"; type = str; }; - } // more; - }; - }; - psqlOptions = { - host = mkOption { description = "Host to access Postgresql"; type = str; }; - port = mkOption { description = "Port to access Postgresql"; type = str; }; - socket = mkOption { description = "Socket to access Postgresql"; type = path; }; - pam = mkOption { - description = "PAM configuration for psql"; - type = submodule { - options = { - dn = mkOption { description = "DN to connect as to check users"; type = str; }; - password = mkOption { description = "DN password to connect as to check users"; type = str; }; - filter = mkOption { description = "filter to match users"; type = str; }; - }; - }; - }; - }; - mkPsqlOptions = name: mkOption { - description = "${name} psql configuration"; - type = submodule { - options = psqlOptions // { - database = mkOption { description = "${name} database"; type = str; }; - schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; }; - user = mkOption { description = "${name} user"; type = str; }; - password = mkOption { description = "psql password of the ${name} user"; type = str; }; - }; - }; - }; - redisOptions = { - host = mkOption { description = "Host to access Redis"; type = str; }; - port = mkOption { description = "Port to access Redis"; type = str; }; - socket = mkOption { description = "Socket to access Redis"; type = path; }; - dbs = mkOption { - description = "Attrs of db number. Each number should be unique to avoid collision!"; - type = attrsOf str; - }; - spiped_key = mkOption { - type = str; - description = '' - Key to use with spiped to make a secure channel to replication - ''; - }; - predixy = mkOption { - description = "Predixy configuration. Unused yet"; - type = submodule { - options = { - read = mkOption { type = str; description = "Read password"; }; - }; - }; - }; - }; - mkRedisOptions = name: mkOption { - description = "${name} redis configuration"; - type = submodule { - options = redisOptions // { - db = mkOption { description = "${name} database"; type = str; }; - }; - }; - }; - smtpOptions = { - host = mkOption { description = "Host to access SMTP"; type = str; }; - port = mkOption { description = "Port to access SMTP"; type = str; }; - }; - mkSmtpOptions = name: mkOption { - description = "${name} smtp configuration"; - type = submodule { - options = smtpOptions // { - email = mkOption { description = "${name} email"; type = str; }; - password = mkOption { description = "SMTP password of the ${name} user"; type = str; }; - }; - }; - }; - hostEnv = submodule { - options = { - fqdn = mkOption { - description = "Host FQDN"; - type = str; - }; - users = mkOption { - type = unspecified; - default = pkgs: []; - description = '' - Sublist of users from realUsers. Function that takes pkgs as - argument and gives an array as a result - ''; - }; - emails = mkOption { - default = []; - description = "List of e-mails that the server can be a sender of"; - type = listOf str; - }; - ldap = mkOption { - description = '' - LDAP credentials for the host - ''; - type = submodule { - options = { - password = mkOption { type = str; description = "Password for the LDAP connection"; }; - dn = mkOption { type = str; description = "DN for the LDAP connection"; }; - }; - }; - }; - mx = mkOption { - description = "subdomain and priority for MX server"; - default = { enable = false; }; - type = submodule { - options = { - enable = mkEnableOption "Enable MX"; - subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; }; - priority = mkOption { type = nullOr str; description = "Priority"; }; - }; - }; - }; - ips = mkOption { - description = '' - attrs of ip4/ip6 grouped by section - ''; - type = attrsOf (submodule { - options = { - ip4 = mkOption { - type = str; - description = '' - ip4 address of the host - ''; - }; - ip6 = mkOption { - type = listOf str; - default = []; - description = '' - ip6 addresses of the host - ''; - }; - }; - }); - }; - }; - }; -in -{ - options.myEnv = { - servers = mkOption { - description = '' - Attrs of servers information in the cluster (not necessarily handled by nixops) - ''; - default = {}; - type = attrsOf hostEnv; - }; - hetznerCloud = mkOption { - description = '' - Hetzner Cloud credential information - ''; - type = submodule { - options = { - authToken = mkOption { - type = str; - description = '' - The API auth token. - ''; - }; - }; - }; - }; - hetzner = mkOption { - description = '' - Hetzner credential information - ''; - type = submodule { - options = { - user = mkOption { type = str; description = "User"; }; - pass = mkOption { type = str; description = "Password"; }; - }; - }; - }; - sshd = mkOption { - description = '' - sshd service credential information - ''; - type = submodule { - options = { - rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; }; - ldap = mkOption { - description = '' - LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn - ''; - type = submodule { - options = { - password = mkOption { description = "Password"; type = str; }; - }; - }; - }; - }; - }; - }; - ports = mkOption { - description = '' - non-standard reserved ports. Must be unique! - ''; - type = attrsOf port; - default = {}; - apply = let - noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x)); - in - x: if isAttrs x && noDupl x then x else throw "Non unique values for ports"; - }; - httpd = mkOption { - description = '' - httpd service credential information - ''; - type = submodule { - options = { - ldap = mkOption { - description = '' - LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn - ''; - type = submodule { - options = { - password = mkOption { description = "Password"; type = str; }; - }; - }; - }; - }; - }; - }; - smtp = mkOption { - type = submodule { options = smtpOptions; }; - description = "SMTP configuration"; - }; - ldap = mkOption { - description = '' - LDAP server configuration - ''; - type = submodule { - options = ldapOptions; - }; - }; - databases = mkOption { - description = "Databases configuration"; - type = submodule { - options = { - mysql = mkOption { - type = submodule { options = mysqlOptions; }; - description = "Mysql configuration"; - }; - redis = mkOption { - type = submodule { options = redisOptions; }; - description = "Redis configuration"; - }; - postgresql = mkOption { - type = submodule { options = psqlOptions; }; - description = "Postgresql configuration"; - }; - }; - }; - }; - jabber = mkOption { - description = "Jabber configuration"; - type = submodule { - options = { - postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; }; - ldap = mkLdapOptions "Jabber" {}; - postgresql = mkPsqlOptions "Jabber"; - }; - }; - }; - realUsers = mkOption { - description = '' - Attrset of function taking pkgs as argument. - Real users settings, should provide a subattr of users.users. - with at least: name, (hashed)Password, shell - ''; - type = attrsOf unspecified; - }; - users = mkOption { - description = "System and regular users uid/gid"; - type = attrsOf (submodule { - options = { - uid = mkOption { - description = "user uid"; - type = int; - }; - gid = mkOption { - description = "user gid"; - type = int; - }; - }; - }); - }; - dns = mkOption { - description = "DNS configuration"; - type = submodule { - options = { - soa = mkOption { - description = "SOA information"; - type = submodule { - options = { - serial = mkOption { - description = "Serial number. Should be incremented at each change and unique"; - type = str; - }; - refresh = mkOption { - description = "Refresh time"; - type = str; - }; - retry = mkOption { - description = "Retry time"; - type = str; - }; - expire = mkOption { - description = "Expire time"; - type = str; - }; - ttl = mkOption { - description = "Default TTL time"; - type = str; - }; - email = mkOption { - description = "hostmaster e-mail"; - type = str; - }; - primary = mkOption { - description = "Primary NS"; - type = str; - }; - }; - }; - }; - ns = mkOption { - description = "Attrs of NS servers group"; - example = { - foo = { - "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ]; - "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ]; - }; - }; - type = attrsOf (attrsOf (listOf str)); - }; - keys = mkOption { - default = {}; - description = "DNS keys"; - type = attrsOf (submodule { - options = { - algorithm = mkOption { type = str; description = "Algorithm"; }; - secret = mkOption { type = str; description = "Secret"; }; - }; - }); - }; - slaveZones = mkOption { - description = "List of slave zones"; - type = listOf (submodule { - options = { - name = mkOption { type = str; description = "zone name"; }; - masters = mkOption { - description = "NS master groups of this zone"; - type = listOf str; - }; - keys = mkOption { - default = []; - description = "Keys associated to the server"; - type = listOf str; - }; - }; - }); - }; - masterZones = mkOption { - description = "List of master zones"; - type = listOf (submodule { - options = { - name = mkOption { type = str; description = "zone name"; }; - withCAA = mkOption { type = nullOr str; description = "CAA entry"; default = null; }; - slaves = mkOption { - description = "NS slave groups of this zone"; - type = listOf str; - }; - ns = mkOption { - description = "groups names that should have their NS entries listed here"; - type = listOf str; - }; - extra = mkOption { - description = "Extra zone configuration for bind"; - example = '' - notify yes; - ''; - type = lines; - }; - entries = mkOption { type = lines; description = "Regular entries of the NS zone"; }; - withEmail = mkOption { - description = "List of domains that should have mail entries (MX, dkim, SPF, ...)"; - default = []; - type = listOf (submodule { - options = { - domain = mkOption { type = str; description = "Which subdomain is concerned"; }; - send = mkOption { type = bool; description = "Whether there can be e-mails originating from the subdomain"; }; - receive = mkOption { type = bool; description = "Whether there can be e-mails arriving to the subdomain"; }; - }; - }); - }; - }; - }); - }; - }; - }; - }; - backup = mkOption { - description = '' - Remote backup with duplicity - ''; - type = submodule { - options = { - password = mkOption { type = str; description = "Password for encrypting files"; }; - remotes = mkOption { - type = attrsOf (submodule { - options = { - remote = mkOption { - type = unspecified; - example = literalExample '' - bucket: "s3://some_host/${bucket}"; - ''; - description = '' - Function. - Takes a bucket name as argument and returns a url - ''; - }; - accessKeyId = mkOption { type = str; description = "Remote access-key"; }; - secretAccessKey = mkOption { type = str; description = "Remote access secret"; }; - }; - }); - }; - }; - }; - }; - zrepl_backup = mkOption { - type = submodule { - options = { - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - mysql = mkMysqlOptions "Zrepl" {}; - }; - }; - }; - rsync_backup = mkOption { - description ='' - Rsync backup configuration from controlled host - ''; - type = submodule { - options = { - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - profiles = mkOption { - description = "Attrs of profiles to backup"; - type = attrsOf (submodule { - options = { - keep = mkOption { type = int; description = "Number of backups to keep"; }; - check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; }; - login = mkOption { type = str; description = "Login to connect to host"; }; - port = mkOption { type = str; default = "22"; description = "Port to connect to host"; }; - host = mkOption { type = str; description = "Host to connect to"; }; - host_key = mkOption { type = str; description = "Host key"; }; - host_key_type = mkOption { type = str; description = "Host key type"; }; - parts = mkOption { - description = "Parts to backup for this host"; - type = attrsOf (submodule { - options = { - remote_folder = mkOption { type = path; description = "Remote folder to backup";}; - exclude_from = mkOption { - type = listOf path; - default = []; - description = "List of folders/files to exclude from the backup"; - }; - files_from = mkOption { - type = listOf path; - default = []; - description = "List of folders/files to backup in the base folder"; - }; - args = mkOption { - type = nullOr str; - default = null; - description = "Extra arguments to pass to rsync"; - }; - }; - }); - }; - }; - }); - }; - }; - }; - }; - monitoring = mkOption { - description = "Monitoring configuration"; - type = submodule { - options = { - status_url = mkOption { type = str; description = "URL to push status to"; }; - status_token = mkOption { type = str; description = "Token for the status url"; }; - http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; }; - email = mkOption { type = str; description = "Admin E-mail"; }; - ssh_public_key = mkOption { type = str; description = "SSH public key"; }; - ssh_secret_key = mkOption { type = str; description = "SSH secret key"; }; - imap_login = mkOption { type = str; description = "IMAP login"; }; - imap_password = mkOption { type = str; description = "IMAP password"; }; - eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; }; - ovh_sms = mkOption { - description = "OVH credentials for sms script"; - type = submodule { - options = { - endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; }; - application_key = mkOption { type = str; description = "Application key"; }; - application_secret = mkOption { type = str; description = "Application secret"; }; - consumer_key = mkOption { type = str; description = "Consumer key"; }; - account = mkOption { type = str; description = "Account"; }; - }; - }; - }; - eban = mkOption { - description = "Eban credentials for webhook"; - type = submodule { - options = { - user = mkOption { type = str; description = "User"; }; - password = mkOption { type = str; description = "Password"; }; - }; - }; - }; - nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; }; - slack_url = mkOption { type = str; description = "Slack webhook url to push status update"; }; - slack_channel = mkOption { type = str; description = "Slack channel to push status update"; }; - netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; }; - netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; }; - contacts = mkOption { type = attrsOf unspecified; description = "Contact dicts to fill naemon objects"; }; - email_check = mkOption { - description = "Emails services to check"; - type = attrsOf (submodule { - options = { - local = mkOption { type = bool; default = false; description = "Use local configuration"; }; - port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; }; - login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; }; - targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; }; - mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; }; - mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; }; - }; - }); - }; - }; - }; - }; - mpd = mkOption { - description = "MPD configuration"; - type = submodule { - options = { - folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; }; - password = mkOption { type = str; description = "Password to connect to the MPD instance"; }; - host = mkOption { type = str; description = "Host to connect to the MPD instance"; }; - port = mkOption { type = str; description = "Port to connect to the MPD instance"; }; - }; - }; - }; - ftp = mkOption { - description = "FTP configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "FTP" { - proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; }; - pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; }; - }; - }; - }; - }; - vpn = mkOption { - description = "VPN configuration"; - type = attrsOf (submodule { - options = { - prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; }; - privateKey = mkOption { type = str; description = "Private key for the host"; }; - publicKey = mkOption { type = str; description = "Public key for the host"; }; - }; - }); - }; - mail = mkOption { - description = "Mail configuration"; - type = submodule { - options = { - dmarc = mkOption { - description = "DMARC configuration"; - type = submodule { - options = { - ignore_hosts = mkOption { - type = lines; - description = '' - Hosts to ignore when checking for dmarc - ''; - }; - }; - }; - }; - dkim = mkOption { - description = "DKIM configuration"; - type = attrsOf (submodule { - options = { - public = mkOption { - type = str; - example = '' - ( "v=DKIM1; k=rsa; " - "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB" ) - ''; - description = "Public entry to put in DNS TXT field"; - }; - private = mkOption { type = str; description = "Private key"; }; - }; - }); - }; - postfix = mkOption { - description = "Postfix configuration"; - type = submodule { - options = { - additional_mailbox_domains = mkOption { - description = '' - List of domains that are used as mailbox final destination, in addition to those defined in the DNS records - ''; - type = listOf str; - }; - mysql = mkMysqlOptions "Postfix" { - password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; }; - }; - backup_domains = mkOption { - description = '' - Domains that are accepted for relay as backup domain - ''; - type = attrsOf (submodule { - options = { - domains = mkOption { type = listOf str; description = "Domains list"; }; - relay_restrictions = mkOption { - type = lines; - description = '' - Restrictions for relaying the e-mails from the domains - ''; - }; - recipient_maps = mkOption { - description = '' - Recipient map to accept relay for. - Must be specified for domain, the rules apply to everyone! - ''; - type = listOf (submodule { - options = { - type = mkOption { - type = enum [ "hash" ]; - description = "Map type"; - }; - content = mkOption { - type = str; - description = "Map content"; - }; - }; - }); - }; - }; - }); - }; - }; - }; - }; - dovecot = mkOption { - description = "Dovecot configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Dovecot" { - pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; }; - user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; }; - iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; }; - iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; }; - postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; }; - }; - }; - }; - }; - rspamd = mkOption { - description = "rspamd configuration"; - type = submodule { - options = { - redis = mkRedisOptions "Redis"; - read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; }; - write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; }; - read_password = mkOption { - type = str; - description = "Read password for rspamd. Unused"; - apply = x: ""; - }; - write_password = mkOption { - type = str; - description = "Write password for rspamd. Unused"; - apply = x: ""; - }; - }; - }; - }; - scripts = mkOption { - description = "Mail script recipients"; - type = attrsOf (submodule { - options = { - external = mkEnableOption "Create a script_@mail.immae.eu external address"; - src = mkOption { - description = '' - git source to fetch the script from. - It must have a default.nix file as its root accepting a scriptEnv parameter - ''; - type = submodule { - options = { - url = mkOption { type = str; description = "git url to fetch"; }; - rev = mkOption { type = str; description = "git reference to fetch"; }; - }; - }; - }; - env = mkOption { - description = "Variables to pass to the script"; - type = unspecified; - }; - }; - }); - }; - sympa = mkOption { - description = "Sympa configuration"; - type = submodule { - options = { - listmasters = mkOption { - type = listOf str; - description = "Listmasters"; - }; - postgresql = mkPsqlOptions "Sympa"; - data_sources = mkOption { - type = attrsOf str; - default = {}; - description = "Data sources to make available to sympa"; - }; - scenari = mkOption { - type = attrsOf str; - default = {}; - description = "Scenari to make available to sympa"; - }; - }; - }; - }; - }; - }; - }; - buildbot = mkOption { - description = "Buildbot configuration"; - type = submodule { - options = { - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - workerPassword = mkOption { description = "Buildbot worker password"; type = str; }; - user = mkOption { - description = "Buildbot user"; - type = submodule { - options = { - uid = mkOption { - description = "user uid"; - type = int; - }; - gid = mkOption { - description = "user gid"; - type = int; - }; - }; - }; - }; - ldap = mkOption { - description = "Ldap configuration for buildbot"; - type = submodule { - options = { - password = mkOption { type = str; description = "Buildbot password"; }; - }; - }; - }; - projects = mkOption { - description = "Projects to make a buildbot for"; - type = attrsOf (submodule { - options = { - name = mkOption { type = str; description = "Project name"; }; - packages = mkOption { - type = unspecified; - example = literalExample '' - pkgs: [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ]; - ''; - description = '' - Function. - Builds packages list to make available to buildbot project. - Takes pkgs as argument. - ''; - }; - pythonPackages = mkOption { - type = unspecified; - example = literalExample '' - p: pkgs: [ pkgs.python3Packages.pip ]; - ''; - description = '' - Function. - Builds python packages list to make available to buildbot project. - Takes buildbot python module as first argument and pkgs as second argument in order to augment the python modules list. - ''; - }; - pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; }; - workerPort = mkOption { type = port; description = "Port for the worker"; }; - secrets = mkOption { - type = attrsOf str; - description = "Secrets for the project to dump as files"; - }; - environment = mkOption { - type = attrsOf str; - description = '' - Environment variables for the project. - BUILDBOT_ is prefixed to the variable names - ''; - }; - activationScript = mkOption { - type = lines; - description = '' - Activation script to run during deployment - ''; - }; - builderPaths = mkOption { - type = attrsOf unspecified; - default = {}; - description = '' - Attrs of functions to make accessible specifically per builder. - Takes pkgs as argument and should return a single path containing binaries. - This path will be accessible as BUILDBOT_PATH_ - ''; - }; - webhookTokens = mkOption { - type = nullOr (listOf str); - default = null; - description = '' - List of tokens allowed to push to project’s change_hook/base endpoint - ''; - }; - }; - }); - }; - }; - }; - }; - tools = mkOption { - description = "Tools configurations"; - type = submodule { - options = { - contact = mkOption { type = str; description = "Contact e-mail address"; }; - assets = mkOption { - default = {}; - type = attrsOf (submodule { - options = { - url = mkOption { type = str; description = "URL to fetch"; }; - sha256 = mkOption { type = str; description = "Hash of the url"; }; - }; - }); - description = "Assets to provide on assets.immae.eu"; - }; - davical = mkOption { - description = "Davical configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Davical"; - ldap = mkLdapOptions "Davical" {}; - }; - }; - }; - diaspora = mkOption { - description = "Diaspora configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Diaspora"; - redis = mkRedisOptions "Diaspora"; - ldap = mkLdapOptions "Diaspora" {}; - secret_token = mkOption { type = str; description = "Secret token"; }; - }; - }; - }; - dmarc_reports = mkOption { - description = "DMARC reports configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "DMARC" {}; - anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; }; - }; - }; - }; - etherpad-lite = mkOption { - description = "Etherpad configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Etherpad"; - ldap = mkLdapOptions "Etherpad" { - group_filter = mkOption { type = str; description = "Filter for groups"; }; - }; - adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; }; - session_key = mkOption { type = str; description = "Session key"; }; - api_key = mkOption { type = str; description = "API key"; }; - redirects = mkOption { type = str; description = "Redirects for apache"; }; - }; - }; - }; - gitolite = mkOption { - description = "Gitolite configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Gitolite" {}; - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - }; - }; - }; - kanboard = mkOption { - description = "Kanboard configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Kanboard"; - ldap = mkLdapOptions "Kanboard" { - admin_dn = mkOption { type = str; description = "Admin DN"; }; - }; - }; - }; - }; - mantisbt = mkOption { - description = "Mantisbt configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Mantisbt"; - ldap = mkLdapOptions "Mantisbt" {}; - master_salt = mkOption { type = str; description = "Master salt for password hash"; }; - }; - }; - }; - mastodon = mkOption { - description = "Mastodon configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Mastodon"; - redis = mkRedisOptions "Mastodon"; - ldap = mkLdapOptions "Mastodon" {}; - paperclip_secret = mkOption { type = str; description = "Paperclip secret"; }; - otp_secret = mkOption { type = str; description = "OTP secret"; }; - secret_key_base = mkOption { type = str; description = "Secret key base"; }; - vapid = mkOption { - description = "vapid key"; - type = submodule { - options = { - private = mkOption { type = str; description = "Private key"; }; - public = mkOption { type = str; description = "Public key"; }; - }; - }; - }; - }; - }; - }; - mediagoblin = mkOption { - description = "Mediagoblin configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Mediagoblin"; - redis = mkRedisOptions "Mediagoblin"; - ldap = mkLdapOptions "Mediagoblin" {}; - }; - }; - }; - nextcloud = mkOption { - description = "Nextcloud configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Peertube"; - redis = mkRedisOptions "Peertube"; - password_salt = mkOption { type = str; description = "Password salt"; }; - instance_id = mkOption { type = str; description = "Instance ID"; }; - secret = mkOption { type = str; description = "App secret"; }; - }; - }; - }; - peertube = mkOption { - description = "Peertube configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Peertube"; - redis = mkRedisOptions "Peertube"; - ldap = mkLdapOptions "Peertube" {}; - }; - }; - }; - syden_peertube = mkOption { - description = "Peertube Syden configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Peertube"; - redis = mkRedisOptions "Peertube"; - }; - }; - }; - phpldapadmin = mkOption { - description = "phpLdapAdmin configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "phpldapadmin" {}; - }; - }; - }; - rompr = mkOption { - description = "Rompr configuration"; - type = submodule { - options = { - mpd = mkOption { - description = "MPD configuration"; - type = submodule { - options = { - host = mkOption { type = str; description = "Host for MPD"; }; - port = mkOption { type = port; description = "Port to access MPD host"; }; - }; - }; - }; - }; - }; - }; - roundcubemail = mkOption { - description = "Roundcubemail configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "TT-RSS"; - secret = mkOption { type = str; description = "Secret"; }; - }; - }; - }; - shaarli = mkOption { - description = "Shaarli configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Shaarli" {}; - }; - }; - }; - status_engine = mkOption { - description = "Status Engine configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "StatusEngine" {}; - ldap = mkLdapOptions "StatusEngine" {}; - }; - }; - }; - task = mkOption { - description = "Taskwarrior configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Taskwarrior" {}; - taskwarrior-web = mkOption { - description = "taskwarrior-web profiles"; - type = attrsOf (submodule { - options = { - uid = mkOption { - type = listOf str; - description = "List of ldap uids having access to this profile"; - }; - org = mkOption { type = str; description = "Taskd organisation"; }; - key = mkOption { type = str; description = "Taskd key"; }; - date = mkOption { type = str; description = "Preferred date format"; }; - }; - }); - }; - }; - }; - }; - ttrss = mkOption { - description = "TT-RSS configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "TT-RSS"; - ldap = mkLdapOptions "TT-RSS" {}; - }; - }; - }; - wallabag = mkOption { - description = "Wallabag configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Wallabag"; - ldap = mkLdapOptions "Wallabag" { - admin_filter = mkOption { type = str; description = "Admin users filter"; }; - }; - redis = mkRedisOptions "Wallabag"; - secret = mkOption { type = str; description = "App secret"; }; - }; - }; - }; - webhooks = mkOption { - type = attrsOf str; - description = "Mapping 'name'.php => script for webhooks"; - }; - csp_reports = mkOption { - description = "CSP report configuration"; - type = submodule { - options = { - report_uri = mkOption { type = str; description = "URI to report CSP violations to"; }; - policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; }; - postgresql = mkPsqlOptions "CSP reports"; - }; - }; - }; - commento = mkOption { - description = "Commento configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Commento"; - smtp = mkSmtpOptions "Commento"; - }; - }; - }; - cryptpad = mkOption { - description = "Cryptpad configuration"; - type = attrsOf (submodule { - options = { - email = mkOption { type = str; description = "Admin e-mail"; }; - admins = mkOption { type = listOf str; description = "Instance admin public keys"; }; - port = mkOption { type = port; description = "Port to listen to"; }; - }; - }); - }; - ympd = mkOption { - description = "Ympd configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - mpd = mkOption { - description = "MPD configuration"; - type = submodule { - options = { - password = mkOption { type = str; description = "Password to access MPD host"; }; - host = mkOption { type = str; description = "Host for MPD"; }; - port = mkOption { type = port; description = "Port to access MPD host"; }; - }; - }; - }; - }; - }; - }; - umami = mkOption { - description = "Umami configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Umami"; - hashSalt = mkOption { type = str; description = "Hash salt"; }; - }; - }; - }; - yourls = mkOption { - description = "Yourls configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "Yourls" {}; - ldap = mkLdapOptions "Yourls" {}; - cookieKey = mkOption { type = str; description = "Cookie key"; }; - }; - }; - }; - }; - }; - }; - serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; }; - websites = mkOption { - description = "Websites configurations"; - type = submodule { - options = { - immae = mkOption { - description = "Immae configuration by environment"; - type = submodule { - options = { - temp = mkOption { - description = "Temp configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Immae temp" { - filter = mkOption { type = str; description = "Filter for user access"; }; - }; - }; - }; - }; - }; - }; - }; - isabelle = mkOption { - description = "Isabelle configurations by environment"; - type = - let - atenSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - secret = mkOption { type = str; description = "Symfony App secret"; }; - postgresql = mkPsqlOptions "Aten"; - }; - }; - }; - in - submodule { - options = { - aten_production = atenSubmodule; - aten_integration = atenSubmodule; - iridologie = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "SPIP environment"; }; - mysql = mkMysqlOptions "Iridologie" {}; - ldap = mkLdapOptions "Iridologie" {}; - }; - }; - }; - }; - }; - }; - chloe = mkOption { - description = "Chloe configurations by environment"; - type = - let - chloeSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "SPIP environment"; }; - mysql = mkMysqlOptions "Chloe" {}; - ldap = mkLdapOptions "Chloe" {}; - }; - }; - }; - in - submodule { - options = { - production = chloeSubmodule; - integration = chloeSubmodule; - }; - }; - }; - connexionswing = mkOption { - description = "Connexionswing configurations by environment"; - type = - let - csSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "Connexionswing" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - email = mkOption { type = str; description = "Symfony email notification"; }; - }; - }; - }; - in - submodule { - options = { - production = csSubmodule; - integration = csSubmodule; - }; - }; - }; - jerome = mkOption { - description = "Naturaloutil configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "Naturaloutil" {}; - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - telio_tortay = mkOption { - description = "Telio Tortay configuration"; - type = submodule { - options = { - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - ludivine = mkOption { - description = "Ludivinecassal configurations by environment"; - type = - let - lcSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "LudivineCassal" {}; - ldap = mkLdapOptions "LudivineCassal" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - }; - }; - }; - in - submodule { - options = { - production = lcSubmodule; - integration = lcSubmodule; - }; - }; - }; - emilia = mkOption { - description = "Emilia configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Emilia"; - }; - }; - }; - florian = mkOption { - description = "Florian configuration"; - type = submodule { - options = { - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - nassime = mkOption { - description = "Nassime configuration"; - type = submodule { - options = { - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - piedsjaloux = mkOption { - description = "Piedsjaloux configurations by environment"; - type = - let - pjSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "Piedsjaloux" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - }; - }; - }; - in - submodule { - options = { - production = pjSubmodule; - integration = pjSubmodule; - }; - }; - }; - richie = mkOption { - description = "Europe Richie configurations by environment"; - type = submodule { - options = { - mysql = mkMysqlOptions "Richie" {}; - smtp_mailer = mkOption { - description = "SMTP mailer configuration"; - type = submodule { - options = { - user = mkOption { type = str; description = "Username"; }; - password = mkOption { type = str; description = "Password"; }; - }; - }; - }; - }; - }; - }; - caldance = mkOption { - description = "Caldance configurations by environment"; - type = submodule { - options = { - integration = mkOption { - description = "environment configuration"; - type = submodule { - options = { - password = mkOption { type = str; description = "Password file content for basic auth"; }; - }; - }; - }; - }; - }; - }; - tellesflorian = mkOption { - description = "Tellesflorian configurations by environment"; - type = - let - tfSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "Tellesflorian" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - invite_passwords = mkOption { type = str; description = "Password basic auth"; }; - }; - }; - }; - in - submodule { - options = { - integration = tfSubmodule; - }; - }; - }; - }; - }; - }; - }; - options.hostEnv = mkOption { - readOnly = true; - type = hostEnv; - default = config.myEnv.servers."${name}"; - description = "Host environment"; - }; -} diff --git a/modules/private/gemini/default.nix b/modules/private/gemini/default.nix deleted file mode 100644 index ffe8a12..0000000 --- a/modules/private/gemini/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ lib, config, pkgs, ... }: -let - configFile = pkgs.writeText "config.yaml" '' - listen: ":1965" - hosts: - immae.eu: - cert: /var/lib/acme/immae/full.pem - key: /var/lib/acme/immae/key.pem - paths: - - path: / - root: ${./public} - ''; -in -{ - options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule"; - config = lib.mkIf config.myServices.gemini.enable { - networking.firewall.allowedTCPPorts = [ 1965 ]; - systemd.services.gemini = { - description = "Gemini capsule server"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}"; - serviceConfig.Type = "simple"; - }; - }; -} diff --git a/modules/private/gitolite/default.nix b/modules/private/gitolite/default.nix deleted file mode 100644 index 6a74734..0000000 --- a/modules/private/gitolite/default.nix +++ /dev/null @@ -1,77 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.gitolite; -in { - options.myServices.gitolite = { - enable = lib.mkEnableOption "my gitolite service"; - gitoliteDir = lib.mkOption { - type = lib.types.str; - default = "/var/lib/gitolite"; - }; - }; - - config = lib.mkIf cfg.enable { - myServices.ssh.modules = [{ - snippet = builtins.readFile ./ldap_gitolite.sh; - dependencies = [ pkgs.gitolite ]; - }]; - networking.firewall.allowedTCPPorts = [ 9418 ]; - - secrets.keys."gitolite/ldap_password" = { - user = "gitolite"; - group = "gitolite"; - permissions = "0400"; - text = config.myEnv.tools.gitolite.ldap.password; - }; - - services.gitDaemon = { - enable = true; - user = "gitolite"; - group = "gitolite"; - basePath = "${cfg.gitoliteDir}/repositories"; - }; - - system.activationScripts.gitolite = let - deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ]; - gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" { - buildInputs = [ pkgs.makeWrapper ]; - } '' - makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \ - --prefix PATH : ${lib.makeBinPath deps} \ - --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"} - ''; - in { - deps = [ "users" ]; - text = '' - if [ -d ${cfg.gitoliteDir} ]; then - ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh - chmod g+rx ${cfg.gitoliteDir} - fi - if [ -f ${cfg.gitoliteDir}/projects.list ]; then - chmod g+r ${cfg.gitoliteDir}/projects.list - fi - ''; - }; - - users.users.wwwrun.extraGroups = [ "gitolite" ]; - users.users.gitolite.extraGroups = [ "keys" ]; - - users.users.gitolite.packages = let - python-packages = python-packages: with python-packages; [ - simplejson - urllib3 - sleekxmpp - ]; - in - [ - (pkgs.python3.withPackages python-packages) - pkgs.nettools - pkgs.findutils - ]; - # Installation: https://git.immae.eu/mantisbt/view.php?id=93 - services.gitolite = { - enable = true; - adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion; - }; - }; -} diff --git a/modules/private/gitolite/ldap_gitolite.sh b/modules/private/gitolite/ldap_gitolite.sh deleted file mode 100644 index 23cb2bf..0000000 --- a/modules/private/gitolite/ldap_gitolite.sh +++ /dev/null @@ -1,33 +0,0 @@ -### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh -LDAP_GITOLITE_MEMBER="cn=users,cn=gitolite,ou=services,dc=immae,dc=eu" -GITOLITE_SHELL=$(which gitolite-shell) - -if [[ $user == gitolite ]]; then - ldap_search '(&(memberOf='$LDAP_GITOLITE_MEMBER')('$KEY'=*))' $KEY | \ - while read line ; - do - if [ ! -z "$line" ]; then - if [[ $line == dn* ]]; then - user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line") - if [ -n "$user" ]; then - if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then - # Capitalize first letter (backward compatibility) - user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user") - fi - else - # Service fake user - user=$(sed -n 's/.*cn=\([^,]*\).*/\1/p' <<< "$line") - fi - elif [[ $line == $KEY* ]]; then - key=$(clean_key_line git "$line") - if [ ! -z "$key" ]; then - if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then - echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ' - echo $key - fi - fi - fi - fi - done - exit 0 -fi diff --git a/modules/private/irc.nix b/modules/private/irc.nix deleted file mode 100644 index bc0bfb4..0000000 --- a/modules/private/irc.nix +++ /dev/null @@ -1,54 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.irc; -in -{ - options.myServices = { - ircCerts = lib.mkOption { - description = "Default ircconfigurations for certificates as accepted by acme"; - }; - irc.enable = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - Whether to enable irc stuff. - ''; - }; - }; - - config = lib.mkIf cfg.enable { - security.acme.certs."irc" = config.myServices.ircCerts // { - domain = "irc.immae.eu"; - postRun = '' - systemctl restart stunnel.service - ''; - }; - - networking.firewall.allowedTCPPorts = [ 6697 ]; - services.bitlbee = with pkgs; { - enable = true; - authMode = "Registered"; - libpurple_plugins = [ - purple-hangouts - purple-matrix - ]; - plugins = [ - bitlbee-mastodon - bitlbee-facebook - bitlbee-discord - bitlbee-steam - ]; - }; - - services.stunnel = { - enable = true; - servers = { - bitlbee = { - accept = 6697; - connect = 6667; - cert = "${config.security.acme.certs.irc.directory}/full.pem"; - }; - }; - }; - }; -} diff --git a/modules/private/loginctl-linger.nix b/modules/private/loginctl-linger.nix deleted file mode 100644 index e6b9f23..0000000 --- a/modules/private/loginctl-linger.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ config, lib, pkgs, ... }: - -# https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1 -# A temporary hack to `loginctl enable-linger $somebody` (for -# multiplexer sessions to last), until this one is unresolved: -# https://github.com/NixOS/nixpkgs/issues/3702 -# -# Usage: `users.extraUsers.somebody.linger = true` or slt. - -with lib; - -let - - dataDir = "/var/lib/systemd/linger"; - - lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger))); - - lingeringUsersFile = builtins.toFile "lingering-users" - (concatStrings (map (s: "${s}\n") - (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly - - updateLingering = pkgs.writeScript "update-lingering" '' - if [ ! -e ${dataDir} ]; then - install -m 0755 -o root -g root -d ${dataDir} - fi - if [ -e ${dataDir} ] ; then - ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger - ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger - fi - ''; - -in - -{ - options = { - users.users = mkOption { - options = [{ - linger = mkEnableOption "lingering for the user"; - }]; - }; - }; - - config = { - system.activationScripts.update-lingering = - stringAfter [ "users" ] updateLingering; - }; -} diff --git a/modules/private/mail/default.nix b/modules/private/mail/default.nix deleted file mode 100644 index 2d405c6..0000000 --- a/modules/private/mail/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ lib, pkgs, config, ... }: -{ - imports = [ - ./milters.nix - ./postfix.nix - ./dovecot.nix - ./relay.nix - ./rspamd.nix - ./opensmtpd.nix - ./sympa.nix - ]; - options.myServices.mail.enable = lib.mkEnableOption "enable Mail services"; - options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services"; - options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services"; - - config = lib.mkIf config.myServices.mail.enable { - security.acme.certs."mail" = config.myServices.certificates.certConfig // { - domain = config.hostEnv.fqdn; - extraDomains = let - zonesWithMx = builtins.filter (zone: - lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0 - ) config.myEnv.dns.masterZones; - mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx; - in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs); - }; - # This is for clients that don’t support elliptic curves (e.g. - # printer) - security.acme.certs."mail-rsa" = config.myServices.certificates.certConfig // { - domain = config.hostEnv.fqdn; - keyType = "rsa4096"; - extraDomains = let - zonesWithMx = builtins.filter (zone: - lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0 - ) config.myEnv.dns.masterZones; - mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx; - in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs); - }; - systemd.slices.mail = { - description = "Mail slice"; - }; - }; -} diff --git a/modules/private/mail/milters.nix b/modules/private/mail/milters.nix deleted file mode 100644 index 4b93a7a..0000000 --- a/modules/private/mail/milters.nix +++ /dev/null @@ -1,88 +0,0 @@ -{ lib, pkgs, config, name, ... }: -{ - imports = - builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/openarc).nixosModules - ++ builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/opendmarc).nixosModules; - - options.myServices.mail.milters.sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - opendkim = "/run/opendkim/opendkim.sock"; - opendmarc = config.services.opendmarc.socket; - openarc = config.services.openarc.socket; - }; - readOnly = true; - description = '' - milters sockets - ''; - }; - config = lib.mkIf (config.myServices.mail.enable || config.myServices.mailBackup.enable) { - secrets.keys = { - "opendkim" = { - isDir = true; - user = config.services.opendkim.user; - group = config.services.opendkim.group; - permissions = "0550"; - }; - "opendkim/eldiron.private" = { - user = config.services.opendkim.user; - group = config.services.opendkim.group; - permissions = "0400"; - text = config.myEnv.mail.dkim.eldiron.private; - }; - "opendkim/eldiron.txt" = { - user = config.services.opendkim.user; - group = config.services.opendkim.group; - permissions = "0444"; - text = '' - eldiron._domainkey IN TXT ${config.myEnv.mail.dkim.eldiron.public}''; - }; - }; - users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ]; - services.opendkim = { - enable = true; - socket = "local:${config.myServices.mail.milters.sockets.opendkim}"; - domains = builtins.concatStringsSep "," (lib.flatten (map - (zone: map - (e: "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}") - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - )); - keyPath = config.secrets.fullPaths."opendkim"; - selector = "eldiron"; - configFile = pkgs.writeText "opendkim.conf" '' - SubDomains yes - UMask 002 - AlwaysAddARHeader yes - ''; - group = config.services.postfix.group; - }; - systemd.services.opendkim.serviceConfig.Slice = "mail.slice"; - systemd.services.opendkim.preStart = lib.mkBefore '' - # Skip the prestart script as keys are handled in secrets - exit 0 - ''; - services.filesWatcher.opendkim = { - restart = true; - paths = [ - config.secrets.fullPaths."opendkim/eldiron.private" - ]; - }; - - systemd.services.milter_verify_from = { - description = "Verify from milter"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Slice = "mail.slice"; - User = "postfix"; - Group = "postfix"; - ExecStart = let python = pkgs.python3.withPackages (p: [ p.pymilter ]); - in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock"; - RuntimeDirectory = "milter_verify_from"; - }; - }; - }; -} diff --git a/modules/private/mail/opensmtpd.nix b/modules/private/mail/opensmtpd.nix deleted file mode 100644 index e05bba9..0000000 --- a/modules/private/mail/opensmtpd.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ lib, pkgs, config, name, ... }: -{ - config = lib.mkIf config.myServices.mailRelay.enable { - secrets.keys."opensmtpd/creds" = { - user = "smtpd"; - group = "smtpd"; - permissions = "0400"; - text = '' - eldiron ${name}:${config.hostEnv.ldap.password} - ''; - }; - users.users.smtpd.extraGroups = [ "keys" ]; - services.opensmtpd = { - enable = true; - serverConfiguration = let - filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" { - buildInputs = [ pkgs.python3 ]; - } '' - cp ${./filter-rewrite-from.py} $out - patchShebangs $out - ''; - in '' - table creds \ - "${config.secrets.fullPaths."opensmtpd/creds"}" - # FIXME: filtering requires 6.6, uncomment following lines when - # upgrading - # filter "fixfrom" \ - # proc-exec "${filter-rewrite-from} ${name}@immae.eu" - # listen on socket filter "fixfrom" - action "relay-rewrite-from" relay \ - helo ${config.hostEnv.fqdn} \ - host smtp+tls://eldiron@eldiron.immae.eu:587 \ - auth \ - mail-from ${name}@immae.eu - action "relay" relay \ - helo ${config.hostEnv.fqdn} \ - host smtp+tls://eldiron@eldiron.immae.eu:587 \ - auth - match for any !mail-from "@immae.eu" action "relay-rewrite-from" - match for any mail-from "@immae.eu" action "relay" - ''; - }; - environment.systemPackages = [ config.services.opensmtpd.package ]; - services.mail.sendmailSetuidWrapper = { - program = "sendmail"; - source = "${config.services.opensmtpd.package}/bin/smtpctl"; - setuid = false; - setgid = false; - }; - security.wrappers.mailq = { - program = "mailq"; - source = "${config.services.opensmtpd.package}/bin/smtpctl"; - setuid = false; - setgid = false; - }; - }; -} diff --git a/modules/private/monitoring/default.nix b/modules/private/monitoring/default.nix deleted file mode 100644 index 0783c2f..0000000 --- a/modules/private/monitoring/default.nix +++ /dev/null @@ -1,249 +0,0 @@ -{ config, pkgs, lib, name, nodes, ... }: -let - cfg = config.myServices.monitoring; - activatedPlugins = [ "memory" "command" "bandwidth" ] - ++ (if cfg.master then (masterObjects.activatedPlugins or []) else []) - ++ (if cfg.master then (lib.flatten (map (v: v.activatedPlugins or []) otherObjects)) else []) - ++ (hostObjects.activatedPlugins or []) - ++ (if cfg.master then ["notify-primary"] else ["notify-secondary"]); - allPluginsConfig = import ./myplugins.nix { - inherit pkgs lib config; - sudo = "/run/wrappers/bin/sudo"; - }; - mypluginsConfig = lib.getAttrs activatedPlugins allPluginsConfig; - myplugins = let - mypluginsChunk = builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig); - in pkgs.runCommand "buildplugins" { - buildInputs = [ pkgs.makeWrapper pkgs.perl ]; - } '' - mkdir $out - ${mypluginsChunk} - ''; - toObjects = pkgs.callPackage ./to_objects.nix {}; - commonConfig = { - dilion = { - processWarn = "250"; processAlert = "400"; - loadWarn = "1.0"; loadAlert = "1.2"; - interface = "eth0"; - }; - eldiron = { - processWarn = "550"; processAlert = "650"; - loadWarn = "1.0"; loadAlert = "1.2"; - interface = "eth0"; - }; - backup-2 = { - processWarn = "60"; processAlert = "70"; - loadWarn = "1.0"; loadAlert = "2.0"; - interface = "ens3"; - }; - monitoring-1 = { - processWarn = "50"; processAlert = "60"; - loadWarn = "4.0"; loadAlert = "6.0"; - load15Warn = "1.0"; load15Alert = "2.0"; - interface = "ens3"; - }; - quatresaisons = { - processWarn = "250"; processAlert = "400"; - loadWarn = "1.0"; loadAlert = "1.2"; - interface = "eth0"; - }; - }; - externalObjects = lib.genAttrs [ "tiboqorl-fr" ] - (n: pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; }); - masterPassiveObjects = let - passiveNodes = lib.attrsets.filterAttrs (n: _: builtins.elem n ["backup-2" "eldiron" "quatresaisons" "dilion"]) nodes; - toPassiveServices = map (s: s.passiveInfo.filter s // s.passiveInfo); - passiveServices = lib.flatten (lib.attrsets.mapAttrsToList - (_: n: toPassiveServices n.config.myServices.monitoring.services) - passiveNodes - ) ++ lib.flatten (lib.attrsets.mapAttrsToList - (_: n: toPassiveServices n.service) - externalObjects); - in { - service = passiveServices; - host = lib.lists.foldr - (a: b: a//b) - {} - (lib.attrsets.mapAttrsToList (_: h: h.config.myServices.monitoring.hosts) passiveNodes - ++ lib.attrsets.mapAttrsToList (_: n: n.host) externalObjects); - }; - emailCheck = host: hostFQDN: let - allCfg = config.myEnv.monitoring.email_check; - cfg = allCfg."${host}"; - reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem host v.targets) allCfg); - to_email = cfg': host': - let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+"; - in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}"; - mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets); - mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets); - command = if cfg.local - then - [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ] - else - [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ]; - in - { - service_description = "${hostFQDN} email service is active"; - use = "mail-service"; - host_name = hostFQDN; - servicegroups = "webstatus-email"; - check_command = command; - }; - otherObjects = map - (n: (pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; })) - [ "ulminfo-fr" "phare" "eban" ]; - masterObjects = pkgs.callPackage ./objects_master.nix { inherit config; }; - commonObjects = pkgs.callPackage ./objects_common.nix ({ - master = cfg.master; - hostFQDN = config.hostEnv.fqdn; - hostName = name; - inherit mypluginsConfig; - } // builtins.getAttr name commonConfig); - hostObjects = - let - specific_file = ./. + "/objects_" + name + ".nix"; - in - lib.attrsets.optionalAttrs - (builtins.pathExists specific_file) - (pkgs.callPackage specific_file { - inherit config nodes emailCheck; - hostFQDN = config.hostEnv.fqdn; - hostName = name; - }); - objectsFiles = lib.mapAttrs' (name: value: lib.nameValuePair - "=/${name}/objects.conf" { alias = pkgs.writeText "objects.conf" (toObjects value); } - ) externalObjects; -in -{ - options = { - myServices.monitoring = { - enable = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - Whether to enable monitoring. - ''; - }; - master = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - This instance is the master instance - ''; - }; - hosts = lib.mkOption { - readOnly = true; - description = "Hosts list for this host"; - default = (commonObjects.host or {}) // (hostObjects.host or {}); - }; - services = lib.mkOption { - readOnly = true; - description = "Services list for this host"; - default = commonObjects.service ++ hostObjects.service; - }; - }; - }; - - config = lib.mkIf cfg.enable { - services.nginx = lib.mkIf config.myServices.status.enable { - virtualHosts."status.immae.eu".locations = objectsFiles // { - "=/common/immae.cfg" = { - alias = pkgs.writeText "immae.cfg" '' - # put me for instance in /etc/naemon/module-conf.d/immae.cfg - # Make sure that you have include_dir=module-conf.d in - # naemon.cfg - log_initial_states=1 - date_format=iso8601 - admin_email=${config.myEnv.monitoring.email} - obsess_over_services=1 - ocsp_command=notify-master - ''; - }; - "=/common/resource.cfg" = { - alias = pkgs.writeText "resource.cfg" '' - # Resource.cfg file - # Replace this with path to monitoring plugins - $USER1$=@@COMMON_PLUGINS@@ - # Replace this with a path to scripts from - # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins - $USER2$=@@IMMAE_PLUGINS@@ - $USER200$=https://status.immae.eu/ - $USER201$=@@TOKEN@@ - ''; - }; - }; - }; - - security.sudo.extraRules = let - pluginsSudo = lib.lists.remove null (lib.attrsets.mapAttrsToList (k: v: - if (v ? sudo) - then ({ users = [ "naemon" ]; } // (v.sudo myplugins)) - else null) mypluginsConfig); - in [ - { - commands = [ - { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; } - { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; } - ]; - users = [ "naemon" ]; - runAs = "root"; - } - ] ++ pluginsSudo; - environment.etc."mdadm.conf" = { - enable = true; - mode = "0644"; - user = "root"; - text = "MAILADDR ${config.myEnv.monitoring.email}"; - }; - - secrets.keys = { - "naemon/id_rsa" = { - user = "naemon"; - group = "naemon"; - permissions = "0400"; - text = config.myEnv.monitoring.ssh_secret_key; - }; - } // lib.optionalAttrs cfg.master ( - lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" { - user = "naemon"; - group = "naemon"; - permissions = "0400"; - text = '' - export AWS_ACCESS_KEY_ID="${v.accessKeyId}" - export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}" - export BASE_URL="${v.remote "immae-eldiron"}" - ''; - }) config.myEnv.backup.remotes - ); - # needed since extraResource is not in the closure - systemd.services.naemon.path = [ myplugins ]; - services.naemon = { - enable = true; - extraConfig = '' - use_syslog=1 - log_initial_states=1 - date_format=iso8601 - admin_email=${config.myEnv.monitoring.email} - '' + lib.optionalString (!cfg.master) '' - obsess_over_services=1 - ocsp_command=notify-master - '' + lib.optionalString (cfg.master) '' - broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live - broker_module=${pkgs.status_engine.module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0 - ''; - extraResource = let - resources = [hostObjects.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig); - joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources; - joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined); - in '' - $USER2$=${myplugins} - ${joinedStr} - ''; - objectDefs = toObjects commonObjects - + toObjects hostObjects - + lib.optionalString cfg.master (toObjects masterObjects) - + lib.optionalString cfg.master (toObjects masterPassiveObjects) - + lib.optionalString cfg.master (builtins.concatStringsSep "\n" (map toObjects otherObjects)); - }; - }; -} diff --git a/modules/private/monitoring/objects_backup-2.nix b/modules/private/monitoring/objects_backup-2.nix deleted file mode 100644 index 28032a4..0000000 --- a/modules/private/monitoring/objects_backup-2.nix +++ /dev/null @@ -1,111 +0,0 @@ -{ config, pkgs, lib, hostFQDN, emailCheck, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in -{ - activatedPlugins = [ "file_date" "mysql" "openldap" "redis" "emails" ]; - service = [ - (emailCheck "backup-2" hostFQDN // { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; }; - }) - { - passiveInfo = defaultPassiveInfo; - service_description = "Size on /backup2 partition"; - use = "local-service"; - check_command = ["check_local_disk" "10%" "5%" "/backup2"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; }; - service_description = "Last backup in /backup2/phare is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; }; - service_description = "Last backup in /backup2/dilion is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; }; - service_description = "Last backup in /backup2/ulminfo is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Redis replication for eldiron is up to date"; - use = "local-service"; - check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Mysql replication for eldiron is up to date"; - use = "local-service"; - check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Openldap replication for eldiron is up to date"; - use = "local-service"; - check_command = let - name = "eldiron"; - hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron; - base = config.myServices.databasesReplication.openldap.base; - eldiron_schemas = pkgs.callPackage ../databases/openldap/eldiron_schemas.nix {}; - ldapConfig = pkgs.writeText "slapd.conf" '' - include ${pkgs.openldap}/etc/schema/core.schema - include ${pkgs.openldap}/etc/schema/cosine.schema - include ${pkgs.openldap}/etc/schema/inetorgperson.schema - include ${pkgs.openldap}/etc/schema/nis.schema - ${eldiron_schemas} - moduleload back_hdb - backend hdb - database hdb - - suffix "${hcfg.base}" - directory ${base}/${name}/openldap - ''; - in [ - "check_openldap_replication" - hcfg.url - hcfg.dn - config.secrets.fullPaths."openldap_replication/eldiron/replication_password" - hcfg.base - ldapConfig - ]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"]; - } - ]; -} diff --git a/modules/private/monitoring/objects_dilion.nix b/modules/private/monitoring/objects_dilion.nix deleted file mode 100644 index 16b3c64..0000000 --- a/modules/private/monitoring/objects_dilion.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ lib, hostFQDN, emailCheck, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; - zfs_snapshot = name: { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "ZFS snapshot ${name} happened not too long ago"; - use = "local-service"; - check_command = ["check_zfs_snapshot" name]; - }; -in -{ - activatedPlugins = [ "zfs" ]; - service = [ - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "No ZFS pool is degraded"; - use = "local-service"; - check_command = ["check_zfs"]; - } - (zfs_snapshot "zpool/backup/eldiron/zpool/root") - (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc") - (zfs_snapshot "zpool/backup/eldiron/zpool/root/var") - ]; -} diff --git a/modules/private/monitoring/objects_eban.nix b/modules/private/monitoring/objects_eban.nix deleted file mode 100644 index df54f6a..0000000 --- a/modules/private/monitoring/objects_eban.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ ... }: -let - serviceTemplate = rest: { - host_name = "eban.bzh"; - use = "external-web-service"; - contacts = "eban"; - contact_groups = "null"; - check_interval = "15"; - - servicegroups = "webstatus-resources"; - _webstatus_namespace = "eban"; - } // rest; -in -{ - activatedPlugins = [ "http" ]; - contact = { - eban = { - use = "generic-contact"; - host_notification_commands = "notify-host-eban-url"; - service_notification_commands = "notify-service-eban-url"; - }; - }; - host = { - "eban.bzh" = { - alias = "eban.bzh"; - address = "eban.bzh"; - use = "linux-server"; - hostgroups = "webstatus-hosts"; - contacts = "eban"; - contact_groups = "null"; - _webstatus_name = "Eban"; - _webstatus_vhost = "status.eban.bzh"; - _webstatus_namespace = "eban"; - }; - }; - service = [ - (serviceTemplate { - service_description = "Eban website is up and running"; - check_command = ["check_https" "eban.bzh" "/" ""]; - _webstatus_name = "Main Website"; - _webstatus_url = "https://eban.bzh/"; - }) - (serviceTemplate { - service_description = "Eban blog is up and running"; - check_command = ["check_https" "blog.eban.bzh" "/" "<title>"]; - _webstatus_name = "Blog"; - _webstatus_url = "https://blog.eban.bzh/"; - }) - (serviceTemplate { - service_description = "Eban gitea is up and running"; - check_command = ["check_https" "git.eban.bzh" "/" "<title>"]; - _webstatus_name = "Git"; - _webstatus_url = "https://git.eban.bzh/"; - }) - (serviceTemplate { - service_description = "I Learned website is up and running"; - check_command = [ "check_https" "ilearned.eu.org" "/" "<title" ]; - - _webstatus_name = "I Learned website"; - _webstatus_url = "https://ilearned.eu.org/"; - }) - (serviceTemplate { - service_description = "I Learned gitea is up and running"; - check_command = [ "check_https" "git.ilearned.eu.org" "/" "<title" ]; - - _webstatus_name = "I Learned Git"; - _webstatus_url = "https://git.ilearned.eu.org/"; - }) - ]; -} diff --git a/modules/private/monitoring/objects_eldiron.nix b/modules/private/monitoring/objects_eldiron.nix deleted file mode 100644 index 75e7b0e..0000000 --- a/modules/private/monitoring/objects_eldiron.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ lib, hostFQDN, emailCheck, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in -{ - activatedPlugins = [ "emails" "postgresql" "zfs" ]; - service = [ - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Postgresql replication for backup-2 is up to date"; - use = "local-service"; - check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "No ZFS pool is degraded"; - use = "local-service"; - check_command = ["check_zfs"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; }; - service_description = "mailq is empty"; - use = "local-service"; - check_command = ["check_mailq"]; - } - (emailCheck "eldiron" hostFQDN // { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; }; - }) - ]; -} diff --git a/modules/private/monitoring/objects_master.nix b/modules/private/monitoring/objects_master.nix deleted file mode 100644 index 30bfe73..0000000 --- a/modules/private/monitoring/objects_master.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ config, ... }: -{ - contact = { - immae = config.myEnv.monitoring.contacts.immae // { - use = "generic-contact"; - contactgroups = "admins"; - host_notification_commands = "notify-host-by-email,notify-by-slack!$USER206$!$USER207$"; - service_notification_commands = "notify-service-by-email,notify-by-slack!$USER206$!$USER207$"; - }; - }; - command = { - check_passive = "$USER1$/check_dummy 3 \"Service result are stale\""; - }; - templates = { - service = { - external-passive-service = { - active_checks_enabled = "0"; - check_freshness = "1"; - check_period = "24x7"; - contact_groups = "admins"; - event_handler_enabled = "1"; - flap_detection_enabled = "1"; - is_volatile = "0"; - max_check_attempts = "3"; - notification_interval = "60"; - notification_options = "w,u,c,r,f,s"; - notification_period = "24x7"; - notifications_enabled = "1"; - passive_checks_enabled = "1"; - process_perf_data = "1"; - retain_nonstatus_information = "1"; - retain_status_information = "1"; - retry_interval = "2"; - check_command = "check_passive"; - _webstatus_namespace = "immae"; - }; - }; - }; -} diff --git a/modules/private/monitoring/objects_monitoring-1.nix b/modules/private/monitoring/objects_monitoring-1.nix deleted file mode 100644 index 563be16..0000000 --- a/modules/private/monitoring/objects_monitoring-1.nix +++ /dev/null @@ -1,714 +0,0 @@ -{ config, pkgs, nodes, hostFQDN, emailCheck, lib, ... }: -{ - activatedPlugins = [ "dns" "ftp" "git" "http" "imap" "ovh" "tcp" ]; - host = { - # Dummy host for testing - # "dummy-host" = { - # alias = "dummy.host"; - # address = "dummy.host"; - # use = "linux-server"; - # check_command = "check_ok"; - # }; - }; - service = [ - # Dummy service for testing - # { - # service_description = "Dummy failing test"; - # host_name = "dummy-host"; - # use = "local-service"; - # check_interval = "0.3"; - # max_check_attempts = "1"; - # flap_detection_enabled = "0"; - # notification_interval = "0.1"; - # check_command = "check_critical"; - # } - - (emailCheck "monitoring-1" hostFQDN) - - { - service_description = "ftp has access to database for authentication"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_ftp_database"; - - servicegroups = "webstatus-remote-services"; - _webstatus_name = "FTP"; - _webstatus_url = "ftp.immae.eu"; - } - - { - service_description = "gitolite is working"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = "check_git"; - - servicegroups = "webstatus-remote-services"; - _webstatus_name = "Git"; - _webstatus_url = "git.immae.eu"; - } - - { - service_description = "postfix SSL is up to date"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_smtp"; - - servicegroups = "webstatus-ssl"; - _webstatus_name = "SMTP"; - _webstatus_url = "smtp.immae.eu"; - } - - { - service_description = "imap SSL is up to date"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = ["check_tcp_ssl" "993"]; - - servicegroups = "webstatus-ssl"; - _webstatus_name = "IMAP"; - _webstatus_url = "imap.immae.eu"; - } - - { - service_description = "imap connection works"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_imap_connection"; - - servicegroups = "webstatus-remote-services,webstatus-email"; - _webstatus_name = "IMAP"; - _webstatus_url = "imap.immae.eu"; - } - - # Third party services - { - service_description = "OVH account has enough sms"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_ovh_sms"; - - check_interval = "120"; - notification_interval = "1440"; - } - - # Backup services - # { - # service_description = "eriomem backup is up and not full"; - # host_name = "eldiron.immae.eu"; - # use = "external-service"; - # check_command = "check_backup_eriomem"; - - # check_interval = "120"; - # notification_interval = "1440"; - - # servicegroups = "webstatus-backup"; - # } - { - service_description = "ovh backup is up and not full"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_ok"; - - check_interval = "120"; - notification_interval = "1440"; - - servicegroups = "webstatus-backup"; - } - - # DNS services - { - service_description = "eldiron dns is active and authoritative for aten.pro"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "aten.pro" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "aten.pro"; - } - - { - service_description = "eldiron dns is active and authoritative for bouya.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "bouya.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "bouya.org"; - } - - { - service_description = "eldiron dns is active and authoritative for filedesreves.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "filedesreves.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "filedesreves.fr"; - } - - { - service_description = "eldiron dns is active and authoritative for ludivinecassal.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "ludivinecassal.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "ludivinecassal.com"; - } - - { - service_description = "eldiron dns is active and authoritative for icommandeur.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "icommandeur.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "icommandeur.org"; - } - - { - service_description = "eldiron dns is active and authoritative for immae.eu"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "immae.eu" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.eu"; - } - - { - service_description = "eldiron dns is active and authoritative for immae.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "immae.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.fr"; - } - - { - service_description = "eldiron dns is active and authoritative for piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "piedsjaloux.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "piedsjaloux.fr"; - } - - { - service_description = "eldiron dns is active and authoritative for saison-photo.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "saison-photo.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "saison-photo.org"; - } - - { - service_description = "eldiron dns is active and authoritative for tellesflorian.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "tellesflorian.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "tellesflorian.com"; - } - - { - service_description = "eldiron dns is active and authoritative for capitaines.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "capitaines.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "capitaines.fr"; - } - - { - service_description = "cloudns dns is active and authoritative for aten.pro"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "aten.pro" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "aten.pro (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for bouya.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "bouya.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "bouya.org (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for filedesreves.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "filedesreves.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "filedesreves.fr (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for ludivinecassal.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "ludivinecassal.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "ludivinecassal.com (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for icommandeur.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "icommandeur.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "icommandeur.org (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for immae.eu"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "immae.eu" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.eu (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for immae.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "immae.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.fr (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "piedsjaloux.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "piedsjaloux.fr (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for tellesflorian.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "tellesflorian.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "tellesflorian.com (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for saison-photo.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "saison-photo.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "saison-photo.org (Secondary DNS ClouDNS)"; - } - - #### Web scenarios - { - service_description = "blog website is running on immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "Immae’s Blog"; - _webstatus_url = "https://www.immae.eu/blog"; - } - - { - service_description = "owncloud website is running on cloud.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Nextcloud"; - _webstatus_url = "https://cloud.immae.eu"; - } - - { - service_description = "nextcloud website is running on nextcloud.4c.salle-s.org"; - host_name = "quatresaisons.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "nextcloud.4c.salle-s.org" "/" "a safe home for all your data"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Nextcloud"; - _webstatus_url = "https://nextcloud.4c.salle-s.org"; - } - - { - service_description = "davical website is running on dav.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Davical"; - _webstatus_url = "https://dav.immae.eu/davical"; - } - - { - service_description = "adminer website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminer.org"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Adminer"; - _webstatus_url = "https://tools.immae.eu/adminer/"; - } - - { - service_description = "ttrss website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "TT-RSS"; - _webstatus_url = "https://tools.immae.eu/ttrss/"; - } - - { - service_description = "mpd website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "MPD (YMPD)"; - _webstatus_url = "https://tools.immae.eu/mpd/"; - } - - { - service_description = "rompr mpd website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "MPD (ROMPR)"; - _webstatus_url = "https://tools.immae.eu/rompr/"; - } - - { - service_description = "wallabag website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Wallabag"; - _webstatus_url = "https://tools.immae.eu/wallabag/"; - } - - { - service_description = "yourl website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "YOURLS"; - _webstatus_url = "https://tools.immae.eu/url/admin/"; - } - - { - service_description = "roundcube website is running on mail.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"]; - - servicegroups = "webstatus-webapps,webstatus-email"; - _webstatus_name = "Roundcube"; - _webstatus_url = "https://mail.immae.eu/roundcube/"; - } - - { - service_description = "dokuwiki website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Dokuwiki"; - _webstatus_url = "https://tools.immae.eu/dokuwiki/"; - } - - { - service_description = "shaarli website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Shaarli"; - _webstatus_url = "https://tools.immae.eu/Shaarli/"; - } - - { - service_description = "ldap website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "LDAP"; - _webstatus_url = "https://tools.immae.eu/ldap/"; - } - - { - service_description = "gitweb website is running on git.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Git"; - _webstatus_url = "https://git.immae.eu/"; - } - - { - service_description = "mantisbt website is running on git.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Mantisbt"; - _webstatus_url = "https://git.immae.eu/mantisbt"; - } - - { - service_description = "diaspora website is running on diaspora.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Diaspora"; - _webstatus_url = "https://diaspora.immae.eu/"; - } - - { - service_description = "peertube website is running on peertube.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Peertube"; - _webstatus_url = "https://peertube.immae.eu/"; - } - - { - service_description = "etherpad website is running on ether.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "ether.immae.eu" "/" "<title>Etherpad"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Etherpad"; - _webstatus_url = "https://ether.immae.eu/"; - } - - { - service_description = "mediagoblin website is running on mgoblin.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "mgoblin.immae.eu" "/" "<title>GNU MediaGoblin"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Mediagoblin"; - _webstatus_url = "https://mgoblin.immae.eu/"; - } - - { - service_description = "mastodon website is running on mastodon.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Mastodon"; - _webstatus_url = "https://mastodon.immae.eu/"; - } - - # Other web pages - { - service_description = "Jerome website is running on naturaloutil.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "naturaloutil.immae.eu" "/ping.php" "YES"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "naturaloutil.immae.eu"; - _webstatus_url = "https://naturaloutil.immae.eu/"; - } - - { - service_description = "Telio website is running on realistesmedia.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "realistesmedia.fr" "/" "doctype html"]; - contact_groups = "telio-tortay"; - } - - { - service_description = "Chloe website site is running on osteopathe-cc.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.osteopathe-cc.fr" "/" "Chloé Condamin ostéopathe D.O."]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "osteopathe-cc.fr"; - _webstatus_url = "https://www.osteopathe-cc.fr/"; - } - - { - service_description = "Richie website is running on europe-richie.org"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.europe-richie.org" "/" "<title>.Europe Richie]"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "europe-richie.org"; - _webstatus_url = "https://www.europe-richie.org/"; - } - - { - service_description = "Ludivine website site is running on ludivinecassal.com"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.ludivinecassal.com" "/" "<title>Ludivine Cassal"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "ludivinecassal.com"; - _webstatus_url = "https://www.ludivinecassal.com/"; - } - - { - service_description = "Aten website site is running on aten.pro"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "aten.pro" "/" "<title>ATEN"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "aten.pro"; - _webstatus_url = "https://aten.pro/"; - } - - { - service_description = "PiedsJaloux website site is running on piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.piedsjaloux.fr" "/" "<title>Les Pieds Jaloux"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "piedsjaloux.fr"; - _webstatus_url = "https://www.piedsjaloux.fr/"; - } - - { - service_description = "Denise and Jerome website site is running on denisejerome.piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "denisejerome.piedsjaloux.fr" "/" "<title>Accueil - Mariage"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "denisejerome.piedsjaloux.fr"; - _webstatus_url = "https://denisejerome.piedsjaloux.fr/"; - } - - { - service_description = "Connexionswing website site is running on connexionswing.com"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.connexionswing.com" "/" "<title>Cours, stages"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "connexionswing.com"; - _webstatus_url = "https://www.connexionswing.com/"; - } - - { - service_description = "Sandetludo website site is running on sandetludo.com"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.sandetludo.com" "/" "<title>Cours de West Coast"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "sandetludo.com"; - _webstatus_url = "https://www.sandetludo.com/"; - } - - # SSL - { - service_description = "ldap SSL is up to date"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = ["check_tcp_ssl" "636"]; - - servicegroups = "webstatus-ssl"; - _webstatus_name = "LDAP"; - _webstatus_url = "ldap.immae.eu"; - } - - # Tiboqorl - { - service_description = "Cyllene support page is running"; - host_name = "tiboqorl.fr"; - use = "external-web-service"; - contact_groups = "tiboqorl"; - check_command = [ "check_https" "sc.groupe-cyllene.com" "/" "<title>Support Client Cyllene" ]; - _webstatus_namespace = "tiboqorl"; - } - - { - service_description = "Origny page is running"; - host_name = "tiboqorl.fr"; - use = "external-web-service"; - contact_groups = "tiboqorl"; - check_command = [ "check_https" "origny.tiboqorl.fr" "/" "<title>Home Assistant" ]; - _webstatus_namespace = "tiboqorl"; - } - ]; - contact = { - telio-tortay = config.myEnv.monitoring.contacts.telio-tortay // { - use = "generic-contact"; - contactgroups = "telio-tortay"; - }; - thibault = config.myEnv.monitoring.contacts.thibault // { - use = "generic-contact"; - contactgroups = "tiboqorl"; - }; - }; - contactgroup = { - telio-tortay = { alias = "Telio Tortay"; members = "immae"; }; - tiboqorl = { alias = "Tiboqorl"; members = "immae"; }; - }; -} diff --git a/modules/private/monitoring/objects_quatresaisons.nix b/modules/private/monitoring/objects_quatresaisons.nix deleted file mode 100644 index f30cf81..0000000 --- a/modules/private/monitoring/objects_quatresaisons.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ lib, hostFQDN, emailCheck, openldap, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in -{ - resources = { - USER212 = "{{ .monitoring.quatresaisons.naemon_ldap }}"; - }; - activatedPlugins = [ "megaraid" "command" "postgresql" ]; - service = [ - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "No RAID device is degraded"; - use = "local-service"; - check_command = ["check_megaraid"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "LDAP is running"; - use = "local-service"; - check_command = [ "check_command_status" "${openldap}/bin/ldapwhoami -D uid=naemon,ou=services,dc=salle-s,dc=org -w $USER212$" "0" ""]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "Postgresql is running"; - use = "local-service"; - check_command = [ "check_postgresql_database_count" "/run/postgresql" "5432" "3" ]; - } - ]; -} diff --git a/modules/private/monitoring/objects_tiboqorl-fr.nix b/modules/private/monitoring/objects_tiboqorl-fr.nix deleted file mode 100644 index b49a1d8..0000000 --- a/modules/private/monitoring/objects_tiboqorl-fr.nix +++ /dev/null @@ -1,174 +0,0 @@ -{ lib, ... }: -let - hostFQDN = "tiboqorl.fr"; - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - contact_groups = "tiboqorl"; - freshness_threshold = "450"; - notification_interval = "240"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - _webstatus_namespace = "tiboqorl"; - host_name = hostFQDN; - }; -in -{ - host = { - "tiboqorl.fr" = { - alias = "tiboqorl.fr"; - address = "tiboqorl.fr"; - use = "linux-server"; - contact_groups = "tiboqorl"; - hostgroups = "webstatus-hosts"; - _webstatus_name = "tiboqorl"; - _webstatus_vhost = "status.immae.eu"; - _webstatus_namespace = "tiboqorl"; - }; - }; - service = [ - { - passiveInfo = defaultPassiveInfo; - service_description = "Size on root partition"; - use = "local-service"; - check_command = ["check_local_disk" "20%" "10%" "/"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Total number of process"; - use = "local-service"; - check_command = [ "check_local_procs" "250" "400" "RSZDT" ]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Network bandwidth"; - use = "local-service"; - check_interval = "2"; - max_check_attempts = "20"; - retry_interval = "2"; - check_command = [ - "check_local_bandwidth" - "eth0" - "20480" # kb/s - "51200" # kb/s - ]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Average load"; - use = "local-service"; - check_command = [ - "check_local_load" - "0.75,0.75,0.75" # warn - "1.0,1.0,1.0" # alert - ]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Swap usage"; - use = "local-service"; - check_command = ["check_local_swap" "20" "10"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Memory usage"; - use = "local-service"; - check_command = ["check_memory" "80" "90"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "NTP is activated and working"; - use = "local-service"; - check_command = ["check_ntp"]; - } - ]; - command = { - check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$"; - check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$"; - check_local_load = "$USER1$/check_load -w $ARG1$ -c $ARG2$"; - check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$"; - check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$"; - check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$"; - check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org"; - - check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5"; - - notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\""; - }; - timeperiod = { - "24x7" = { - alias = "24 Hours A Day, 7 Days A Week"; - monday = "00:00-24:00"; - tuesday = "00:00-24:00"; - wednesday = "00:00-24:00"; - thursday = "00:00-24:00"; - friday = "00:00-24:00"; - saturday = "00:00-24:00"; - sunday = "00:00-24:00"; - }; - }; - servicegroup = { - webstatus-resources = { alias = "Local resources"; }; - }; - hostgroup = { - webstatus-hosts = { alias = "Hosts"; }; - }; - contactgroup = { - tiboqorl = { alias = "Naemon Administrators"; }; - }; - templates = { - service = { - generic-service = { - active_checks_enabled = "1"; - check_freshness = "0"; - check_interval = "10"; - check_period = "24x7"; - contact_groups = "tiboqorl"; - event_handler_enabled = "1"; - flap_detection_enabled = "1"; - is_volatile = "0"; - max_check_attempts = "3"; - notification_interval = "60"; - notification_options = "w,u,c,r,f,s"; - notification_period = "24x7"; - notifications_enabled = "0"; - obsess_over_service = "1"; - passive_checks_enabled = "1"; - process_perf_data = "1"; - retain_nonstatus_information = "1"; - retain_status_information = "1"; - retry_interval = "2"; - }; - local-service = { - use = "generic-service"; - host_name = hostFQDN; - check_interval = "5"; - max_check_attempts = "4"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - }; - }; - host = { - generic-host = { - event_handler_enabled = "1"; - flap_detection_enabled = "1"; - notification_period = "24x7"; - notifications_enabled = "1"; - process_perf_data = "1"; - retain_nonstatus_information = "1"; - retain_status_information = "1"; - }; - linux-server = { - check_command = "check_host_alive"; - check_interval = "5"; - check_period = "24x7"; - contact_groups = "tiboqorl"; - max_check_attempts = "10"; - notification_interval = "120"; - notification_options = "d,u,r,f"; - retry_interval = "1"; - }; - }; - }; -} diff --git a/modules/private/monitoring/plugins/notify_eban_url b/modules/private/monitoring/plugins/notify_eban_url deleted file mode 100755 index 107b5de..0000000 --- a/modules/private/monitoring/plugins/notify_eban_url +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -if [ "$SERVICESTATE" = "CRITICAL" -o "$SERVICESTATE" = "UNKNOWN" -o "$HOSTSTATE" = "DOWN" -o "$HOSTSTATE" = "UNREACHABLE" ]; then - MESSAGE="$STATUS_NAME seems down!" - curl -X GET -G --data-urlencode "user=$USER" --data-urlencode "pass=$PASSWORD" --data-urlencode "msg=$MESSAGE" https://smsapi.free-mobile.fr/sendmsg -fi diff --git a/modules/private/pub/default.nix b/modules/private/pub/default.nix deleted file mode 100644 index c419530..0000000 --- a/modules/private/pub/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ lib, pkgs, config, ... }: -{ - options = { - myServices.pub.enable = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - Whether to enable pub user. - ''; - }; - }; - - config = lib.mkIf config.myServices.pub.enable { - myServices.ssh.modules = [{ - snippet = builtins.readFile ./ldap_pub.sh; - dependencies = [ pkgs.coreutils ]; - }]; - users.users.pub = let - restrict = pkgs.runCommand "restrict" { - file = ./restrict; - buildInputs = [ pkgs.makeWrapper ]; - } '' - mkdir -p $out/bin - cp $file $out/bin/restrict - chmod a+x $out/bin/restrict - patchShebangs $out/bin/restrict - wrapProgram $out/bin/restrict \ - --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \ - --set TMUX_RESTRICT ${./tmux.restrict.conf} - ''; - purple-hangouts = pkgs.purple-hangouts.overrideAttrs(old: { - installPhase = '' - install -Dm755 -t $out/lib/purple-2/ libhangouts.so - for size in 16 22 24 48; do - install -TDm644 hangouts$size.png $out/share/pixmaps/pidgin/protocols/$size/hangouts.png - done - ''; - }); - in { - createHome = true; - description = "Restricted shell user"; - home = "/var/lib/pub"; - uid = config.myEnv.users.pub.uid; - useDefaultShell = true; - packages = [ - restrict - pkgs.tmux - (pkgs.pidgin.override { plugins = [ - pkgs.purple-plugin-pack purple-hangouts - pkgs.purple-discord pkgs.purple-facebook - pkgs.telegram-purple - ]; }) - ]; - }; - }; -} diff --git a/modules/private/pub/ldap_pub.sh b/modules/private/pub/ldap_pub.sh deleted file mode 100644 index bbbefdc..0000000 --- a/modules/private/pub/ldap_pub.sh +++ /dev/null @@ -1,56 +0,0 @@ -### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh -LDAP_PUB_RESTRICT_MEMBER="cn=restrict,cn=pub,ou=services,dc=immae,dc=eu" -LDAP_PUB_FORWARD_MEMBER="cn=forward,cn=pub,ou=services,dc=immae,dc=eu" -ECHO=$(which echo) - -if [[ $user == pub ]]; then - ldap_search '(&(memberOf='$LDAP_PUB_RESTRICT_MEMBER')('$KEY'=*))' $KEY | \ - while read line ; - do - if [ ! -z "$line" ]; then - if [[ $line == dn* ]]; then - echo "" - user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line") - echo "# $user" - elif [[ $line == $KEY* ]]; then - key=$(clean_key_line pub "$line") - key_forward=$(clean_key_line forward "$line") - if [ ! -z "$key" ]; then - if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then - echo -n 'command="/etc/profiles/per-user/pub/bin/restrict '$user'" ' - echo $key - fi - elif [ ! -z "$key_forward" ]; then - if [[ $key_forward != *$'\n'* ]] && [[ $key_forward == ssh-* ]]; then - echo "# forward only" - echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" ' - echo $key_forward - fi - fi - fi - fi - done - - echo "" - ldap_search '(&(memberOf='$LDAP_PUB_FORWARD_MEMBER')('$KEY'=*))' $KEY | \ - while read line ; - do - if [ ! -z "$line" ]; then - if [[ $line == dn* ]]; then - echo "" - user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line") - echo "# $user" - elif [[ $line == $KEY* ]]; then - key=$(clean_key_line forward "$line") - if [ ! -z "$key" ]; then - if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then - echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" ' - echo $key - fi - fi - fi - fi - done - exit 0 -fi - diff --git a/modules/private/ssh/default.nix b/modules/private/ssh/default.nix deleted file mode 100644 index ee5dda5..0000000 --- a/modules/private/ssh/default.nix +++ /dev/null @@ -1,91 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.ssh; -in -{ - options.myServices.ssh = let - module = lib.types.submodule { - options = { - snippet = lib.mkOption { - type = lib.types.lines; - description = '' - Snippet to use - ''; - }; - dependencies = lib.mkOption { - type = lib.types.listOf lib.types.package; - default = []; - description = '' - Dependencies of the package - ''; - }; - }; - }; - in { - predefinedModules = lib.mkOption { - type = lib.types.attrsOf module; - default = { - regular = { - snippet = builtins.readFile ./ldap_regular.sh; - }; - }; - readOnly = true; - description = '' - Predefined modules - ''; - }; - modules = lib.mkOption { - type = lib.types.listOf module; - default = []; - description = '' - List of modules to enable - ''; - }; - }; - config = { - networking.firewall.allowedTCPPorts = [ 22 ]; - } // (lib.mkIf (builtins.length cfg.modules > 0) { - - services.openssh.extraConfig = '' - AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys - AuthorizedKeysCommandUser nobody - ''; - - secrets.keys."ssh-ldap" = { - user = "nobody"; - group = "nogroup"; - permissions = "0400"; - text = config.myEnv.sshd.ldap.password; - }; - system.activationScripts.sshd = { - deps = [ "secrets" ]; - text = '' - install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password - ''; - }; - # ssh is strict about parent directory having correct rights, don't - # move it in the nix store. - environment.etc."ssh/ldap_authorized_keys" = let - deps = lib.lists.unique ( - [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils ] - ++ lib.flatten (map (v: v.dependencies) cfg.modules) - ); - fullScript = pkgs.runCommand "ldap_authorized_keys" { - snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) cfg.modules); - } '' - substituteAll ${./ldap_authorized_keys.sh} $out - chmod a+x $out - ''; - ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" { - buildInputs = [ pkgs.makeWrapper ]; - } '' - makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps} - ''; - in { - enable = true; - mode = "0755"; - user = "root"; - source = ldap_authorized_keys; - }; - }); -} diff --git a/modules/private/system.nix b/modules/private/system.nix deleted file mode 100644 index 5f3d79e..0000000 --- a/modules/private/system.nix +++ /dev/null @@ -1,98 +0,0 @@ -{ pkgs, lib, config, name, nodes, ... }: -{ - config = { - deployment.secrets."secret_vars.yml" = { - source = builtins.toString ../../nixops/secrets/vars.yml; - destination = config.secrets.secretsVars; - owner.user = "root"; - owner.group = "root"; - permissions = "0400"; - }; - - networking.extraHosts = builtins.concatStringsSep "\n" - (lib.mapAttrsToList (n: v: "${v.config.hostEnv.ips.main.ip4} ${n}") nodes); - - users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ]; - secrets.deleteSecretsVars = true; - secrets.gpgKeys = [ - ../../nixops/public_keys/Immae.pub - ]; - secrets.secretsVars = "/run/keys/vars.yml"; - - services.openssh.enable = true; - - nixpkgs.overlays = builtins.attrValues (import ../../overlays) ++ [ - (self: super: { - postgresql = self.postgresql_pam; - mariadb = self.mariadb_pam; - }) # don’t put them as generic overlay because of home-manager - ]; - - services.journald.extraConfig = '' - #Should be "warning" but disabled for now, it prevents anything from being stored - MaxLevelStore=info - MaxRetentionSec=1year - ''; - - users.users = - builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({ - isNormalUser = true; - home = "/home/${x.name}"; - createHome = true; - linger = true; - } // x)) (config.hostEnv.users pkgs)) - // { - root.packages = let - nagios-cli = pkgs.writeScriptBin "nagios-cli" '' - #!${pkgs.stdenv.shell} - sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${./monitoring/nagios-cli.cfg} - ''; - in - [ - pkgs.telnet - pkgs.htop - pkgs.iftop - pkgs.bind.dnsutils - pkgs.httpie - pkgs.iotop - pkgs.whois - pkgs.ngrep - pkgs.tcpdump - pkgs.tshark - pkgs.tcpflow - # pkgs.mitmproxy # failing - pkgs.nmap - pkgs.p0f - pkgs.socat - pkgs.lsof - pkgs.psmisc - pkgs.openssl - pkgs.wget - - pkgs.cnagios - nagios-cli - - pkgs.pv - pkgs.smartmontools - ]; - }; - - users.mutableUsers = lib.mkDefault false; - - environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios"; - environment.systemPackages = [ - pkgs.git - pkgs.vim - pkgs.rsync - pkgs.strace - ] ++ - (lib.optional (builtins.length (config.hostEnv.users pkgs) > 0) pkgs.home-manager); - - systemd.targets.maintenance = { - description = "Maintenance target with only sshd"; - after = [ "network-online.target" "sshd.service" ]; - requires = [ "network-online.target" "sshd.service" ]; - unitConfig.AllowIsolate = "yes"; - }; - }; -} diff --git a/modules/private/system/dilion/vms.nix b/modules/private/system/dilion/vms.nix deleted file mode 100644 index af96622..0000000 --- a/modules/private/system/dilion/vms.nix +++ /dev/null @@ -1,185 +0,0 @@ -# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS -{ config, pkgs, lib, ... }@args: -let - pools = { - niximages = { - type = "dir"; - target = "/etc/libvirtd/base-images"; - }; - buildbot-disks = rec { - preStart = '' - mkdir -p ${target} - ''; - type = "dir"; - target = "/var/lib/libvirt/images/buildbot-disks"; - }; - zfspool = { - # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs - type = "zfs"; - xml = '' - <source> - <name>zpool/libvirt</name> - </source> - ''; - }; - }; - networks = { - immae = { - bridgeNumber = "1"; - ipRange = "192.168.100"; - }; - }; - guests = { - caldance = { - pool = "zfspool"; - cpus = "1"; - memory = "2"; - network = "immae"; - diskSize = "10GiB"; - extraDevicesXML = '' - <filesystem type="mount"> - <source dir="/var/lib/caldance"/> - <target dir="home"/> - </filesystem> - ''; - }; - buildbot = { - pool = "zfspool"; - cpus = "1"; - memory = "3"; - network = "immae"; - diskSize = "10GiB"; - destroyVolumeOnExit = true; - }; - }; - toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2"; -in -{ - environment.etc."libvirtd/base-images/nixos.qcow2".source = toImage ./vms/base_configuration.nix; - environment.etc."libvirtd/base-images/buildbot.qcow2".source = toImage ./vms/buildbot_configuration.nix; - systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" { - after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; - requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = - let - xml = pkgs.writeText "libvirt-guest-${name}.xml" - '' - <domain type="kvm"> - <name>${name}</name> - <uuid>UUID</uuid> - <memory unit="GiB">${guest.memory}</memory> - <vcpu>${guest.cpus}</vcpu> - <os> - <type arch="x86_64">hvm</type> - </os> - <devices> - <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator> - <disk type="volume"> - <source pool="${guest.pool}" volume="guest-${name}" /> - <target dev="vda" bus="virtio"/> - </disk> - ${guest.extraDevicesXML or ""} - <input type="keyboard" bus="usb"/> - <graphics type="vnc" port="-1" autoport="yes"/> - <interface type="network"> - <source network="${guest.network}" /> - </interface> - </devices> - <features> - <acpi/> - </features> - </domain> - ''; - in - guest.preStart or "" + '' - if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then - ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${guest.diskSize}' - volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}') - ${pkgs.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path - fi - uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)" - ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}') - ${pkgs.libvirt}/bin/virsh start '${name}' - ''; - preStop = '' - ${pkgs.libvirt}/bin/virsh shutdown '${name}' - let "timeout = $(date +%s) + 10" - while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do - if [ "$(date +%s)" -ge "$timeout" ]; then - # Meh, we warned it... - ${pkgs.libvirt}/bin/virsh destroy '${name}' - else - # The machine is still running, let's give it some time to shut down - sleep 0.5 - fi - done - '' + lib.optionalString (guest.destroyVolumeOnExit or false) '' - if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then - ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true - ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}' - fi - ''; - }) guests // (lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" { - after = [ "libvirtd.service" ]; - requires = [ "libvirtd.service" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = let - xml = pkgs.writeText "libvirt-network-${name}.xml" '' - <network> - <name>${name}</name> - <uuid>UUID</uuid> - <forward mode='nat' /> - <bridge name='virbr${network.bridgeNumber}' /> - <domain name='${name}' localOnly='yes'/> - <ip address='${network.ipRange}.1' netmask='255.255.255.0'> - <dhcp> - <range start='${network.ipRange}.2' end='${network.ipRange}.254'/> - </dhcp> - </ip> - </network> - ''; - in '' - uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)" - ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}') - ${pkgs.libvirt}/bin/virsh net-start '${name}' - ''; - preStop = '' - ${pkgs.libvirt}/bin/virsh net-destroy '${name}' - ''; - }) networks) // (lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" { - after = [ "libvirtd.service" ]; - requires = [ "libvirtd.service" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = let - xml = pkgs.writeText "libvirt-pool-${name}.xml" '' - <pool type="${pool.type}"> - <name>${name}</name> - <uuid>UUID</uuid> - ${pool.xml or ""} - ${if pool ? target then '' - <target> - <path>${pool.target}</path> - </target> - '' else ""} - </pool> - ''; - in pool.preStart or "" + '' - uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)" - ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}') - ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true - ''; - }) pools); -} diff --git a/modules/private/system/eldiron.nix b/modules/private/system/eldiron.nix deleted file mode 100644 index 8b2784d..0000000 --- a/modules/private/system/eldiron.nix +++ /dev/null @@ -1,228 +0,0 @@ -{ config, pkgs, lib, ... }: -{ - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; - # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age - secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ]; - boot = { - kernelModules = [ "kvm-intel" ]; - blacklistedKernelModules = [ "nvidiafb" ]; - loader.timeout = 1; - loader.grub.devices = [ "/dev/sda" "/dev/sdb" ]; - kernel.sysctl = { - # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md - "net.ipv4.tcp_sack" = 0; - }; - supportedFilesystems = [ "zfs" ]; - kernelParams = ["zfs.zfs_arc_max=6442450944"]; - kernelPackages = pkgs.linuxPackages_latest; - initrd.availableKernelModules = [ "ahci" "sd_mod" ]; - initrd.secrets = { - "/boot/pass.key" = "/boot/pass.key"; - }; - }; - services.udev.extraRules = '' - ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0" - ''; - nix.maxJobs = 8; - powerManagement.cpuFreqGovernor = "powersave"; - myEnv = import ../../../nixops/secrets/environment.nix; - - fileSystems = { - # pools: - # zpool: ashift=12 - # zfast: ashift=12 - # zfs: - # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy - # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key - # zpool/root/var: atime=on - # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy - # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key - # zfast/root/etc: ø - # zfast/root/nix: ø - # zfast/root/tmp: async=disabled - # zfast/root/var: atime=on - # zfast/root/var/lib: ø - # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata - # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput - # zfast/root/var/lib/postgresql/11.0: ø - # zfast/root/var/lib/postgresql/11.0/pg_wal: ø - "/" = { fsType = "zfs"; device = "zpool/root"; }; - "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; }; - "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; }; - "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; }; - "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; }; - "/var" = { fsType = "zfs"; device = "zpool/root/var"; }; - "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; }; - "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; }; - "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; }; - "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; }; - }; - swapDevices = [ { label = "swap1"; } { label = "swap2"; } ]; - hardware.enableRedistributableFirmware = true; - - services.zfs = { - autoScrub = { - enable = false; - }; - }; - networking = { - hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4 - firewall.enable = true; - # FIXME: on next reboot, remove the /27 and the localCommands - interfaces."eth0".ipv4.addresses = - pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips) - ++ [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ]; - interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList - (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) - config.hostEnv.ips); - defaultGateway = "176.9.151.65"; - localCommands = '' - # FIXME: Those commands were added by nixops and may not be - # actually needed - ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true - ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true - ip -6 route add default via 'fe80::1' dev eth0 || true - ''; - nameservers = [ - "213.133.98.98" - "213.133.99.99" - "213.133.100.100" - "2a01:4f8:0:a0a1::add:1010" - "2a01:4f8:0:a102::add:9999" - "2a01:4f8:0:a111::add:9898" - ]; - }; - - imports = builtins.attrValues (import ../..); - - myServices.buildbot.enable = true; - myServices.databases.enable = true; - myServices.gitolite.enable = true; - myServices.monitoring.enable = true; - myServices.irc.enable = true; - myServices.pub.enable = true; - myServices.tasks.enable = true; - myServices.mpd.enable = true; - myServices.dns.enable = true; - myServices.certificates.enable = true; - myServices.websites.enable = true; - myServices.gemini.enable = true; - myServices.mail.enable = true; - myServices.ejabberd.enable = true; - myServices.vpn.enable = true; - myServices.ftp.enable = true; - - services.netdata.enable = true; - services.netdata.config.global."memory mode" = "none"; - services.netdata.config.health."enabled" = "no"; - services.netdata.config.web.mode = "none"; - users.users."${config.services.netdata.user}".extraGroups = [ "keys" ]; - environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf"; - secrets.keys = { - "netdata-stream.conf" = { - user = config.services.netdata.user; - group = config.services.netdata.group; - permissions = "0400"; - text = '' - [stream] - enabled = yes - destination = ${config.myEnv.monitoring.netdata_aggregator} - api key = ${config.myEnv.monitoring.netdata_keys.eldiron} - ''; - }; - "zrepl_backup/identity" = { - user = "root"; - group = "root"; - permissions = "0400"; - text = config.myEnv.zrepl_backup.ssh_key.private; - }; - }; - programs.ssh.knownHosts.dilion = { - hostNames = ["dilion.immae.eu"]; - publicKey = let - profile = config.myEnv.rsync_backup.profiles.dilion; - in - "${profile.host_key_type} ${profile.host_key}"; - }; - - services.cron = { - enable = true; - mailto = "cron@immae.eu"; - systemCronJobs = [ - '' - 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected" - # Need a way to blacklist properly - # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:" - 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced" - '' - ]; - }; - - environment.systemPackages = [ pkgs.bindfs ]; - - services.zrepl = { - enable = true; - config = let - redis_dump = pkgs.writeScript "redis-dump" '' - #! ${pkgs.stdenv.shell} - ${pkgs.redis}/bin/redis-cli bgsave - ''; - in '' - jobs: - - type: push - # must not change - name: "backup-to-dilion" - filesystems: - "zpool/root": true - "zpool/root/etc": true - "zpool/root/var<": true - connect: - type: ssh+stdinserver - host: dilion.immae.eu - user: backup - port: 22 - identity_file: ${config.secrets.fullPaths."zrepl_backup/identity"} - snapshotting: - type: periodic - prefix: zrepl_ - interval: 1h - #hooks: - # - type: mysql-lock-tables - # dsn: "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/" - # filesystems: - # "zpool/root/var": true - # - type: command - # path: ${redis_dump} - # err_is_fatal: false - # filesystems: - # "zpool/root/var": true - send: - encrypted: true - pruning: - keep_sender: - - type: regex - regex: "^manual_.*" - - type: grid - grid: 24x1h | 7x1d | 4x7d | 6x30d - regex: "^zrepl_.*" - keep_receiver: - - type: regex - regex: "^manual_.*" - - type: grid - grid: 6x4h | 7x1d | 4x7d | 6x30d - regex: "^zrepl_.*" - ''; - }; - # This value determines the NixOS release with which your system is - # to be compatible, in order to avoid breaking some software such as - # database servers. You should change this only after NixOS release - # notes say you should. - # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? -} diff --git a/modules/private/system/quatresaisons.nix b/modules/private/system/quatresaisons.nix deleted file mode 100644 index 82db70f..0000000 --- a/modules/private/system/quatresaisons.nix +++ /dev/null @@ -1,436 +0,0 @@ -{ config, pkgs, lib, ... }: -let - serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons; - yarnModules = pkgs.yarn2nix-moretea.mkYarnModules rec { - name = "landing"; - pname = name; - version = "v1.0.0"; - packageJSON = "${pkgs.sources.webapps-landing}/package.json"; - yarnLock = "${pkgs.sources.webapps-landing}/yarn.lock"; - yarnNix = ../websites/tools/tools/landing/yarn-packages.nix; - }; - toLanding = landingConfig: pkgs.stdenv.mkDerivation rec { - pname = "landing"; - version = "v1.0.0"; - src = pkgs.sources.webapps-landing; - - buildInputs = [ yarnModules pkgs.yarn2nix-moretea.yarn ]; - configurePhase = '' - ln -s ${yarnModules}/node_modules . - ''; - buildPhase = '' - yarn build - ''; - installPhase = '' - cp -a dist $out - cp -f ${landingConfig} $out/config.yml - ln -s service-worker.js $out/worker.js - ''; - }; - normalUsers = serverSpecificConfig.users; - sponsoredUser = pkgs.writeScriptBin "sponsored_user" '' - #!/usr/bin/env bash - - set -euo pipefail - [ -z "''${SUDO_USER+x}" ] && echo "Must be run with sudo" && exit 1 - - mygroup=$(id -ng $SUDO_USER) - - sponsored=$(getent group $mygroup | cut -d':' -f4) - - echo "Sponsored users: ''${sponsored:-<none>}" - - log () { - touch /var/log/sponsored_users - chmod go-rwx /var/log/sponsored_users - echo "`date` $mygroup $1" | LANG=C cat -v | tr '\012' ' ' | sed 's:$:\x0a:' >> /var/log/sponsored_users - } - - create_user () { - log "creates $1: $2" - useradd -m -G users,$mygroup -g $mygroup -p '!' "$1" - touch /var/lib/nixos/sponsored_users - chmod go-rwx /var/lib/nixos/sponsored_users - echo "$mygroup $1 $2" >> /var/lib/nixos/sponsored_users - (${pkgs.openldap}/bin/ldapadd -c -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} 2>/dev/null >/dev/null || true) <<EOF - dn: uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org - objectClass: inetOrgPerson - cn: $1 - description:: $(echo -n "$2" | base64) - sn: $1 - uid: $1 - EOF - while ! passwd "$1"; do - echo "please give an initial password" - done - } - - delete_user () { - IFS=","; - for u in $sponsored; do - if [ "$u" = "$1" ]; then - log "deletes $1" - userdel -r "$1" - sed -i -e "/^$mygroup $1/d" /var/lib/nixos/sponsored_users - ${pkgs.openldap}/bin/ldapdelete -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} \ - "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org" - echo "deleted" - exit 0 - fi - done - - echo "User does not exist or does not belong to you"; - exit 1 - } - - reset_password () { - IFS=","; - for u in $sponsored; do - if [ "$u" = "$1" ]; then - log "resets password for $1" - passwd "$1" - exit 0 - fi - done - - echo "User does not exist or does not belong to you"; - exit 1 - } - - reset_ldap_password () { - if [ "$1" = "$mygroup" ]; then - log "resets web password" - ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} \ - -S "uid=$mygroup,ou=users,dc=salle-s,dc=org" - else - IFS=","; - for u in $sponsored; do - if [ "$u" = "$1" ]; then - log "resets web password of $1" - ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} \ - -S "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org" - exit 0 - fi - done - - echo "User does not exist or does not belong to you"; - exit 1 - fi - } - - show_help () { - echo "sponsored_users create username realname" - echo " create a new sub-user attached to your account" - echo "sponsored_users (delete|reset_password) username" - echo " delete a sub-user attached to your account or reset his password" - echo "sponsored_users reset_ldap_password username" - echo " reset the web password of a sub-user or yourself" - } - - [ -z "''${1+x}" -o -z "''${2+x}" ] && { show_help ; exit 0; } - action="$1" - username="$2" - shift - shift - - case "$action" in - create) - [ -z "''${1+x}" ] && { show_help ; echo "Conformément à la charte https://4c.salle-s.org/charte veuillez préciser le nom réel du futur utilisateur du compte $username, juste pour root." ; exit 1; } - create_user "$username" "$*"; - ;; - delete) - delete_user "$username"; - ;; - reset_password) - reset_password "$username"; - ;; - reset_ldap_password) - reset_ldap_password "$username"; - ;; - *) - show_help - ;; - esac - ''; -in -{ - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; - # ssh-keyscan quatresaison | nix-shell -p ssh-to-age --run ssh-to-age - secrets.ageKeys = [ "age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7" ]; - - programs.ssh.package = pkgs.openssh.overrideAttrs(old: { - PATH_PASSWD_PROG = "/run/wrappers/bin/passwd"; - buildFlags = [ "SSH_KEYSIGN=/run/wrappers/bin/ssh-keysign" ]; - }); - - imports = builtins.attrValues (import ../..) ++ - [ ./quatresaisons/nextcloud.nix ./quatresaisons/databases.nix ]; - - myEnv = import ../../../nixops/secrets/environment.nix; - - fileSystems = { - "/" = { device = "/dev/disk/by-uuid/865931b4-c5cc-439f-8e42-8072c7a30634"; fsType = "ext4"; }; - "/home" = { device = "/dev/disk/by-uuid/76020bc4-5b88-464c-8952-9a59072c597f"; fsType = "ext4"; neededForBoot = true; }; - "/boot" = { device = "/dev/disk/by-uuid/0fb8421a-61e5-4ed5-a795-4dd3a9b2152a"; fsType = "ext4"; }; - "/var/lib" = { device = "/home/var_lib"; fsType = "none"; options = [ "defaults,bind" ]; }; - }; - powerManagement.cpuFreqGovernor = "powersave"; - hardware.enableRedistributableFirmware = true; - - boot.initrd.availableKernelModules = [ "ahci" "megaraid_sas" "sd_mod" ]; - boot.initrd.kernelModules = [ "dm-snapshot" ]; - boot.kernelModules = [ "kvm-intel" ]; - - boot.loader.grub.enable = true; - boot.loader.grub.version = 2; - boot.loader.grub.device = "/dev/sda"; - - networking.firewall.enable = false; - networking.firewall.allowedTCPPorts = [ 80 443 ]; - networking.useDHCP = false; - networking.interfaces.eth0.useDHCP = true; - networking.interfaces.eth0.ipv6.addresses = [ - { address = pkgs.lib.head config.hostEnv.ips.main.ip6; prefixLength = 64; } - ]; - networking.defaultGateway6 = { address = "fe80::1"; interface = "eth0"; }; - services.udev.extraRules = '' - ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:8b:2f:f0", NAME="eth0" - ''; - security.pam.services.chage.text = '' - auth sufficient pam_rootok.so - auth required pam_unix.so - account required pam_unix.so - session required pam_unix.so - password required pam_permit.so - ''; - security.pam.services.sshd.makeHomeDir = true; - security.pam.services.passwd_default = {}; - security.pam.services.passwd.text = '' - password required pam_cracklib.so enforce_for_root difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 - '' + config.security.pam.services.passwd_default.text; - - system.activationScripts.ldapSync = { - deps = [ "secrets" "users" ]; - text = - let - com = "-D cn=root,dc=salle-s,dc=org -y ${config.secrets.fullPaths."ldap/sync_password"}"; - in '' - # Add users - ${pkgs.openldap}/bin/ldapadd -c ${com} -f ${config.secrets.fullPaths."ldap/ldaptree.ldif"} 2>/dev/null >/dev/null || true - - # Remove obsolete users - ${pkgs.openldap}/bin/ldapsearch -LLL ${com} -s one -b "ou=users,dc=salle-s,dc=org" "uid" |\ - grep "^uid" | ${pkgs.gnused}/bin/sed -e "s/uid: //" | while read ldapuser; do - - for user in ${builtins.concatStringsSep " " (builtins.attrNames normalUsers)}; do - if [ "$user" = "$ldapuser" ]; then - continue 2 - fi - done - ${pkgs.openldap}/bin/ldapdelete -r ${com} uid=$ldapuser,ou=users,dc=salle-s,dc=org - done - - # Subusers - if [ -f /var/lib/nixos/sponsored_users ]; then - cat /var/lib/nixos/sponsored_users | while read mainUser subUser name; do - (${pkgs.openldap}/bin/ldapadd -c ${com} 2>/dev/null >/dev/null || true) <<EOF - dn: uid=$subUser,uid=$mainUser,ou=users,dc=salle-s,dc=org - objectClass: inetOrgPerson - cn: $subUser - description:: $(echo -n "$name" | base64) - sn: $subUser - uid: $subUser - EOF - done - fi - ''; - }; - - secrets.keys = { - "ldap/sync_password" = { - permissions = "0400"; - text = serverSpecificConfig.ldap_sync_password; - }; - "ldap/ldaptree.ldif" = { - permissions = "0400"; - text = serverSpecificConfig.ldap_service_users - + (builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: '' - dn: uid=${n},ou=users,dc=salle-s,dc=org - objectClass: inetOrgPerson - cn: ${n} - description: ${v._meta.name or n} ${v._meta.email} - sn: ${n} - uid: ${n} - '') normalUsers)); - }; - }; - - myServices.monitoring.enable = true; - myServices.certificates.enable = true; - users.mutableUsers = true; - system.stateVersion = "21.03"; - programs.zsh.enable = true; - - users.motd = '' - Bienvenue sur quatresaisons.salle-s.org ! - - * Charte : - https://4c.salle-s.org/charte - * Gérer les utilisateurs unix additionnels : - sudo sponsored_user -h - * Applications web : - * tableau de bord : https://4c.salle-s.org/ - * nextcloud : https://nextcloud.4c.salle-s.org/ - ''; - - users.groups = - lib.mapAttrs (n: v: { gid = v.uid; }) normalUsers - // { wwwrun = { gid = config.ids.gids.wwwrun; }; }; - users.users = - let - defaultNormal = n: { - group = n; - extraGroups = [ "users" ]; - isNormalUser = true; - }; - in - lib.mapAttrs (n: v: defaultNormal n // (lib.filterAttrs (k: _: k != "_meta") v)) normalUsers - // { - sponsored-separator = { - uid = 10000; - group = "users"; - home = "/var/empty"; - extraGroups = []; - isNormalUser = true; - createHome = false; - }; - wwwrun = { - group = "wwwrun"; - description = "Apache httpd user"; - uid = config.ids.uids.wwwrun; - extraGroups = [ "keys" ]; - }; - }; - - system.activationScripts.usersPost = { - deps = [ "users" "groups" ]; - text = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: '' - if getent shadow "${n}" | grep -q '^${n}:${v.initialHashedPassword or "!"}:1'; then - chage -d 0 "${n}" - [ '${v.initialHashedPassword or "!"}' = '!' ] && passwd -d "${n}" - fi - '') normalUsers); - }; - security.sudo.extraRules = [ - { - commands = [ - { command = "${sponsoredUser}/bin/sponsored_user"; options = [ "NOPASSWD" ]; } - { command = "/run/current-system/sw/bin/sponsored_user"; options = [ "NOPASSWD" ]; } - ]; - users = builtins.attrNames normalUsers; - runAs = "root"; - } - ]; - - environment.systemPackages = [ - sponsoredUser - pkgs.git pkgs.vim pkgs.rsync pkgs.strace pkgs.home-manager - pkgs.telnet pkgs.htop pkgs.iftop pkgs.bind.dnsutils pkgs.httpie - pkgs.iotop pkgs.whois pkgs.ngrep pkgs.tcpdump pkgs.tshark - pkgs.tcpflow pkgs.nmap pkgs.p0f pkgs.socat pkgs.lsof pkgs.psmisc - pkgs.openssl pkgs.wget pkgs.pv pkgs.smartmontools pkgs.youtube-dl - pkgs.unzip pkgs.octave pkgs.feh pkgs.xv pkgs.sshfs pkgs.gdb - pkgs.file pkgs.lynx pkgs.tmux pkgs.awesome pkgs.libreoffice - pkgs.evince pkgs.firefox pkgs.xcalib pkgs.python3 pkgs.python2 - pkgs.xorg.xkbcomp pkgs.subversion pkgs.xclip pkgs.imagemagick - pkgs.bc pkgs.sox pkgs.zip pkgs.gnome3.gnome-screenshot - pkgs.datadog-process-agent - ]; - - services.websites.env.production = { - enable = true; - adminAddr = "httpd@immae.eu"; - httpdName = "Prod"; - modules = [ "http2" "deflate" "filter" ]; - extraConfig = [ - '' - LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost - Protocols h2 http/1.1 - AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript - '' ]; - ips = - let ips = config.hostEnv.ips.main; - in [ips.ip4] ++ (ips.ip6 or []); - - fallbackVhost = { - certName = "quatresaisons"; - hosts = [ "quatresaisons.immae.eu" ]; - root = pkgs.runCommand "empty" {} "mkdir $out && touch $out/index.html"; - extraConfig = [ "DirectoryIndex index.html" ]; - }; - vhostConfs.salle-s = { - certName = "quatresaisons"; - addToCerts = true; - hosts = [ "salle-s.org" ]; - root = toLanding ./quatresaisons/landing.yml; - extraConfig = [ - '' - <Directory ${toLanding ./quatresaisons/landing.yml}> - AllowOverride None - Require all granted - DirectoryIndex index.html - </Directory> - '' - ]; - }; - vhostConfs.tools = { - certName = "quatresaisons"; - addToCerts = true; - hosts = [ "4c.salle-s.org" "quatresaisons.salle-s.org" "quatre-saisons.salle-s.org" ]; - root = toLanding ./quatresaisons/landing_4c.yml; - extraConfig = [ - '' - Alias /charte ${serverSpecificConfig.charte_path} - <Directory ${serverSpecificConfig.charte_path}> - AllowOverride None - Require all granted - DirectoryIndex index.html index.txt - </Directory> - - <Directory ${toLanding ./quatresaisons/landing_4c.yml}> - AllowOverride None - Require all granted - DirectoryIndex index.html - </Directory> - '' - ]; - }; - }; - system.activationScripts.httpd = '' - install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php - install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions - ''; - - services.phpfpm = { - phpOptions = '' - session.save_path = "/var/lib/php/sessions" - post_max_size = 20M - ; 15 days (seconds) - session.gc_maxlifetime = 1296000 - ; 30 days (minutes) - session.cache_expire = 43200 - ''; - settings = { - log_level = "notice"; - }; - }; - -} diff --git a/modules/private/system/quatresaisons/databases.nix b/modules/private/system/quatresaisons/databases.nix deleted file mode 100644 index f7b27e0..0000000 --- a/modules/private/system/quatresaisons/databases.nix +++ /dev/null @@ -1,147 +0,0 @@ -{ pkgs, config, lib, ... }: -{ - config = let - serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons; - phpLdapAdmin = pkgs.webapps.phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; }; - in { - services.postgresql.enable = true; - services.postgresql.package = pkgs.postgresql_12; - services.postgresql.ensureUsers = [ - { name = "naemon"; } - ]; - secrets.keys = { - "ldap/password" = { - permissions = "0400"; - user = "openldap"; - group = "openldap"; - text = "rootpw ${serverSpecificConfig.ldap_root_pw}"; - }; - "webapps/tools-ldap" = { - user = "wwwrun"; - group = "wwwrun"; - permissions = "0400"; - text = '' - <?php - $config->custom->appearance['show_clear_password'] = true; - $config->custom->appearance['hide_template_warning'] = true; - $config->custom->appearance['theme'] = "tango"; - $config->custom->appearance['minimalMode'] = false; - $config->custom->appearance['tree'] = 'AJAXTree'; - - $servers = new Datastore(); - - $servers->newServer('ldap_pla'); - $servers->setValue('server','name','LDAP'); - $servers->setValue('server','host','ldap://localhost'); - $servers->setValue('login','auth_type','cookie'); - $servers->setValue('login','bind_id','${serverSpecificConfig.ldap_phpldapadmin_dn}'); - $servers->setValue('login','bind_pass','${serverSpecificConfig.ldap_phpldapadmin_password}'); - $servers->setValue('appearance','pla_password_hash','ssha'); - $servers->setValue('login','attr','uid'); - $servers->setValue('login','fallback_dn',true); - ''; - }; - }; - - users.users.openldap.extraGroups = [ "keys" ]; - services.openldap = { - enable = true; - dataDir = "/var/lib/openldap"; - urlList = [ "ldap://localhost" ]; - logLevel = "none"; - extraConfig = '' - pidfile /run/slapd/slapd.pid - argsfile /run/slapd/slapd.args - - moduleload back_hdb - backend hdb - ''; - - extraDatabaseConfig = '' - moduleload memberof - overlay memberof - - moduleload syncprov - overlay syncprov - syncprov-checkpoint 100 10 - - index objectClass eq - index uid pres,eq - #index uidMember pres,eq - index mail pres,sub,eq - index cn pres,sub,eq - index sn pres,sub,eq - index dc eq - index member eq - index memberOf eq - - # No one must access that information except root - access to attrs=description - by * none - - access to attrs=entry,uid filter="(uid=*)" - by dn.exact="${serverSpecificConfig.ldap_phpldapadmin_dn}" read - by * break - - access to dn.subtree="ou=users,dc=salle-s,dc=org" - by dn.subtree="ou=services,dc=salle-s,dc=org" read - by * break - - access to * - by self read - by anonymous auth - by * break - ''; - rootpwFile = config.secrets.fullPaths."ldap/password"; - suffix = "dc=salle-s,dc=org"; - rootdn = "cn=root,dc=salle-s,dc=org"; - database = "hdb"; - }; - - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.tools.extraConfig = [ - '' - Alias /ldap "${phpLdapAdmin}/htdocs" - <Directory "${phpLdapAdmin}/htdocs"> - DirectoryIndex index.php - <FilesMatch "\.php$"> - SetHandler "proxy:unix:${config.services.phpfpm.pools.ldap.socket}|fcgi://localhost" - </FilesMatch> - - AllowOverride None - Require all granted - </Directory> - '' - ]; - services.phpfpm.pools.ldap = { - user = "wwwrun"; - group = "wwwrun"; - settings = - let - basedir = builtins.concatStringsSep ":" [ phpLdapAdmin config.secrets.fullPaths."webapps/tools-ldap" ]; - in { - "listen.owner" = "wwwrun"; - "listen.group" = "wwwrun"; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - # Needed to avoid clashes in browser cookies (same domain) - "php_value[session.name]" = "LdapPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin"; - }; - phpPackage = pkgs.php72; - }; - system.activationScripts.ldap = { - deps = [ "users" ]; - text = '' - install -m 0755 -o wwwrun -g wwwrun -d /var/lib/php/sessions/phpldapadmin - ''; - }; - systemd.services.phpfpm-ldap = { - after = lib.mkAfter [ "openldap.service" ]; - wants = [ "openldap.service" ]; - }; - }; -} diff --git a/modules/private/system/quatresaisons/landing.yml b/modules/private/system/quatresaisons/landing.yml deleted file mode 100644 index cf4ba87..0000000 --- a/modules/private/system/quatresaisons/landing.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -# Homepage configuration -# See https://fontawesome.com/icons for icons options - -title: "Websites dashboard" -subtitle: "Salle-S" -footer: false -#footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>' # set false if you want to hide it. - -# Optional navbar -# links: [] # Allows for navbar (dark mode, layout, and search) without any links -links: [] - -# Services -# First level array represent a group. -# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). -services: - - name: "Quatramaran" - items: - - name: "Roundcube" - logo: "assets/tools/roundcube.svg" - url: "https://quatramaran.salle-s.org/roundcube/" - - name: "Les dessous de paillasse" - url: "https://dessous-de-paillasse.salle-s.org" - - name: "Quatre Saisons" - items: - - name: "Charte d’utilisation" - icon: "fas fa-scroll" - url: "https://4c.salle-s.org/charte/" - - name: "Nextcloud" - logo: "assets/tools/nextcloud.png" - url: "https://nextcloud.4c.salle-s.org" diff --git a/modules/private/system/quatresaisons/landing_4c.yml b/modules/private/system/quatresaisons/landing_4c.yml deleted file mode 100644 index 0b9f6b6..0000000 --- a/modules/private/system/quatresaisons/landing_4c.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -# Homepage configuration -# See https://fontawesome.com/icons for icons options - -title: "Websites dashboard" -subtitle: "Quatre saisons" -footer: false -#footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>' # set false if you want to hide it. - -# Optional navbar -# links: [] # Allows for navbar (dark mode, layout, and search) without any links -links: [] - -# Services -# First level array represent a group. -# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). -services: - - items: - - name: "Charte d’utilisation" - icon: "fas fa-scroll" - url: "https://4c.salle-s.org/charte/" - - name: "Nextcloud" - logo: "assets/tools/nextcloud.png" - url: "https://nextcloud.4c.salle-s.org" diff --git a/modules/private/system/quatresaisons/nextcloud.nix b/modules/private/system/quatresaisons/nextcloud.nix deleted file mode 100644 index 89d69d5..0000000 --- a/modules/private/system/quatresaisons/nextcloud.nix +++ /dev/null @@ -1,141 +0,0 @@ -{ lib, pkgs, config, ... }: -let - nextcloud = pkgs.webapps.nextcloud.withApps (a: [ - a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.circles - a.contacts a.cookbook a.deck a.extract a.files_markdown - a.files_readmemd a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps - a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed - a.social a.tasks - ]); - varDir = "/var/lib/nextcloud"; - phpFpm = rec { - basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps); - pool = { - "listen.owner" = "wwwrun"; - "listen.group" = "wwwrun"; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[output_buffering]" = "0"; - "php_admin_value[max_execution_time]" = "1800"; - "php_admin_value[zend_extension]" = "opcache"; - #already enabled by default? - #"php_value[opcache.enable]" = "1"; - "php_value[opcache.enable_cli]" = "1"; - "php_value[opcache.interned_strings_buffer]" = "8"; - "php_value[opcache.max_accelerated_files]" = "10000"; - "php_value[opcache.memory_consumption]" = "128"; - "php_value[opcache.save_comments]" = "1"; - "php_value[opcache.revalidate_freq]" = "1"; - "php_admin_value[memory_limit]" = "512M"; - - "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - }; - }; -in { - config = { - services.postgresql.ensureDatabases = [ "nextcloud" ]; - services.postgresql.ensureUsers = [ - { name = "nextcloud"; ensurePermissions = { "DATABASE nextcloud" = "ALL PRIVILEGES"; }; } - ]; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - - services.websites.env.production.vhostConfs.cloud = { - certName = "quatresaisons"; - addToCerts = true; - hosts = ["nextcloud.4c.salle-s.org" ]; - root = nextcloud; - extraConfig = - [ - '' - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - <Directory ${nextcloud}> - AcceptPathInfo On - DirectoryIndex index.php - Options FollowSymlinks - Require all granted - AllowOverride all - - <IfModule mod_headers.c> - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" - </IfModule> - <FilesMatch "\.php$"> - CGIPassAuth on - SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost" - </FilesMatch> - - </Directory> - '' - ]; - }; - services.websites.env.production.vhostConfs.cloud_wait = let - content = pkgs.writeText "contenu" '' - nextcloud est un service qui a besoin de pérennité du nom - "nextcloud.salle-s.org", on va peut-etre y arriver, c'est une - question de jours, voir le message informatique.internet:8017 - ''; - in { - certName = "quatresaisons"; - addToCerts = true; - hosts = ["nextcloud.salle-s.org" ]; - root = content; - extraConfig = - [ - '' - Alias / ${content} - '' - ]; - }; - - users.users.root.packages = let - occ = pkgs.writeScriptBin "nextcloud-occ" '' - #! ${pkgs.stdenv.shell} - cd ${nextcloud} - NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \ - exec \ - sudo -E -u wwwrun ${pkgs.php74}/bin/php \ - -c ${pkgs.php74}/etc/php.ini \ - occ $* - ''; - in [ occ ]; - - system.activationScripts.nextcloud = { - deps = [ "users" ]; - text = let - confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig; - in - '' - install -m 0755 -o wwwrun -g wwwrun -d ${varDir} - install -m 0755 -o wwwrun -g wwwrun -d ${varDir}/config - install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions - ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: - "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json" - ) confs)} - ''; - }; - services.phpfpm.pools.nextcloud = { - user = "wwwrun"; - group = "wwwrun"; - settings = phpFpm.pool; - phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick ]); - }; - - services.cron = { - enable = true; - systemCronJobs = let - script = pkgs.writeScriptBin "nextcloud-cron" '' - #! ${pkgs.stdenv.shell} - export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive - export PATH=/run/wrappers/bin:$PATH - ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php - ''; - in [ - '' - */15 * * * * wwwrun ${script}/bin/nextcloud-cron - '' - ]; - }; - }; -} diff --git a/modules/private/websites/bakeer/cloud.nix b/modules/private/websites/bakeer/cloud.nix deleted file mode 100644 index bf78317..0000000 --- a/modules/private/websites/bakeer/cloud.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.bakeer.cloud; - nextcloud = config.myServices.tools.cloud.farm.package; -in { - options.myServices.websites.bakeer.cloud.enable = lib.mkEnableOption "enable Bakeer’s cloud"; - - config = lib.mkIf cfg.enable { - myServices.tools.cloud.farm.instances = [ "bakeer" ]; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.bakeer = { - certName = "bakeer"; - certMainHost = "bakeer.immae.eu"; - addToCerts = true; - hosts = ["bakeer.immae.eu" "baxsolution.immae.eu"]; - root = nextcloud; - extraConfig = [ - config.myServices.tools.cloud.farm.vhosts.bakeer - ]; - }; - }; -} - diff --git a/modules/private/websites/capitaines/discourse_static/discourse.png b/modules/private/websites/capitaines/discourse_static/discourse.png deleted file mode 100644 index 91ce42d50db9f2a53e0e656fe77e492e60872739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2440 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 diff --git a/modules/private/websites/capitaines/discourse_static/index.html b/modules/private/websites/capitaines/discourse_static/index.html deleted file mode 100644 index 4c2ead0..0000000 --- a/modules/private/websites/capitaines/discourse_static/index.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html lang='en'> - <head> - <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'> - <title>This instance is now closed - Discourse - - - -
- Discourse capitaines -

Sorry, this instance is closed now.

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

Sorry, this instance is closed now.

-
- - diff --git a/modules/private/websites/capitaines/mastodon_static/oops.png b/modules/private/websites/capitaines/mastodon_static/oops.png deleted file mode 100644 index 0abddad3e8a11e53ff717ec55810d383e4b2b9ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120305 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­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

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

-

Site web en pause !

-
-

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

-
-
- - diff --git a/modules/private/websites/florian/app.nix b/modules/private/websites/florian/app.nix deleted file mode 100644 index 2df344f..0000000 --- a/modules/private/websites/florian/app.nix +++ /dev/null @@ -1,142 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - secrets = config.myEnv.websites.tellesflorian.integration; - webRoot = "/var/lib/ftp/immae/florian/web"; - cfg = config.myServices.websites.florian.app; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.florian.app.enable = lib.mkEnableOption "enable Florian's app in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.florian_app = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - inherit webRoot; - varDir = "/var/lib/ftp/immae/florian_var"; - varDirPaths = { - "var" = "0700"; - }; - app = "/var/lib/ftp/immae/florian"; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/florian/app" - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys = { - "websites/florian/app_passwords" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - invite:${secrets.invite_passwords} - ''; - }; - "websites/florian/app" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - ''; - }; - }; - - services.websites.env.integration.modules = adminer.apache.modules; - services.websites.env.integration.vhostConfs.florian_app = { - certName = "integration"; - addToCerts = true; - hosts = [ "app.tellesflorian.com" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.florian_app}|fcgi://localhost" - - - - AuthBasicProvider file ldap - Use LDAPConnect - Require ldap-group cn=app.tellesflorian.com,cn=httpd,ou=services,dc=immae,dc=eu - - AuthUserFile "${config.secrets.fullPaths."websites/florian/app_passwords"}" - Require user "invite" - - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - (adminer.apache.vhostConf null) - ]; - }; - }; -} diff --git a/modules/private/websites/florian/app/default.nix b/modules/private/websites/florian/app/default.nix deleted file mode 100644 index 28a7ec1..0000000 --- a/modules/private/websites/florian/app/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl; } // - rec { - version = sources.websites-florian-app.version; - pname = "tellesflorian"; - name = "${pname}-${version}"; - src = sources.websites-florian-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - ''; - postInstall = '' - cd $out - rm app/config/parameters.yml - ln -sf ${secretsPath} app/config/parameters.yml - rm -rf var/{logs,cache} - ln -sf ${varDir}/var/{logs,cache,sessions} var/ - ''; - passthru = { - inherit varDir environment; - webRoot = "${app}/web"; - }; - }); -in app diff --git a/modules/private/websites/florian/app/php-packages.nix b/modules/private/websites/florian/app/php-packages.nix deleted file mode 100644 index 0c7e00c..0000000 --- a/modules/private/websites/florian/app/php-packages.nix +++ /dev/null @@ -1,389 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl }: -{ - packages = { - "composer/ca-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "composer-ca-bundle-943b2c4fcad1ef178d16a713c2468bf7e579c288"; - src = fetchurl { - url = https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288; - sha256 = "1gljia7akifp57w4rjzyh1km23kwymmvglz0mgafdgqzczcw0m6w"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-f25c8aab83e0c3e976fd7d19875f198ccf2f7535"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535; - sha256 = "08vm22fqq8r4bg2fk06y4inqnc8x0yfmsss28w5ra2011x2phq4z"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b; - sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-6c1e4eef75f310ea1b3e30945e9f06e652128b8a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a; - sha256 = "1dkxr2vjycykpcnnmq68rcnn1ww0kbpizd5pxxm6x9i2ilj8cbn7"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-7bce00698899aa2c06fe7365c76e4d78ddb15fa3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3; - sha256 = "12yizcsxsbhhi8hwaik4zalr12n5nxbpld05zygqhx6miyr92jyd"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873; - sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-eb6e4fb904a459be28872765ab6e2d246aac7c87"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87; - sha256 = "0kkisgyblc9hf9x3zpbb1wif51fa8mi6svyd44nls38k9k93dp17"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1; - sha256 = "08bqz18vk4673pnm2r2pcph6pdchc36zajnma1p9c6dp21sv7iki"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae; - sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d; - sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754; - sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1"; - }; - }; - }; - "fig/link-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac; - sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64"; - }; - }; - }; - "incenteev/composer-parameter-handler" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550"; - src = fetchurl { - url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550; - sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "monolog/monolog" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4"; - src = fetchurl { - url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4; - sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9"; - }; - }; - }; - "paragonie/random_compat" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "paragonie-random_compat-5da4d3c796c275c55f057af5a643ae297d96b4d8"; - src = fetchurl { - url = https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8; - sha256 = "1hp6pin4923c300yi85m7qk04gsrbygv52wv5zm7giyyf0k0g073"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/link" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562; - sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d; - sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "sensio/distribution-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a; - sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-bf4940572e43af679aaa13be98f3446a1c237bd8"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bf4940572e43af679aaa13be98f3446a1c237bd8; - sha256 = "1kb1n5w3kfc0kf4pslqdx5pgp0g4hmaag0i00wvjj2n3pjfm5lhf"; - }; - }; - }; - "sensiolabs/security-checker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142; - sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1"; - }; - }; - }; - "swiftmailer/swiftmailer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91"; - src = fetchurl { - url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91; - sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v"; - }; - }; - }; - "symfony/monolog-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd"; - src = fetchurl { - url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd; - sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8"; - }; - }; - }; - "symfony/polyfill-apcu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-apcu-e8ae2136ddb53dea314df56fcd88e318ab936c00"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00; - sha256 = "07wdszb9ircnidjk3fp3cvcrggxv3sfm996jzd0a9pm6vfz9hymv"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-254919c03761d46c29291616576ed003f10e91c1"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/254919c03761d46c29291616576ed003f10e91c1; - sha256 = "01yivzv7p55fzrkkyvgd57zpyz82zn1qp0h6nzr77k01rkv3w0ds"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-78be803ce01e55d3491c1397cf1c64beb9c1b63b"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b; - sha256 = "0cqr8ni6wpbaxa9gyr40y5bsv54pa2g8kdarlfw3qg2rgzmk0yz1"; - }; - }; - }; - "symfony/polyfill-php56" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php56-ebc999ce5f14204c5150b9bd15f8f04e621409d8"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ebc999ce5f14204c5150b9bd15f8f04e621409d8; - sha256 = "0b2j56l6d6rdggx7vr20d527df4pjfp4lgxpglsgbf5912rcyf83"; - }; - }; - }; - "symfony/polyfill-php70" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php70-3532bfcd8f933a7816f3a0a59682fc404776600f"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f; - sha256 = "151m76lc9w0kxnnwk4zdcjlmj7fppibnp8jisgpvvq32ml3fizdi"; - }; - }; - }; - "symfony/polyfill-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-util-e17c808ec4228026d4f5a8832afa19be85979563"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-util/zipball/e17c808ec4228026d4f5a8832afa19be85979563; - sha256 = "17sdpdidc0b701f9rippjv1grfci7wrdpy2i1inlwwpr6zy782cq"; - }; - }; - }; - "symfony/swiftmailer-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec"; - src = fetchurl { - url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec; - sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01"; - }; - }; - }; - "symfony/symfony" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-symfony-874d4d659774d7bab90538072c83ed532dd17dc5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/symfony/zipball/874d4d659774d7bab90538072c83ed532dd17dc5; - sha256 = "02rsn3sc34jh107n576jfbh666k06y44yr7hw61nir0d864k8api"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-9c24f2cd39dc1906b76879e099970b7e53724601"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601; - sha256 = "0brfj2lahrrw1322zy6jyd380hjks1ynzzkmq3875a282gzrfkdz"; - }; - }; - }; - }; - devPackages = { - "sensio/generator-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65; - sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3"; - }; - }; - }; - "symfony/phpunit-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-phpunit-bridge-32b06d2b0babf3216e55acfce42249321a304f03"; - src = fetchurl { - url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/32b06d2b0babf3216e55acfce42249321a304f03; - sha256 = "0vw4q3lvz8gfs0r93ds8yymz8586k0czwa01c7d172rc8x02v0qq"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/florian/integration.nix b/modules/private/websites/florian/integration.nix deleted file mode 100644 index 8ac1f46..0000000 --- a/modules/private/websites/florian/integration.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.florian.integration; - varDir = "/var/lib/ftp/florian/www.ft.immae.dev"; - env = config.myEnv.websites.florian; -in { - options.myServices.websites.florian.integration.enable = lib.mkEnableOption "enable Florian's website integration"; - - config = lib.mkIf cfg.enable { - security.acme.certs."ftp".extraDomains."ft.immae.dev" = null; - - services.websites.env.integration.modules = adminer.apache.modules; - services.websites.env.integration.vhostConfs.florian_integration = { - certName = "integration"; - addToCerts = true; - hosts = [ "www.ft.immae.dev" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - ServerAdmin ${env.server_admin} - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/florian/production.nix b/modules/private/websites/florian/production.nix deleted file mode 100644 index 1c5ffa6..0000000 --- a/modules/private/websites/florian/production.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.florian.production; - varDir = "/var/lib/ftp/florian/tellesflorian.com"; - env = config.myEnv.websites.florian; -in { - options.myServices.websites.florian.production.enable = lib.mkEnableOption "enable Florian's website production"; - - config = lib.mkIf cfg.enable { - security.acme.certs."ftp".extraDomains."tellesflorian.com" = null; - - services.websites.env.production.modules = adminer.apache.modules; - services.websites.env.production.vhostConfs.florian_production = { - certName = "florian"; - certMainHost = "tellesflorian.com"; - hosts = [ "tellesflorian.com" "www.tellesflorian.com" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - ServerAdmin ${env.server_admin} - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/immae/chatons/immae-eu.properties b/modules/private/websites/immae/chatons/immae-eu.properties deleted file mode 100644 index 32b2d47..0000000 --- a/modules/private/websites/immae/chatons/immae-eu.properties +++ /dev/null @@ -1,46 +0,0 @@ -# https://framagit.org/chatons/chatonsinfos/-/blob/master/MODELES/organization.properties - -# [File] -file.class = organization -file.protocol = ChatonsInfos-0.1 -file.datetime = 2021-01-11T22:23:00 -file.generator = Immae avec ses doigts - -# [Organisation] -organization.country.name = France -organization.country.code = FR -organization.name = ImmaeEu -organization.description = ImmaeEu est un CHATONS des Alpes Maritimes -organization.website = https://www.immae.eu -organization.logo = https://assets.immae.eu/logo.jpg -organization.socialnetworks.diaspora = https://diaspora.immae.eu/people/1a185f29cc76cb35 -organization.socialnetworks.facebook = https://www.facebook.com/ismael.bouya -organization.socialnetworks.mastodon = https://mastodon.immae.eu/@immae -organization.socialnetworks.peertube = https://peertube.immae.eu/accounts/immae/ -organization.socialnetworks.twitter = https://twitter.com/_immae -organization.chatrooms.xmpp = ismael@immae.fr -organization.chatrooms.irc = immae@freenode -organization.chatrooms.matrix = @immae:matrix.org -organization.owner.name = Ismaël Bouya -organization.owner.website = https://www.immae.eu -organization.owner.logo = https://assets.immae.eu/logo.jpg -organization.contact.url = https://www.immae.eu/contacts_fr.html -organization.contact.email = contact@mail.immae.eu -organization.legal.url = https://www.immae.eu/mentions.html -organization.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/ -organization.status.level = ACTIVE -organization.status.description = En activité -organization.startdate = 01/01/2019 - -organization.memberof.chatons.startdate = 01/07/2019 -organization.memberof.chatons.status.level = ACTIVE -organization.memberof.chatons.status.description = Participe au collectif - -# [Subs] -# Un lien vers un fichier properties complémentaire (type URL, optionnel, ex. https://www.chapril.org/.well-known/chapril.properties). -subs.etherpad = https://www.immae.eu/.well-known/chatonsinfos/service-etherpad.properties - - -# [Metrics] -#metrics.http.total.2020 = - diff --git a/modules/private/websites/immae/chatons/service-etherpad.properties b/modules/private/websites/immae/chatons/service-etherpad.properties deleted file mode 100644 index cfcab1d..0000000 --- a/modules/private/websites/immae/chatons/service-etherpad.properties +++ /dev/null @@ -1,164 +0,0 @@ -# service.properties - -# [File] -# Classe du fichier (valeur parmi Federation/Organization/Service/Device, obligatoire). -file.class = service - -# Version de l'ontologie utilisée utilisé (type STRING, recommandé). -file.protocol = ChatonsInfos-0.1 - -# Date et horaire de génération du fichier (type DATETIME, recommandé). -file.datetime = 2021-01-04T00:01:00 - -# Nom du générateur du fichier (type STRING, recommandé). Exemple : Florian avec ses doigts -file.generator = Immae avec ses doigts - - -# [Service] -# Nom du service (type STRING, obligatoire). Exemple : Pad Exemple -service.name = Etherpard - -# Description du service (type STRING, recommandé). -service.description = Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément. - -# Lien du site web du service (type URL, recommandé). Exemple : https://pad.exemple.ext -service.website = https://ether.immae.eu - -# Lien du logo du service (type URL, recommandé, ex. https://www.chapril.org/.well-known/statoolinfos/chapril-logo-mini.png. -service.logo = https://ether.immae.eu/favicon.ico - -# Lien de la page web des mentions légales du service (type URL, recommandé). Exemple : https://pad.exemple.ext/cgu.html -service.legal.url = https://www.immae.eu/mentions.html - -# Lien de la documentation web du service (type URL, recommandé). -service.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/ - -# Lien des aides web pour le service (type URL, recommandé). -service.guide.user = - -# Lien de la page de support du service (type URL, recommandé). Exemple : https://exemple.ext/contact.html -service.contact.url = https://www.immae.eu/contacts_fr.html - -# Courriel du support du service (type EMAIL, recommandé). Exemple : contact@exemple.ext -service.contact.email = contact@mail.immae.eu - -# Date d'ouverture du service (type DATE, recommandé). Exemple : 20/03/2020 -service.startdate = 01/01/2019 - -# Date de fermeture du service (type DATE, optionnel). -service.enddate = - -# Statut du service (un parmi {OK,WARNING,ALERT,ERROR,OVER,VOID}, obligatoire). -service.status.level = OK - -# Description du statut du service (type STRING, optionnel, exemple : mise à jour en cours) -service.status.description = OK - -# Inscriptions requises pour utiliser le service (parmi None;Free;Member;Client, obligatoire). -service.registration = None - -# [Software] -# Nom du logiciel (type STRING, obligatoire). -software.name = Etherpad - -# Lien du site web du logiciel (type URL, recommandé). -software.website = https://etherpad.org/ - -# Lien web vers la licence du logiciel (type URL, obligatoire). -software.license.url = https://github.com/ether/etherpad-lite/blob/develop/LICENSE - -# Nom de la licence du logiciel (type STRING, obligatoire). -software.license.name = Apache License Version 2.0 - -# Version du logiciel (type STRING, recommandé). -software.version = 1.8.3 - -# Lien web vers les sources du logiciel (type URL, recommandé). -software.source.url = https://github.com/ether/etherpad-lite - -# Liste de modules optionnels installés (type VALUES, optionnel, ex. Nextcloud-Calendar,Nextcloud-Talk). -software.modules = ep_align,ep_bookmark,ep_colors,ep_comments_page,ep_cursortrace,ep_delete_empty_pads,ep_embedmedia,ep_font_size,ep_headings2,ep_immae_buttons,ep_ldapauth,ep_line_height,ep_markdown,ep_mypads,ep_page_view,ep_previewimages,ep_ruler,ep_scrollto,ep_set_title_on_pad,ep_subscript_and_superscript,ep_timesliderdiff - - -# [Host] -# Nom de l'hébergeur de la machine qui fait tourner le service, dans le cas d'un auto-hébergement c'est vous ! (type STRING, obligatoire). Exemple : OVH. -host.name = Hetzner - -# Description de l'hébergeur (type STRING, optionnel). -host.description = - -# Type de serveur (un parmi NANO, PHYSICAL, VIRTUAL, SHARED, CLOUD, obligatoire, ex. PHYSICAL). -# NANO : nano-ordinateur (Raspberry Pi, Olimex…) -# PHYSICAL : machine physique -# VIRTUAL : machine virtuelle -# SHARED : hébergement mutualisé -# CLOUD : infrastructure multi-serveurs -host.server.type = PHYSICAL - -# Type d'hébergement (un parmi HOME, HOSTEDBAY, HOSTEDSERVER, OUTSOURCED, obligatoire, ex. HOSTEDSERVER). -# HOME : hébergement à domicile -# HOSTEDBAY : serveur personnel hébergé dans une baie d'un fournisseur -# HOSTEDSERVER : serveur d'un fournisseur -# OUTSOURCED : infrastructure totalement sous-traitée -host.provider.type = HOSTEDSERVER - -# Si vous avez du mal à remplir les champs précédents, ce tableau pourra vous aider : -# NANO PHYSICAL VIRTUAL SHARED CLOUD -# HOME pm pm vm shared cloud -# HOSTEDBAY -- pm vm shared cloud -# HOSTEDSERVER -- pm vm shared cloud -# OUTSOURCED -- -- vps shared cloud -# Légendes : pm : physical machine ; vm : virtual machine ; vps : virtual private server. - -# Pays de l'hébergeur (type STRING, recommandé). Exemple : France -host.country.name = Allemagne - -# Code pays de l'hébergeur (type STRING, recommandé). Exemple : FR -host.country.code = DE - - - -# [Subs] -# Un lien vers un fichier properties complémentaire (type URL, optionnel). Exemple : https:// -subs.foo = - -# [Metrics] -# Nom du métrique (type STRING, recommandé). -metrics.http.total.name = Nombre total de requêtes HTTP - -# Description du métrique (type STRING, recommandé). -metrics.http.total.description = Somme des requêtes HTTP ipv4 et ipv6. - -# Métrique à valeur anuelle (type NUMERIC, optionnel). -metrics.http.total.2020 = - -# Métrique à valeur mensuelle (type MONTHS, optionnel). -metrics.http.total.2020.months= - -# Métrique à valeur hebdomadaire (type WEEKS, optionnel). -metrics.http.total.2020.weeks= - -# Métrique à valeur quotidienne (type DAYS, optionnel). -metrics.http.total.2020.days= - - -# Nom du métrique (type STRING, recommandé). -metrics.visitors.total.name = Nombre total de visiteurs - -# Description du métrique (type STRING, recommandé). -metrics.visitors.total.description = - -# Métrique à valeur anuelle (type NUMERIC, optionnel). -metrics.visitors.total.2020 = - -# Métrique à valeur mensuelle (type MONTHS, optionnel). -metrics.visitors.total.2020.months= - -# Métrique à valeur hebdomadaire (type WEEKS, optionnel). -metrics.visitors.total.2020.weeks= - -# Métrique à valeur quotidienne (type DAYS, optionnel). -metrics.visitors.total.2020.days= - - -# [Metrics spécifiques au service] diff --git a/modules/private/websites/immae/temp.nix b/modules/private/websites/immae/temp.nix deleted file mode 100644 index 19aef1a..0000000 --- a/modules/private/websites/immae/temp.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.immae.temp; - varDir = "/var/lib/immae_temp"; - env = config.myEnv.websites.immae.temp; -in { - options.myServices.websites.immae.temp.enable = lib.mkEnableOption "enable Temp' website"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.immae_temp = { - certName = "immae"; - addToCerts = true; - hosts = [ "temp.immae.eu" ]; - root = null; - extraConfig = [ '' - ProxyVia On - ProxyRequests Off - ProxyPreserveHost On - ProxyPass / unix:///run/surfer/listen.sock|http://temp.immae.eu/ - ProxyPassReverse / unix:///run/surfer/listen.sock|http://temp.immae.eu/ - - Options FollowSymLinks MultiViews - AllowOverride None - Require all granted - - '' ]; - }; - - secrets.keys."webapps/surfer" = { - permissions = "0400"; - user = "wwwrun"; - group = "wwwrun"; - text = '' - CLOUDRON_LDAP_URL=ldaps://${env.ldap.host} - CLOUDRON_LDAP_USERS_BASE_DN=${env.ldap.base} - TOKENSTORE_FILE=/var/lib/surfer/tokens.json - CLOUDRON_LDAP_BIND_DN=${env.ldap.dn} - CLOUDRON_LDAP_BIND_PASSWORD=${env.ldap.password} - CLOUDRON_LDAP_USERS_BASE_DN=${env.ldap.base} - CLOUDRON_LDAP_FILTER="${env.ldap.filter}" - LISTEN=/run/surfer/listen.sock - ''; - }; - - systemd.services.surfer = { - description = "Surfer"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - script = '' - exec ${pkgs.webapps.surfer}/bin/surfer-server ${varDir} - ''; - serviceConfig = { - EnvironmentFile = config.secrets.fullPaths."webapps/surfer"; - User = "wwwrun"; - Group = "wwwrun"; - StateDirectory = "surfer"; - RuntimeDirectory = "surfer"; - Type = "simple"; - }; - }; - }; -} - diff --git a/modules/private/websites/isabelle/aten_app/default.nix b/modules/private/websites/isabelle/aten_app/default.nix deleted file mode 100644 index f967b9a..0000000 --- a/modules/private/websites/isabelle/aten_app/default.nix +++ /dev/null @@ -1,61 +0,0 @@ -{ environment ? "prod" -, varDir ? "/var/lib/aten_${environment}" -, composerEnv, fetchgit, runCommand, nodejs-10_x, jq, libsass, python, fetchurl, yarn2nix-moretea, yarn, sources }: -let - yarn2nix-moretea' = yarn2nix-moretea.override({ - yarn = yarn.override({ nodejs = nodejs-10_x; }); - nodejs = nodejs-10_x; - }); - packagesource = sources.websites-isabelle-aten; - packagejson = runCommand "package.json" { buildInputs = [ jq ]; } '' - cat ${packagesource}/package.json | jq -r '.version = "v1.0.0"|.name="aten"' > $out - ''; - yarnModules = yarn2nix-moretea'.mkYarnModules rec { - name = "aten-yarn"; - pname = name; - version = "v1.0.0"; - packageJSON = packagejson; - yarnLock = "${packagesource}/yarn.lock"; - yarnNix = ./yarn-packages.nix; - pkgConfig = { - node-sass = { - buildInputs = [ libsass python ]; - postInstall = let - nodeHeaders = fetchurl { - url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz"; - sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c"; - }; - in - '' - node scripts/build.js --tarball=${nodeHeaders} - ''; - }; - }; - }; - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - version = packagesource.version; - pname = "aten"; - name = "${pname}-${version}"; - src = packagesource; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - export APP_ENV="${environment}" - ''; - postInstall = '' - ln -sf ${yarnModules}/node_modules . - yarn run --offline encore production - rm -rf var/{log,cache} - ln -sf ${varDir}/{log,cache} var/ - ''; - buildInputs = [ yarnModules yarn2nix-moretea'.yarn ]; - passthru = { - inherit varDir; - inherit environment; - webRoot = "${app}/public"; - }; - } - ); -in app diff --git a/modules/private/websites/isabelle/aten_app/php-packages.nix b/modules/private/websites/isabelle/aten_app/php-packages.nix deleted file mode 100644 index 3647938..0000000 --- a/modules/private/websites/isabelle/aten_app/php-packages.nix +++ /dev/null @@ -1,740 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl, fetchgit ? null }: -{ - packages = { - "behat/transliterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"; - src = fetchurl { - url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c; - sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5; - sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57; - sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf; - sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d; - sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9; - sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d; - sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927; - sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa"; - }; - }; - }; - "doctrine/doctrine-migrations-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce; - sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn"; - }; - }; - }; - "doctrine/event-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3; - sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a; - sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda; - sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/migrations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6; - sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8; - sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls"; - }; - }; - }; - "doctrine/persistence" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38; - sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7"; - }; - }; - }; - "doctrine/reflection" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6; - sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy"; - }; - }; - }; - "gedmo/doctrine-extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27"; - src = fetchurl { - url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27; - sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb"; - }; - }; - }; - "giggsey/libphonenumber-for-php" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "giggsey-libphonenumber-for-php-a71f260c2efce10ded8af030a20fa13edfb0e9be"; - src = fetchurl { - url = https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/a71f260c2efce10ded8af030a20fa13edfb0e9be; - sha256 = "15id03c1msyhri7j4i63r535g3g56n3x99i8301as63w7m1ybfj5"; - }; - }; - }; - "giggsey/locale" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "giggsey-locale-da6845720b5d104d319d7e84576f54e44dd9e4f5"; - src = fetchurl { - url = https://api.github.com/repos/giggsey/Locale/zipball/da6845720b5d104d319d7e84576f54e44dd9e4f5; - sha256 = "0gc8im06h5l794a0drd74s3inps22jr1zr5wnw0b89m06d4nw42j"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "ocramius/package-versions" = { - targetDir = ""; - needsModifyRights = true; - src = composerEnv.buildZipPackage { - name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f; - sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881"; - }; - }; - }; - "ocramius/proxy-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1; - sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn"; - }; - }; - }; - "opensoft/doctrine-postgres-types" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "opensoft-doctrine-postgres-types-7e69bdfeb2ae61c2f1e90872370cdf0135fb3006"; - src = fetchurl { - url = https://api.github.com/repos/opensoft/doctrine-postgres-types/zipball/7e69bdfeb2ae61c2f1e90872370cdf0135fb3006; - sha256 = "1v9rjq82dxnpnb6bir6irkj54324a02qlybayvq2gf2807241bjj"; - }; - }; - }; - "presta/sitemap-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "presta-sitemap-bundle-16a2c0eae7320e3647013e48026a6a6bd14f75df"; - src = fetchurl { - url = https://api.github.com/repos/prestaconcept/PrestaSitemapBundle/zipball/16a2c0eae7320e3647013e48026a6a6bd14f75df; - sha256 = "1hqh144awazafa2vpv091h9pyqrppbalcvzf9c1n6h387jwwj5l8"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd; - sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-1fdf591c4b388e62dbb2579de89c1560b33f865d"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d; - sha256 = "0hhw3lsvgm78rqphgmdrg2inc9997lwx0290x71hsixk08khnlb1"; - }; - }; - }; - "symfony/asset" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-asset-fb06338fd3762f8615b51a58e5e9299ccca03876"; - src = fetchurl { - url = https://api.github.com/repos/symfony/asset/zipball/fb06338fd3762f8615b51a58e5e9299ccca03876; - sha256 = "19fbnz2h4z5nxzcy8n3bfbcjwgncabwdlxh70qfkr7bswpsxr6p3"; - }; - }; - }; - "symfony/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-cache-5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41"; - src = fetchurl { - url = https://api.github.com/repos/symfony/cache/zipball/5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41; - sha256 = "1wn2rd3n5nj300vsygh60vbjh2k9lh7s9c3ayl614hahrfcfb29s"; - }; - }; - }; - "symfony/config" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-config-005d9a083d03f588677d15391a716b1ac9b887c0"; - src = fetchurl { - url = https://api.github.com/repos/symfony/config/zipball/005d9a083d03f588677d15391a716b1ac9b887c0; - sha256 = "1h20qhkzsl5xwzs3rg1yyaq5yn8rg92krfzmpmfgv7d3jp1v03as"; - }; - }; - }; - "symfony/console" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-console-4dff24e5d01e713818805c1862d2e3f901ee7dd0"; - src = fetchurl { - url = https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0; - sha256 = "016l3hxcbvyxz3kkkynk12gi8949hl3x09dwsh0x5wqikgnp64c2"; - }; - }; - }; - "symfony/contracts" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-contracts-1aa7ab2429c3d594dd70689604b5cf7421254cdf"; - src = fetchurl { - url = https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf; - sha256 = "0jhav49lngmrjg4r5kdpmc7lhmasn2fzkmbvhw62l4i1vnm5r5bm"; - }; - }; - }; - "symfony/debug" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-debug-e0a2b92ee0b5b934f973d90c2f58e18af109d276"; - src = fetchurl { - url = https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276; - sha256 = "0yzyaprsrmbc93gzwr1wdjx05kin7b4hqy5w74zkcxyab09pan7f"; - }; - }; - }; - "symfony/dependency-injection" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-dependency-injection-e4adc57a48d3fa7f394edfffa9e954086d7740e5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/dependency-injection/zipball/e4adc57a48d3fa7f394edfffa9e954086d7740e5; - sha256 = "0g8ssf7qm0jf0anvflp033xwdim9z4g73k3kz1vs3smw4pffl6nv"; - }; - }; - }; - "symfony/doctrine-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-doctrine-bridge-3466c911438e176c20e1943c529131889432d12f"; - src = fetchurl { - url = https://api.github.com/repos/symfony/doctrine-bridge/zipball/3466c911438e176c20e1943c529131889432d12f; - sha256 = "0qq644z7l9j9fyydlj68p9f43a9i20rnmxy8pkq5sn4r0yn06bb8"; - }; - }; - }; - "symfony/event-dispatcher" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-event-dispatcher-921f49c3158a276d27c0d770a5a347a3b718b328"; - src = fetchurl { - url = https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328; - sha256 = "05i8syqbzhh11cf2i9d64s8b5x41mfsribfa62rvc0mhbqk7ifzf"; - }; - }; - }; - "symfony/filesystem" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-filesystem-2f4c8b999b3b7cadb2a69390b01af70886753710"; - src = fetchurl { - url = https://api.github.com/repos/symfony/filesystem/zipball/2f4c8b999b3b7cadb2a69390b01af70886753710; - sha256 = "1gi14q8gf250a3rzmr6arb08ljpzpfg868vm0z21fgmf0zh0dqr6"; - }; - }; - }; - "symfony/finder" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-finder-e53d477d7b5c4982d0e1bfd2298dbee63d01441d"; - src = fetchurl { - url = https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d; - sha256 = "1mpxwgvfqzng36xbdvda6nk1zidyr9dgswccmr4z15k0i9gi0qsj"; - }; - }; - }; - "symfony/flex" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-flex-955774ecf07b10230bb5b44e150ba078b45f68fa"; - src = fetchurl { - url = https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa; - sha256 = "069v1s810mq5kqvx68x87lmlz0h9b2kgla1znnibnbh6j6k4qg6d"; - }; - }; - }; - "symfony/form" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-form-5ab767b7732154ca6f45c92e30e081178edf30ad"; - src = fetchurl { - url = https://api.github.com/repos/symfony/form/zipball/5ab767b7732154ca6f45c92e30e081178edf30ad; - sha256 = "1g65a7hl1kk6rpa6q52fyzy6vkjafr3233hi2qiggyp0qys20kcc"; - }; - }; - }; - "symfony/framework-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-framework-bundle-eb32d67140510f04fe9cc5fb9ad38fda09591db1"; - src = fetchurl { - url = https://api.github.com/repos/symfony/framework-bundle/zipball/eb32d67140510f04fe9cc5fb9ad38fda09591db1; - sha256 = "06dpqppwyngq1frww0q0zjs0gj8na0fi67czlhqf2x2lizgz6wjd"; - }; - }; - }; - "symfony/http-foundation" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-http-foundation-1b31f3017fadd8cb05cf2c8aebdbf3b12a943851"; - src = fetchurl { - url = https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851; - sha256 = "0s6mx79gl6sp39bk8213xcdzx4ld5xim38s8lckm7wqnkvx94mfl"; - }; - }; - }; - "symfony/http-kernel" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-http-kernel-b39ceffc0388232c309cbde3a7c3685f2ec0a624"; - src = fetchurl { - url = https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624; - sha256 = "17rb1hl9r8rlqw1cv9qx2ckvz81g2ylppirq035mya1a848y5ym5"; - }; - }; - }; - "symfony/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-inflector-f9a637c0359f74404d44cf0da0a3ce53bae0787e"; - src = fetchurl { - url = https://api.github.com/repos/symfony/inflector/zipball/f9a637c0359f74404d44cf0da0a3ce53bae0787e; - sha256 = "1sp1pk716biyplqpakcpq71ik2h2m1bvsz9cfj9zd63y2723xna3"; - }; - }; - }; - "symfony/intl" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-intl-748a1c54903344385f88fef75da293915b16a207"; - src = fetchurl { - url = https://api.github.com/repos/symfony/intl/zipball/748a1c54903344385f88fef75da293915b16a207; - sha256 = "1vwa2n7fglxs8rv1yrbxn6vgizg73asimg794igk27i90xdybfmc"; - }; - }; - }; - "symfony/lts" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-lts-c1affae45b78aee036effa1759237e7fa96d4af2"; - src = fetchurl { - url = https://api.github.com/repos/symfony/lts/zipball/c1affae45b78aee036effa1759237e7fa96d4af2; - sha256 = "0vk9pn4xl7ascvllak0gschdd1w2mxma3ng04j3r1n13zccxc33s"; - }; - }; - }; - "symfony/options-resolver" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-options-resolver-a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba"; - src = fetchurl { - url = https://api.github.com/repos/symfony/options-resolver/zipball/a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba; - sha256 = "1fjjlp09mwkjcxg98bihqlq4miq24k13691051f5p39lcy03zmb3"; - }; - }; - }; - "symfony/orm-pack" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-orm-pack-1b58f752cd917a08c9c8df020781d9c46a2275b1"; - src = fetchurl { - url = https://api.github.com/repos/symfony/orm-pack/zipball/1b58f752cd917a08c9c8df020781d9c46a2275b1; - sha256 = "1sk8jchaw29lmpq76yb24mc1csmifnkvbjdrgjdgqs6x5i39plli"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644; - sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494; - sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi"; - }; - }; - }; - "symfony/property-access" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-property-access-b6df4e1849f389468edb36e2e59877d4a8170723"; - src = fetchurl { - url = https://api.github.com/repos/symfony/property-access/zipball/b6df4e1849f389468edb36e2e59877d4a8170723; - sha256 = "16pbnv3x56gp5wxakmbphf3d4igkjyr3v693n3cjm62h72z4dxf3"; - }; - }; - }; - "symfony/routing" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-routing-649460207e77da6c545326c7f53618d23ad2c866"; - src = fetchurl { - url = https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866; - sha256 = "1qjkgghs0kp4lk4711d3gx26vvilrrrjbbz02navzfqy4xjrf0sw"; - }; - }; - }; - "symfony/translation" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-translation-c0e2191e9bed845946ab3d99767513b56ca7dcd6"; - src = fetchurl { - url = https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6; - sha256 = "0gzq7f2izsiam9blha85bzvg7x6zc4f3x3bkwhzma6x6ipjfkla2"; - }; - }; - }; - "symfony/twig-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-twig-bridge-2e928d6c8244e7f3b32bcfac5814095a83179e60"; - src = fetchurl { - url = https://api.github.com/repos/symfony/twig-bridge/zipball/2e928d6c8244e7f3b32bcfac5814095a83179e60; - sha256 = "1f902j8b0lyqjss9r2mf7j63apv5z8ki57vmcdcw5jlqagbmw1y1"; - }; - }; - }; - "symfony/twig-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-twig-bundle-024820cbb4aeffc4843c4170b69c057fb4840fb3"; - src = fetchurl { - url = https://api.github.com/repos/symfony/twig-bundle/zipball/024820cbb4aeffc4843c4170b69c057fb4840fb3; - sha256 = "1qqfpxw228lc024whpr4j6aa6k9ly290nxz9c9ds826lllg2l1zh"; - }; - }; - }; - "symfony/validator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-validator-cd35bb14a0e81bd99835e36cac4db1e72ad1939b"; - src = fetchurl { - url = https://api.github.com/repos/symfony/validator/zipball/cd35bb14a0e81bd99835e36cac4db1e72ad1939b; - sha256 = "1809yz483mv5mmrw14v3b371dmjab7i455gxkrqm0z8n0wjdn6i3"; - }; - }; - }; - "symfony/var-exporter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-var-exporter-a39222e357362424b61dcde50e2f7b5a7d3306db"; - src = fetchurl { - url = https://api.github.com/repos/symfony/var-exporter/zipball/a39222e357362424b61dcde50e2f7b5a7d3306db; - sha256 = "1ys2sc3ivgfxq7kj8cydxqh5179d3niqxsy10lgg18c5a6bsj41j"; - }; - }; - }; - "symfony/webpack-encore-pack" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-webpack-encore-pack-8d7f51379d7ae17aea7cf501d910a11896895ac4"; - src = fetchurl { - url = https://api.github.com/repos/symfony/webpack-encore-pack/zipball/8d7f51379d7ae17aea7cf501d910a11896895ac4; - sha256 = "0k6xavcyihx45dsrm1r2r1lbn7vryy463akz66w4gycx5dcqrw0j"; - }; - }; - }; - "symfony/yaml" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-yaml-c41175c801e3edfda90f32e292619d10c27103d7"; - src = fetchurl { - url = https://api.github.com/repos/symfony/yaml/zipball/c41175c801e3edfda90f32e292619d10c27103d7; - sha256 = "0bh9365mmvzhdk1m0b1xarlg0swx9pv916m7xifcmdrxn67w552p"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1; - sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n"; - }; - }; - }; - "zendframework/zend-code" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb; - sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1"; - }; - }; - }; - "zendframework/zend-eventmanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd; - sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n"; - }; - }; - }; - }; - devPackages = { - "nikic/php-parser" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "nikic-php-parser-8aae5b59b83bb4d0dbf07b0a835f2680a658f610"; - src = fetchurl { - url = https://api.github.com/repos/nikic/PHP-Parser/zipball/8aae5b59b83bb4d0dbf07b0a835f2680a658f610; - sha256 = "103ix4bsvrwyc4wxh9cqd38xffn25kq3phnpgk8b3z7dqvvr2pss"; - }; - }; - }; - "symfony/dotenv" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-dotenv-97f135ab40f969cbeae27d482ff63acbc33dbe2a"; - src = fetchurl { - url = https://api.github.com/repos/symfony/dotenv/zipball/97f135ab40f969cbeae27d482ff63acbc33dbe2a; - sha256 = "1jwpxb4w0mi5p89k51l1g84hnnj9s8kjl9jsx3xj39hhc3dy44pc"; - }; - }; - }; - "symfony/maker-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-maker-bundle-24b19cccad0c658eca516b35b08668d123fabf92"; - src = fetchurl { - url = https://api.github.com/repos/symfony/maker-bundle/zipball/24b19cccad0c658eca516b35b08668d123fabf92; - sha256 = "1wm17jl3gk0m5ma7nz40y7ryxgm0qncrxcrqdqg5x6afwla85grp"; - }; - }; - }; - "symfony/polyfill-php72" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php72-9050816e2ca34a8e916c3a0ae8b9c2fccf68b631"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631; - sha256 = "1smd08fw64mf89s9ma099ayfjlz26wrix9hfr6kh5w4d0rzrhmlw"; - }; - }; - }; - "symfony/profiler-pack" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-profiler-pack-99c4370632c2a59bb0444852f92140074ef02209"; - src = fetchurl { - url = https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209; - sha256 = "12xisnrqq6q5l0v8bric0p23bsaxh50x43fq7wn2adnsz24nv9pi"; - }; - }; - }; - "symfony/stopwatch" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-stopwatch-ec076716412274e51f8a7ea675d9515e5c311123"; - src = fetchurl { - url = https://api.github.com/repos/symfony/stopwatch/zipball/ec076716412274e51f8a7ea675d9515e5c311123; - sha256 = "0fzh2bh7lm8f222hk5ihfkpi697babfrz1r0dghlws17hfbgzgax"; - }; - }; - }; - "symfony/var-dumper" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-var-dumper-db61258540350725f4beb6b84006e32398acd120"; - src = fetchurl { - url = https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120; - sha256 = "0pw3hf4mcc1q9miswrjbgr32x0a2dfjvpi16pjzw173xmf79i4iz"; - }; - }; - }; - "symfony/web-profiler-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-web-profiler-bundle-198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08"; - src = fetchurl { - url = https://api.github.com/repos/symfony/web-profiler-bundle/zipball/198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08; - sha256 = "0r4r3zf22860mdx8b2l72ghz8liyi3l39cc1934b2lkh2kghlsi6"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/isabelle/aten_app/yarn-packages.nix b/modules/private/websites/isabelle/aten_app/yarn-packages.nix deleted file mode 100644 index c16d9dc..0000000 --- a/modules/private/websites/isabelle/aten_app/yarn-packages.nix +++ /dev/null @@ -1,7871 +0,0 @@ -{fetchurl, linkFarm}: rec { - offline_cache = linkFarm "offline" packages; - packages = [ - - { - name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz"; - path = fetchurl { - name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz"; - url = "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.19.0.tgz"; - sha1 = "f0725dbbede5ff9d9fdbd7a07f84accafc83ca14"; - }; - } - - { - name = "_types_node___node_10.5.3.tgz"; - path = fetchurl { - name = "_types_node___node_10.5.3.tgz"; - url = "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz"; - sha1 = "5bcfaf088ad17894232012877669634c06b20cc5"; - }; - } - - { - name = "_types_tapable___tapable_0.2.5.tgz"; - path = fetchurl { - name = "_types_tapable___tapable_0.2.5.tgz"; - url = "https://registry.yarnpkg.com/@types/tapable/-/tapable-0.2.5.tgz"; - sha1 = "2443fc12da514c81346b1a665675559cee21fa75"; - }; - } - - { - name = "_types_uglify_js___uglify_js_3.0.3.tgz"; - path = fetchurl { - name = "_types_uglify_js___uglify_js_3.0.3.tgz"; - url = "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.3.tgz"; - sha1 = "801a5ca1dc642861f47c46d14b700ed2d610840b"; - }; - } - - { - name = "_types_webpack___webpack_3.8.14.tgz"; - path = fetchurl { - name = "_types_webpack___webpack_3.8.14.tgz"; - url = "https://registry.yarnpkg.com/@types/webpack/-/webpack-3.8.14.tgz"; - sha1 = "e2bfdf7f604b3f7dc776eaa17446d7f7538f3de7"; - }; - } - - { - name = "abbrev___abbrev_1.1.1.tgz"; - path = fetchurl { - name = "abbrev___abbrev_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz"; - sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8"; - }; - } - - { - name = "accepts___accepts_1.3.5.tgz"; - path = fetchurl { - name = "accepts___accepts_1.3.5.tgz"; - url = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz"; - sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2"; - }; - } - - { - name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz"; - path = fetchurl { - name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz"; - sha1 = "c752bd210bef679501b6c6cb7fc84f8f47158cc4"; - }; - } - - { - name = "acorn___acorn_4.0.13.tgz"; - path = fetchurl { - name = "acorn___acorn_4.0.13.tgz"; - url = "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz"; - sha1 = "105495ae5361d697bd195c825192e1ad7f253787"; - }; - } - - { - name = "acorn___acorn_5.7.1.tgz"; - path = fetchurl { - name = "acorn___acorn_5.7.1.tgz"; - url = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz"; - sha1 = "f095829297706a7c9776958c0afc8930a9b9d9d8"; - }; - } - - { - name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz"; - path = fetchurl { - name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz"; - sha1 = "e33fde95e50db9f2a802e3647e311d2fc5000c69"; - }; - } - - { - name = "ajv_keywords___ajv_keywords_3.2.0.tgz"; - path = fetchurl { - name = "ajv_keywords___ajv_keywords_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz"; - sha1 = "e86b819c602cf8821ad637413698f1dec021847a"; - }; - } - - { - name = "ajv___ajv_4.11.8.tgz"; - path = fetchurl { - name = "ajv___ajv_4.11.8.tgz"; - url = "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz"; - sha1 = "82ffb02b29e662ae53bdc20af15947706739c536"; - }; - } - - { - name = "ajv___ajv_5.5.2.tgz"; - path = fetchurl { - name = "ajv___ajv_5.5.2.tgz"; - url = "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz"; - sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965"; - }; - } - - { - name = "ajv___ajv_6.5.2.tgz"; - path = fetchurl { - name = "ajv___ajv_6.5.2.tgz"; - url = "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz"; - sha1 = "678495f9b82f7cca6be248dd92f59bff5e1f4360"; - }; - } - - { - name = "align_text___align_text_0.1.4.tgz"; - path = fetchurl { - name = "align_text___align_text_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz"; - sha1 = "0cd90a561093f35d0a99256c22b7069433fad117"; - }; - } - - { - name = "alphanum_sort___alphanum_sort_1.0.2.tgz"; - path = fetchurl { - name = "alphanum_sort___alphanum_sort_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz"; - sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3"; - }; - } - - { - name = "amdefine___amdefine_1.0.1.tgz"; - path = fetchurl { - name = "amdefine___amdefine_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz"; - sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5"; - }; - } - - { - name = "ansi_html___ansi_html_0.0.7.tgz"; - path = fetchurl { - name = "ansi_html___ansi_html_0.0.7.tgz"; - url = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz"; - sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e"; - }; - } - - { - name = "ansi_regex___ansi_regex_2.1.1.tgz"; - path = fetchurl { - name = "ansi_regex___ansi_regex_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz"; - sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df"; - }; - } - - { - name = "ansi_regex___ansi_regex_3.0.0.tgz"; - path = fetchurl { - name = "ansi_regex___ansi_regex_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz"; - sha1 = "ed0317c322064f79466c02966bddb605ab37d998"; - }; - } - - { - name = "ansi_styles___ansi_styles_2.2.1.tgz"; - path = fetchurl { - name = "ansi_styles___ansi_styles_2.2.1.tgz"; - url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz"; - sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe"; - }; - } - - { - name = "ansi_styles___ansi_styles_3.2.1.tgz"; - path = fetchurl { - name = "ansi_styles___ansi_styles_3.2.1.tgz"; - url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz"; - sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d"; - }; - } - - { - name = "anymatch___anymatch_2.0.0.tgz"; - path = fetchurl { - name = "anymatch___anymatch_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz"; - sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"; - }; - } - - { - name = "aproba___aproba_1.2.0.tgz"; - path = fetchurl { - name = "aproba___aproba_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz"; - sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a"; - }; - } - - { - name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz"; - path = fetchurl { - name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz"; - url = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz"; - sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21"; - }; - } - - { - name = "argparse___argparse_1.0.10.tgz"; - path = fetchurl { - name = "argparse___argparse_1.0.10.tgz"; - url = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz"; - sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911"; - }; - } - - { - name = "arr_diff___arr_diff_2.0.0.tgz"; - path = fetchurl { - name = "arr_diff___arr_diff_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz"; - sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf"; - }; - } - - { - name = "arr_diff___arr_diff_4.0.0.tgz"; - path = fetchurl { - name = "arr_diff___arr_diff_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz"; - sha1 = "d6461074febfec71e7e15235761a329a5dc7c520"; - }; - } - - { - name = "arr_flatten___arr_flatten_1.1.0.tgz"; - path = fetchurl { - name = "arr_flatten___arr_flatten_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz"; - sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1"; - }; - } - - { - name = "arr_union___arr_union_3.1.0.tgz"; - path = fetchurl { - name = "arr_union___arr_union_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz"; - sha1 = "e39b09aea9def866a8f206e288af63919bae39c4"; - }; - } - - { - name = "array_find_index___array_find_index_1.0.2.tgz"; - path = fetchurl { - name = "array_find_index___array_find_index_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz"; - sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1"; - }; - } - - { - name = "array_flatten___array_flatten_1.1.1.tgz"; - path = fetchurl { - name = "array_flatten___array_flatten_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz"; - sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2"; - }; - } - - { - name = "array_flatten___array_flatten_2.1.1.tgz"; - path = fetchurl { - name = "array_flatten___array_flatten_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz"; - sha1 = "426bb9da84090c1838d812c8150af20a8331e296"; - }; - } - - { - name = "array_includes___array_includes_3.0.3.tgz"; - path = fetchurl { - name = "array_includes___array_includes_3.0.3.tgz"; - url = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz"; - sha1 = "184b48f62d92d7452bb31b323165c7f8bd02266d"; - }; - } - - { - name = "array_union___array_union_1.0.2.tgz"; - path = fetchurl { - name = "array_union___array_union_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz"; - sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39"; - }; - } - - { - name = "array_uniq___array_uniq_1.0.3.tgz"; - path = fetchurl { - name = "array_uniq___array_uniq_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz"; - sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6"; - }; - } - - { - name = "array_unique___array_unique_0.2.1.tgz"; - path = fetchurl { - name = "array_unique___array_unique_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz"; - sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53"; - }; - } - - { - name = "array_unique___array_unique_0.3.2.tgz"; - path = fetchurl { - name = "array_unique___array_unique_0.3.2.tgz"; - url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz"; - sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"; - }; - } - - { - name = "asn1.js___asn1.js_4.10.1.tgz"; - path = fetchurl { - name = "asn1.js___asn1.js_4.10.1.tgz"; - url = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz"; - sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"; - }; - } - - { - name = "asn1___asn1_0.2.3.tgz"; - path = fetchurl { - name = "asn1___asn1_0.2.3.tgz"; - url = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz"; - sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86"; - }; - } - - { - name = "assert_plus___assert_plus_1.0.0.tgz"; - path = fetchurl { - name = "assert_plus___assert_plus_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz"; - sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"; - }; - } - - { - name = "assert_plus___assert_plus_0.2.0.tgz"; - path = fetchurl { - name = "assert_plus___assert_plus_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz"; - sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234"; - }; - } - - { - name = "assert___assert_1.4.1.tgz"; - path = fetchurl { - name = "assert___assert_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz"; - sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91"; - }; - } - - { - name = "assign_symbols___assign_symbols_1.0.0.tgz"; - path = fetchurl { - name = "assign_symbols___assign_symbols_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz"; - sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"; - }; - } - - { - name = "async_each___async_each_1.0.1.tgz"; - path = fetchurl { - name = "async_each___async_each_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz"; - sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d"; - }; - } - - { - name = "async_foreach___async_foreach_0.1.3.tgz"; - path = fetchurl { - name = "async_foreach___async_foreach_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz"; - sha1 = "36121f845c0578172de419a97dbeb1d16ec34542"; - }; - } - - { - name = "async___async_1.5.2.tgz"; - path = fetchurl { - name = "async___async_1.5.2.tgz"; - url = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz"; - sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a"; - }; - } - - { - name = "async___async_2.6.1.tgz"; - path = fetchurl { - name = "async___async_2.6.1.tgz"; - url = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz"; - sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610"; - }; - } - - { - name = "asynckit___asynckit_0.4.0.tgz"; - path = fetchurl { - name = "asynckit___asynckit_0.4.0.tgz"; - url = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz"; - sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"; - }; - } - - { - name = "atob___atob_2.1.1.tgz"; - path = fetchurl { - name = "atob___atob_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz"; - sha1 = "ae2d5a729477f289d60dd7f96a6314a22dd6c22a"; - }; - } - - { - name = "autoprefixer___autoprefixer_6.7.7.tgz"; - path = fetchurl { - name = "autoprefixer___autoprefixer_6.7.7.tgz"; - url = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz"; - sha1 = "1dbd1c835658e35ce3f9984099db00585c782014"; - }; - } - - { - name = "aws_sign2___aws_sign2_0.6.0.tgz"; - path = fetchurl { - name = "aws_sign2___aws_sign2_0.6.0.tgz"; - url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz"; - sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f"; - }; - } - - { - name = "aws_sign2___aws_sign2_0.7.0.tgz"; - path = fetchurl { - name = "aws_sign2___aws_sign2_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz"; - sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"; - }; - } - - { - name = "aws4___aws4_1.7.0.tgz"; - path = fetchurl { - name = "aws4___aws4_1.7.0.tgz"; - url = "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz"; - sha1 = "d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"; - }; - } - - { - name = "babel_code_frame___babel_code_frame_6.26.0.tgz"; - path = fetchurl { - name = "babel_code_frame___babel_code_frame_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz"; - sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"; - }; - } - - { - name = "babel_core___babel_core_6.26.3.tgz"; - path = fetchurl { - name = "babel_core___babel_core_6.26.3.tgz"; - url = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz"; - sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207"; - }; - } - - { - name = "babel_generator___babel_generator_6.26.1.tgz"; - path = fetchurl { - name = "babel_generator___babel_generator_6.26.1.tgz"; - url = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz"; - sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90"; - }; - } - - { - name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz"; - sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664"; - }; - } - - { - name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz"; - sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d"; - }; - } - - { - name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz"; - path = fetchurl { - name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz"; - sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f"; - }; - } - - { - name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz"; - sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa"; - }; - } - - { - name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz"; - sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9"; - }; - } - - { - name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz"; - sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d"; - }; - } - - { - name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz"; - sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76"; - }; - } - - { - name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz"; - sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257"; - }; - } - - { - name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz"; - path = fetchurl { - name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz"; - sha1 = "325c59f902f82f24b74faceed0363954f6495e72"; - }; - } - - { - name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz"; - sha1 = "5ec581827ad723fecdd381f1c928390676e4551b"; - }; - } - - { - name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz"; - sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"; - }; - } - - { - name = "babel_helpers___babel_helpers_6.24.1.tgz"; - path = fetchurl { - name = "babel_helpers___babel_helpers_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz"; - sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2"; - }; - } - - { - name = "babel_loader___babel_loader_7.1.5.tgz"; - path = fetchurl { - name = "babel_loader___babel_loader_7.1.5.tgz"; - url = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz"; - sha1 = "e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"; - }; - } - - { - name = "babel_messages___babel_messages_6.23.0.tgz"; - path = fetchurl { - name = "babel_messages___babel_messages_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz"; - sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e"; - }; - } - - { - name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz"; - sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a"; - }; - } - - { - name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz"; - path = fetchurl { - name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz"; - sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95"; - }; - } - - { - name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz"; - path = fetchurl { - name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz"; - sha1 = "9ee7e8337290da95288201a6a57f4170317830de"; - }; - } - - { - name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz"; - sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3"; - }; - } - - { - name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz"; - sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"; - }; - } - - { - name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz"; - sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221"; - }; - } - - { - name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz"; - sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141"; - }; - } - - { - name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz"; - sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f"; - }; - } - - { - name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz"; - sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"; - }; - } - - { - name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz"; - sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3"; - }; - } - - { - name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz"; - sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d"; - }; - } - - { - name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz"; - sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e"; - }; - } - - { - name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz"; - sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691"; - }; - } - - { - name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz"; - sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"; - }; - } - - { - name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz"; - sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz"; - sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz"; - sha1 = "58a793863a9e7ca870bdc5a881117ffac27db6f3"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz"; - sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz"; - sha1 = "ac997e6285cd18ed6176adb607d602344ad38468"; - }; - } - - { - name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz"; - sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d"; - }; - } - - { - name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz"; - sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b"; - }; - } - - { - name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz"; - sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0"; - }; - } - - { - name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz"; - sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"; - }; - } - - { - name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz"; - sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"; - }; - } - - { - name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz"; - sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"; - }; - } - - { - name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz"; - sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372"; - }; - } - - { - name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz"; - sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9"; - }; - } - - { - name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz"; - sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"; - }; - } - - { - name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz"; - sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"; - }; - } - - { - name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz"; - sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758"; - }; - } - - { - name = "babel_preset_env___babel_preset_env_1.7.0.tgz"; - path = fetchurl { - name = "babel_preset_env___babel_preset_env_1.7.0.tgz"; - url = "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz"; - sha1 = "dea79fa4ebeb883cd35dab07e260c1c9c04df77a"; - }; - } - - { - name = "babel_register___babel_register_6.26.0.tgz"; - path = fetchurl { - name = "babel_register___babel_register_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz"; - sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071"; - }; - } - - { - name = "babel_runtime___babel_runtime_6.26.0.tgz"; - path = fetchurl { - name = "babel_runtime___babel_runtime_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz"; - sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe"; - }; - } - - { - name = "babel_template___babel_template_6.26.0.tgz"; - path = fetchurl { - name = "babel_template___babel_template_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz"; - sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02"; - }; - } - - { - name = "babel_traverse___babel_traverse_6.26.0.tgz"; - path = fetchurl { - name = "babel_traverse___babel_traverse_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz"; - sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"; - }; - } - - { - name = "babel_types___babel_types_6.26.0.tgz"; - path = fetchurl { - name = "babel_types___babel_types_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz"; - sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497"; - }; - } - - { - name = "babylon___babylon_6.18.0.tgz"; - path = fetchurl { - name = "babylon___babylon_6.18.0.tgz"; - url = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz"; - sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"; - }; - } - - { - name = "balanced_match___balanced_match_0.4.2.tgz"; - path = fetchurl { - name = "balanced_match___balanced_match_0.4.2.tgz"; - url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz"; - sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838"; - }; - } - - { - name = "balanced_match___balanced_match_1.0.0.tgz"; - path = fetchurl { - name = "balanced_match___balanced_match_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz"; - sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767"; - }; - } - - { - name = "base64_js___base64_js_1.3.0.tgz"; - path = fetchurl { - name = "base64_js___base64_js_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz"; - sha1 = "cab1e6118f051095e58b5281aea8c1cd22bfc0e3"; - }; - } - - { - name = "base___base_0.11.2.tgz"; - path = fetchurl { - name = "base___base_0.11.2.tgz"; - url = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz"; - sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f"; - }; - } - - { - name = "batch___batch_0.6.1.tgz"; - path = fetchurl { - name = "batch___batch_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz"; - sha1 = "dc34314f4e679318093fc760272525f94bf25c16"; - }; - } - - { - name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz"; - path = fetchurl { - name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"; - sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"; - }; - } - - { - name = "big.js___big.js_3.2.0.tgz"; - path = fetchurl { - name = "big.js___big.js_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz"; - sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e"; - }; - } - - { - name = "binary_extensions___binary_extensions_1.11.0.tgz"; - path = fetchurl { - name = "binary_extensions___binary_extensions_1.11.0.tgz"; - url = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz"; - sha1 = "46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"; - }; - } - - { - name = "block_stream___block_stream_0.0.9.tgz"; - path = fetchurl { - name = "block_stream___block_stream_0.0.9.tgz"; - url = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz"; - sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a"; - }; - } - - { - name = "bn.js___bn.js_4.11.8.tgz"; - path = fetchurl { - name = "bn.js___bn.js_4.11.8.tgz"; - url = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz"; - sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f"; - }; - } - - { - name = "body_parser___body_parser_1.18.2.tgz"; - path = fetchurl { - name = "body_parser___body_parser_1.18.2.tgz"; - url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz"; - sha1 = "87678a19d84b47d859b83199bd59bce222b10454"; - }; - } - - { - name = "bonjour___bonjour_3.5.0.tgz"; - path = fetchurl { - name = "bonjour___bonjour_3.5.0.tgz"; - url = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz"; - sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"; - }; - } - - { - name = "boolbase___boolbase_1.0.0.tgz"; - path = fetchurl { - name = "boolbase___boolbase_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz"; - sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"; - }; - } - - { - name = "boom___boom_2.10.1.tgz"; - path = fetchurl { - name = "boom___boom_2.10.1.tgz"; - url = "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz"; - sha1 = "39c8918ceff5799f83f9492a848f625add0c766f"; - }; - } - - { - name = "bootstrap___bootstrap_4.1.3.tgz"; - path = fetchurl { - name = "bootstrap___bootstrap_4.1.3.tgz"; - url = "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz"; - sha1 = "0eb371af2c8448e8c210411d0cb824a6409a12be"; - }; - } - - { - name = "brace_expansion___brace_expansion_1.1.11.tgz"; - path = fetchurl { - name = "brace_expansion___brace_expansion_1.1.11.tgz"; - url = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz"; - sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd"; - }; - } - - { - name = "braces___braces_1.8.5.tgz"; - path = fetchurl { - name = "braces___braces_1.8.5.tgz"; - url = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz"; - sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7"; - }; - } - - { - name = "braces___braces_2.3.2.tgz"; - path = fetchurl { - name = "braces___braces_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz"; - sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729"; - }; - } - - { - name = "brorand___brorand_1.1.0.tgz"; - path = fetchurl { - name = "brorand___brorand_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz"; - sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f"; - }; - } - - { - name = "browserify_aes___browserify_aes_1.2.0.tgz"; - path = fetchurl { - name = "browserify_aes___browserify_aes_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz"; - sha1 = "326734642f403dabc3003209853bb70ad428ef48"; - }; - } - - { - name = "browserify_cipher___browserify_cipher_1.0.1.tgz"; - path = fetchurl { - name = "browserify_cipher___browserify_cipher_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz"; - sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"; - }; - } - - { - name = "browserify_des___browserify_des_1.0.2.tgz"; - path = fetchurl { - name = "browserify_des___browserify_des_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz"; - sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c"; - }; - } - - { - name = "browserify_rsa___browserify_rsa_4.0.1.tgz"; - path = fetchurl { - name = "browserify_rsa___browserify_rsa_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz"; - sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524"; - }; - } - - { - name = "browserify_sign___browserify_sign_4.0.4.tgz"; - path = fetchurl { - name = "browserify_sign___browserify_sign_4.0.4.tgz"; - url = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz"; - sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"; - }; - } - - { - name = "browserify_zlib___browserify_zlib_0.2.0.tgz"; - path = fetchurl { - name = "browserify_zlib___browserify_zlib_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz"; - sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"; - }; - } - - { - name = "browserslist___browserslist_1.7.7.tgz"; - path = fetchurl { - name = "browserslist___browserslist_1.7.7.tgz"; - url = "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz"; - sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9"; - }; - } - - { - name = "browserslist___browserslist_3.2.8.tgz"; - path = fetchurl { - name = "browserslist___browserslist_3.2.8.tgz"; - url = "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz"; - sha1 = "b0005361d6471f0f5952797a76fc985f1f978fc6"; - }; - } - - { - name = "buffer_indexof___buffer_indexof_1.1.1.tgz"; - path = fetchurl { - name = "buffer_indexof___buffer_indexof_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz"; - sha1 = "52fabcc6a606d1a00302802648ef68f639da268c"; - }; - } - - { - name = "buffer_xor___buffer_xor_1.0.3.tgz"; - path = fetchurl { - name = "buffer_xor___buffer_xor_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz"; - sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9"; - }; - } - - { - name = "buffer___buffer_4.9.1.tgz"; - path = fetchurl { - name = "buffer___buffer_4.9.1.tgz"; - url = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz"; - sha1 = "6d1bb601b07a4efced97094132093027c95bc298"; - }; - } - - { - name = "builtin_modules___builtin_modules_1.1.1.tgz"; - path = fetchurl { - name = "builtin_modules___builtin_modules_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz"; - sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f"; - }; - } - - { - name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz"; - path = fetchurl { - name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"; - sha1 = "85982878e21b98e1c66425e03d0174788f569ee8"; - }; - } - - { - name = "bytes___bytes_3.0.0.tgz"; - path = fetchurl { - name = "bytes___bytes_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz"; - sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048"; - }; - } - - { - name = "cache_base___cache_base_1.0.1.tgz"; - path = fetchurl { - name = "cache_base___cache_base_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz"; - sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2"; - }; - } - - { - name = "camelcase_keys___camelcase_keys_2.1.0.tgz"; - path = fetchurl { - name = "camelcase_keys___camelcase_keys_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz"; - sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7"; - }; - } - - { - name = "camelcase___camelcase_1.2.1.tgz"; - path = fetchurl { - name = "camelcase___camelcase_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz"; - sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"; - }; - } - - { - name = "camelcase___camelcase_2.1.1.tgz"; - path = fetchurl { - name = "camelcase___camelcase_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz"; - sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"; - }; - } - - { - name = "camelcase___camelcase_3.0.0.tgz"; - path = fetchurl { - name = "camelcase___camelcase_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz"; - sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"; - }; - } - - { - name = "camelcase___camelcase_4.1.0.tgz"; - path = fetchurl { - name = "camelcase___camelcase_4.1.0.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz"; - sha1 = "d545635be1e33c542649c69173e5de6acfae34dd"; - }; - } - - { - name = "caniuse_api___caniuse_api_1.6.1.tgz"; - path = fetchurl { - name = "caniuse_api___caniuse_api_1.6.1.tgz"; - url = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz"; - sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"; - }; - } - - { - name = "caniuse_db___caniuse_db_1.0.30000871.tgz"; - path = fetchurl { - name = "caniuse_db___caniuse_db_1.0.30000871.tgz"; - url = "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000871.tgz"; - sha1 = "f1995c1fe31892649a7605957a80c92518423d4d"; - }; - } - - { - name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz"; - path = fetchurl { - name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz"; - url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz"; - sha1 = "70026616e8afe6e1442f8bb4e1092987d81a2f25"; - }; - } - - { - name = "caseless___caseless_0.12.0.tgz"; - path = fetchurl { - name = "caseless___caseless_0.12.0.tgz"; - url = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz"; - sha1 = "1b681c21ff84033c826543090689420d187151dc"; - }; - } - - { - name = "center_align___center_align_0.1.3.tgz"; - path = fetchurl { - name = "center_align___center_align_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz"; - sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad"; - }; - } - - { - name = "chalk___chalk_1.1.3.tgz"; - path = fetchurl { - name = "chalk___chalk_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz"; - sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98"; - }; - } - - { - name = "chalk___chalk_2.4.1.tgz"; - path = fetchurl { - name = "chalk___chalk_2.4.1.tgz"; - url = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz"; - sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e"; - }; - } - - { - name = "chokidar___chokidar_2.0.4.tgz"; - path = fetchurl { - name = "chokidar___chokidar_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz"; - sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26"; - }; - } - - { - name = "chownr___chownr_1.0.1.tgz"; - path = fetchurl { - name = "chownr___chownr_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz"; - sha1 = "e2a75042a9551908bebd25b8523d5f9769d79181"; - }; - } - - { - name = "cipher_base___cipher_base_1.0.4.tgz"; - path = fetchurl { - name = "cipher_base___cipher_base_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz"; - sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de"; - }; - } - - { - name = "clap___clap_1.2.3.tgz"; - path = fetchurl { - name = "clap___clap_1.2.3.tgz"; - url = "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz"; - sha1 = "4f36745b32008492557f46412d66d50cb99bce51"; - }; - } - - { - name = "class_utils___class_utils_0.3.6.tgz"; - path = fetchurl { - name = "class_utils___class_utils_0.3.6.tgz"; - url = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz"; - sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463"; - }; - } - - { - name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz"; - path = fetchurl { - name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz"; - url = "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz"; - sha1 = "ceda8bb96b00fe168e9b080272960d20fdcadd6d"; - }; - } - - { - name = "cliui___cliui_2.1.0.tgz"; - path = fetchurl { - name = "cliui___cliui_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz"; - sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1"; - }; - } - - { - name = "cliui___cliui_3.2.0.tgz"; - path = fetchurl { - name = "cliui___cliui_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz"; - sha1 = "120601537a916d29940f934da3b48d585a39213d"; - }; - } - - { - name = "clone_deep___clone_deep_2.0.2.tgz"; - path = fetchurl { - name = "clone_deep___clone_deep_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz"; - sha1 = "00db3a1e173656730d1188c3d6aced6d7ea97713"; - }; - } - - { - name = "clone___clone_1.0.4.tgz"; - path = fetchurl { - name = "clone___clone_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz"; - sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e"; - }; - } - - { - name = "co___co_4.6.0.tgz"; - path = fetchurl { - name = "co___co_4.6.0.tgz"; - url = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz"; - sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"; - }; - } - - { - name = "coa___coa_1.0.4.tgz"; - path = fetchurl { - name = "coa___coa_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz"; - sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd"; - }; - } - - { - name = "code_point_at___code_point_at_1.1.0.tgz"; - path = fetchurl { - name = "code_point_at___code_point_at_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz"; - sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"; - }; - } - - { - name = "collection_visit___collection_visit_1.0.0.tgz"; - path = fetchurl { - name = "collection_visit___collection_visit_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz"; - sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0"; - }; - } - - { - name = "color_convert___color_convert_1.9.2.tgz"; - path = fetchurl { - name = "color_convert___color_convert_1.9.2.tgz"; - url = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz"; - sha1 = "49881b8fba67df12a96bdf3f56c0aab9e7913147"; - }; - } - - { - name = "color_name___color_name_1.1.1.tgz"; - path = fetchurl { - name = "color_name___color_name_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz"; - sha1 = "4b1415304cf50028ea81643643bd82ea05803689"; - }; - } - - { - name = "color_name___color_name_1.1.3.tgz"; - path = fetchurl { - name = "color_name___color_name_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz"; - sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25"; - }; - } - - { - name = "color_string___color_string_0.3.0.tgz"; - path = fetchurl { - name = "color_string___color_string_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz"; - sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991"; - }; - } - - { - name = "color___color_0.11.4.tgz"; - path = fetchurl { - name = "color___color_0.11.4.tgz"; - url = "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz"; - sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764"; - }; - } - - { - name = "colormin___colormin_1.1.2.tgz"; - path = fetchurl { - name = "colormin___colormin_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz"; - sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133"; - }; - } - - { - name = "colors___colors_1.1.2.tgz"; - path = fetchurl { - name = "colors___colors_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz"; - sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63"; - }; - } - - { - name = "combined_stream___combined_stream_1.0.6.tgz"; - path = fetchurl { - name = "combined_stream___combined_stream_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz"; - sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818"; - }; - } - - { - name = "commondir___commondir_1.0.1.tgz"; - path = fetchurl { - name = "commondir___commondir_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz"; - sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b"; - }; - } - - { - name = "component_emitter___component_emitter_1.2.1.tgz"; - path = fetchurl { - name = "component_emitter___component_emitter_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz"; - sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6"; - }; - } - - { - name = "compressible___compressible_2.0.14.tgz"; - path = fetchurl { - name = "compressible___compressible_2.0.14.tgz"; - url = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz"; - sha1 = "326c5f507fbb055f54116782b969a81b67a29da7"; - }; - } - - { - name = "compression___compression_1.7.3.tgz"; - path = fetchurl { - name = "compression___compression_1.7.3.tgz"; - url = "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz"; - sha1 = "27e0e176aaf260f7f2c2813c3e440adb9f1993db"; - }; - } - - { - name = "concat_map___concat_map_0.0.1.tgz"; - path = fetchurl { - name = "concat_map___concat_map_0.0.1.tgz"; - url = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz"; - sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b"; - }; - } - - { - name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz"; - path = fetchurl { - name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz"; - url = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz"; - sha1 = "b06873934bc5e344fef611a196a6faae0aee015a"; - }; - } - - { - name = "console_browserify___console_browserify_1.1.0.tgz"; - path = fetchurl { - name = "console_browserify___console_browserify_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz"; - sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10"; - }; - } - - { - name = "console_control_strings___console_control_strings_1.1.0.tgz"; - path = fetchurl { - name = "console_control_strings___console_control_strings_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz"; - sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e"; - }; - } - - { - name = "constants_browserify___constants_browserify_1.0.0.tgz"; - path = fetchurl { - name = "constants_browserify___constants_browserify_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz"; - sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75"; - }; - } - - { - name = "content_disposition___content_disposition_0.5.2.tgz"; - path = fetchurl { - name = "content_disposition___content_disposition_0.5.2.tgz"; - url = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz"; - sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"; - }; - } - - { - name = "content_type___content_type_1.0.4.tgz"; - path = fetchurl { - name = "content_type___content_type_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz"; - sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b"; - }; - } - - { - name = "convert_source_map___convert_source_map_0.3.5.tgz"; - path = fetchurl { - name = "convert_source_map___convert_source_map_0.3.5.tgz"; - url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz"; - sha1 = "f1d802950af7dd2631a1febe0596550c86ab3190"; - }; - } - - { - name = "convert_source_map___convert_source_map_1.5.1.tgz"; - path = fetchurl { - name = "convert_source_map___convert_source_map_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz"; - sha1 = "b8278097b9bc229365de5c62cf5fcaed8b5599e5"; - }; - } - - { - name = "cookie_signature___cookie_signature_1.0.6.tgz"; - path = fetchurl { - name = "cookie_signature___cookie_signature_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz"; - sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c"; - }; - } - - { - name = "cookie___cookie_0.3.1.tgz"; - path = fetchurl { - name = "cookie___cookie_0.3.1.tgz"; - url = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz"; - sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"; - }; - } - - { - name = "copy_descriptor___copy_descriptor_0.1.1.tgz"; - path = fetchurl { - name = "copy_descriptor___copy_descriptor_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz"; - sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d"; - }; - } - - { - name = "core_js___core_js_2.5.7.tgz"; - path = fetchurl { - name = "core_js___core_js_2.5.7.tgz"; - url = "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz"; - sha1 = "f972608ff0cead68b841a16a932d0b183791814e"; - }; - } - - { - name = "core_util_is___core_util_is_1.0.2.tgz"; - path = fetchurl { - name = "core_util_is___core_util_is_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz"; - sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7"; - }; - } - - { - name = "create_ecdh___create_ecdh_4.0.3.tgz"; - path = fetchurl { - name = "create_ecdh___create_ecdh_4.0.3.tgz"; - url = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz"; - sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff"; - }; - } - - { - name = "create_hash___create_hash_1.2.0.tgz"; - path = fetchurl { - name = "create_hash___create_hash_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz"; - sha1 = "889078af11a63756bcfb59bd221996be3a9ef196"; - }; - } - - { - name = "create_hmac___create_hmac_1.1.7.tgz"; - path = fetchurl { - name = "create_hmac___create_hmac_1.1.7.tgz"; - url = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz"; - sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff"; - }; - } - - { - name = "cross_spawn___cross_spawn_3.0.1.tgz"; - path = fetchurl { - name = "cross_spawn___cross_spawn_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz"; - sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982"; - }; - } - - { - name = "cross_spawn___cross_spawn_5.1.0.tgz"; - path = fetchurl { - name = "cross_spawn___cross_spawn_5.1.0.tgz"; - url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz"; - sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449"; - }; - } - - { - name = "cryptiles___cryptiles_2.0.5.tgz"; - path = fetchurl { - name = "cryptiles___cryptiles_2.0.5.tgz"; - url = "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz"; - sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8"; - }; - } - - { - name = "crypto_browserify___crypto_browserify_3.12.0.tgz"; - path = fetchurl { - name = "crypto_browserify___crypto_browserify_3.12.0.tgz"; - url = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz"; - sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec"; - }; - } - - { - name = "css_color_names___css_color_names_0.0.4.tgz"; - path = fetchurl { - name = "css_color_names___css_color_names_0.0.4.tgz"; - url = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz"; - sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0"; - }; - } - - { - name = "css_loader___css_loader_0.26.4.tgz"; - path = fetchurl { - name = "css_loader___css_loader_0.26.4.tgz"; - url = "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz"; - sha1 = "b61e9e30db94303e6ffc892f10ecd09ad025a1fd"; - }; - } - - { - name = "css_select___css_select_1.2.0.tgz"; - path = fetchurl { - name = "css_select___css_select_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz"; - sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858"; - }; - } - - { - name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz"; - path = fetchurl { - name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz"; - sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86"; - }; - } - - { - name = "css_what___css_what_2.1.0.tgz"; - path = fetchurl { - name = "css_what___css_what_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz"; - sha1 = "9467d032c38cfaefb9f2d79501253062f87fa1bd"; - }; - } - - { - name = "css___css_2.2.3.tgz"; - path = fetchurl { - name = "css___css_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz"; - sha1 = "f861f4ba61e79bedc962aa548e5780fd95cbc6be"; - }; - } - - { - name = "cssesc___cssesc_0.1.0.tgz"; - path = fetchurl { - name = "cssesc___cssesc_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz"; - sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4"; - }; - } - - { - name = "cssnano___cssnano_3.10.0.tgz"; - path = fetchurl { - name = "cssnano___cssnano_3.10.0.tgz"; - url = "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz"; - sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"; - }; - } - - { - name = "csso___csso_2.3.2.tgz"; - path = fetchurl { - name = "csso___csso_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz"; - sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85"; - }; - } - - { - name = "currently_unhandled___currently_unhandled_0.4.1.tgz"; - path = fetchurl { - name = "currently_unhandled___currently_unhandled_0.4.1.tgz"; - url = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz"; - sha1 = "988df33feab191ef799a61369dd76c17adf957ea"; - }; - } - - { - name = "d___d_1.0.0.tgz"; - path = fetchurl { - name = "d___d_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz"; - sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f"; - }; - } - - { - name = "dashdash___dashdash_1.14.1.tgz"; - path = fetchurl { - name = "dashdash___dashdash_1.14.1.tgz"; - url = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz"; - sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"; - }; - } - - { - name = "date_now___date_now_0.1.4.tgz"; - path = fetchurl { - name = "date_now___date_now_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz"; - sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b"; - }; - } - - { - name = "debug___debug_2.6.9.tgz"; - path = fetchurl { - name = "debug___debug_2.6.9.tgz"; - url = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz"; - sha1 = "5d128515df134ff327e90a4c93f4e077a536341f"; - }; - } - - { - name = "debug___debug_3.1.0.tgz"; - path = fetchurl { - name = "debug___debug_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz"; - sha1 = "5bb5a0672628b64149566ba16819e61518c67261"; - }; - } - - { - name = "decamelize___decamelize_1.2.0.tgz"; - path = fetchurl { - name = "decamelize___decamelize_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz"; - sha1 = "f6534d15148269b20352e7bee26f501f9a191290"; - }; - } - - { - name = "decode_uri_component___decode_uri_component_0.2.0.tgz"; - path = fetchurl { - name = "decode_uri_component___decode_uri_component_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz"; - sha1 = "eb3913333458775cb84cd1a1fae062106bb87545"; - }; - } - - { - name = "deep_equal___deep_equal_1.0.1.tgz"; - path = fetchurl { - name = "deep_equal___deep_equal_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz"; - sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5"; - }; - } - - { - name = "deep_extend___deep_extend_0.6.0.tgz"; - path = fetchurl { - name = "deep_extend___deep_extend_0.6.0.tgz"; - url = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz"; - sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac"; - }; - } - - { - name = "define_properties___define_properties_1.1.2.tgz"; - path = fetchurl { - name = "define_properties___define_properties_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz"; - sha1 = "83a73f2fea569898fb737193c8f873caf6d45c94"; - }; - } - - { - name = "define_property___define_property_0.2.5.tgz"; - path = fetchurl { - name = "define_property___define_property_0.2.5.tgz"; - url = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz"; - sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116"; - }; - } - - { - name = "define_property___define_property_1.0.0.tgz"; - path = fetchurl { - name = "define_property___define_property_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz"; - sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"; - }; - } - - { - name = "define_property___define_property_2.0.2.tgz"; - path = fetchurl { - name = "define_property___define_property_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz"; - sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d"; - }; - } - - { - name = "defined___defined_1.0.0.tgz"; - path = fetchurl { - name = "defined___defined_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz"; - sha1 = "c98d9bcef75674188e110969151199e39b1fa693"; - }; - } - - { - name = "del___del_3.0.0.tgz"; - path = fetchurl { - name = "del___del_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz"; - sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5"; - }; - } - - { - name = "delayed_stream___delayed_stream_1.0.0.tgz"; - path = fetchurl { - name = "delayed_stream___delayed_stream_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz"; - sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619"; - }; - } - - { - name = "delegates___delegates_1.0.0.tgz"; - path = fetchurl { - name = "delegates___delegates_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz"; - sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a"; - }; - } - - { - name = "depd___depd_1.1.1.tgz"; - path = fetchurl { - name = "depd___depd_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz"; - sha1 = "5783b4e1c459f06fa5ca27f991f3d06e7a310359"; - }; - } - - { - name = "depd___depd_1.1.2.tgz"; - path = fetchurl { - name = "depd___depd_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz"; - sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9"; - }; - } - - { - name = "des.js___des.js_1.0.0.tgz"; - path = fetchurl { - name = "des.js___des.js_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz"; - sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"; - }; - } - - { - name = "destroy___destroy_1.0.4.tgz"; - path = fetchurl { - name = "destroy___destroy_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz"; - sha1 = "978857442c44749e4206613e37946205826abd80"; - }; - } - - { - name = "detect_indent___detect_indent_4.0.0.tgz"; - path = fetchurl { - name = "detect_indent___detect_indent_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz"; - sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208"; - }; - } - - { - name = "detect_libc___detect_libc_1.0.3.tgz"; - path = fetchurl { - name = "detect_libc___detect_libc_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz"; - sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"; - }; - } - - { - name = "detect_node___detect_node_2.0.3.tgz"; - path = fetchurl { - name = "detect_node___detect_node_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz"; - sha1 = "a2033c09cc8e158d37748fbde7507832bd6ce127"; - }; - } - - { - name = "diffie_hellman___diffie_hellman_5.0.3.tgz"; - path = fetchurl { - name = "diffie_hellman___diffie_hellman_5.0.3.tgz"; - url = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz"; - sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875"; - }; - } - - { - name = "dns_equal___dns_equal_1.0.0.tgz"; - path = fetchurl { - name = "dns_equal___dns_equal_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz"; - sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d"; - }; - } - - { - name = "dns_packet___dns_packet_1.3.1.tgz"; - path = fetchurl { - name = "dns_packet___dns_packet_1.3.1.tgz"; - url = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz"; - sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a"; - }; - } - - { - name = "dns_txt___dns_txt_2.0.2.tgz"; - path = fetchurl { - name = "dns_txt___dns_txt_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz"; - sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6"; - }; - } - - { - name = "dom_converter___dom_converter_0.1.4.tgz"; - path = fetchurl { - name = "dom_converter___dom_converter_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz"; - sha1 = "a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"; - }; - } - - { - name = "dom_serializer___dom_serializer_0.1.0.tgz"; - path = fetchurl { - name = "dom_serializer___dom_serializer_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz"; - sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82"; - }; - } - - { - name = "domain_browser___domain_browser_1.2.0.tgz"; - path = fetchurl { - name = "domain_browser___domain_browser_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz"; - sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda"; - }; - } - - { - name = "domelementtype___domelementtype_1.3.0.tgz"; - path = fetchurl { - name = "domelementtype___domelementtype_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz"; - sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2"; - }; - } - - { - name = "domelementtype___domelementtype_1.1.3.tgz"; - path = fetchurl { - name = "domelementtype___domelementtype_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz"; - sha1 = "bd28773e2642881aec51544924299c5cd822185b"; - }; - } - - { - name = "domhandler___domhandler_2.1.0.tgz"; - path = fetchurl { - name = "domhandler___domhandler_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz"; - sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"; - }; - } - - { - name = "domutils___domutils_1.1.6.tgz"; - path = fetchurl { - name = "domutils___domutils_1.1.6.tgz"; - url = "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz"; - sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485"; - }; - } - - { - name = "domutils___domutils_1.5.1.tgz"; - path = fetchurl { - name = "domutils___domutils_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz"; - sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf"; - }; - } - - { - name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz"; - path = fetchurl { - name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz"; - sha1 = "0fc73a9ed5f0d53c38193398523ef7e543777505"; - }; - } - - { - name = "ee_first___ee_first_1.1.1.tgz"; - path = fetchurl { - name = "ee_first___ee_first_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz"; - sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d"; - }; - } - - { - name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz"; - path = fetchurl { - name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz"; - url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz"; - sha1 = "d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"; - }; - } - - { - name = "elliptic___elliptic_6.4.0.tgz"; - path = fetchurl { - name = "elliptic___elliptic_6.4.0.tgz"; - url = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz"; - sha1 = "cac9af8762c85836187003c8dfe193e5e2eae5df"; - }; - } - - { - name = "emojis_list___emojis_list_2.1.0.tgz"; - path = fetchurl { - name = "emojis_list___emojis_list_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz"; - sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389"; - }; - } - - { - name = "encodeurl___encodeurl_1.0.2.tgz"; - path = fetchurl { - name = "encodeurl___encodeurl_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz"; - sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"; - }; - } - - { - name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz"; - path = fetchurl { - name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz"; - url = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz"; - sha1 = "0421e339fd71419b3da13d129b3979040230476e"; - }; - } - - { - name = "entities___entities_1.1.1.tgz"; - path = fetchurl { - name = "entities___entities_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz"; - sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"; - }; - } - - { - name = "errno___errno_0.1.7.tgz"; - path = fetchurl { - name = "errno___errno_0.1.7.tgz"; - url = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz"; - sha1 = "4684d71779ad39af177e3f007996f7c67c852618"; - }; - } - - { - name = "error_ex___error_ex_1.3.2.tgz"; - path = fetchurl { - name = "error_ex___error_ex_1.3.2.tgz"; - url = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz"; - sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf"; - }; - } - - { - name = "error_stack_parser___error_stack_parser_2.0.2.tgz"; - path = fetchurl { - name = "error_stack_parser___error_stack_parser_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz"; - sha1 = "4ae8dbaa2bf90a8b450707b9149dcabca135520d"; - }; - } - - { - name = "es_abstract___es_abstract_1.12.0.tgz"; - path = fetchurl { - name = "es_abstract___es_abstract_1.12.0.tgz"; - url = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz"; - sha1 = "9dbbdd27c6856f0001421ca18782d786bf8a6165"; - }; - } - - { - name = "es_to_primitive___es_to_primitive_1.1.1.tgz"; - path = fetchurl { - name = "es_to_primitive___es_to_primitive_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz"; - sha1 = "45355248a88979034b6792e19bb81f2b7975dd0d"; - }; - } - - { - name = "es5_ext___es5_ext_0.10.45.tgz"; - path = fetchurl { - name = "es5_ext___es5_ext_0.10.45.tgz"; - url = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz"; - sha1 = "0bfdf7b473da5919d5adf3bd25ceb754fccc3653"; - }; - } - - { - name = "es6_iterator___es6_iterator_2.0.3.tgz"; - path = fetchurl { - name = "es6_iterator___es6_iterator_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz"; - sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7"; - }; - } - - { - name = "es6_map___es6_map_0.1.5.tgz"; - path = fetchurl { - name = "es6_map___es6_map_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz"; - sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0"; - }; - } - - { - name = "es6_set___es6_set_0.1.5.tgz"; - path = fetchurl { - name = "es6_set___es6_set_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz"; - sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1"; - }; - } - - { - name = "es6_symbol___es6_symbol_3.1.1.tgz"; - path = fetchurl { - name = "es6_symbol___es6_symbol_3.1.1.tgz"; - url = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz"; - sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"; - }; - } - - { - name = "es6_weak_map___es6_weak_map_2.0.2.tgz"; - path = fetchurl { - name = "es6_weak_map___es6_weak_map_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz"; - sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"; - }; - } - - { - name = "escape_html___escape_html_1.0.3.tgz"; - path = fetchurl { - name = "escape_html___escape_html_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz"; - sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988"; - }; - } - - { - name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz"; - path = fetchurl { - name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"; - sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"; - }; - } - - { - name = "escope___escope_3.6.0.tgz"; - path = fetchurl { - name = "escope___escope_3.6.0.tgz"; - url = "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz"; - sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3"; - }; - } - - { - name = "esprima___esprima_2.7.3.tgz"; - path = fetchurl { - name = "esprima___esprima_2.7.3.tgz"; - url = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz"; - sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581"; - }; - } - - { - name = "esrecurse___esrecurse_4.2.1.tgz"; - path = fetchurl { - name = "esrecurse___esrecurse_4.2.1.tgz"; - url = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz"; - sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"; - }; - } - - { - name = "estraverse___estraverse_4.2.0.tgz"; - path = fetchurl { - name = "estraverse___estraverse_4.2.0.tgz"; - url = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz"; - sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13"; - }; - } - - { - name = "esutils___esutils_2.0.2.tgz"; - path = fetchurl { - name = "esutils___esutils_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz"; - sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"; - }; - } - - { - name = "etag___etag_1.8.1.tgz"; - path = fetchurl { - name = "etag___etag_1.8.1.tgz"; - url = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz"; - sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887"; - }; - } - - { - name = "event_emitter___event_emitter_0.3.5.tgz"; - path = fetchurl { - name = "event_emitter___event_emitter_0.3.5.tgz"; - url = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz"; - sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39"; - }; - } - - { - name = "eventemitter3___eventemitter3_3.1.0.tgz"; - path = fetchurl { - name = "eventemitter3___eventemitter3_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz"; - sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163"; - }; - } - - { - name = "events___events_1.1.1.tgz"; - path = fetchurl { - name = "events___events_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz"; - sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"; - }; - } - - { - name = "eventsource___eventsource_0.1.6.tgz"; - path = fetchurl { - name = "eventsource___eventsource_0.1.6.tgz"; - url = "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz"; - sha1 = "0acede849ed7dd1ccc32c811bb11b944d4f29232"; - }; - } - - { - name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz"; - path = fetchurl { - name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"; - sha1 = "7fcbdb198dc71959432efe13842684e0525acb02"; - }; - } - - { - name = "execa___execa_0.7.0.tgz"; - path = fetchurl { - name = "execa___execa_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz"; - sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777"; - }; - } - - { - name = "expand_brackets___expand_brackets_0.1.5.tgz"; - path = fetchurl { - name = "expand_brackets___expand_brackets_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz"; - sha1 = "df07284e342a807cd733ac5af72411e581d1177b"; - }; - } - - { - name = "expand_brackets___expand_brackets_2.1.4.tgz"; - path = fetchurl { - name = "expand_brackets___expand_brackets_2.1.4.tgz"; - url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz"; - sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622"; - }; - } - - { - name = "expand_range___expand_range_1.8.2.tgz"; - path = fetchurl { - name = "expand_range___expand_range_1.8.2.tgz"; - url = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz"; - sha1 = "a299effd335fe2721ebae8e257ec79644fc85337"; - }; - } - - { - name = "express___express_4.16.3.tgz"; - path = fetchurl { - name = "express___express_4.16.3.tgz"; - url = "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz"; - sha1 = "6af8a502350db3246ecc4becf6b5a34d22f7ed53"; - }; - } - - { - name = "extend_shallow___extend_shallow_2.0.1.tgz"; - path = fetchurl { - name = "extend_shallow___extend_shallow_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz"; - sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f"; - }; - } - - { - name = "extend_shallow___extend_shallow_3.0.2.tgz"; - path = fetchurl { - name = "extend_shallow___extend_shallow_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz"; - sha1 = "26a71aaf073b39fb2127172746131c2704028db8"; - }; - } - - { - name = "extend___extend_3.0.2.tgz"; - path = fetchurl { - name = "extend___extend_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz"; - sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa"; - }; - } - - { - name = "extglob___extglob_0.3.2.tgz"; - path = fetchurl { - name = "extglob___extglob_0.3.2.tgz"; - url = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz"; - sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1"; - }; - } - - { - name = "extglob___extglob_2.0.4.tgz"; - path = fetchurl { - name = "extglob___extglob_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz"; - sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543"; - }; - } - - { - name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz"; - path = fetchurl { - name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz"; - sha1 = "5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7"; - }; - } - - { - name = "extsprintf___extsprintf_1.3.0.tgz"; - path = fetchurl { - name = "extsprintf___extsprintf_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz"; - sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05"; - }; - } - - { - name = "extsprintf___extsprintf_1.4.0.tgz"; - path = fetchurl { - name = "extsprintf___extsprintf_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz"; - sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f"; - }; - } - - { - name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz"; - path = fetchurl { - name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz"; - sha1 = "c053477817c86b51daa853c81e059b733d023614"; - }; - } - - { - name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz"; - path = fetchurl { - name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz"; - sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"; - }; - } - - { - name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz"; - path = fetchurl { - name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz"; - sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2"; - }; - } - - { - name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz"; - path = fetchurl { - name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz"; - url = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"; - sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917"; - }; - } - - { - name = "fastparse___fastparse_1.1.1.tgz"; - path = fetchurl { - name = "fastparse___fastparse_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz"; - sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8"; - }; - } - - { - name = "faye_websocket___faye_websocket_0.10.0.tgz"; - path = fetchurl { - name = "faye_websocket___faye_websocket_0.10.0.tgz"; - url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz"; - sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"; - }; - } - - { - name = "faye_websocket___faye_websocket_0.11.1.tgz"; - path = fetchurl { - name = "faye_websocket___faye_websocket_0.11.1.tgz"; - url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz"; - sha1 = "f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"; - }; - } - - { - name = "file_loader___file_loader_0.10.1.tgz"; - path = fetchurl { - name = "file_loader___file_loader_0.10.1.tgz"; - url = "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz"; - sha1 = "815034119891fc6441fb5a64c11bc93c22ddd842"; - }; - } - - { - name = "filename_regex___filename_regex_2.0.1.tgz"; - path = fetchurl { - name = "filename_regex___filename_regex_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz"; - sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"; - }; - } - - { - name = "fill_range___fill_range_2.2.4.tgz"; - path = fetchurl { - name = "fill_range___fill_range_2.2.4.tgz"; - url = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz"; - sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565"; - }; - } - - { - name = "fill_range___fill_range_4.0.0.tgz"; - path = fetchurl { - name = "fill_range___fill_range_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz"; - sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7"; - }; - } - - { - name = "finalhandler___finalhandler_1.1.1.tgz"; - path = fetchurl { - name = "finalhandler___finalhandler_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz"; - sha1 = "eebf4ed840079c83f4249038c9d703008301b105"; - }; - } - - { - name = "find_cache_dir___find_cache_dir_1.0.0.tgz"; - path = fetchurl { - name = "find_cache_dir___find_cache_dir_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz"; - sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f"; - }; - } - - { - name = "find_up___find_up_1.1.2.tgz"; - path = fetchurl { - name = "find_up___find_up_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz"; - sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"; - }; - } - - { - name = "find_up___find_up_2.1.0.tgz"; - path = fetchurl { - name = "find_up___find_up_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz"; - sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7"; - }; - } - - { - name = "flatten___flatten_1.0.2.tgz"; - path = fetchurl { - name = "flatten___flatten_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz"; - sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782"; - }; - } - - { - name = "follow_redirects___follow_redirects_1.5.1.tgz"; - path = fetchurl { - name = "follow_redirects___follow_redirects_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz"; - sha1 = "67a8f14f5a1f67f962c2c46469c79eaec0a90291"; - }; - } - - { - name = "for_in___for_in_0.1.8.tgz"; - path = fetchurl { - name = "for_in___for_in_0.1.8.tgz"; - url = "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz"; - sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1"; - }; - } - - { - name = "for_in___for_in_1.0.2.tgz"; - path = fetchurl { - name = "for_in___for_in_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz"; - sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80"; - }; - } - - { - name = "for_own___for_own_0.1.5.tgz"; - path = fetchurl { - name = "for_own___for_own_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz"; - sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce"; - }; - } - - { - name = "for_own___for_own_1.0.0.tgz"; - path = fetchurl { - name = "for_own___for_own_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz"; - sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b"; - }; - } - - { - name = "foreach___foreach_2.0.5.tgz"; - path = fetchurl { - name = "foreach___foreach_2.0.5.tgz"; - url = "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz"; - sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99"; - }; - } - - { - name = "forever_agent___forever_agent_0.6.1.tgz"; - path = fetchurl { - name = "forever_agent___forever_agent_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz"; - sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"; - }; - } - - { - name = "form_data___form_data_2.1.4.tgz"; - path = fetchurl { - name = "form_data___form_data_2.1.4.tgz"; - url = "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz"; - sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1"; - }; - } - - { - name = "form_data___form_data_2.3.2.tgz"; - path = fetchurl { - name = "form_data___form_data_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz"; - sha1 = "4970498be604c20c005d4f5c23aecd21d6b49099"; - }; - } - - { - name = "forwarded___forwarded_0.1.2.tgz"; - path = fetchurl { - name = "forwarded___forwarded_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz"; - sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84"; - }; - } - - { - name = "fragment_cache___fragment_cache_0.2.1.tgz"; - path = fetchurl { - name = "fragment_cache___fragment_cache_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz"; - sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19"; - }; - } - - { - name = "fresh___fresh_0.5.2.tgz"; - path = fetchurl { - name = "fresh___fresh_0.5.2.tgz"; - url = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz"; - sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7"; - }; - } - - { - name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz"; - path = fetchurl { - name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz"; - url = "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz"; - sha1 = "efc86cbb816224565861a1be7a9d84d0aafea136"; - }; - } - - { - name = "fs_extra___fs_extra_2.1.2.tgz"; - path = fetchurl { - name = "fs_extra___fs_extra_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz"; - sha1 = "046c70163cef9aad46b0e4a7fa467fb22d71de35"; - }; - } - - { - name = "fs_minipass___fs_minipass_1.2.5.tgz"; - path = fetchurl { - name = "fs_minipass___fs_minipass_1.2.5.tgz"; - url = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz"; - sha1 = "06c277218454ec288df77ada54a03b8702aacb9d"; - }; - } - - { - name = "fs.realpath___fs.realpath_1.0.0.tgz"; - path = fetchurl { - name = "fs.realpath___fs.realpath_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz"; - sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; - }; - } - - { - name = "fsevents___fsevents_1.2.4.tgz"; - path = fetchurl { - name = "fsevents___fsevents_1.2.4.tgz"; - url = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz"; - sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426"; - }; - } - - { - name = "fstream___fstream_1.0.11.tgz"; - path = fetchurl { - name = "fstream___fstream_1.0.11.tgz"; - url = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz"; - sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"; - }; - } - - { - name = "function_bind___function_bind_1.1.1.tgz"; - path = fetchurl { - name = "function_bind___function_bind_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz"; - sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d"; - }; - } - - { - name = "gauge___gauge_2.7.4.tgz"; - path = fetchurl { - name = "gauge___gauge_2.7.4.tgz"; - url = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz"; - sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7"; - }; - } - - { - name = "gaze___gaze_1.1.3.tgz"; - path = fetchurl { - name = "gaze___gaze_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz"; - sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a"; - }; - } - - { - name = "get_caller_file___get_caller_file_1.0.3.tgz"; - path = fetchurl { - name = "get_caller_file___get_caller_file_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz"; - sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"; - }; - } - - { - name = "get_stdin___get_stdin_4.0.1.tgz"; - path = fetchurl { - name = "get_stdin___get_stdin_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz"; - sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe"; - }; - } - - { - name = "get_stream___get_stream_3.0.0.tgz"; - path = fetchurl { - name = "get_stream___get_stream_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz"; - sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14"; - }; - } - - { - name = "get_value___get_value_2.0.6.tgz"; - path = fetchurl { - name = "get_value___get_value_2.0.6.tgz"; - url = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz"; - sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28"; - }; - } - - { - name = "getpass___getpass_0.1.7.tgz"; - path = fetchurl { - name = "getpass___getpass_0.1.7.tgz"; - url = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz"; - sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa"; - }; - } - - { - name = "glob_base___glob_base_0.3.0.tgz"; - path = fetchurl { - name = "glob_base___glob_base_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz"; - sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"; - }; - } - - { - name = "glob_parent___glob_parent_2.0.0.tgz"; - path = fetchurl { - name = "glob_parent___glob_parent_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz"; - sha1 = "81383d72db054fcccf5336daa902f182f6edbb28"; - }; - } - - { - name = "glob_parent___glob_parent_3.1.0.tgz"; - path = fetchurl { - name = "glob_parent___glob_parent_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz"; - sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae"; - }; - } - - { - name = "glob___glob_6.0.4.tgz"; - path = fetchurl { - name = "glob___glob_6.0.4.tgz"; - url = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz"; - sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"; - }; - } - - { - name = "glob___glob_7.1.2.tgz"; - path = fetchurl { - name = "glob___glob_7.1.2.tgz"; - url = "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz"; - sha1 = "c19c9df9a028702d678612384a6552404c636d15"; - }; - } - - { - name = "globals___globals_9.18.0.tgz"; - path = fetchurl { - name = "globals___globals_9.18.0.tgz"; - url = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz"; - sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"; - }; - } - - { - name = "globby___globby_6.1.0.tgz"; - path = fetchurl { - name = "globby___globby_6.1.0.tgz"; - url = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz"; - sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c"; - }; - } - - { - name = "globule___globule_1.2.1.tgz"; - path = fetchurl { - name = "globule___globule_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz"; - sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d"; - }; - } - - { - name = "graceful_fs___graceful_fs_4.1.11.tgz"; - path = fetchurl { - name = "graceful_fs___graceful_fs_4.1.11.tgz"; - url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz"; - sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"; - }; - } - - { - name = "handle_thing___handle_thing_1.2.5.tgz"; - path = fetchurl { - name = "handle_thing___handle_thing_1.2.5.tgz"; - url = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz"; - sha1 = "fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"; - }; - } - - { - name = "har_schema___har_schema_1.0.5.tgz"; - path = fetchurl { - name = "har_schema___har_schema_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz"; - sha1 = "d263135f43307c02c602afc8fe95970c0151369e"; - }; - } - - { - name = "har_schema___har_schema_2.0.0.tgz"; - path = fetchurl { - name = "har_schema___har_schema_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz"; - sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92"; - }; - } - - { - name = "har_validator___har_validator_4.2.1.tgz"; - path = fetchurl { - name = "har_validator___har_validator_4.2.1.tgz"; - url = "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz"; - sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a"; - }; - } - - { - name = "har_validator___har_validator_5.0.3.tgz"; - path = fetchurl { - name = "har_validator___har_validator_5.0.3.tgz"; - url = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz"; - sha1 = "ba402c266194f15956ef15e0fcf242993f6a7dfd"; - }; - } - - { - name = "has_ansi___has_ansi_2.0.0.tgz"; - path = fetchurl { - name = "has_ansi___has_ansi_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz"; - sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91"; - }; - } - - { - name = "has_flag___has_flag_1.0.0.tgz"; - path = fetchurl { - name = "has_flag___has_flag_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz"; - sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa"; - }; - } - - { - name = "has_flag___has_flag_2.0.0.tgz"; - path = fetchurl { - name = "has_flag___has_flag_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz"; - sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51"; - }; - } - - { - name = "has_flag___has_flag_3.0.0.tgz"; - path = fetchurl { - name = "has_flag___has_flag_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz"; - sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd"; - }; - } - - { - name = "has_unicode___has_unicode_2.0.1.tgz"; - path = fetchurl { - name = "has_unicode___has_unicode_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz"; - sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9"; - }; - } - - { - name = "has_value___has_value_0.3.1.tgz"; - path = fetchurl { - name = "has_value___has_value_0.3.1.tgz"; - url = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz"; - sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f"; - }; - } - - { - name = "has_value___has_value_1.0.0.tgz"; - path = fetchurl { - name = "has_value___has_value_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz"; - sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177"; - }; - } - - { - name = "has_values___has_values_0.1.4.tgz"; - path = fetchurl { - name = "has_values___has_values_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz"; - sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771"; - }; - } - - { - name = "has_values___has_values_1.0.0.tgz"; - path = fetchurl { - name = "has_values___has_values_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz"; - sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f"; - }; - } - - { - name = "has___has_1.0.3.tgz"; - path = fetchurl { - name = "has___has_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz"; - sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796"; - }; - } - - { - name = "hash_base___hash_base_3.0.4.tgz"; - path = fetchurl { - name = "hash_base___hash_base_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz"; - sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918"; - }; - } - - { - name = "hash.js___hash.js_1.1.5.tgz"; - path = fetchurl { - name = "hash.js___hash.js_1.1.5.tgz"; - url = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz"; - sha1 = "e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"; - }; - } - - { - name = "hawk___hawk_3.1.3.tgz"; - path = fetchurl { - name = "hawk___hawk_3.1.3.tgz"; - url = "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz"; - sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4"; - }; - } - - { - name = "hmac_drbg___hmac_drbg_1.0.1.tgz"; - path = fetchurl { - name = "hmac_drbg___hmac_drbg_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz"; - sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1"; - }; - } - - { - name = "hoek___hoek_2.16.3.tgz"; - path = fetchurl { - name = "hoek___hoek_2.16.3.tgz"; - url = "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz"; - sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed"; - }; - } - - { - name = "home_or_tmp___home_or_tmp_2.0.0.tgz"; - path = fetchurl { - name = "home_or_tmp___home_or_tmp_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz"; - sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8"; - }; - } - - { - name = "hosted_git_info___hosted_git_info_2.7.1.tgz"; - path = fetchurl { - name = "hosted_git_info___hosted_git_info_2.7.1.tgz"; - url = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz"; - sha1 = "97f236977bd6e125408930ff6de3eec6281ec047"; - }; - } - - { - name = "hpack.js___hpack.js_2.1.6.tgz"; - path = fetchurl { - name = "hpack.js___hpack.js_2.1.6.tgz"; - url = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz"; - sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2"; - }; - } - - { - name = "html_comment_regex___html_comment_regex_1.1.1.tgz"; - path = fetchurl { - name = "html_comment_regex___html_comment_regex_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz"; - sha1 = "668b93776eaae55ebde8f3ad464b307a4963625e"; - }; - } - - { - name = "html_entities___html_entities_1.2.1.tgz"; - path = fetchurl { - name = "html_entities___html_entities_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz"; - sha1 = "0df29351f0721163515dfb9e5543e5f6eed5162f"; - }; - } - - { - name = "htmlparser2___htmlparser2_3.3.0.tgz"; - path = fetchurl { - name = "htmlparser2___htmlparser2_3.3.0.tgz"; - url = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz"; - sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe"; - }; - } - - { - name = "http_deceiver___http_deceiver_1.2.7.tgz"; - path = fetchurl { - name = "http_deceiver___http_deceiver_1.2.7.tgz"; - url = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz"; - sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87"; - }; - } - - { - name = "http_errors___http_errors_1.6.2.tgz"; - path = fetchurl { - name = "http_errors___http_errors_1.6.2.tgz"; - url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz"; - sha1 = "0a002cc85707192a7e7946ceedc11155f60ec736"; - }; - } - - { - name = "http_errors___http_errors_1.6.3.tgz"; - path = fetchurl { - name = "http_errors___http_errors_1.6.3.tgz"; - url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz"; - sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d"; - }; - } - - { - name = "http_parser_js___http_parser_js_0.4.13.tgz"; - path = fetchurl { - name = "http_parser_js___http_parser_js_0.4.13.tgz"; - url = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz"; - sha1 = "3bd6d6fde6e3172c9334c3b33b6c193d80fe1137"; - }; - } - - { - name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz"; - path = fetchurl { - name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz"; - url = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz"; - sha1 = "642e8848851d66f09d4f124912846dbaeb41b833"; - }; - } - - { - name = "http_proxy___http_proxy_1.17.0.tgz"; - path = fetchurl { - name = "http_proxy___http_proxy_1.17.0.tgz"; - url = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz"; - sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a"; - }; - } - - { - name = "http_signature___http_signature_1.1.1.tgz"; - path = fetchurl { - name = "http_signature___http_signature_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz"; - sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf"; - }; - } - - { - name = "http_signature___http_signature_1.2.0.tgz"; - path = fetchurl { - name = "http_signature___http_signature_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz"; - sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1"; - }; - } - - { - name = "https_browserify___https_browserify_1.0.0.tgz"; - path = fetchurl { - name = "https_browserify___https_browserify_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz"; - sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"; - }; - } - - { - name = "iconv_lite___iconv_lite_0.4.19.tgz"; - path = fetchurl { - name = "iconv_lite___iconv_lite_0.4.19.tgz"; - url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz"; - sha1 = "f7468f60135f5e5dad3399c0a81be9a1603a082b"; - }; - } - - { - name = "iconv_lite___iconv_lite_0.4.23.tgz"; - path = fetchurl { - name = "iconv_lite___iconv_lite_0.4.23.tgz"; - url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz"; - sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63"; - }; - } - - { - name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz"; - path = fetchurl { - name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz"; - sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded"; - }; - } - - { - name = "ieee754___ieee754_1.1.12.tgz"; - path = fetchurl { - name = "ieee754___ieee754_1.1.12.tgz"; - url = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz"; - sha1 = "50bf24e5b9c8bb98af4964c941cdb0918da7b60b"; - }; - } - - { - name = "ignore_walk___ignore_walk_3.0.1.tgz"; - path = fetchurl { - name = "ignore_walk___ignore_walk_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz"; - sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8"; - }; - } - - { - name = "import_local___import_local_1.0.0.tgz"; - path = fetchurl { - name = "import_local___import_local_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz"; - sha1 = "5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"; - }; - } - - { - name = "in_publish___in_publish_2.0.0.tgz"; - path = fetchurl { - name = "in_publish___in_publish_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz"; - sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51"; - }; - } - - { - name = "indent_string___indent_string_2.1.0.tgz"; - path = fetchurl { - name = "indent_string___indent_string_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz"; - sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80"; - }; - } - - { - name = "indexes_of___indexes_of_1.0.1.tgz"; - path = fetchurl { - name = "indexes_of___indexes_of_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz"; - sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607"; - }; - } - - { - name = "indexof___indexof_0.0.1.tgz"; - path = fetchurl { - name = "indexof___indexof_0.0.1.tgz"; - url = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz"; - sha1 = "82dc336d232b9062179d05ab3293a66059fd435d"; - }; - } - - { - name = "inflight___inflight_1.0.6.tgz"; - path = fetchurl { - name = "inflight___inflight_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz"; - sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9"; - }; - } - - { - name = "inherits___inherits_2.0.3.tgz"; - path = fetchurl { - name = "inherits___inherits_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz"; - sha1 = "633c2c83e3da42a502f52466022480f4208261de"; - }; - } - - { - name = "inherits___inherits_2.0.1.tgz"; - path = fetchurl { - name = "inherits___inherits_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz"; - sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1"; - }; - } - - { - name = "ini___ini_1.3.5.tgz"; - path = fetchurl { - name = "ini___ini_1.3.5.tgz"; - url = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz"; - sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927"; - }; - } - - { - name = "internal_ip___internal_ip_1.2.0.tgz"; - path = fetchurl { - name = "internal_ip___internal_ip_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz"; - sha1 = "ae9fbf93b984878785d50a8de1b356956058cf5c"; - }; - } - - { - name = "interpret___interpret_1.1.0.tgz"; - path = fetchurl { - name = "interpret___interpret_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz"; - sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"; - }; - } - - { - name = "invariant___invariant_2.2.4.tgz"; - path = fetchurl { - name = "invariant___invariant_2.2.4.tgz"; - url = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz"; - sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6"; - }; - } - - { - name = "invert_kv___invert_kv_1.0.0.tgz"; - path = fetchurl { - name = "invert_kv___invert_kv_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz"; - sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"; - }; - } - - { - name = "ip___ip_1.1.5.tgz"; - path = fetchurl { - name = "ip___ip_1.1.5.tgz"; - url = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz"; - sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a"; - }; - } - - { - name = "ipaddr.js___ipaddr.js_1.8.0.tgz"; - path = fetchurl { - name = "ipaddr.js___ipaddr.js_1.8.0.tgz"; - url = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz"; - sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"; - }; - } - - { - name = "is_absolute_url___is_absolute_url_2.1.0.tgz"; - path = fetchurl { - name = "is_absolute_url___is_absolute_url_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz"; - sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"; - }; - } - - { - name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz"; - path = fetchurl { - name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz"; - url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz"; - sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"; - }; - } - - { - name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz"; - path = fetchurl { - name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz"; - sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656"; - }; - } - - { - name = "is_arrayish___is_arrayish_0.2.1.tgz"; - path = fetchurl { - name = "is_arrayish___is_arrayish_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz"; - sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d"; - }; - } - - { - name = "is_binary_path___is_binary_path_1.0.1.tgz"; - path = fetchurl { - name = "is_binary_path___is_binary_path_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz"; - sha1 = "75f16642b480f187a711c814161fd3a4a7655898"; - }; - } - - { - name = "is_buffer___is_buffer_1.1.6.tgz"; - path = fetchurl { - name = "is_buffer___is_buffer_1.1.6.tgz"; - url = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz"; - sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"; - }; - } - - { - name = "is_builtin_module___is_builtin_module_1.0.0.tgz"; - path = fetchurl { - name = "is_builtin_module___is_builtin_module_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz"; - sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe"; - }; - } - - { - name = "is_callable___is_callable_1.1.4.tgz"; - path = fetchurl { - name = "is_callable___is_callable_1.1.4.tgz"; - url = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz"; - sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"; - }; - } - - { - name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz"; - path = fetchurl { - name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz"; - sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56"; - }; - } - - { - name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz"; - path = fetchurl { - name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz"; - sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7"; - }; - } - - { - name = "is_date_object___is_date_object_1.0.1.tgz"; - path = fetchurl { - name = "is_date_object___is_date_object_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz"; - sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"; - }; - } - - { - name = "is_descriptor___is_descriptor_0.1.6.tgz"; - path = fetchurl { - name = "is_descriptor___is_descriptor_0.1.6.tgz"; - url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz"; - sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca"; - }; - } - - { - name = "is_descriptor___is_descriptor_1.0.2.tgz"; - path = fetchurl { - name = "is_descriptor___is_descriptor_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz"; - sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec"; - }; - } - - { - name = "is_dotfile___is_dotfile_1.0.3.tgz"; - path = fetchurl { - name = "is_dotfile___is_dotfile_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz"; - sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"; - }; - } - - { - name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz"; - path = fetchurl { - name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz"; - sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534"; - }; - } - - { - name = "is_extendable___is_extendable_0.1.1.tgz"; - path = fetchurl { - name = "is_extendable___is_extendable_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz"; - sha1 = "62b110e289a471418e3ec36a617d472e301dfc89"; - }; - } - - { - name = "is_extendable___is_extendable_1.0.1.tgz"; - path = fetchurl { - name = "is_extendable___is_extendable_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz"; - sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4"; - }; - } - - { - name = "is_extglob___is_extglob_1.0.0.tgz"; - path = fetchurl { - name = "is_extglob___is_extglob_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz"; - sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0"; - }; - } - - { - name = "is_extglob___is_extglob_2.1.1.tgz"; - path = fetchurl { - name = "is_extglob___is_extglob_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz"; - sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2"; - }; - } - - { - name = "is_finite___is_finite_1.0.2.tgz"; - path = fetchurl { - name = "is_finite___is_finite_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz"; - sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa"; - }; - } - - { - name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz"; - path = fetchurl { - name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"; - sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb"; - }; - } - - { - name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz"; - path = fetchurl { - name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"; - sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f"; - }; - } - - { - name = "is_glob___is_glob_2.0.1.tgz"; - path = fetchurl { - name = "is_glob___is_glob_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz"; - sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863"; - }; - } - - { - name = "is_glob___is_glob_3.1.0.tgz"; - path = fetchurl { - name = "is_glob___is_glob_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz"; - sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a"; - }; - } - - { - name = "is_glob___is_glob_4.0.0.tgz"; - path = fetchurl { - name = "is_glob___is_glob_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz"; - sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0"; - }; - } - - { - name = "is_number___is_number_2.1.0.tgz"; - path = fetchurl { - name = "is_number___is_number_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz"; - sha1 = "01fcbbb393463a548f2f466cce16dece49db908f"; - }; - } - - { - name = "is_number___is_number_3.0.0.tgz"; - path = fetchurl { - name = "is_number___is_number_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz"; - sha1 = "24fd6201a4782cf50561c810276afc7d12d71195"; - }; - } - - { - name = "is_number___is_number_4.0.0.tgz"; - path = fetchurl { - name = "is_number___is_number_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz"; - sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff"; - }; - } - - { - name = "is_path_cwd___is_path_cwd_1.0.0.tgz"; - path = fetchurl { - name = "is_path_cwd___is_path_cwd_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz"; - sha1 = "d225ec23132e89edd38fda767472e62e65f1106d"; - }; - } - - { - name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz"; - path = fetchurl { - name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz"; - sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52"; - }; - } - - { - name = "is_path_inside___is_path_inside_1.0.1.tgz"; - path = fetchurl { - name = "is_path_inside___is_path_inside_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz"; - sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"; - }; - } - - { - name = "is_plain_obj___is_plain_obj_1.1.0.tgz"; - path = fetchurl { - name = "is_plain_obj___is_plain_obj_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz"; - sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e"; - }; - } - - { - name = "is_plain_object___is_plain_object_2.0.4.tgz"; - path = fetchurl { - name = "is_plain_object___is_plain_object_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz"; - sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677"; - }; - } - - { - name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz"; - path = fetchurl { - name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"; - sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"; - }; - } - - { - name = "is_primitive___is_primitive_2.0.0.tgz"; - path = fetchurl { - name = "is_primitive___is_primitive_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz"; - sha1 = "207bab91638499c07b2adf240a41a87210034575"; - }; - } - - { - name = "is_regex___is_regex_1.0.4.tgz"; - path = fetchurl { - name = "is_regex___is_regex_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz"; - sha1 = "5517489b547091b0930e095654ced25ee97e9491"; - }; - } - - { - name = "is_stream___is_stream_1.1.0.tgz"; - path = fetchurl { - name = "is_stream___is_stream_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz"; - sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"; - }; - } - - { - name = "is_svg___is_svg_2.1.0.tgz"; - path = fetchurl { - name = "is_svg___is_svg_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz"; - sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9"; - }; - } - - { - name = "is_symbol___is_symbol_1.0.1.tgz"; - path = fetchurl { - name = "is_symbol___is_symbol_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz"; - sha1 = "3cc59f00025194b6ab2e38dbae6689256b660572"; - }; - } - - { - name = "is_typedarray___is_typedarray_1.0.0.tgz"; - path = fetchurl { - name = "is_typedarray___is_typedarray_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz"; - sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a"; - }; - } - - { - name = "is_utf8___is_utf8_0.2.1.tgz"; - path = fetchurl { - name = "is_utf8___is_utf8_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz"; - sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72"; - }; - } - - { - name = "is_windows___is_windows_1.0.2.tgz"; - path = fetchurl { - name = "is_windows___is_windows_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz"; - sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d"; - }; - } - - { - name = "is_wsl___is_wsl_1.1.0.tgz"; - path = fetchurl { - name = "is_wsl___is_wsl_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz"; - sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d"; - }; - } - - { - name = "isarray___isarray_0.0.1.tgz"; - path = fetchurl { - name = "isarray___isarray_0.0.1.tgz"; - url = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz"; - sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf"; - }; - } - - { - name = "isarray___isarray_1.0.0.tgz"; - path = fetchurl { - name = "isarray___isarray_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz"; - sha1 = "bb935d48582cba168c06834957a54a3e07124f11"; - }; - } - - { - name = "isexe___isexe_2.0.0.tgz"; - path = fetchurl { - name = "isexe___isexe_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz"; - sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10"; - }; - } - - { - name = "isobject___isobject_2.1.0.tgz"; - path = fetchurl { - name = "isobject___isobject_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz"; - sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89"; - }; - } - - { - name = "isobject___isobject_3.0.1.tgz"; - path = fetchurl { - name = "isobject___isobject_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz"; - sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"; - }; - } - - { - name = "isstream___isstream_0.1.2.tgz"; - path = fetchurl { - name = "isstream___isstream_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz"; - sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a"; - }; - } - - { - name = "jquery___jquery_3.3.1.tgz"; - path = fetchurl { - name = "jquery___jquery_3.3.1.tgz"; - url = "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz"; - sha1 = "958ce29e81c9790f31be7792df5d4d95fc57fbca"; - }; - } - - { - name = "js_base64___js_base64_2.4.8.tgz"; - path = fetchurl { - name = "js_base64___js_base64_2.4.8.tgz"; - url = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz"; - sha1 = "57a9b130888f956834aa40c5b165ba59c758f033"; - }; - } - - { - name = "js_tokens___js_tokens_4.0.0.tgz"; - path = fetchurl { - name = "js_tokens___js_tokens_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz"; - sha1 = "19203fb59991df98e3a287050d4647cdeaf32499"; - }; - } - - { - name = "js_tokens___js_tokens_3.0.2.tgz"; - path = fetchurl { - name = "js_tokens___js_tokens_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz"; - sha1 = "9866df395102130e38f7f996bceb65443209c25b"; - }; - } - - { - name = "js_yaml___js_yaml_3.7.0.tgz"; - path = fetchurl { - name = "js_yaml___js_yaml_3.7.0.tgz"; - url = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz"; - sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80"; - }; - } - - { - name = "jsbn___jsbn_0.1.1.tgz"; - path = fetchurl { - name = "jsbn___jsbn_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz"; - sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"; - }; - } - - { - name = "jsesc___jsesc_1.3.0.tgz"; - path = fetchurl { - name = "jsesc___jsesc_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz"; - sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b"; - }; - } - - { - name = "jsesc___jsesc_0.5.0.tgz"; - path = fetchurl { - name = "jsesc___jsesc_0.5.0.tgz"; - url = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz"; - sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d"; - }; - } - - { - name = "json_loader___json_loader_0.5.7.tgz"; - path = fetchurl { - name = "json_loader___json_loader_0.5.7.tgz"; - url = "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz"; - sha1 = "dca14a70235ff82f0ac9a3abeb60d337a365185d"; - }; - } - - { - name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz"; - path = fetchurl { - name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz"; - url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz"; - sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340"; - }; - } - - { - name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz"; - path = fetchurl { - name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz"; - url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"; - sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660"; - }; - } - - { - name = "json_schema___json_schema_0.2.3.tgz"; - path = fetchurl { - name = "json_schema___json_schema_0.2.3.tgz"; - url = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz"; - sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13"; - }; - } - - { - name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz"; - path = fetchurl { - name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz"; - sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af"; - }; - } - - { - name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz"; - path = fetchurl { - name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz"; - url = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"; - sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"; - }; - } - - { - name = "json3___json3_3.3.2.tgz"; - path = fetchurl { - name = "json3___json3_3.3.2.tgz"; - url = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz"; - sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1"; - }; - } - - { - name = "json5___json5_0.5.1.tgz"; - path = fetchurl { - name = "json5___json5_0.5.1.tgz"; - url = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz"; - sha1 = "1eade7acc012034ad84e2396767ead9fa5495821"; - }; - } - - { - name = "jsonfile___jsonfile_2.4.0.tgz"; - path = fetchurl { - name = "jsonfile___jsonfile_2.4.0.tgz"; - url = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz"; - sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"; - }; - } - - { - name = "jsonify___jsonify_0.0.0.tgz"; - path = fetchurl { - name = "jsonify___jsonify_0.0.0.tgz"; - url = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz"; - sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73"; - }; - } - - { - name = "jsprim___jsprim_1.4.1.tgz"; - path = fetchurl { - name = "jsprim___jsprim_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz"; - sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"; - }; - } - - { - name = "killable___killable_1.0.0.tgz"; - path = fetchurl { - name = "killable___killable_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz"; - sha1 = "da8b84bd47de5395878f95d64d02f2449fe05e6b"; - }; - } - - { - name = "kind_of___kind_of_3.2.2.tgz"; - path = fetchurl { - name = "kind_of___kind_of_3.2.2.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz"; - sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64"; - }; - } - - { - name = "kind_of___kind_of_4.0.0.tgz"; - path = fetchurl { - name = "kind_of___kind_of_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz"; - sha1 = "20813df3d712928b207378691a45066fae72dd57"; - }; - } - - { - name = "kind_of___kind_of_5.1.0.tgz"; - path = fetchurl { - name = "kind_of___kind_of_5.1.0.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz"; - sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d"; - }; - } - - { - name = "kind_of___kind_of_6.0.2.tgz"; - path = fetchurl { - name = "kind_of___kind_of_6.0.2.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz"; - sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051"; - }; - } - - { - name = "lazy_cache___lazy_cache_1.0.4.tgz"; - path = fetchurl { - name = "lazy_cache___lazy_cache_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz"; - sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"; - }; - } - - { - name = "lcid___lcid_1.0.0.tgz"; - path = fetchurl { - name = "lcid___lcid_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz"; - sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835"; - }; - } - - { - name = "load_json_file___load_json_file_1.1.0.tgz"; - path = fetchurl { - name = "load_json_file___load_json_file_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz"; - sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0"; - }; - } - - { - name = "load_json_file___load_json_file_2.0.0.tgz"; - path = fetchurl { - name = "load_json_file___load_json_file_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz"; - sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8"; - }; - } - - { - name = "loader_runner___loader_runner_2.3.0.tgz"; - path = fetchurl { - name = "loader_runner___loader_runner_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz"; - sha1 = "f482aea82d543e07921700d5a46ef26fdac6b8a2"; - }; - } - - { - name = "loader_utils___loader_utils_1.1.0.tgz"; - path = fetchurl { - name = "loader_utils___loader_utils_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz"; - sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd"; - }; - } - - { - name = "locate_path___locate_path_2.0.0.tgz"; - path = fetchurl { - name = "locate_path___locate_path_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz"; - sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"; - }; - } - - { - name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz"; - path = fetchurl { - name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz"; - sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e"; - }; - } - - { - name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz"; - path = fetchurl { - name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz"; - sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"; - }; - } - - { - name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz"; - path = fetchurl { - name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz"; - sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e"; - }; - } - - { - name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz"; - path = fetchurl { - name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz"; - sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"; - }; - } - - { - name = "lodash._getnative___lodash._getnative_3.9.1.tgz"; - path = fetchurl { - name = "lodash._getnative___lodash._getnative_3.9.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz"; - sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5"; - }; - } - - { - name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz"; - path = fetchurl { - name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz"; - url = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"; - sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c"; - }; - } - - { - name = "lodash.assign___lodash.assign_3.2.0.tgz"; - path = fetchurl { - name = "lodash.assign___lodash.assign_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz"; - sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"; - }; - } - - { - name = "lodash.assign___lodash.assign_4.2.0.tgz"; - path = fetchurl { - name = "lodash.assign___lodash.assign_4.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz"; - sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7"; - }; - } - - { - name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz"; - path = fetchurl { - name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"; - sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6"; - }; - } - - { - name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz"; - path = fetchurl { - name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"; - sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef"; - }; - } - - { - name = "lodash.debounce___lodash.debounce_4.0.8.tgz"; - path = fetchurl { - name = "lodash.debounce___lodash.debounce_4.0.8.tgz"; - url = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz"; - sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af"; - }; - } - - { - name = "lodash.defaults___lodash.defaults_3.1.2.tgz"; - path = fetchurl { - name = "lodash.defaults___lodash.defaults_3.1.2.tgz"; - url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz"; - sha1 = "c7308b18dbf8bc9372d701a73493c61192bd2e2c"; - }; - } - - { - name = "lodash.defaults___lodash.defaults_4.2.0.tgz"; - path = fetchurl { - name = "lodash.defaults___lodash.defaults_4.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz"; - sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c"; - }; - } - - { - name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz"; - path = fetchurl { - name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz"; - sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a"; - }; - } - - { - name = "lodash.isarray___lodash.isarray_3.0.4.tgz"; - path = fetchurl { - name = "lodash.isarray___lodash.isarray_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz"; - sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55"; - }; - } - - { - name = "lodash.keys___lodash.keys_3.1.2.tgz"; - path = fetchurl { - name = "lodash.keys___lodash.keys_3.1.2.tgz"; - url = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz"; - sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a"; - }; - } - - { - name = "lodash.memoize___lodash.memoize_4.1.2.tgz"; - path = fetchurl { - name = "lodash.memoize___lodash.memoize_4.1.2.tgz"; - url = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz"; - sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe"; - }; - } - - { - name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz"; - path = fetchurl { - name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz"; - url = "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz"; - sha1 = "639057e726c3afbdb3e7d42741caa8d6e4335927"; - }; - } - - { - name = "lodash.restparam___lodash.restparam_3.6.1.tgz"; - path = fetchurl { - name = "lodash.restparam___lodash.restparam_3.6.1.tgz"; - url = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz"; - sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805"; - }; - } - - { - name = "lodash.tail___lodash.tail_4.1.1.tgz"; - path = fetchurl { - name = "lodash.tail___lodash.tail_4.1.1.tgz"; - url = "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz"; - sha1 = "d2333a36d9e7717c8ad2f7cacafec7c32b444664"; - }; - } - - { - name = "lodash.uniq___lodash.uniq_4.5.0.tgz"; - path = fetchurl { - name = "lodash.uniq___lodash.uniq_4.5.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz"; - sha1 = "d0225373aeb652adc1bc82e4945339a842754773"; - }; - } - - { - name = "lodash___lodash_4.17.10.tgz"; - path = fetchurl { - name = "lodash___lodash_4.17.10.tgz"; - url = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz"; - sha1 = "1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"; - }; - } - - { - name = "loglevel___loglevel_1.6.1.tgz"; - path = fetchurl { - name = "loglevel___loglevel_1.6.1.tgz"; - url = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz"; - sha1 = "e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"; - }; - } - - { - name = "longest___longest_1.0.1.tgz"; - path = fetchurl { - name = "longest___longest_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz"; - sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097"; - }; - } - - { - name = "loose_envify___loose_envify_1.4.0.tgz"; - path = fetchurl { - name = "loose_envify___loose_envify_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz"; - sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf"; - }; - } - - { - name = "loud_rejection___loud_rejection_1.6.0.tgz"; - path = fetchurl { - name = "loud_rejection___loud_rejection_1.6.0.tgz"; - url = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz"; - sha1 = "5b46f80147edee578870f086d04821cf998e551f"; - }; - } - - { - name = "lru_cache___lru_cache_4.1.3.tgz"; - path = fetchurl { - name = "lru_cache___lru_cache_4.1.3.tgz"; - url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz"; - sha1 = "a1175cf3496dfc8436c156c334b4955992bce69c"; - }; - } - - { - name = "make_dir___make_dir_1.3.0.tgz"; - path = fetchurl { - name = "make_dir___make_dir_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz"; - sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c"; - }; - } - - { - name = "map_cache___map_cache_0.2.2.tgz"; - path = fetchurl { - name = "map_cache___map_cache_0.2.2.tgz"; - url = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz"; - sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"; - }; - } - - { - name = "map_obj___map_obj_1.0.1.tgz"; - path = fetchurl { - name = "map_obj___map_obj_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz"; - sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d"; - }; - } - - { - name = "map_visit___map_visit_1.0.0.tgz"; - path = fetchurl { - name = "map_visit___map_visit_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz"; - sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"; - }; - } - - { - name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz"; - path = fetchurl { - name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz"; - url = "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz"; - sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac"; - }; - } - - { - name = "math_random___math_random_1.0.1.tgz"; - path = fetchurl { - name = "math_random___math_random_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz"; - sha1 = "8b3aac588b8a66e4975e3cdea67f7bb329601fac"; - }; - } - - { - name = "md5.js___md5.js_1.3.4.tgz"; - path = fetchurl { - name = "md5.js___md5.js_1.3.4.tgz"; - url = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz"; - sha1 = "e9bdbde94a20a5ac18b04340fc5764d5b09d901d"; - }; - } - - { - name = "media_typer___media_typer_0.3.0.tgz"; - path = fetchurl { - name = "media_typer___media_typer_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz"; - sha1 = "8710d7af0aa626f8fffa1ce00168545263255748"; - }; - } - - { - name = "mem___mem_1.1.0.tgz"; - path = fetchurl { - name = "mem___mem_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz"; - sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76"; - }; - } - - { - name = "memory_fs___memory_fs_0.4.1.tgz"; - path = fetchurl { - name = "memory_fs___memory_fs_0.4.1.tgz"; - url = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz"; - sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552"; - }; - } - - { - name = "meow___meow_3.7.0.tgz"; - path = fetchurl { - name = "meow___meow_3.7.0.tgz"; - url = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz"; - sha1 = "72cb668b425228290abbfa856892587308a801fb"; - }; - } - - { - name = "merge_descriptors___merge_descriptors_1.0.1.tgz"; - path = fetchurl { - name = "merge_descriptors___merge_descriptors_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz"; - sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61"; - }; - } - - { - name = "methods___methods_1.1.2.tgz"; - path = fetchurl { - name = "methods___methods_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz"; - sha1 = "5529a4d67654134edcc5266656835b0f851afcee"; - }; - } - - { - name = "micromatch___micromatch_2.3.11.tgz"; - path = fetchurl { - name = "micromatch___micromatch_2.3.11.tgz"; - url = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz"; - sha1 = "86677c97d1720b363431d04d0d15293bd38c1565"; - }; - } - - { - name = "micromatch___micromatch_3.1.10.tgz"; - path = fetchurl { - name = "micromatch___micromatch_3.1.10.tgz"; - url = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz"; - sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23"; - }; - } - - { - name = "miller_rabin___miller_rabin_4.0.1.tgz"; - path = fetchurl { - name = "miller_rabin___miller_rabin_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz"; - sha1 = "f080351c865b0dc562a8462966daa53543c78a4d"; - }; - } - - { - name = "mime_db___mime_db_1.35.0.tgz"; - path = fetchurl { - name = "mime_db___mime_db_1.35.0.tgz"; - url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz"; - sha1 = "0569d657466491283709663ad379a99b90d9ab47"; - }; - } - - { - name = "mime_types___mime_types_2.1.19.tgz"; - path = fetchurl { - name = "mime_types___mime_types_2.1.19.tgz"; - url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz"; - sha1 = "71e464537a7ef81c15f2db9d97e913fc0ff606f0"; - }; - } - - { - name = "mime___mime_1.4.1.tgz"; - path = fetchurl { - name = "mime___mime_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz"; - sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"; - }; - } - - { - name = "mime___mime_1.6.0.tgz"; - path = fetchurl { - name = "mime___mime_1.6.0.tgz"; - url = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz"; - sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1"; - }; - } - - { - name = "mimic_fn___mimic_fn_1.2.0.tgz"; - path = fetchurl { - name = "mimic_fn___mimic_fn_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz"; - sha1 = "820c86a39334640e99516928bd03fca88057d022"; - }; - } - - { - name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz"; - path = fetchurl { - name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"; - sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"; - }; - } - - { - name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz"; - path = fetchurl { - name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"; - sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"; - }; - } - - { - name = "minimatch___minimatch_3.0.4.tgz"; - path = fetchurl { - name = "minimatch___minimatch_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz"; - sha1 = "5166e286457f03306064be5497e8dbb0c3d32083"; - }; - } - - { - name = "minimist___minimist_0.0.8.tgz"; - path = fetchurl { - name = "minimist___minimist_0.0.8.tgz"; - url = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz"; - sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d"; - }; - } - - { - name = "minimist___minimist_1.2.0.tgz"; - path = fetchurl { - name = "minimist___minimist_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz"; - sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284"; - }; - } - - { - name = "minipass___minipass_2.3.3.tgz"; - path = fetchurl { - name = "minipass___minipass_2.3.3.tgz"; - url = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz"; - sha1 = "a7dcc8b7b833f5d368759cce544dccb55f50f233"; - }; - } - - { - name = "minizlib___minizlib_1.1.0.tgz"; - path = fetchurl { - name = "minizlib___minizlib_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz"; - sha1 = "11e13658ce46bc3a70a267aac58359d1e0c29ceb"; - }; - } - - { - name = "mixin_deep___mixin_deep_1.3.1.tgz"; - path = fetchurl { - name = "mixin_deep___mixin_deep_1.3.1.tgz"; - url = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz"; - sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe"; - }; - } - - { - name = "mixin_object___mixin_object_2.0.1.tgz"; - path = fetchurl { - name = "mixin_object___mixin_object_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz"; - sha1 = "4fb949441dab182540f1fe035ba60e1947a5e57e"; - }; - } - - { - name = "mkdirp___mkdirp_0.5.1.tgz"; - path = fetchurl { - name = "mkdirp___mkdirp_0.5.1.tgz"; - url = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz"; - sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903"; - }; - } - - { - name = "ms___ms_2.0.0.tgz"; - path = fetchurl { - name = "ms___ms_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz"; - sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8"; - }; - } - - { - name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz"; - path = fetchurl { - name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz"; - sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901"; - }; - } - - { - name = "multicast_dns___multicast_dns_6.2.3.tgz"; - path = fetchurl { - name = "multicast_dns___multicast_dns_6.2.3.tgz"; - url = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz"; - sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229"; - }; - } - - { - name = "nan___nan_2.10.0.tgz"; - path = fetchurl { - name = "nan___nan_2.10.0.tgz"; - url = "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz"; - sha1 = "96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"; - }; - } - - { - name = "nanomatch___nanomatch_1.2.13.tgz"; - path = fetchurl { - name = "nanomatch___nanomatch_1.2.13.tgz"; - url = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz"; - sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119"; - }; - } - - { - name = "needle___needle_2.2.1.tgz"; - path = fetchurl { - name = "needle___needle_2.2.1.tgz"; - url = "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz"; - sha1 = "b5e325bd3aae8c2678902fa296f729455d1d3a7d"; - }; - } - - { - name = "negotiator___negotiator_0.6.1.tgz"; - path = fetchurl { - name = "negotiator___negotiator_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz"; - sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9"; - }; - } - - { - name = "neo_async___neo_async_2.5.1.tgz"; - path = fetchurl { - name = "neo_async___neo_async_2.5.1.tgz"; - url = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz"; - sha1 = "acb909e327b1e87ec9ef15f41b8a269512ad41ee"; - }; - } - - { - name = "next_tick___next_tick_1.0.0.tgz"; - path = fetchurl { - name = "next_tick___next_tick_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz"; - sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c"; - }; - } - - { - name = "node_forge___node_forge_0.7.5.tgz"; - path = fetchurl { - name = "node_forge___node_forge_0.7.5.tgz"; - url = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz"; - sha1 = "6c152c345ce11c52f465c2abd957e8639cd674df"; - }; - } - - { - name = "node_gyp___node_gyp_3.7.0.tgz"; - path = fetchurl { - name = "node_gyp___node_gyp_3.7.0.tgz"; - url = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz"; - sha1 = "789478e8f6c45e277aa014f3e28f958f286f9203"; - }; - } - - { - name = "node_libs_browser___node_libs_browser_2.1.0.tgz"; - path = fetchurl { - name = "node_libs_browser___node_libs_browser_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz"; - sha1 = "5f94263d404f6e44767d726901fff05478d600df"; - }; - } - - { - name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz"; - path = fetchurl { - name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz"; - url = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz"; - sha1 = "3070040716afdc778747b61b6887bf78880b80fc"; - }; - } - - { - name = "node_sass___node_sass_4.9.2.tgz"; - path = fetchurl { - name = "node_sass___node_sass_4.9.2.tgz"; - url = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz"; - sha1 = "5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437"; - }; - } - - { - name = "nopt___nopt_3.0.6.tgz"; - path = fetchurl { - name = "nopt___nopt_3.0.6.tgz"; - url = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz"; - sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9"; - }; - } - - { - name = "nopt___nopt_4.0.1.tgz"; - path = fetchurl { - name = "nopt___nopt_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz"; - sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d"; - }; - } - - { - name = "normalize_package_data___normalize_package_data_2.4.0.tgz"; - path = fetchurl { - name = "normalize_package_data___normalize_package_data_2.4.0.tgz"; - url = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz"; - sha1 = "12f95a307d58352075a04907b84ac8be98ac012f"; - }; - } - - { - name = "normalize_path___normalize_path_2.1.1.tgz"; - path = fetchurl { - name = "normalize_path___normalize_path_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz"; - sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"; - }; - } - - { - name = "normalize_range___normalize_range_0.1.2.tgz"; - path = fetchurl { - name = "normalize_range___normalize_range_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz"; - sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942"; - }; - } - - { - name = "normalize_url___normalize_url_1.9.1.tgz"; - path = fetchurl { - name = "normalize_url___normalize_url_1.9.1.tgz"; - url = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz"; - sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c"; - }; - } - - { - name = "npm_bundled___npm_bundled_1.0.3.tgz"; - path = fetchurl { - name = "npm_bundled___npm_bundled_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz"; - sha1 = "7e71703d973af3370a9591bafe3a63aca0be2308"; - }; - } - - { - name = "npm_packlist___npm_packlist_1.1.11.tgz"; - path = fetchurl { - name = "npm_packlist___npm_packlist_1.1.11.tgz"; - url = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz"; - sha1 = "84e8c683cbe7867d34b1d357d893ce29e28a02de"; - }; - } - - { - name = "npm_run_path___npm_run_path_2.0.2.tgz"; - path = fetchurl { - name = "npm_run_path___npm_run_path_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz"; - sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f"; - }; - } - - { - name = "npmlog___npmlog_4.1.2.tgz"; - path = fetchurl { - name = "npmlog___npmlog_4.1.2.tgz"; - url = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz"; - sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b"; - }; - } - - { - name = "nth_check___nth_check_1.0.1.tgz"; - path = fetchurl { - name = "nth_check___nth_check_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz"; - sha1 = "9929acdf628fc2c41098deab82ac580cf149aae4"; - }; - } - - { - name = "num2fraction___num2fraction_1.2.2.tgz"; - path = fetchurl { - name = "num2fraction___num2fraction_1.2.2.tgz"; - url = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz"; - sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"; - }; - } - - { - name = "number_is_nan___number_is_nan_1.0.1.tgz"; - path = fetchurl { - name = "number_is_nan___number_is_nan_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz"; - sha1 = "097b602b53422a522c1afb8790318336941a011d"; - }; - } - - { - name = "oauth_sign___oauth_sign_0.8.2.tgz"; - path = fetchurl { - name = "oauth_sign___oauth_sign_0.8.2.tgz"; - url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz"; - sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"; - }; - } - - { - name = "object_assign___object_assign_4.1.1.tgz"; - path = fetchurl { - name = "object_assign___object_assign_4.1.1.tgz"; - url = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz"; - sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863"; - }; - } - - { - name = "object_copy___object_copy_0.1.0.tgz"; - path = fetchurl { - name = "object_copy___object_copy_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz"; - sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c"; - }; - } - - { - name = "object_keys___object_keys_1.0.12.tgz"; - path = fetchurl { - name = "object_keys___object_keys_1.0.12.tgz"; - url = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz"; - sha1 = "09c53855377575310cca62f55bb334abff7b3ed2"; - }; - } - - { - name = "object_path___object_path_0.9.2.tgz"; - path = fetchurl { - name = "object_path___object_path_0.9.2.tgz"; - url = "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz"; - sha1 = "0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"; - }; - } - - { - name = "object_visit___object_visit_1.0.1.tgz"; - path = fetchurl { - name = "object_visit___object_visit_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz"; - sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb"; - }; - } - - { - name = "object.omit___object.omit_2.0.1.tgz"; - path = fetchurl { - name = "object.omit___object.omit_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz"; - sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"; - }; - } - - { - name = "object.pick___object.pick_1.3.0.tgz"; - path = fetchurl { - name = "object.pick___object.pick_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz"; - sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747"; - }; - } - - { - name = "obuf___obuf_1.1.2.tgz"; - path = fetchurl { - name = "obuf___obuf_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz"; - sha1 = "09bea3343d41859ebd446292d11c9d4db619084e"; - }; - } - - { - name = "on_finished___on_finished_2.3.0.tgz"; - path = fetchurl { - name = "on_finished___on_finished_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz"; - sha1 = "20f1336481b083cd75337992a16971aa2d906947"; - }; - } - - { - name = "on_headers___on_headers_1.0.1.tgz"; - path = fetchurl { - name = "on_headers___on_headers_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz"; - sha1 = "928f5d0f470d49342651ea6794b0857c100693f7"; - }; - } - - { - name = "once___once_1.4.0.tgz"; - path = fetchurl { - name = "once___once_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz"; - sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1"; - }; - } - - { - name = "open_iconic___open_iconic_1.1.1.tgz"; - path = fetchurl { - name = "open_iconic___open_iconic_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/open-iconic/-/open-iconic-1.1.1.tgz"; - sha1 = "9dcfc8c7cd3c61cdb4a236b1a347894c97adc0c6"; - }; - } - - { - name = "opn___opn_5.3.0.tgz"; - path = fetchurl { - name = "opn___opn_5.3.0.tgz"; - url = "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz"; - sha1 = "64871565c863875f052cfdf53d3e3cb5adb53b1c"; - }; - } - - { - name = "original___original_1.0.1.tgz"; - path = fetchurl { - name = "original___original_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz"; - sha1 = "b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190"; - }; - } - - { - name = "os_browserify___os_browserify_0.3.0.tgz"; - path = fetchurl { - name = "os_browserify___os_browserify_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz"; - sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27"; - }; - } - - { - name = "os_homedir___os_homedir_1.0.2.tgz"; - path = fetchurl { - name = "os_homedir___os_homedir_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz"; - sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3"; - }; - } - - { - name = "os_locale___os_locale_1.4.0.tgz"; - path = fetchurl { - name = "os_locale___os_locale_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz"; - sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9"; - }; - } - - { - name = "os_locale___os_locale_2.1.0.tgz"; - path = fetchurl { - name = "os_locale___os_locale_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz"; - sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2"; - }; - } - - { - name = "os_tmpdir___os_tmpdir_1.0.2.tgz"; - path = fetchurl { - name = "os_tmpdir___os_tmpdir_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz"; - sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274"; - }; - } - - { - name = "osenv___osenv_0.1.5.tgz"; - path = fetchurl { - name = "osenv___osenv_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz"; - sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410"; - }; - } - - { - name = "p_finally___p_finally_1.0.0.tgz"; - path = fetchurl { - name = "p_finally___p_finally_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz"; - sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae"; - }; - } - - { - name = "p_limit___p_limit_1.3.0.tgz"; - path = fetchurl { - name = "p_limit___p_limit_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz"; - sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"; - }; - } - - { - name = "p_locate___p_locate_2.0.0.tgz"; - path = fetchurl { - name = "p_locate___p_locate_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz"; - sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43"; - }; - } - - { - name = "p_map___p_map_1.2.0.tgz"; - path = fetchurl { - name = "p_map___p_map_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz"; - sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b"; - }; - } - - { - name = "p_try___p_try_1.0.0.tgz"; - path = fetchurl { - name = "p_try___p_try_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz"; - sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"; - }; - } - - { - name = "pako___pako_1.0.6.tgz"; - path = fetchurl { - name = "pako___pako_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz"; - sha1 = "0101211baa70c4bca4a0f63f2206e97b7dfaf258"; - }; - } - - { - name = "parse_asn1___parse_asn1_5.1.1.tgz"; - path = fetchurl { - name = "parse_asn1___parse_asn1_5.1.1.tgz"; - url = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz"; - sha1 = "f6bf293818332bd0dab54efb16087724745e6ca8"; - }; - } - - { - name = "parse_glob___parse_glob_3.0.4.tgz"; - path = fetchurl { - name = "parse_glob___parse_glob_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz"; - sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c"; - }; - } - - { - name = "parse_json___parse_json_2.2.0.tgz"; - path = fetchurl { - name = "parse_json___parse_json_2.2.0.tgz"; - url = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz"; - sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9"; - }; - } - - { - name = "parseurl___parseurl_1.3.2.tgz"; - path = fetchurl { - name = "parseurl___parseurl_1.3.2.tgz"; - url = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz"; - sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3"; - }; - } - - { - name = "pascalcase___pascalcase_0.1.1.tgz"; - path = fetchurl { - name = "pascalcase___pascalcase_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz"; - sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14"; - }; - } - - { - name = "path_browserify___path_browserify_0.0.0.tgz"; - path = fetchurl { - name = "path_browserify___path_browserify_0.0.0.tgz"; - url = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz"; - sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a"; - }; - } - - { - name = "path_dirname___path_dirname_1.0.2.tgz"; - path = fetchurl { - name = "path_dirname___path_dirname_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz"; - sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0"; - }; - } - - { - name = "path_exists___path_exists_2.1.0.tgz"; - path = fetchurl { - name = "path_exists___path_exists_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz"; - sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b"; - }; - } - - { - name = "path_exists___path_exists_3.0.0.tgz"; - path = fetchurl { - name = "path_exists___path_exists_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz"; - sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"; - }; - } - - { - name = "path_is_absolute___path_is_absolute_1.0.1.tgz"; - path = fetchurl { - name = "path_is_absolute___path_is_absolute_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz"; - sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"; - }; - } - - { - name = "path_is_inside___path_is_inside_1.0.2.tgz"; - path = fetchurl { - name = "path_is_inside___path_is_inside_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz"; - sha1 = "365417dede44430d1c11af61027facf074bdfc53"; - }; - } - - { - name = "path_key___path_key_2.0.1.tgz"; - path = fetchurl { - name = "path_key___path_key_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz"; - sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40"; - }; - } - - { - name = "path_to_regexp___path_to_regexp_0.1.7.tgz"; - path = fetchurl { - name = "path_to_regexp___path_to_regexp_0.1.7.tgz"; - url = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz"; - sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c"; - }; - } - - { - name = "path_type___path_type_1.1.0.tgz"; - path = fetchurl { - name = "path_type___path_type_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz"; - sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441"; - }; - } - - { - name = "path_type___path_type_2.0.0.tgz"; - path = fetchurl { - name = "path_type___path_type_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz"; - sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73"; - }; - } - - { - name = "pbkdf2___pbkdf2_3.0.16.tgz"; - path = fetchurl { - name = "pbkdf2___pbkdf2_3.0.16.tgz"; - url = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz"; - sha1 = "7404208ec6b01b62d85bf83853a8064f8d9c2a5c"; - }; - } - - { - name = "performance_now___performance_now_0.2.0.tgz"; - path = fetchurl { - name = "performance_now___performance_now_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz"; - sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"; - }; - } - - { - name = "performance_now___performance_now_2.1.0.tgz"; - path = fetchurl { - name = "performance_now___performance_now_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz"; - sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"; - }; - } - - { - name = "pify___pify_2.3.0.tgz"; - path = fetchurl { - name = "pify___pify_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz"; - sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c"; - }; - } - - { - name = "pify___pify_3.0.0.tgz"; - path = fetchurl { - name = "pify___pify_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz"; - sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"; - }; - } - - { - name = "pinkie_promise___pinkie_promise_2.0.1.tgz"; - path = fetchurl { - name = "pinkie_promise___pinkie_promise_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz"; - sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa"; - }; - } - - { - name = "pinkie___pinkie_2.0.4.tgz"; - path = fetchurl { - name = "pinkie___pinkie_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz"; - sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870"; - }; - } - - { - name = "pkg_dir___pkg_dir_2.0.0.tgz"; - path = fetchurl { - name = "pkg_dir___pkg_dir_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz"; - sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b"; - }; - } - - { - name = "pkg_up___pkg_up_1.0.0.tgz"; - path = fetchurl { - name = "pkg_up___pkg_up_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz"; - sha1 = "3e08fb461525c4421624a33b9f7e6d0af5b05a26"; - }; - } - - { - name = "popper.js___popper.js_1.14.4.tgz"; - path = fetchurl { - name = "popper.js___popper.js_1.14.4.tgz"; - url = "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz"; - sha1 = "8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6"; - }; - } - - { - name = "portfinder___portfinder_1.0.13.tgz"; - path = fetchurl { - name = "portfinder___portfinder_1.0.13.tgz"; - url = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz"; - sha1 = "bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"; - }; - } - - { - name = "posix_character_classes___posix_character_classes_0.1.1.tgz"; - path = fetchurl { - name = "posix_character_classes___posix_character_classes_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz"; - sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"; - }; - } - - { - name = "postcss_calc___postcss_calc_5.3.1.tgz"; - path = fetchurl { - name = "postcss_calc___postcss_calc_5.3.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz"; - sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e"; - }; - } - - { - name = "postcss_colormin___postcss_colormin_2.2.2.tgz"; - path = fetchurl { - name = "postcss_colormin___postcss_colormin_2.2.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz"; - sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"; - }; - } - - { - name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz"; - path = fetchurl { - name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz"; - sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"; - }; - } - - { - name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz"; - path = fetchurl { - name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz"; - sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d"; - }; - } - - { - name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz"; - path = fetchurl { - name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz"; - sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932"; - }; - } - - { - name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz"; - path = fetchurl { - name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz"; - sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"; - }; - } - - { - name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz"; - path = fetchurl { - name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz"; - sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58"; - }; - } - - { - name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz"; - path = fetchurl { - name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz"; - sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433"; - }; - } - - { - name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz"; - path = fetchurl { - name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz"; - sha1 = "82245fdf82337041645e477114d8e593aa18b8ec"; - }; - } - - { - name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz"; - path = fetchurl { - name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz"; - url = "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz"; - sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270"; - }; - } - - { - name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz"; - path = fetchurl { - name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz"; - sha1 = "23d90cd127b0a77994915332739034a1a4f3d658"; - }; - } - - { - name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz"; - path = fetchurl { - name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz"; - sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"; - }; - } - - { - name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz"; - path = fetchurl { - name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz"; - sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"; - }; - } - - { - name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz"; - path = fetchurl { - name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz"; - sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69"; - }; - } - - { - name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz"; - path = fetchurl { - name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz"; - sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"; - }; - } - - { - name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz"; - path = fetchurl { - name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz"; - sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3"; - }; - } - - { - name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz"; - path = fetchurl { - name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz"; - sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf"; - }; - } - - { - name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz"; - path = fetchurl { - name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz"; - sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb"; - }; - } - - { - name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz"; - path = fetchurl { - name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz"; - sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069"; - }; - } - - { - name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz"; - path = fetchurl { - name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz"; - sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90"; - }; - } - - { - name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz"; - path = fetchurl { - name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz"; - sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20"; - }; - } - - { - name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz"; - path = fetchurl { - name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz"; - sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"; - }; - } - - { - name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz"; - path = fetchurl { - name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz"; - url = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz"; - sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222"; - }; - } - - { - name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz"; - path = fetchurl { - name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz"; - sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d"; - }; - } - - { - name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz"; - path = fetchurl { - name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz"; - sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3"; - }; - } - - { - name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz"; - path = fetchurl { - name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz"; - sha1 = "68f80695f045d08263a879ad240df8dd64f644ea"; - }; - } - - { - name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz"; - path = fetchurl { - name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz"; - sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1"; - }; - } - - { - name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz"; - path = fetchurl { - name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz"; - sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90"; - }; - } - - { - name = "postcss_svgo___postcss_svgo_2.1.6.tgz"; - path = fetchurl { - name = "postcss_svgo___postcss_svgo_2.1.6.tgz"; - url = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz"; - sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d"; - }; - } - - { - name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz"; - path = fetchurl { - name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz"; - sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"; - }; - } - - { - name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz"; - path = fetchurl { - name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz"; - sha1 = "87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"; - }; - } - - { - name = "postcss_zindex___postcss_zindex_2.2.0.tgz"; - path = fetchurl { - name = "postcss_zindex___postcss_zindex_2.2.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz"; - sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22"; - }; - } - - { - name = "postcss___postcss_5.2.18.tgz"; - path = fetchurl { - name = "postcss___postcss_5.2.18.tgz"; - url = "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz"; - sha1 = "badfa1497d46244f6390f58b319830d9107853c5"; - }; - } - - { - name = "postcss___postcss_6.0.23.tgz"; - path = fetchurl { - name = "postcss___postcss_6.0.23.tgz"; - url = "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz"; - sha1 = "61c82cc328ac60e677645f979054eb98bc0e3324"; - }; - } - - { - name = "prepend_http___prepend_http_1.0.4.tgz"; - path = fetchurl { - name = "prepend_http___prepend_http_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz"; - sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"; - }; - } - - { - name = "preserve___preserve_0.2.0.tgz"; - path = fetchurl { - name = "preserve___preserve_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz"; - sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b"; - }; - } - - { - name = "pretty_error___pretty_error_2.1.1.tgz"; - path = fetchurl { - name = "pretty_error___pretty_error_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz"; - sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"; - }; - } - - { - name = "private___private_0.1.8.tgz"; - path = fetchurl { - name = "private___private_0.1.8.tgz"; - url = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz"; - sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff"; - }; - } - - { - name = "process_nextick_args___process_nextick_args_2.0.0.tgz"; - path = fetchurl { - name = "process_nextick_args___process_nextick_args_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz"; - sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa"; - }; - } - - { - name = "process___process_0.11.10.tgz"; - path = fetchurl { - name = "process___process_0.11.10.tgz"; - url = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz"; - sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182"; - }; - } - - { - name = "proxy_addr___proxy_addr_2.0.4.tgz"; - path = fetchurl { - name = "proxy_addr___proxy_addr_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz"; - sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93"; - }; - } - - { - name = "prr___prr_1.0.1.tgz"; - path = fetchurl { - name = "prr___prr_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz"; - sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476"; - }; - } - - { - name = "pseudomap___pseudomap_1.0.2.tgz"; - path = fetchurl { - name = "pseudomap___pseudomap_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz"; - sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3"; - }; - } - - { - name = "public_encrypt___public_encrypt_4.0.2.tgz"; - path = fetchurl { - name = "public_encrypt___public_encrypt_4.0.2.tgz"; - url = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz"; - sha1 = "46eb9107206bf73489f8b85b69d91334c6610994"; - }; - } - - { - name = "punycode___punycode_1.3.2.tgz"; - path = fetchurl { - name = "punycode___punycode_1.3.2.tgz"; - url = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz"; - sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d"; - }; - } - - { - name = "punycode___punycode_1.4.1.tgz"; - path = fetchurl { - name = "punycode___punycode_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz"; - sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"; - }; - } - - { - name = "punycode___punycode_2.1.1.tgz"; - path = fetchurl { - name = "punycode___punycode_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz"; - sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec"; - }; - } - - { - name = "q___q_1.5.1.tgz"; - path = fetchurl { - name = "q___q_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz"; - sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7"; - }; - } - - { - name = "qs___qs_6.5.1.tgz"; - path = fetchurl { - name = "qs___qs_6.5.1.tgz"; - url = "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz"; - sha1 = "349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"; - }; - } - - { - name = "qs___qs_6.4.0.tgz"; - path = fetchurl { - name = "qs___qs_6.4.0.tgz"; - url = "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz"; - sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233"; - }; - } - - { - name = "qs___qs_6.5.2.tgz"; - path = fetchurl { - name = "qs___qs_6.5.2.tgz"; - url = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz"; - sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36"; - }; - } - - { - name = "query_string___query_string_4.3.4.tgz"; - path = fetchurl { - name = "query_string___query_string_4.3.4.tgz"; - url = "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz"; - sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb"; - }; - } - - { - name = "querystring_es3___querystring_es3_0.2.1.tgz"; - path = fetchurl { - name = "querystring_es3___querystring_es3_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz"; - sha1 = "9ec61f79049875707d69414596fd907a4d711e73"; - }; - } - - { - name = "querystring___querystring_0.2.0.tgz"; - path = fetchurl { - name = "querystring___querystring_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz"; - sha1 = "b209849203bb25df820da756e747005878521620"; - }; - } - - { - name = "querystringify___querystringify_2.0.0.tgz"; - path = fetchurl { - name = "querystringify___querystringify_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz"; - sha1 = "fa3ed6e68eb15159457c89b37bc6472833195755"; - }; - } - - { - name = "randomatic___randomatic_3.0.0.tgz"; - path = fetchurl { - name = "randomatic___randomatic_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz"; - sha1 = "d35490030eb4f7578de292ce6dfb04a91a128923"; - }; - } - - { - name = "randombytes___randombytes_2.0.6.tgz"; - path = fetchurl { - name = "randombytes___randombytes_2.0.6.tgz"; - url = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz"; - sha1 = "d302c522948588848a8d300c932b44c24231da80"; - }; - } - - { - name = "randomfill___randomfill_1.0.4.tgz"; - path = fetchurl { - name = "randomfill___randomfill_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz"; - sha1 = "c92196fc86ab42be983f1bf31778224931d61458"; - }; - } - - { - name = "range_parser___range_parser_1.2.0.tgz"; - path = fetchurl { - name = "range_parser___range_parser_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz"; - sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e"; - }; - } - - { - name = "raw_body___raw_body_2.3.2.tgz"; - path = fetchurl { - name = "raw_body___raw_body_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz"; - sha1 = "bcd60c77d3eb93cde0050295c3f379389bc88f89"; - }; - } - - { - name = "rc___rc_1.2.8.tgz"; - path = fetchurl { - name = "rc___rc_1.2.8.tgz"; - url = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz"; - sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"; - }; - } - - { - name = "read_pkg_up___read_pkg_up_1.0.1.tgz"; - path = fetchurl { - name = "read_pkg_up___read_pkg_up_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz"; - sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02"; - }; - } - - { - name = "read_pkg_up___read_pkg_up_2.0.0.tgz"; - path = fetchurl { - name = "read_pkg_up___read_pkg_up_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz"; - sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be"; - }; - } - - { - name = "read_pkg___read_pkg_1.1.0.tgz"; - path = fetchurl { - name = "read_pkg___read_pkg_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz"; - sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"; - }; - } - - { - name = "read_pkg___read_pkg_2.0.0.tgz"; - path = fetchurl { - name = "read_pkg___read_pkg_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz"; - sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"; - }; - } - - { - name = "readable_stream___readable_stream_1.0.34.tgz"; - path = fetchurl { - name = "readable_stream___readable_stream_1.0.34.tgz"; - url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz"; - sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c"; - }; - } - - { - name = "readable_stream___readable_stream_2.3.6.tgz"; - path = fetchurl { - name = "readable_stream___readable_stream_2.3.6.tgz"; - url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz"; - sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"; - }; - } - - { - name = "readdirp___readdirp_2.1.0.tgz"; - path = fetchurl { - name = "readdirp___readdirp_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz"; - sha1 = "4ed0ad060df3073300c48440373f72d1cc642d78"; - }; - } - - { - name = "redent___redent_1.0.0.tgz"; - path = fetchurl { - name = "redent___redent_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz"; - sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"; - }; - } - - { - name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz"; - path = fetchurl { - name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz"; - sha1 = "747c914e049614a4c9cfbba629871ad1d2927716"; - }; - } - - { - name = "reduce_function_call___reduce_function_call_1.0.2.tgz"; - path = fetchurl { - name = "reduce_function_call___reduce_function_call_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz"; - sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99"; - }; - } - - { - name = "regenerate___regenerate_1.4.0.tgz"; - path = fetchurl { - name = "regenerate___regenerate_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz"; - sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11"; - }; - } - - { - name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz"; - path = fetchurl { - name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz"; - url = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"; - sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"; - }; - } - - { - name = "regenerator_transform___regenerator_transform_0.10.1.tgz"; - path = fetchurl { - name = "regenerator_transform___regenerator_transform_0.10.1.tgz"; - url = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz"; - sha1 = "1e4996837231da8b7f3cf4114d71b5691a0680dd"; - }; - } - - { - name = "regex_cache___regex_cache_0.4.4.tgz"; - path = fetchurl { - name = "regex_cache___regex_cache_0.4.4.tgz"; - url = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz"; - sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd"; - }; - } - - { - name = "regex_not___regex_not_1.0.2.tgz"; - path = fetchurl { - name = "regex_not___regex_not_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz"; - sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c"; - }; - } - - { - name = "regex_parser___regex_parser_2.2.9.tgz"; - path = fetchurl { - name = "regex_parser___regex_parser_2.2.9.tgz"; - url = "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz"; - sha1 = "a372f45a248b62976a568037c1b6e60a60599192"; - }; - } - - { - name = "regexpu_core___regexpu_core_1.0.0.tgz"; - path = fetchurl { - name = "regexpu_core___regexpu_core_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz"; - sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b"; - }; - } - - { - name = "regexpu_core___regexpu_core_2.0.0.tgz"; - path = fetchurl { - name = "regexpu_core___regexpu_core_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz"; - sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240"; - }; - } - - { - name = "regjsgen___regjsgen_0.2.0.tgz"; - path = fetchurl { - name = "regjsgen___regjsgen_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz"; - sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7"; - }; - } - - { - name = "regjsparser___regjsparser_0.1.5.tgz"; - path = fetchurl { - name = "regjsparser___regjsparser_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz"; - sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"; - }; - } - - { - name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz"; - path = fetchurl { - name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"; - sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef"; - }; - } - - { - name = "renderkid___renderkid_2.0.1.tgz"; - path = fetchurl { - name = "renderkid___renderkid_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz"; - sha1 = "898cabfc8bede4b7b91135a3ffd323e58c0db319"; - }; - } - - { - name = "repeat_element___repeat_element_1.1.2.tgz"; - path = fetchurl { - name = "repeat_element___repeat_element_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz"; - sha1 = "ef089a178d1483baae4d93eb98b4f9e4e11d990a"; - }; - } - - { - name = "repeat_string___repeat_string_1.6.1.tgz"; - path = fetchurl { - name = "repeat_string___repeat_string_1.6.1.tgz"; - url = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz"; - sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637"; - }; - } - - { - name = "repeating___repeating_2.0.1.tgz"; - path = fetchurl { - name = "repeating___repeating_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz"; - sha1 = "5214c53a926d3552707527fbab415dbc08d06dda"; - }; - } - - { - name = "request___request_2.87.0.tgz"; - path = fetchurl { - name = "request___request_2.87.0.tgz"; - url = "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz"; - sha1 = "32f00235cd08d482b4d0d68db93a829c0ed5756e"; - }; - } - - { - name = "request___request_2.81.0.tgz"; - path = fetchurl { - name = "request___request_2.81.0.tgz"; - url = "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz"; - sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0"; - }; - } - - { - name = "require_directory___require_directory_2.1.1.tgz"; - path = fetchurl { - name = "require_directory___require_directory_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz"; - sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"; - }; - } - - { - name = "require_main_filename___require_main_filename_1.0.1.tgz"; - path = fetchurl { - name = "require_main_filename___require_main_filename_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz"; - sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1"; - }; - } - - { - name = "requires_port___requires_port_1.0.0.tgz"; - path = fetchurl { - name = "requires_port___requires_port_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz"; - sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff"; - }; - } - - { - name = "resolve_cwd___resolve_cwd_2.0.0.tgz"; - path = fetchurl { - name = "resolve_cwd___resolve_cwd_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz"; - sha1 = "00a9f7387556e27038eae232caa372a6a59b665a"; - }; - } - - { - name = "resolve_from___resolve_from_3.0.0.tgz"; - path = fetchurl { - name = "resolve_from___resolve_from_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz"; - sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748"; - }; - } - - { - name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz"; - path = fetchurl { - name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz"; - sha1 = "e1b37034d48f22f8cfb9f04c026faaa070fdaf26"; - }; - } - - { - name = "resolve_url___resolve_url_0.2.1.tgz"; - path = fetchurl { - name = "resolve_url___resolve_url_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz"; - sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a"; - }; - } - - { - name = "ret___ret_0.1.15.tgz"; - path = fetchurl { - name = "ret___ret_0.1.15.tgz"; - url = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz"; - sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"; - }; - } - - { - name = "rework_visit___rework_visit_1.0.0.tgz"; - path = fetchurl { - name = "rework_visit___rework_visit_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz"; - sha1 = "9945b2803f219e2f7aca00adb8bc9f640f842c9a"; - }; - } - - { - name = "rework___rework_1.0.1.tgz"; - path = fetchurl { - name = "rework___rework_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz"; - sha1 = "30806a841342b54510aa4110850cd48534144aa7"; - }; - } - - { - name = "right_align___right_align_0.1.3.tgz"; - path = fetchurl { - name = "right_align___right_align_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz"; - sha1 = "61339b722fe6a3515689210d24e14c96148613ef"; - }; - } - - { - name = "rimraf___rimraf_2.6.2.tgz"; - path = fetchurl { - name = "rimraf___rimraf_2.6.2.tgz"; - url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz"; - sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"; - }; - } - - { - name = "ripemd160___ripemd160_2.0.2.tgz"; - path = fetchurl { - name = "ripemd160___ripemd160_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz"; - sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c"; - }; - } - - { - name = "safe_buffer___safe_buffer_5.1.1.tgz"; - path = fetchurl { - name = "safe_buffer___safe_buffer_5.1.1.tgz"; - url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz"; - sha1 = "893312af69b2123def71f57889001671eeb2c853"; - }; - } - - { - name = "safe_buffer___safe_buffer_5.1.2.tgz"; - path = fetchurl { - name = "safe_buffer___safe_buffer_5.1.2.tgz"; - url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz"; - sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d"; - }; - } - - { - name = "safe_regex___safe_regex_1.1.0.tgz"; - path = fetchurl { - name = "safe_regex___safe_regex_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz"; - sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e"; - }; - } - - { - name = "safer_buffer___safer_buffer_2.1.2.tgz"; - path = fetchurl { - name = "safer_buffer___safer_buffer_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz"; - sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a"; - }; - } - - { - name = "sass_graph___sass_graph_2.2.4.tgz"; - path = fetchurl { - name = "sass_graph___sass_graph_2.2.4.tgz"; - url = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz"; - sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"; - }; - } - - { - name = "sass_loader___sass_loader_7.0.3.tgz"; - path = fetchurl { - name = "sass_loader___sass_loader_7.0.3.tgz"; - url = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz"; - sha1 = "6ca10871a1cc7549f8143db5a9958242c4e4ca2a"; - }; - } - - { - name = "sax___sax_1.2.4.tgz"; - path = fetchurl { - name = "sax___sax_1.2.4.tgz"; - url = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz"; - sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9"; - }; - } - - { - name = "schema_utils___schema_utils_0.3.0.tgz"; - path = fetchurl { - name = "schema_utils___schema_utils_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz"; - sha1 = "f5877222ce3e931edae039f17eb3716e7137f8cf"; - }; - } - - { - name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz"; - path = fetchurl { - name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz"; - url = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz"; - sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1"; - }; - } - - { - name = "select_hose___select_hose_2.0.0.tgz"; - path = fetchurl { - name = "select_hose___select_hose_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz"; - sha1 = "625d8658f865af43ec962bfc376a37359a4994ca"; - }; - } - - { - name = "selfsigned___selfsigned_1.10.3.tgz"; - path = fetchurl { - name = "selfsigned___selfsigned_1.10.3.tgz"; - url = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz"; - sha1 = "d628ecf9e3735f84e8bafba936b3cf85bea43823"; - }; - } - - { - name = "semver___semver_5.5.0.tgz"; - path = fetchurl { - name = "semver___semver_5.5.0.tgz"; - url = "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz"; - sha1 = "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"; - }; - } - - { - name = "semver___semver_5.3.0.tgz"; - path = fetchurl { - name = "semver___semver_5.3.0.tgz"; - url = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz"; - sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"; - }; - } - - { - name = "send___send_0.16.2.tgz"; - path = fetchurl { - name = "send___send_0.16.2.tgz"; - url = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz"; - sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1"; - }; - } - - { - name = "serve_index___serve_index_1.9.1.tgz"; - path = fetchurl { - name = "serve_index___serve_index_1.9.1.tgz"; - url = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz"; - sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239"; - }; - } - - { - name = "serve_static___serve_static_1.13.2.tgz"; - path = fetchurl { - name = "serve_static___serve_static_1.13.2.tgz"; - url = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz"; - sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1"; - }; - } - - { - name = "set_blocking___set_blocking_2.0.0.tgz"; - path = fetchurl { - name = "set_blocking___set_blocking_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz"; - sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7"; - }; - } - - { - name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz"; - path = fetchurl { - name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"; - sha1 = "4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"; - }; - } - - { - name = "set_value___set_value_0.4.3.tgz"; - path = fetchurl { - name = "set_value___set_value_0.4.3.tgz"; - url = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz"; - sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"; - }; - } - - { - name = "set_value___set_value_2.0.0.tgz"; - path = fetchurl { - name = "set_value___set_value_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz"; - sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"; - }; - } - - { - name = "setimmediate___setimmediate_1.0.5.tgz"; - path = fetchurl { - name = "setimmediate___setimmediate_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz"; - sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285"; - }; - } - - { - name = "setprototypeof___setprototypeof_1.0.3.tgz"; - path = fetchurl { - name = "setprototypeof___setprototypeof_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz"; - sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04"; - }; - } - - { - name = "setprototypeof___setprototypeof_1.1.0.tgz"; - path = fetchurl { - name = "setprototypeof___setprototypeof_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz"; - sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656"; - }; - } - - { - name = "sha.js___sha.js_2.4.11.tgz"; - path = fetchurl { - name = "sha.js___sha.js_2.4.11.tgz"; - url = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz"; - sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7"; - }; - } - - { - name = "shallow_clone___shallow_clone_1.0.0.tgz"; - path = fetchurl { - name = "shallow_clone___shallow_clone_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz"; - sha1 = "4480cd06e882ef68b2ad88a3ea54832e2c48b571"; - }; - } - - { - name = "shebang_command___shebang_command_1.2.0.tgz"; - path = fetchurl { - name = "shebang_command___shebang_command_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz"; - sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea"; - }; - } - - { - name = "shebang_regex___shebang_regex_1.0.0.tgz"; - path = fetchurl { - name = "shebang_regex___shebang_regex_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz"; - sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3"; - }; - } - - { - name = "signal_exit___signal_exit_3.0.2.tgz"; - path = fetchurl { - name = "signal_exit___signal_exit_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz"; - sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d"; - }; - } - - { - name = "slash___slash_1.0.0.tgz"; - path = fetchurl { - name = "slash___slash_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz"; - sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"; - }; - } - - { - name = "snapdragon_node___snapdragon_node_2.1.1.tgz"; - path = fetchurl { - name = "snapdragon_node___snapdragon_node_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz"; - sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b"; - }; - } - - { - name = "snapdragon_util___snapdragon_util_3.0.1.tgz"; - path = fetchurl { - name = "snapdragon_util___snapdragon_util_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz"; - sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2"; - }; - } - - { - name = "snapdragon___snapdragon_0.8.2.tgz"; - path = fetchurl { - name = "snapdragon___snapdragon_0.8.2.tgz"; - url = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz"; - sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d"; - }; - } - - { - name = "sntp___sntp_1.0.9.tgz"; - path = fetchurl { - name = "sntp___sntp_1.0.9.tgz"; - url = "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz"; - sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198"; - }; - } - - { - name = "sockjs_client___sockjs_client_1.1.4.tgz"; - path = fetchurl { - name = "sockjs_client___sockjs_client_1.1.4.tgz"; - url = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz"; - sha1 = "5babe386b775e4cf14e7520911452654016c8b12"; - }; - } - - { - name = "sockjs___sockjs_0.3.19.tgz"; - path = fetchurl { - name = "sockjs___sockjs_0.3.19.tgz"; - url = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz"; - sha1 = "d976bbe800af7bd20ae08598d582393508993c0d"; - }; - } - - { - name = "sort_keys___sort_keys_1.1.2.tgz"; - path = fetchurl { - name = "sort_keys___sort_keys_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz"; - sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad"; - }; - } - - { - name = "source_list_map___source_list_map_0.1.8.tgz"; - path = fetchurl { - name = "source_list_map___source_list_map_0.1.8.tgz"; - url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz"; - sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106"; - }; - } - - { - name = "source_list_map___source_list_map_2.0.0.tgz"; - path = fetchurl { - name = "source_list_map___source_list_map_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz"; - sha1 = "aaa47403f7b245a92fbc97ea08f250d6087ed085"; - }; - } - - { - name = "source_map_resolve___source_map_resolve_0.5.2.tgz"; - path = fetchurl { - name = "source_map_resolve___source_map_resolve_0.5.2.tgz"; - url = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz"; - sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259"; - }; - } - - { - name = "source_map_support___source_map_support_0.4.18.tgz"; - path = fetchurl { - name = "source_map_support___source_map_support_0.4.18.tgz"; - url = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz"; - sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f"; - }; - } - - { - name = "source_map_url___source_map_url_0.4.0.tgz"; - path = fetchurl { - name = "source_map_url___source_map_url_0.4.0.tgz"; - url = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz"; - sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3"; - }; - } - - { - name = "source_map___source_map_0.1.43.tgz"; - path = fetchurl { - name = "source_map___source_map_0.1.43.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz"; - sha1 = "c24bc146ca517c1471f5dacbe2571b2b7f9e3346"; - }; - } - - { - name = "source_map___source_map_0.4.4.tgz"; - path = fetchurl { - name = "source_map___source_map_0.4.4.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz"; - sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b"; - }; - } - - { - name = "source_map___source_map_0.5.7.tgz"; - path = fetchurl { - name = "source_map___source_map_0.5.7.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz"; - sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"; - }; - } - - { - name = "source_map___source_map_0.6.1.tgz"; - path = fetchurl { - name = "source_map___source_map_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz"; - sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263"; - }; - } - - { - name = "spdx_correct___spdx_correct_3.0.0.tgz"; - path = fetchurl { - name = "spdx_correct___spdx_correct_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz"; - sha1 = "05a5b4d7153a195bc92c3c425b69f3b2a9524c82"; - }; - } - - { - name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz"; - path = fetchurl { - name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz"; - sha1 = "2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"; - }; - } - - { - name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz"; - path = fetchurl { - name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz"; - sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0"; - }; - } - - { - name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz"; - path = fetchurl { - name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz"; - sha1 = "7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"; - }; - } - - { - name = "spdy_transport___spdy_transport_2.1.0.tgz"; - path = fetchurl { - name = "spdy_transport___spdy_transport_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz"; - sha1 = "4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1"; - }; - } - - { - name = "spdy___spdy_3.4.7.tgz"; - path = fetchurl { - name = "spdy___spdy_3.4.7.tgz"; - url = "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz"; - sha1 = "42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"; - }; - } - - { - name = "split_string___split_string_3.1.0.tgz"; - path = fetchurl { - name = "split_string___split_string_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz"; - sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2"; - }; - } - - { - name = "sprintf_js___sprintf_js_1.0.3.tgz"; - path = fetchurl { - name = "sprintf_js___sprintf_js_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz"; - sha1 = "04e6926f662895354f3dd015203633b857297e2c"; - }; - } - - { - name = "sshpk___sshpk_1.14.2.tgz"; - path = fetchurl { - name = "sshpk___sshpk_1.14.2.tgz"; - url = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz"; - sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"; - }; - } - - { - name = "stackframe___stackframe_1.0.4.tgz"; - path = fetchurl { - name = "stackframe___stackframe_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz"; - sha1 = "357b24a992f9427cba6b545d96a14ed2cbca187b"; - }; - } - - { - name = "static_extend___static_extend_0.1.2.tgz"; - path = fetchurl { - name = "static_extend___static_extend_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz"; - sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6"; - }; - } - - { - name = "statuses___statuses_1.5.0.tgz"; - path = fetchurl { - name = "statuses___statuses_1.5.0.tgz"; - url = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz"; - sha1 = "161c7dac177659fd9811f43771fa99381478628c"; - }; - } - - { - name = "statuses___statuses_1.4.0.tgz"; - path = fetchurl { - name = "statuses___statuses_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz"; - sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087"; - }; - } - - { - name = "stdout_stream___stdout_stream_1.4.0.tgz"; - path = fetchurl { - name = "stdout_stream___stdout_stream_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz"; - sha1 = "a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"; - }; - } - - { - name = "stream_browserify___stream_browserify_2.0.1.tgz"; - path = fetchurl { - name = "stream_browserify___stream_browserify_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz"; - sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"; - }; - } - - { - name = "stream_http___stream_http_2.8.3.tgz"; - path = fetchurl { - name = "stream_http___stream_http_2.8.3.tgz"; - url = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz"; - sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc"; - }; - } - - { - name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz"; - path = fetchurl { - name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"; - sha1 = "279b225df1d582b1f54e65addd4352e18faa0713"; - }; - } - - { - name = "string_width___string_width_1.0.2.tgz"; - path = fetchurl { - name = "string_width___string_width_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz"; - sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"; - }; - } - - { - name = "string_width___string_width_2.1.1.tgz"; - path = fetchurl { - name = "string_width___string_width_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz"; - sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e"; - }; - } - - { - name = "string_decoder___string_decoder_1.1.1.tgz"; - path = fetchurl { - name = "string_decoder___string_decoder_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz"; - sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8"; - }; - } - - { - name = "string_decoder___string_decoder_0.10.31.tgz"; - path = fetchurl { - name = "string_decoder___string_decoder_0.10.31.tgz"; - url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz"; - sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94"; - }; - } - - { - name = "stringstream___stringstream_0.0.6.tgz"; - path = fetchurl { - name = "stringstream___stringstream_0.0.6.tgz"; - url = "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz"; - sha1 = "7880225b0d4ad10e30927d167a1d6f2fd3b33a72"; - }; - } - - { - name = "strip_ansi___strip_ansi_3.0.1.tgz"; - path = fetchurl { - name = "strip_ansi___strip_ansi_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz"; - sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"; - }; - } - - { - name = "strip_ansi___strip_ansi_4.0.0.tgz"; - path = fetchurl { - name = "strip_ansi___strip_ansi_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz"; - sha1 = "a8479022eb1ac368a871389b635262c505ee368f"; - }; - } - - { - name = "strip_bom___strip_bom_2.0.0.tgz"; - path = fetchurl { - name = "strip_bom___strip_bom_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz"; - sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e"; - }; - } - - { - name = "strip_bom___strip_bom_3.0.0.tgz"; - path = fetchurl { - name = "strip_bom___strip_bom_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz"; - sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"; - }; - } - - { - name = "strip_eof___strip_eof_1.0.0.tgz"; - path = fetchurl { - name = "strip_eof___strip_eof_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz"; - sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf"; - }; - } - - { - name = "strip_indent___strip_indent_1.0.1.tgz"; - path = fetchurl { - name = "strip_indent___strip_indent_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz"; - sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2"; - }; - } - - { - name = "strip_json_comments___strip_json_comments_2.0.1.tgz"; - path = fetchurl { - name = "strip_json_comments___strip_json_comments_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz"; - sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a"; - }; - } - - { - name = "style_loader___style_loader_0.13.2.tgz"; - path = fetchurl { - name = "style_loader___style_loader_0.13.2.tgz"; - url = "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz"; - sha1 = "74533384cf698c7104c7951150b49717adc2f3bb"; - }; - } - - { - name = "summernote___summernote_0.8.10.tgz"; - path = fetchurl { - name = "summernote___summernote_0.8.10.tgz"; - url = "https://registry.yarnpkg.com/summernote/-/summernote-0.8.10.tgz"; - sha1 = "21a5d7f18a3b07500b58b60d5907417a54897520"; - }; - } - - { - name = "supports_color___supports_color_2.0.0.tgz"; - path = fetchurl { - name = "supports_color___supports_color_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz"; - sha1 = "535d045ce6b6363fa40117084629995e9df324c7"; - }; - } - - { - name = "supports_color___supports_color_3.2.3.tgz"; - path = fetchurl { - name = "supports_color___supports_color_3.2.3.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz"; - sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"; - }; - } - - { - name = "supports_color___supports_color_4.5.0.tgz"; - path = fetchurl { - name = "supports_color___supports_color_4.5.0.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz"; - sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b"; - }; - } - - { - name = "supports_color___supports_color_5.4.0.tgz"; - path = fetchurl { - name = "supports_color___supports_color_5.4.0.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz"; - sha1 = "1c6b337402c2137605efe19f10fec390f6faab54"; - }; - } - - { - name = "svgo___svgo_0.7.2.tgz"; - path = fetchurl { - name = "svgo___svgo_0.7.2.tgz"; - url = "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz"; - sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5"; - }; - } - - { - name = "tapable___tapable_0.2.8.tgz"; - path = fetchurl { - name = "tapable___tapable_0.2.8.tgz"; - url = "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz"; - sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22"; - }; - } - - { - name = "tar___tar_2.2.1.tgz"; - path = fetchurl { - name = "tar___tar_2.2.1.tgz"; - url = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz"; - sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"; - }; - } - - { - name = "tar___tar_4.4.4.tgz"; - path = fetchurl { - name = "tar___tar_4.4.4.tgz"; - url = "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz"; - sha1 = "ec8409fae9f665a4355cc3b4087d0820232bb8cd"; - }; - } - - { - name = "thunky___thunky_1.0.2.tgz"; - path = fetchurl { - name = "thunky___thunky_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz"; - sha1 = "a862e018e3fb1ea2ec3fce5d55605cf57f247371"; - }; - } - - { - name = "time_stamp___time_stamp_2.0.0.tgz"; - path = fetchurl { - name = "time_stamp___time_stamp_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz"; - sha1 = "95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"; - }; - } - - { - name = "timers_browserify___timers_browserify_2.0.10.tgz"; - path = fetchurl { - name = "timers_browserify___timers_browserify_2.0.10.tgz"; - url = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz"; - sha1 = "1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"; - }; - } - - { - name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz"; - path = fetchurl { - name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"; - sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43"; - }; - } - - { - name = "to_fast_properties___to_fast_properties_1.0.3.tgz"; - path = fetchurl { - name = "to_fast_properties___to_fast_properties_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz"; - sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47"; - }; - } - - { - name = "to_object_path___to_object_path_0.3.0.tgz"; - path = fetchurl { - name = "to_object_path___to_object_path_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz"; - sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af"; - }; - } - - { - name = "to_regex_range___to_regex_range_2.1.1.tgz"; - path = fetchurl { - name = "to_regex_range___to_regex_range_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz"; - sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38"; - }; - } - - { - name = "to_regex___to_regex_3.0.2.tgz"; - path = fetchurl { - name = "to_regex___to_regex_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz"; - sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"; - }; - } - - { - name = "tough_cookie___tough_cookie_2.3.4.tgz"; - path = fetchurl { - name = "tough_cookie___tough_cookie_2.3.4.tgz"; - url = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz"; - sha1 = "ec60cee38ac675063ffc97a5c18970578ee83655"; - }; - } - - { - name = "trim_newlines___trim_newlines_1.0.0.tgz"; - path = fetchurl { - name = "trim_newlines___trim_newlines_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz"; - sha1 = "5887966bb582a4503a41eb524f7d35011815a613"; - }; - } - - { - name = "trim_right___trim_right_1.0.1.tgz"; - path = fetchurl { - name = "trim_right___trim_right_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz"; - sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003"; - }; - } - - { - name = "true_case_path___true_case_path_1.0.2.tgz"; - path = fetchurl { - name = "true_case_path___true_case_path_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz"; - sha1 = "7ec91130924766c7f573be3020c34f8fdfd00d62"; - }; - } - - { - name = "tty_browserify___tty_browserify_0.0.0.tgz"; - path = fetchurl { - name = "tty_browserify___tty_browserify_0.0.0.tgz"; - url = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz"; - sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6"; - }; - } - - { - name = "tunnel_agent___tunnel_agent_0.6.0.tgz"; - path = fetchurl { - name = "tunnel_agent___tunnel_agent_0.6.0.tgz"; - url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz"; - sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd"; - }; - } - - { - name = "tweetnacl___tweetnacl_0.14.5.tgz"; - path = fetchurl { - name = "tweetnacl___tweetnacl_0.14.5.tgz"; - url = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz"; - sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64"; - }; - } - - { - name = "type_is___type_is_1.6.16.tgz"; - path = fetchurl { - name = "type_is___type_is_1.6.16.tgz"; - url = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz"; - sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194"; - }; - } - - { - name = "uglify_js___uglify_js_2.8.29.tgz"; - path = fetchurl { - name = "uglify_js___uglify_js_2.8.29.tgz"; - url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz"; - sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd"; - }; - } - - { - name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz"; - path = fetchurl { - name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz"; - sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7"; - }; - } - - { - name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz"; - path = fetchurl { - name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz"; - url = "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz"; - sha1 = "b951f4abb6bd617e66f63eb891498e391763e309"; - }; - } - - { - name = "union_value___union_value_1.0.0.tgz"; - path = fetchurl { - name = "union_value___union_value_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz"; - sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"; - }; - } - - { - name = "uniq___uniq_1.0.1.tgz"; - path = fetchurl { - name = "uniq___uniq_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz"; - sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff"; - }; - } - - { - name = "uniqs___uniqs_2.0.0.tgz"; - path = fetchurl { - name = "uniqs___uniqs_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz"; - sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02"; - }; - } - - { - name = "unpipe___unpipe_1.0.0.tgz"; - path = fetchurl { - name = "unpipe___unpipe_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz"; - sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec"; - }; - } - - { - name = "unset_value___unset_value_1.0.0.tgz"; - path = fetchurl { - name = "unset_value___unset_value_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz"; - sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"; - }; - } - - { - name = "upath___upath_1.1.0.tgz"; - path = fetchurl { - name = "upath___upath_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz"; - sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd"; - }; - } - - { - name = "uri_js___uri_js_4.2.2.tgz"; - path = fetchurl { - name = "uri_js___uri_js_4.2.2.tgz"; - url = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz"; - sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0"; - }; - } - - { - name = "urix___urix_0.1.0.tgz"; - path = fetchurl { - name = "urix___urix_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz"; - sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72"; - }; - } - - { - name = "url_parse___url_parse_1.4.1.tgz"; - path = fetchurl { - name = "url_parse___url_parse_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz"; - sha1 = "4dec9dad3dc8585f862fed461d2e19bbf623df30"; - }; - } - - { - name = "url___url_0.11.0.tgz"; - path = fetchurl { - name = "url___url_0.11.0.tgz"; - url = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz"; - sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"; - }; - } - - { - name = "use___use_3.1.1.tgz"; - path = fetchurl { - name = "use___use_3.1.1.tgz"; - url = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz"; - sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f"; - }; - } - - { - name = "util_deprecate___util_deprecate_1.0.2.tgz"; - path = fetchurl { - name = "util_deprecate___util_deprecate_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz"; - sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf"; - }; - } - - { - name = "util___util_0.10.3.tgz"; - path = fetchurl { - name = "util___util_0.10.3.tgz"; - url = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz"; - sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9"; - }; - } - - { - name = "util___util_0.10.4.tgz"; - path = fetchurl { - name = "util___util_0.10.4.tgz"; - url = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz"; - sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901"; - }; - } - - { - name = "utila___utila_0.3.3.tgz"; - path = fetchurl { - name = "utila___utila_0.3.3.tgz"; - url = "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz"; - sha1 = "d7e8e7d7e309107092b05f8d9688824d633a4226"; - }; - } - - { - name = "utila___utila_0.4.0.tgz"; - path = fetchurl { - name = "utila___utila_0.4.0.tgz"; - url = "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz"; - sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c"; - }; - } - - { - name = "utils_merge___utils_merge_1.0.1.tgz"; - path = fetchurl { - name = "utils_merge___utils_merge_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz"; - sha1 = "9f95710f50a267947b2ccc124741c1028427e713"; - }; - } - - { - name = "uuid___uuid_3.3.2.tgz"; - path = fetchurl { - name = "uuid___uuid_3.3.2.tgz"; - url = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz"; - sha1 = "1b4af4955eb3077c501c23872fc6513811587131"; - }; - } - - { - name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz"; - path = fetchurl { - name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz"; - url = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz"; - sha1 = "81643bcbef1bdfecd4623793dc4648948ba98338"; - }; - } - - { - name = "vary___vary_1.1.2.tgz"; - path = fetchurl { - name = "vary___vary_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz"; - sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc"; - }; - } - - { - name = "vendors___vendors_1.0.2.tgz"; - path = fetchurl { - name = "vendors___vendors_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz"; - sha1 = "7fcb5eef9f5623b156bcea89ec37d63676f21801"; - }; - } - - { - name = "verror___verror_1.10.0.tgz"; - path = fetchurl { - name = "verror___verror_1.10.0.tgz"; - url = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz"; - sha1 = "3a105ca17053af55d6e270c1f8288682e18da400"; - }; - } - - { - name = "vm_browserify___vm_browserify_0.0.4.tgz"; - path = fetchurl { - name = "vm_browserify___vm_browserify_0.0.4.tgz"; - url = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz"; - sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"; - }; - } - - { - name = "watchpack___watchpack_1.6.0.tgz"; - path = fetchurl { - name = "watchpack___watchpack_1.6.0.tgz"; - url = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz"; - sha1 = "4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"; - }; - } - - { - name = "wbuf___wbuf_1.7.3.tgz"; - path = fetchurl { - name = "wbuf___wbuf_1.7.3.tgz"; - url = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz"; - sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df"; - }; - } - - { - name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz"; - path = fetchurl { - name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz"; - url = "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.5.0.tgz"; - sha1 = "1dba38203d73c1e6ab069b6810a5a37402399dec"; - }; - } - - { - name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz"; - path = fetchurl { - name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz"; - url = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz"; - sha1 = "f8fc1120ce3b4fc5680ceecb43d777966b21105e"; - }; - } - - { - name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz"; - path = fetchurl { - name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz"; - url = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz"; - sha1 = "1f4f4c78bf1895378f376815910812daf79a216f"; - }; - } - - { - name = "webpack_sources___webpack_sources_1.1.0.tgz"; - path = fetchurl { - name = "webpack_sources___webpack_sources_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz"; - sha1 = "a101ebae59d6507354d71d8013950a3a8b7a5a54"; - }; - } - - { - name = "webpack___webpack_3.12.0.tgz"; - path = fetchurl { - name = "webpack___webpack_3.12.0.tgz"; - url = "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz"; - sha1 = "3f9e34360370602fcf639e97939db486f4ec0d74"; - }; - } - - { - name = "websocket_driver___websocket_driver_0.7.0.tgz"; - path = fetchurl { - name = "websocket_driver___websocket_driver_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz"; - sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"; - }; - } - - { - name = "websocket_extensions___websocket_extensions_0.1.3.tgz"; - path = fetchurl { - name = "websocket_extensions___websocket_extensions_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz"; - sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29"; - }; - } - - { - name = "whet.extend___whet.extend_0.9.9.tgz"; - path = fetchurl { - name = "whet.extend___whet.extend_0.9.9.tgz"; - url = "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz"; - sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1"; - }; - } - - { - name = "which_module___which_module_1.0.0.tgz"; - path = fetchurl { - name = "which_module___which_module_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz"; - sha1 = "bba63ca861948994ff307736089e3b96026c2a4f"; - }; - } - - { - name = "which_module___which_module_2.0.0.tgz"; - path = fetchurl { - name = "which_module___which_module_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz"; - sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"; - }; - } - - { - name = "which___which_1.3.1.tgz"; - path = fetchurl { - name = "which___which_1.3.1.tgz"; - url = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz"; - sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a"; - }; - } - - { - name = "wide_align___wide_align_1.1.3.tgz"; - path = fetchurl { - name = "wide_align___wide_align_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz"; - sha1 = "ae074e6bdc0c14a431e804e624549c633b000457"; - }; - } - - { - name = "window_size___window_size_0.1.0.tgz"; - path = fetchurl { - name = "window_size___window_size_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz"; - sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"; - }; - } - - { - name = "wordwrap___wordwrap_0.0.2.tgz"; - path = fetchurl { - name = "wordwrap___wordwrap_0.0.2.tgz"; - url = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz"; - sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f"; - }; - } - - { - name = "wrap_ansi___wrap_ansi_2.1.0.tgz"; - path = fetchurl { - name = "wrap_ansi___wrap_ansi_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz"; - sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85"; - }; - } - - { - name = "wrappy___wrappy_1.0.2.tgz"; - path = fetchurl { - name = "wrappy___wrappy_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz"; - sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"; - }; - } - - { - name = "xtend___xtend_4.0.1.tgz"; - path = fetchurl { - name = "xtend___xtend_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz"; - sha1 = "a5c6d532be656e23db820efb943a1f04998d63af"; - }; - } - - { - name = "y18n___y18n_3.2.1.tgz"; - path = fetchurl { - name = "y18n___y18n_3.2.1.tgz"; - url = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz"; - sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41"; - }; - } - - { - name = "yallist___yallist_2.1.2.tgz"; - path = fetchurl { - name = "yallist___yallist_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz"; - sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52"; - }; - } - - { - name = "yallist___yallist_3.0.2.tgz"; - path = fetchurl { - name = "yallist___yallist_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz"; - sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"; - }; - } - - { - name = "yargs_parser___yargs_parser_4.2.1.tgz"; - path = fetchurl { - name = "yargs_parser___yargs_parser_4.2.1.tgz"; - url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz"; - sha1 = "29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"; - }; - } - - { - name = "yargs_parser___yargs_parser_5.0.0.tgz"; - path = fetchurl { - name = "yargs_parser___yargs_parser_5.0.0.tgz"; - url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz"; - sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"; - }; - } - - { - name = "yargs_parser___yargs_parser_7.0.0.tgz"; - path = fetchurl { - name = "yargs_parser___yargs_parser_7.0.0.tgz"; - url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz"; - sha1 = "8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"; - }; - } - - { - name = "yargs___yargs_6.6.0.tgz"; - path = fetchurl { - name = "yargs___yargs_6.6.0.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz"; - sha1 = "782ec21ef403345f830a808ca3d513af56065208"; - }; - } - - { - name = "yargs___yargs_7.1.0.tgz"; - path = fetchurl { - name = "yargs___yargs_7.1.0.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz"; - sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8"; - }; - } - - { - name = "yargs___yargs_8.0.2.tgz"; - path = fetchurl { - name = "yargs___yargs_8.0.2.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz"; - sha1 = "6299a9055b1cefc969ff7e79c1d918dceb22c360"; - }; - } - - { - name = "yargs___yargs_3.10.0.tgz"; - path = fetchurl { - name = "yargs___yargs_3.10.0.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz"; - sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"; - }; - } - ]; -} diff --git a/modules/private/websites/isabelle/aten_integration.nix b/modules/private/websites/isabelle/aten_integration.nix deleted file mode 100644 index c55ef92..0000000 --- a/modules/private/websites/isabelle/aten_integration.nix +++ /dev/null @@ -1,91 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.isabelle.aten_integration; - webRoot = "/var/lib/ftp/immae/aten/public"; - cfg = config.myServices.websites.isabelle.aten_integration; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.isabelle.aten_integration.enable = lib.mkEnableOption "enable Aten's website in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.isabelle_aten_integration = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - httpdWatchFiles = [ - config.secrets.fullPaths."websites/isabelle/aten_integration" - ]; - inherit webRoot; - varDir = "/var/lib/ftp/immae/aten_var"; - app = "/var/lib/ftp/immae/aten"; - serviceDeps = [ "postgresql.service" ]; - preStartActions = [ - "APP_ENV=dev ./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/isabelle/aten_integration" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = let - # cf: - # https://secure.php.net/manual/fr/function.parse-url.php - # vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery - psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}"; - in '' - SetEnv APP_ENV "dev" - SetEnv APP_SECRET "${secrets.secret}" - SetEnv DATABASE_URL "${psql_url}" - ''; - }; - services.websites.env.integration.vhostConfs.isabelle_aten_integration = { - certName = "integration"; - addToCerts = true; - hosts = [ "aten.ic.immae.dev" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_integration}|fcgi://localhost" - - - Include ${config.secrets.fullPaths."websites/isabelle/aten_integration"} - - - Use LDAPConnect - Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Use LDAPConnect - Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - DirectoryIndex index.php - FallbackResource /index.php - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/isabelle/aten_production.nix b/modules/private/websites/isabelle/aten_production.nix deleted file mode 100644 index 928a815..0000000 --- a/modules/private/websites/isabelle/aten_production.nix +++ /dev/null @@ -1,90 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.isabelle.aten_production; - app = pkgs.callPackage ./aten_app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/isabelle_aten_production"; - }; - cfg = config.myServices.websites.isabelle.aten_production; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.isabelle.aten_production.enable = lib.mkEnableOption "enable Aten's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "aten.pro"; } ]; - services.phpApplication.apps.isabelle_aten_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - httpdWatchFiles = [ - config.secrets.fullPaths."websites/isabelle/aten_production" - ]; - inherit (app) webRoot varDir; - inherit app; - serviceDeps = [ "postgresql.service" ]; - preStartActions = [ - "APP_ENV=${app.environment} ./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/isabelle/aten_production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = let - # cf: - # https://secure.php.net/manual/fr/function.parse-url.php - # vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery - psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}"; - in '' - SetEnv APP_ENV "${app.environment}" - SetEnv APP_SECRET "${secrets.secret}" - SetEnv DATABASE_URL "${psql_url}" - ''; - }; - services.websites.env.production.vhostConfs.isabelle_aten_production = { - certName = "isabelle"; - certMainHost = "aten.pro"; - hosts = [ "aten.pro" "www.aten.pro" ]; - root = app.webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_production}|fcgi://localhost" - - - Include ${config.secrets.fullPaths."websites/isabelle/aten_production"} - - Use Stats aten.pro - - - Use LDAPConnect - Require ldap-group cn=aten.pro,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - DirectoryIndex index.php - FallbackResource /index.php - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/isabelle/config/chmod.php b/modules/private/websites/isabelle/config/chmod.php deleted file mode 100644 index aae16cd..0000000 --- a/modules/private/websites/isabelle/config/chmod.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/modules/private/websites/isabelle/config/connect.php b/modules/private/websites/isabelle/config/connect.php deleted file mode 100644 index 18b0933..0000000 --- a/modules/private/websites/isabelle/config/connect.php +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/modules/private/websites/isabelle/config/ldap.php b/modules/private/websites/isabelle/config/ldap.php deleted file mode 100644 index 825b7ed..0000000 --- a/modules/private/websites/isabelle/config/ldap.php +++ /dev/null @@ -1,9 +0,0 @@ - array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',); -$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH"); -?> diff --git a/modules/private/websites/isabelle/iridologie.nix b/modules/private/websites/isabelle/iridologie.nix deleted file mode 100644 index cd733c1..0000000 --- a/modules/private/websites/isabelle/iridologie.nix +++ /dev/null @@ -1,113 +0,0 @@ -{ lib, pkgs, config, ... }: -let - icfg = config.myEnv.websites.isabelle.iridologie; - cfg = config.myServices.websites.isabelle.iridologie; - app = pkgs.callPackage ./iridologie_app { - inherit (icfg) environment; - inherit (pkgs.webapps) spip; - varDir = "/var/lib/isabelle_iridologie"; - }; - - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - secretsPath = config.secrets.fullPaths."websites/isabelle/iridologie"; -in { - options.myServices.websites.isabelle.iridologie.enable = lib.mkEnableOption "enable Iridologie's website"; - - config = lib.mkIf cfg.enable { - secrets.keys."websites/isabelle/iridologie" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = '' - SetEnv SPIP_CONFIG_DIR "${./config}" - SetEnv SPIP_VAR_DIR "${app.varDir}" - SetEnv SPIP_SITE "iridologie-${app.environment}" - SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu" - SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu" - SetEnv SPIP_LDAP_SEARCH_DN "${icfg.ldap.dn}" - SetEnv SPIP_LDAP_SEARCH_PW "${icfg.ldap.password}" - SetEnv SPIP_LDAP_SEARCH "${icfg.ldap.filter}" - SetEnv SPIP_MYSQL_HOST "${icfg.mysql.host}" - SetEnv SPIP_MYSQL_PORT "${icfg.mysql.port}" - SetEnv SPIP_MYSQL_DB "${icfg.mysql.database}" - SetEnv SPIP_MYSQL_USER "${icfg.mysql.user}" - SetEnv SPIP_MYSQL_PASSWORD "${icfg.mysql.password}" - ''; - }; - services.webstats.sites = [ { name = "iridologie.icommandeur.org"; } ]; - - systemd.services.phpfpm-isabelle_iridologie.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-isabelle_iridologie.wants = [ "mysql.service" ]; - services.phpfpm.pools.isabelle_iridologie = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - settings = { - "listen.owner" = "${apacheUser}"; - "listen.group" = "${apacheGroup}"; - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp"; - "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpPackage = pkgs.php72; - }; - system.activationScripts.isabelle_iridologie = { - deps = [ "wrappers" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local - install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions - ''; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.isabelle_iridologie = { - certName = "isabelle"; - addToCerts = true; - hosts = [ "iridologie.icommandeur.org" "icommandeur.org" "www.icommandeur.org" ]; - root = app.webRoot; - extraConfig = [ - '' - RewriteEngine On - RewriteCond "%{HTTP_HOST}" "!^iridologie\.icommandeur\.org$" [NC] - RewriteRule ^(.+)$ https://iridologie.icommandeur.org$1 [R=302,L] - - Include ${secretsPath} - - RewriteEngine On - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.isabelle_iridologie.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options -Indexes +FollowSymLinks +MultiViews +Includes - Include ${app.webRoot}/htaccess.txt - - AllowOverride AuthConfig FileInfo Limit - Require all granted - - - - Require all denied - - - - Require all denied - - - Use Stats iridologie.icommandeur.org - '' - ]; - }; - services.websites.env.production.watchPaths = [ - secretsPath - ]; - }; -} diff --git a/modules/private/websites/isabelle/iridologie_app/default.nix b/modules/private/websites/isabelle/iridologie_app/default.nix deleted file mode 100644 index edb7eef..0000000 --- a/modules/private/websites/isabelle/iridologie_app/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ environment ? "prod" -, varDir ? "/var/lib/iridologie_${environment}" -, spip, stdenv, sassc, sources }: -let - siteDir = stdenv.mkDerivation rec { - version = sources.websites-isabelle-iridologie.version; - pname = "iridologie"; - name = "${pname}-${version}"; - src = sources.websites-isabelle-iridologie; - installPhase = '' - cp -a . $out - ''; - }; -in -spip.override { - ldap = true; - siteName = "iridologie"; - inherit environment siteDir varDir; -} diff --git a/modules/private/websites/jerome/naturaloutil.nix b/modules/private/websites/jerome/naturaloutil.nix deleted file mode 100644 index 0974ce3..0000000 --- a/modules/private/websites/jerome/naturaloutil.nix +++ /dev/null @@ -1,97 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.jerome.naturaloutil; - varDir = "/var/lib/ftp/jerome"; - env = config.myEnv.websites.jerome; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - secretsPath = config.secrets.fullPaths."websites/jerome/naturaloutil"; -in { - options.myServices.websites.jerome.naturaloutil.enable = lib.mkEnableOption "enable Jerome Naturaloutil's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "naturaloutil.immae.eu"; } ]; - - security.acme.certs."ftp".extraDomains."naturaloutil.immae.eu" = null; - - secrets.keys."websites/jerome/naturaloutil" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = '' - ssl_set(NULL, NULL, "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt", NULL, NULL); - '' else ""} - $database = connect_db($db, $mysql_server, $mysql_base, $mysql_user, $mysql_password); - ?> - ''; - }; - system.activationScripts.jerome_naturaloutil = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/jerome_naturaloutil - ''; - }; - systemd.services.phpfpm-jerome_naturaloutil.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-jerome_naturaloutil.wants = [ "mysql.service" ]; - services.phpfpm.pools.jerome_naturaloutil = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/jerome_naturaloutil:${secretsPath}:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/jerome_naturaloutil"; - }; - phpEnv = { - BDD_CONNECT = secretsPath; - }; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.jerome_naturaloutil = { - certName = "jerome"; - certMainHost = "naturaloutil.immae.eu"; - hosts = ["naturaloutil.immae.eu" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - Use Stats naturaloutil.immae.eu - ServerAdmin ${env.server_admin} - ErrorLog "${varDir}/logs/error_log" - CustomLog "${varDir}/logs/access_log" combined - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.jerome_naturaloutil.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/leila/production.nix b/modules/private/websites/leila/production.nix deleted file mode 100644 index 8385bc7..0000000 --- a/modules/private/websites/leila/production.nix +++ /dev/null @@ -1,114 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.leila.production; - varDir = "/var/lib/ftp/leila"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.leila.production.enable = lib.mkEnableOption "enable Leila's websites in production"; - - config = lib.mkIf cfg.enable { - services.phpfpm.pools.leila = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "${varDir}:/tmp"; - "php_admin_value[max_execution_time]" = "1800"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]); - phpEnv = { - PATH = lib.makeBinPath [ pkgs.imagemagick ]; - }; - }; - - services.webstats.sites = [ - { name = "leila.bouya.org"; } - { name = "chorale.leila.bouya.org"; } - { name = "syrwennecreation.bouya.org"; } - ]; - - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.leila_chorale = { - certName = "leila"; - addToCerts = true; - hosts = [ "chorale.leila.bouya.org" "chorale-vocanta.fr.nf" "www.chorale-vocanta.fr.nf" ]; - root = "${varDir}/Chorale"; - extraConfig = [ - '' - Use Stats chorale.leila.bouya.org - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - - Use LDAPConnect - Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost" - - - '' - ]; - }; - services.websites.env.production.vhostConfs.leila_syrwenne = { - certName = "leila"; - addToCerts = true; - hosts = [ "syrwennecreation.bouya.org" ]; - root = "${varDir}/Syrwennecreation"; - extraConfig = [ - '' - Use Stats syrwennecreation.bouya.org - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost" - - - '' - ]; - }; - services.websites.env.production.vhostConfs.leila = { - certName = "leila"; - certMainHost = "leila.bouya.org"; - hosts = [ "leila.bouya.org" ]; - root = varDir; - extraConfig = [ - '' - Use Stats leila.bouya.org - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - - Use LDAPConnect - Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost" - - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/ludivine/app/default.nix b/modules/private/websites/ludivine/app/default.nix deleted file mode 100644 index 323b6e0..0000000 --- a/modules/private/websites/ludivine/app/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, fetchgit, imagemagick, sass, ruby, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - name = "${pname}-${version}"; - pname = "ludivinecassal"; - version = sources.websites-ludivine-app.version; - src = sources.websites-ludivine-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - cp app/config/parameters.yml.dist app/config/parameters.yml - cat >> app/config/parameters.yml < - SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_integration}|fcgi://localhost" - - - - Use LDAPConnect - Require ldap-group cn=lc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/ludivine/production.nix b/modules/private/websites/ludivine/production.nix deleted file mode 100644 index 7a18b88..0000000 --- a/modules/private/websites/ludivine/production.nix +++ /dev/null @@ -1,116 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.ludivine.production; - app = pkgs.callPackage ./app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/ludivine_production"; - secretsPath = config.secrets.fullPaths."websites/ludivine/production"; - }; - pcfg = config.services.phpApplication; - cfg = config.myServices.websites.ludivine.production; -in { - options.myServices.websites.ludivine.production.enable = lib.mkEnableOption "enable Ludivine's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "ludivinecassal.com"; } ]; - services.phpApplication.apps.ludivine_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - inherit (app) webRoot varDir; - varDirPaths = { - "tmp" = "0700"; - }; - inherit app; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/ludivine/production" - ]; - phpEnv = { - PATH = lib.makeBinPath [ - # below ones don't need to be in the PATH but they’re used in - # secrets - pkgs.imagemagick pkgs.sass pkgs.ruby - ]; - }; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/ludivine/production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - ldap_host: ldap.immae.eu - ldap_port: 636 - ldap_version: 3 - ldap_ssl: true - ldap_tls: false - ldap_user_bind: 'uid={username},ou=users,dc=immae,dc=eu' - ldap_base_dn: 'dc=immae,dc=eu' - ldap_search_dn: '${secrets.ldap.dn}' - ldap_search_password: '${secrets.ldap.password}' - ldap_search_filter: '${secrets.ldap.filter}' - leapt_im: - binary_path: ${pkgs.imagemagick}/bin - assetic: - sass: ${pkgs.sass}/bin/sass - ruby: ${pkgs.ruby}/bin/ruby - ''; - }; - - services.websites.env.production.vhostConfs.ludivine_production = { - certName = "ludivine"; - certMainHost = "ludivinecassal.com"; - hosts = ["ludivinecassal.com" "www.ludivinecassal.com" ]; - root = app.webRoot; - extraConfig = [ - '' - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^ludivinecassal\.com$" [NC] - RewriteRule ^(.+)$ https://ludivinecassal.com$1 [R=302,L] - - - SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_production}|fcgi://localhost" - - - Use Stats ludivinecassal.com - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/nassime/production.nix b/modules/private/websites/nassime/production.nix deleted file mode 100644 index 1179351..0000000 --- a/modules/private/websites/nassime/production.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.nassime.production; - varDir = "/var/lib/ftp/nassime"; - env = config.myEnv.websites.nassime; - domain = "nassime.bouya.org"; -in { - options.myServices.websites.nassime.production.enable = lib.mkEnableOption "enable Nassime's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = domain; } ]; - - security.acme.certs."ftp".extraDomains."${domain}" = null; - - services.websites.env.production.vhostConfs.nassime = { - certName = "nassime"; - certMainHost = domain; - hosts = [ domain ]; - root = varDir; - extraConfig = [ - '' - Use Stats ${domain} - ServerAdmin ${env.server_admin} - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/nath/villon.nix b/modules/private/websites/nath/villon.nix deleted file mode 100644 index 57a1df5..0000000 --- a/modules/private/websites/nath/villon.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.nath.villon; - varDir = "/var/lib/ftp/nath"; - env = config.myEnv.websites.nath; - domain = "sntvillon.immae.eu"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.nath.villon.enable = lib.mkEnableOption "enable Nath's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = domain; } ]; - - system.activationScripts.nath_villon = { - deps = [ "users" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir} - ''; - }; - security.acme.certs."ftp".extraDomains."${domain}" = null; - - services.websites.env.production.vhostConfs.nath_villon = { - certName = "nath"; - certMainHost = domain; - hosts = [ domain ]; - root = varDir; - extraConfig = [ - '' - Use Stats ${domain} - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/papa/maison_bbc.nix b/modules/private/websites/papa/maison_bbc.nix deleted file mode 100644 index 3eb736e..0000000 --- a/modules/private/websites/papa/maison_bbc.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ lib, config, ... }: -let - cfg = config.myServices.websites.papa.maison_bbc; -in { - options.myServices.websites.papa.maison_bbc.enable = lib.mkEnableOption "enable Papa Maison bbc website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "maison.bbc.bouya.org"; } ]; - - services.websites.env.production.vhostConfs.papa_maison_bbc = { - certName = "papa"; - addToCerts = true; - hosts = [ "maison.bbc.bouya.org" ]; - root = ./maison_bbc_static; - extraConfig = [ - '' - ErrorDocument 404 /index.html - - DirectoryIndex index.htm index.html - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/papa/maison_bbc_static/data.json b/modules/private/websites/papa/maison_bbc_static/data.json deleted file mode 100644 index 1784d27..0000000 --- a/modules/private/websites/papa/maison_bbc_static/data.json +++ /dev/null @@ -1,4101 +0,0 @@ -{ - "mean_consumption": { - "data": [ - { - "x": "2010-01-01 00:00:00", - "y": 0 - }, - { - "x": "2012-06-01 00:00:00", - "y": 0.3 - }, - { - "x": "2012-07-01 00:00:00", - "y": 0.3 - }, - { - "x": "2012-08-01 00:00:00", - "y": 0.5 - }, - { - "x": "2012-09-01 00:00:00", - "y": 0.4 - }, - { - "x": "2012-10-01 00:00:00", - "y": 0.4 - }, - { - "x": "2012-11-01 00:00:00", - "y": 0.5 - }, - { - "x": "2012-12-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-01-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-02-01 00:00:00", - "y": 0.4 - }, - { - "x": "2013-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2013-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-05-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-06-01 00:00:00", - "y": 0.4 - }, - { - "x": "2013-07-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-08-01 00:00:00", - "y": 0.4 - }, - { - "x": "2013-09-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-10-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 0.6 - }, - { - "x": "2013-12-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-01-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-02-01 00:00:00", - "y": 0.5 - }, - { - "x": "2014-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2014-05-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-10-01 00:00:00", - "y": 0.7 - }, - { - "x": "2014-12-01 00:00:00", - "y": 8.1 - }, - { - "x": "2015-01-01 00:00:00", - "y": 8.8 - }, - { - "x": "2015-02-01 00:00:00", - "y": 8.2 - }, - { - "x": "2015-03-01 00:00:00", - "y": 7.2 - }, - { - "x": "2015-04-01 00:00:00", - "y": 1.2 - }, - { - "x": "2015-05-01 00:00:00", - "y": 0.6 - }, - { - "x": "2015-06-01 00:00:00", - "y": 0.6 - }, - { - "x": "2015-07-01 00:00:00", - "y": 0.5 - }, - { - "x": "2015-08-01 00:00:00", - "y": 0.6 - }, - { - "x": "2015-09-01 00:00:00", - "y": 0.5 - }, - { - "x": "2016-02-01 00:00:00", - "y": 0 - }, - { - "x": "2016-03-01 00:00:00", - "y": 0 - }, - { - "x": "2016-04-01 00:00:00", - "y": 0 - }, - { - "x": "2016-05-01 00:00:00", - "y": 0 - }, - { - "x": "2016-06-01 00:00:00", - "y": 0 - }, - { - "x": "2016-07-01 00:00:00", - "y": 0 - }, - { - "x": "2016-08-01 00:00:00", - "y": 0 - }, - { - "x": "2016-09-01 00:00:00", - "y": 0 - }, - { - "x": "2017-04-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-05-01 00:00:00", - "y": 0.5 - }, - { - "x": "2017-06-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-07-01 00:00:00", - "y": 0.6 - }, - { - "x": "2017-08-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-09-01 00:00:00", - "y": 0.5 - }, - { - "x": "2017-10-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-11-01 00:00:00", - "y": 0.5 - }, - { - "x": "2017-12-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-01-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-02-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2018-05-01 00:00:00", - "y": 0.4 - }, - { - "x": "2018-06-01 00:00:00", - "y": 0.5 - }, - { - "x": "2018-07-01 00:00:00", - "y": 0.5 - }, - { - "x": "2018-08-01 00:00:00", - "y": 0.8 - }, - { - "x": "2019-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2019-04-01 00:00:00", - "y": 0.6 - }, - { - "x": "2019-05-01 00:00:00", - "y": 0.4 - }, - { - "x": "2019-06-01 00:00:00", - "y": 0.4 - }, - { - "x": "2019-07-01 00:00:00", - "y": 0.4 - }, - { - "x": "2019-08-01 00:00:00", - "y": 0.6 - }, - { - "x": "2020-03-01 00:00:00", - "y": 0.5 - }, - { - "x": "2020-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2020-05-01 00:00:00", - "y": 0.5 - } - ], - "name": "Consommation moyenne", - "unit": "kW", - "hide": false - }, - "total_consumption": { - "data": [ - { - "x": "2010-01-01 00:00:00", - "y": 74.8 - }, - { - "x": "2012-08-01 00:00:00", - "y": 629 - }, - { - "x": "2012-09-01 00:00:00", - "y": 859.3 - }, - { - "x": "2012-10-01 00:00:00", - "y": 1150.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 1440.1 - }, - { - "x": "2012-12-01 00:00:00", - "y": 1829.6 - }, - { - "x": "2013-01-01 00:00:00", - "y": 2218.6 - }, - { - "x": "2013-02-01 00:00:00", - "y": 468.7 - }, - { - "x": "2013-03-01 00:00:00", - "y": 2924.1 - }, - { - "x": "2013-04-01 00:00:00", - "y": -3217.1 - }, - { - "x": "2013-05-01 00:00:00", - "y": -2847.2 - }, - { - "x": "2013-06-01 00:00:00", - "y": 224.6 - }, - { - "x": "2013-07-01 00:00:00", - "y": 536.5 - }, - { - "x": "2013-08-01 00:00:00", - "y": 882 - }, - { - "x": "2013-09-01 00:00:00", - "y": 1207.7 - }, - { - "x": "2013-10-01 00:00:00", - "y": 1565.4 - }, - { - "x": "2013-11-01 00:00:00", - "y": 1924.1 - }, - { - "x": "2013-12-01 00:00:00", - "y": 2323.5 - }, - { - "x": "2014-01-01 00:00:00", - "y": 2754.8 - }, - { - "x": "2014-02-01 00:00:00", - "y": 3176.7 - }, - { - "x": "2014-03-01 00:00:00", - "y": 3530.1 - }, - { - "x": "2014-04-01 00:00:00", - "y": 3975 - }, - { - "x": "2014-05-01 00:00:00", - "y": 4364.8 - }, - { - "x": "2014-10-01 00:00:00", - "y": 1485.8 - }, - { - "x": "2014-12-01 00:00:00", - "y": 9.3 - }, - { - "x": "2015-01-01 00:00:00", - "y": 6 - }, - { - "x": "2015-02-01 00:00:00", - "y": 10 - }, - { - "x": "2015-03-01 00:00:00", - "y": 10.9 - }, - { - "x": "2015-04-01 00:00:00", - "y": 13.1 - }, - { - "x": "2015-05-01 00:00:00", - "y": 1.6 - }, - { - "x": "2015-06-01 00:00:00", - "y": 2.1 - }, - { - "x": "2015-07-01 00:00:00", - "y": 2.8 - }, - { - "x": "2015-08-01 00:00:00", - "y": 2.2 - }, - { - "x": "2015-09-01 00:00:00", - "y": 2.8 - }, - { - "x": "2016-02-01 00:00:00", - "y": 0 - }, - { - "x": "2016-03-01 00:00:00", - "y": 2.1 - }, - { - "x": "2016-04-01 00:00:00", - "y": 43.2 - }, - { - "x": "2016-05-01 00:00:00", - "y": 78.6 - }, - { - "x": "2016-06-01 00:00:00", - "y": 118.2 - }, - { - "x": "2016-07-01 00:00:00", - "y": 155.2 - }, - { - "x": "2016-08-01 00:00:00", - "y": 203.1 - }, - { - "x": "2016-09-01 00:00:00", - "y": 213.7 - }, - { - "x": "2017-04-01 00:00:00", - "y": 4567.8 - }, - { - "x": "2017-05-01 00:00:00", - "y": 46.2 - }, - { - "x": "2017-06-01 00:00:00", - "y": 404.3 - }, - { - "x": "2017-07-01 00:00:00", - "y": 711.3 - }, - { - "x": "2017-08-01 00:00:00", - "y": 1098.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 1365.4 - }, - { - "x": "2017-10-01 00:00:00", - "y": 1705.3 - }, - { - "x": "2017-11-01 00:00:00", - "y": 2041.5 - }, - { - "x": "2017-12-01 00:00:00", - "y": 2400.8 - }, - { - "x": "2018-01-01 00:00:00", - "y": 2816.8 - }, - { - "x": "2018-02-01 00:00:00", - "y": 3236.5 - }, - { - "x": "2018-03-01 00:00:00", - "y": 3610 - }, - { - "x": "2018-04-01 00:00:00", - "y": 4047.8 - }, - { - "x": "2018-05-01 00:00:00", - "y": 4447.2 - }, - { - "x": "2018-06-01 00:00:00", - "y": 4704.1 - }, - { - "x": "2018-07-01 00:00:00", - "y": 260.9 - }, - { - "x": "2018-08-01 00:00:00", - "y": 502.7 - }, - { - "x": "2019-03-01 00:00:00", - "y": 896.9 - }, - { - "x": "2019-04-01 00:00:00", - "y": 1268.4 - }, - { - "x": "2019-05-01 00:00:00", - "y": 1625.5 - }, - { - "x": "2019-06-01 00:00:00", - "y": 1944.8 - }, - { - "x": "2019-07-01 00:00:00", - "y": 2256.8 - }, - { - "x": "2019-08-01 00:00:00", - "y": 2714.7 - }, - { - "x": "2020-03-01 00:00:00", - "y": 314.9 - }, - { - "x": "2020-04-01 00:00:00", - "y": 679.7 - }, - { - "x": "2020-05-01 00:00:00", - "y": 1084.7 - } - ], - "name": "Consommation totale", - "unit": "kWh", - "hide": false - }, - "Chambre_RDC_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22.3 - }, - { - "x": "2012-07-01 00:00:00", - "y": 22.7 - }, - { - "x": "2012-08-01 00:00:00", - "y": 25.1 - }, - { - "x": "2012-09-01 00:00:00", - "y": 22.6 - }, - { - "x": "2012-10-01 00:00:00", - "y": 20.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 18 - }, - { - "x": "2012-12-01 00:00:00", - "y": 20 - }, - { - "x": "2013-01-01 00:00:00", - "y": 20.1 - }, - { - "x": "2013-02-01 00:00:00", - "y": 15.6 - }, - { - "x": "2013-03-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-04-01 00:00:00", - "y": 18.1 - }, - { - "x": "2013-05-01 00:00:00", - "y": 21.5 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.3 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25.1 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.4 - }, - { - "x": "2013-11-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20.4 - }, - { - "x": "2014-01-01 00:00:00", - "y": 20.5 - }, - { - "x": "2014-02-01 00:00:00", - "y": 19.8 - }, - { - "x": "2014-03-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-04-01 00:00:00", - "y": 21.3 - }, - { - "x": "2014-05-01 00:00:00", - "y": 21.9 - }, - { - "x": "2014-06-01 00:00:00", - "y": 25 - }, - { - "x": "2014-10-01 00:00:00", - "y": 22.4 - }, - { - "x": "2014-11-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-12-01 00:00:00", - "y": 18.2 - }, - { - "x": "2015-01-01 00:00:00", - "y": 20 - }, - { - "x": "2015-02-01 00:00:00", - "y": 20 - }, - { - "x": "2015-03-01 00:00:00", - "y": 19.6 - }, - { - "x": "2015-04-01 00:00:00", - "y": 21.4 - }, - { - "x": "2015-05-01 00:00:00", - "y": 20.4 - }, - { - "x": "2015-06-01 00:00:00", - "y": 24.2 - }, - { - "x": "2015-07-01 00:00:00", - "y": 24.5 - }, - { - "x": "2015-08-01 00:00:00", - "y": 23.6 - }, - { - "x": "2015-09-01 00:00:00", - "y": 22.2 - }, - { - "x": "2015-10-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-11-01 00:00:00", - "y": 20.6 - }, - { - "x": "2015-12-01 00:00:00", - "y": 19.5 - }, - { - "x": "2016-01-01 00:00:00", - "y": 19.8 - }, - { - "x": "2016-02-01 00:00:00", - "y": 20.4 - }, - { - "x": "2016-03-01 00:00:00", - "y": 19.8 - }, - { - "x": "2016-04-01 00:00:00", - "y": 19.5 - }, - { - "x": "2016-05-01 00:00:00", - "y": 21.3 - }, - { - "x": "2016-06-01 00:00:00", - "y": 22.9 - }, - { - "x": "2016-07-01 00:00:00", - "y": 24.4 - }, - { - "x": "2016-08-01 00:00:00", - "y": 24 - }, - { - "x": "2016-09-01 00:00:00", - "y": 23.5 - }, - { - "x": "2017-03-01 00:00:00", - "y": 21.1 - }, - { - "x": "2017-04-01 00:00:00", - "y": 20.6 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2017-06-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-07-01 00:00:00", - "y": 23.9 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23.4 - }, - { - "x": "2017-09-01 00:00:00", - "y": 22.9 - }, - { - "x": "2017-10-01 00:00:00", - "y": 22 - }, - { - "x": "2017-11-01 00:00:00", - "y": 19.7 - }, - { - "x": "2017-12-01 00:00:00", - "y": 20 - }, - { - "x": "2018-01-01 00:00:00", - "y": 20 - }, - { - "x": "2018-02-01 00:00:00", - "y": 20.2 - }, - { - "x": "2018-03-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-04-01 00:00:00", - "y": 21.1 - }, - { - "x": "2018-05-01 00:00:00", - "y": 22.3 - }, - { - "x": "2018-06-01 00:00:00", - "y": 23.5 - }, - { - "x": "2018-07-01 00:00:00", - "y": 23.8 - }, - { - "x": "2018-08-01 00:00:00", - "y": 23.5 - }, - { - "x": "2019-03-01 00:00:00", - "y": 21.7 - }, - { - "x": "2019-04-01 00:00:00", - "y": 21.7 - }, - { - "x": "2019-05-01 00:00:00", - "y": 21.7 - }, - { - "x": "2019-06-01 00:00:00", - "y": 23.6 - }, - { - "x": "2019-07-01 00:00:00", - "y": 24.4 - }, - { - "x": "2019-08-01 00:00:00", - "y": 23.3 - }, - { - "x": "2020-03-01 00:00:00", - "y": 22 - } - ], - "name": "Chambre_RDC", - "unit": "°C", - "hide": false - }, - "Exterieure_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 18.6 - }, - { - "x": "2012-07-01 00:00:00", - "y": 20.2 - }, - { - "x": "2012-08-01 00:00:00", - "y": 24.7 - }, - { - "x": "2012-09-01 00:00:00", - "y": 23.2 - }, - { - "x": "2012-10-01 00:00:00", - "y": 21.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 13.3 - }, - { - "x": "2012-12-01 00:00:00", - "y": 6.1 - }, - { - "x": "2013-01-01 00:00:00", - "y": 3.3 - }, - { - "x": "2013-02-01 00:00:00", - "y": 1.9 - }, - { - "x": "2013-03-01 00:00:00", - "y": 6.6 - }, - { - "x": "2013-04-01 00:00:00", - "y": 10.2 - }, - { - "x": "2013-05-01 00:00:00", - "y": 11.2 - }, - { - "x": "2013-06-01 00:00:00", - "y": 16.9 - }, - { - "x": "2013-07-01 00:00:00", - "y": 28.9 - }, - { - "x": "2013-10-01 00:00:00", - "y": 16.9 - }, - { - "x": "2013-11-01 00:00:00", - "y": 5.9 - }, - { - "x": "2013-12-01 00:00:00", - "y": 4.5 - }, - { - "x": "2014-01-01 00:00:00", - "y": 6.9 - }, - { - "x": "2014-02-01 00:00:00", - "y": 6.8 - }, - { - "x": "2014-03-01 00:00:00", - "y": 8.3 - }, - { - "x": "2014-04-01 00:00:00", - "y": 11.6 - }, - { - "x": "2014-05-01 00:00:00", - "y": 12 - }, - { - "x": "2014-06-01 00:00:00", - "y": 17.3 - }, - { - "x": "2014-10-01 00:00:00", - "y": 13.5 - }, - { - "x": "2014-11-01 00:00:00", - "y": 9.9 - }, - { - "x": "2014-12-01 00:00:00", - "y": 4.5 - }, - { - "x": "2015-01-01 00:00:00", - "y": 4.4 - }, - { - "x": "2015-02-01 00:00:00", - "y": 4.4 - }, - { - "x": "2015-03-01 00:00:00", - "y": 7.7 - }, - { - "x": "2015-04-01 00:00:00", - "y": 12.4 - }, - { - "x": "2015-05-01 00:00:00", - "y": 14.1 - }, - { - "x": "2015-06-01 00:00:00", - "y": 18.8 - }, - { - "x": "2015-07-01 00:00:00", - "y": 21.5 - }, - { - "x": "2015-08-01 00:00:00", - "y": 20.7 - }, - { - "x": "2015-09-01 00:00:00", - "y": 14.3 - }, - { - "x": "2015-10-01 00:00:00", - "y": 10.4 - }, - { - "x": "2015-11-01 00:00:00", - "y": 9.3 - }, - { - "x": "2015-12-01 00:00:00", - "y": 7.7 - }, - { - "x": "2016-01-01 00:00:00", - "y": 6 - }, - { - "x": "2016-02-01 00:00:00", - "y": 5.6 - }, - { - "x": "2016-03-01 00:00:00", - "y": 6.6 - }, - { - "x": "2016-04-01 00:00:00", - "y": 9.6 - }, - { - "x": "2016-05-01 00:00:00", - "y": 14.5 - }, - { - "x": "2016-06-01 00:00:00", - "y": 17.9 - }, - { - "x": "2016-07-01 00:00:00", - "y": 21.3 - }, - { - "x": "2016-08-01 00:00:00", - "y": 20.4 - }, - { - "x": "2017-03-01 00:00:00", - "y": 14.2 - }, - { - "x": "2017-04-01 00:00:00", - "y": 9.7 - }, - { - "x": "2017-05-01 00:00:00", - "y": 16.8 - }, - { - "x": "2017-06-01 00:00:00", - "y": 23.9 - }, - { - "x": "2017-07-01 00:00:00", - "y": 21.4 - }, - { - "x": "2017-08-01 00:00:00", - "y": 20.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 15.8 - }, - { - "x": "2017-10-01 00:00:00", - "y": 14.2 - }, - { - "x": "2017-11-01 00:00:00", - "y": 7.5 - }, - { - "x": "2017-12-01 00:00:00", - "y": 4.2 - }, - { - "x": "2018-03-01 00:00:00", - "y": 10.2 - }, - { - "x": "2018-04-01 00:00:00", - "y": 17.6 - }, - { - "x": "2018-05-01 00:00:00", - "y": 16.1 - }, - { - "x": "2018-06-01 00:00:00", - "y": 22.4 - }, - { - "x": "2018-07-01 00:00:00", - "y": 30 - }, - { - "x": "2018-08-01 00:00:00", - "y": 19.8 - } - ], - "name": "Exterieure", - "unit": "°C", - "hide": false - }, - "Sejour_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22.8 - }, - { - "x": "2012-07-01 00:00:00", - "y": 23 - }, - { - "x": "2012-08-01 00:00:00", - "y": 25.3 - }, - { - "x": "2012-09-01 00:00:00", - "y": 23.3 - }, - { - "x": "2012-10-01 00:00:00", - "y": 21.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 19.9 - }, - { - "x": "2012-12-01 00:00:00", - "y": 20.1 - }, - { - "x": "2013-01-01 00:00:00", - "y": 20 - }, - { - "x": "2013-02-01 00:00:00", - "y": 15.8 - }, - { - "x": "2013-03-01 00:00:00", - "y": 20.5 - }, - { - "x": "2013-04-01 00:00:00", - "y": 20.8 - }, - { - "x": "2013-05-01 00:00:00", - "y": 20.9 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.9 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20.7 - }, - { - "x": "2014-01-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-02-01 00:00:00", - "y": 19.9 - }, - { - "x": "2014-03-01 00:00:00", - "y": 21.2 - }, - { - "x": "2014-04-01 00:00:00", - "y": 21.7 - }, - { - "x": "2014-05-01 00:00:00", - "y": 22.3 - }, - { - "x": "2014-06-01 00:00:00", - "y": 25.6 - }, - { - "x": "2014-10-01 00:00:00", - "y": 22.8 - }, - { - "x": "2014-11-01 00:00:00", - "y": 20.9 - }, - { - "x": "2014-12-01 00:00:00", - "y": 18 - }, - { - "x": "2015-01-01 00:00:00", - "y": 20 - }, - { - "x": "2015-02-01 00:00:00", - "y": 20 - }, - { - "x": "2015-03-01 00:00:00", - "y": 19.6 - }, - { - "x": "2015-04-01 00:00:00", - "y": 21.8 - }, - { - "x": "2015-05-01 00:00:00", - "y": 20.5 - }, - { - "x": "2015-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2015-07-01 00:00:00", - "y": 21.6 - }, - { - "x": "2015-08-01 00:00:00", - "y": 23.9 - }, - { - "x": "2015-09-01 00:00:00", - "y": 23.1 - }, - { - "x": "2015-10-01 00:00:00", - "y": 21.4 - }, - { - "x": "2015-11-01 00:00:00", - "y": 21.1 - }, - { - "x": "2015-12-01 00:00:00", - "y": 20.1 - }, - { - "x": "2016-01-01 00:00:00", - "y": 20.1 - }, - { - "x": "2016-02-01 00:00:00", - "y": 20.3 - }, - { - "x": "2016-03-01 00:00:00", - "y": 20.2 - }, - { - "x": "2016-04-01 00:00:00", - "y": 19.7 - }, - { - "x": "2016-05-01 00:00:00", - "y": 21.6 - }, - { - "x": "2016-06-01 00:00:00", - "y": 23.2 - }, - { - "x": "2016-07-01 00:00:00", - "y": 24.7 - }, - { - "x": "2016-08-01 00:00:00", - "y": 24.5 - }, - { - "x": "2016-09-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-03-01 00:00:00", - "y": 21.7 - }, - { - "x": "2017-04-01 00:00:00", - "y": 21 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.6 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24 - }, - { - "x": "2017-07-01 00:00:00", - "y": 24.3 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 23.3 - }, - { - "x": "2017-10-01 00:00:00", - "y": 22.6 - }, - { - "x": "2017-11-01 00:00:00", - "y": 20.3 - }, - { - "x": "2017-12-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-01-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-02-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-03-01 00:00:00", - "y": 20.3 - }, - { - "x": "2018-04-01 00:00:00", - "y": 21.6 - }, - { - "x": "2018-05-01 00:00:00", - "y": 22.6 - }, - { - "x": "2018-06-01 00:00:00", - "y": 23.8 - }, - { - "x": "2018-07-01 00:00:00", - "y": 23.9 - }, - { - "x": "2018-08-01 00:00:00", - "y": 23.7 - }, - { - "x": "2019-03-01 00:00:00", - "y": 23.3 - }, - { - "x": "2019-04-01 00:00:00", - "y": 22.7 - }, - { - "x": "2019-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2019-06-01 00:00:00", - "y": 23.8 - }, - { - "x": "2019-07-01 00:00:00", - "y": 24.6 - }, - { - "x": "2019-08-01 00:00:00", - "y": 23.3 - }, - { - "x": "2020-03-01 00:00:00", - "y": 23.5 - } - ], - "name": "Sejour", - "unit": "°C", - "hide": false - }, - "Garage_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 20.2 - }, - { - "x": "2012-07-01 00:00:00", - "y": 19.4 - }, - { - "x": "2012-08-01 00:00:00", - "y": 22.2 - }, - { - "x": "2012-09-01 00:00:00", - "y": 17 - }, - { - "x": "2012-10-01 00:00:00", - "y": 13.8 - }, - { - "x": "2012-11-01 00:00:00", - "y": 9.2 - }, - { - "x": "2012-12-01 00:00:00", - "y": 7.6 - }, - { - "x": "2013-01-01 00:00:00", - "y": 5.3 - }, - { - "x": "2013-02-01 00:00:00", - "y": 3.4 - }, - { - "x": "2013-03-01 00:00:00", - "y": 7.3 - }, - { - "x": "2013-04-01 00:00:00", - "y": 10.7 - }, - { - "x": "2013-05-01 00:00:00", - "y": 12.4 - }, - { - "x": "2013-06-01 00:00:00", - "y": 17.2 - }, - { - "x": "2013-07-01 00:00:00", - "y": 23 - }, - { - "x": "2013-08-01 00:00:00", - "y": 20.2 - }, - { - "x": "2013-09-01 00:00:00", - "y": 17.1 - }, - { - "x": "2013-10-01 00:00:00", - "y": 14.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 8.2 - }, - { - "x": "2013-12-01 00:00:00", - "y": 5.9 - }, - { - "x": "2014-01-01 00:00:00", - "y": 7.9 - }, - { - "x": "2014-02-01 00:00:00", - "y": 7.6 - }, - { - "x": "2014-03-01 00:00:00", - "y": 9 - }, - { - "x": "2014-04-01 00:00:00", - "y": 12.6 - }, - { - "x": "2014-05-01 00:00:00", - "y": 14.2 - }, - { - "x": "2014-06-01 00:00:00", - "y": 21.5 - }, - { - "x": "2014-10-01 00:00:00", - "y": 14.6 - }, - { - "x": "2014-11-01 00:00:00", - "y": 11.2 - }, - { - "x": "2014-12-01 00:00:00", - "y": 6.7 - }, - { - "x": "2015-01-01 00:00:00", - "y": 6.3 - }, - { - "x": "2015-02-01 00:00:00", - "y": 5.1 - }, - { - "x": "2015-03-01 00:00:00", - "y": 8.6 - }, - { - "x": "2015-04-01 00:00:00", - "y": 13.3 - }, - { - "x": "2015-05-01 00:00:00", - "y": 14.2 - }, - { - "x": "2015-06-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-07-01 00:00:00", - "y": 23.2 - }, - { - "x": "2015-08-01 00:00:00", - "y": 21.8 - }, - { - "x": "2015-09-01 00:00:00", - "y": 16.3 - }, - { - "x": "2015-10-01 00:00:00", - "y": 12.5 - }, - { - "x": "2015-11-01 00:00:00", - "y": 10.8 - }, - { - "x": "2015-12-01 00:00:00", - "y": 7.5 - }, - { - "x": "2016-02-01 00:00:00", - "y": 55.6 - }, - { - "x": "2016-03-01 00:00:00", - "y": 8 - }, - { - "x": "2016-04-01 00:00:00", - "y": 11.4 - }, - { - "x": "2016-05-01 00:00:00", - "y": 15.2 - }, - { - "x": "2016-06-01 00:00:00", - "y": 18.5 - }, - { - "x": "2016-07-01 00:00:00", - "y": 21.3 - }, - { - "x": "2016-08-01 00:00:00", - "y": 22.6 - }, - { - "x": "2016-09-01 00:00:00", - "y": 18.8 - }, - { - "x": "2017-03-01 00:00:00", - "y": 15.2 - }, - { - "x": "2017-04-01 00:00:00", - "y": 11.5 - }, - { - "x": "2017-05-01 00:00:00", - "y": 16.7 - }, - { - "x": "2017-06-01 00:00:00", - "y": 21.7 - }, - { - "x": "2017-07-01 00:00:00", - "y": 21.5 - }, - { - "x": "2017-08-01 00:00:00", - "y": 21.1 - }, - { - "x": "2017-09-01 00:00:00", - "y": 16.4 - }, - { - "x": "2017-10-01 00:00:00", - "y": 14.2 - }, - { - "x": "2017-11-01 00:00:00", - "y": 9 - }, - { - "x": "2017-12-01 00:00:00", - "y": 7 - }, - { - "x": "2018-01-01 00:00:00", - "y": 9.3 - }, - { - "x": "2018-02-01 00:00:00", - "y": 4 - }, - { - "x": "2018-03-01 00:00:00", - "y": 9.4 - }, - { - "x": "2018-04-01 00:00:00", - "y": 12.9 - }, - { - "x": "2019-03-01 00:00:00", - "y": 13.9 - }, - { - "x": "2019-04-01 00:00:00", - "y": 14.1 - }, - { - "x": "2019-05-01 00:00:00", - "y": 16.4 - }, - { - "x": "2019-06-01 00:00:00", - "y": 24 - }, - { - "x": "2019-07-01 00:00:00", - "y": 24.2 - }, - { - "x": "2020-03-01 00:00:00", - "y": 21.3 - }, - { - "x": "2020-05-01 00:00:00", - "y": 21 - } - ], - "name": "Garage", - "unit": "°C", - "hide": true - }, - "Soufflage_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22 - }, - { - "x": "2012-07-01 00:00:00", - "y": 22.3 - }, - { - "x": "2012-08-01 00:00:00", - "y": 24.1 - }, - { - "x": "2012-09-01 00:00:00", - "y": 20.7 - }, - { - "x": "2012-10-01 00:00:00", - "y": 18.1 - }, - { - "x": "2012-11-01 00:00:00", - "y": 14.6 - }, - { - "x": "2012-12-01 00:00:00", - "y": 16.5 - }, - { - "x": "2013-01-01 00:00:00", - "y": 16.7 - }, - { - "x": "2013-02-01 00:00:00", - "y": 13.4 - }, - { - "x": "2013-03-01 00:00:00", - "y": 18.2 - }, - { - "x": "2013-04-01 00:00:00", - "y": 19.8 - }, - { - "x": "2013-05-01 00:00:00", - "y": 20.4 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-07-01 00:00:00", - "y": 24.9 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.8 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.3 - }, - { - "x": "2013-10-01 00:00:00", - "y": 20.2 - }, - { - "x": "2013-11-01 00:00:00", - "y": 17 - }, - { - "x": "2013-12-01 00:00:00", - "y": 17.8 - }, - { - "x": "2014-01-01 00:00:00", - "y": 18.3 - }, - { - "x": "2014-02-01 00:00:00", - "y": 17.8 - }, - { - "x": "2014-03-01 00:00:00", - "y": 19.1 - }, - { - "x": "2014-04-01 00:00:00", - "y": 20.7 - }, - { - "x": "2014-11-01 00:00:00", - "y": 24.1 - }, - { - "x": "2014-12-01 00:00:00", - "y": 6.6 - }, - { - "x": "2015-01-01 00:00:00", - "y": 6.4 - }, - { - "x": "2015-02-01 00:00:00", - "y": 4.8 - }, - { - "x": "2015-03-01 00:00:00", - "y": 9.9 - }, - { - "x": "2015-04-01 00:00:00", - "y": 15.3 - }, - { - "x": "2015-05-01 00:00:00", - "y": 15.8 - }, - { - "x": "2015-06-01 00:00:00", - "y": 20.1 - }, - { - "x": "2015-07-01 00:00:00", - "y": 21.8 - }, - { - "x": "2015-08-01 00:00:00", - "y": 21.9 - }, - { - "x": "2015-09-01 00:00:00", - "y": 17.1 - }, - { - "x": "2015-10-01 00:00:00", - "y": 13.2 - }, - { - "x": "2015-11-01 00:00:00", - "y": 12.8 - }, - { - "x": "2015-12-01 00:00:00", - "y": 11.1 - }, - { - "x": "2016-01-01 00:00:00", - "y": 11.7 - }, - { - "x": "2016-02-01 00:00:00", - "y": 11.3 - }, - { - "x": "2017-03-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-04-01 00:00:00", - "y": 18.5 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-07-01 00:00:00", - "y": 23.8 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23 - }, - { - "x": "2017-09-01 00:00:00", - "y": 20.9 - }, - { - "x": "2017-10-01 00:00:00", - "y": 19.3 - }, - { - "x": "2017-11-01 00:00:00", - "y": 14.6 - }, - { - "x": "2017-12-01 00:00:00", - "y": 14.9 - }, - { - "x": "2018-01-01 00:00:00", - "y": 16.4 - }, - { - "x": "2018-02-01 00:00:00", - "y": 13.5 - }, - { - "x": "2018-03-01 00:00:00", - "y": 14.7 - } - ], - "name": "Soufflage", - "unit": "°C", - "hide": true - }, - "Mezzanine_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 23.3 - }, - { - "x": "2012-07-01 00:00:00", - "y": 23.5 - }, - { - "x": "2012-08-01 00:00:00", - "y": 25.9 - }, - { - "x": "2012-09-01 00:00:00", - "y": 23.1 - }, - { - "x": "2012-10-01 00:00:00", - "y": 21.5 - }, - { - "x": "2012-11-01 00:00:00", - "y": 19.7 - }, - { - "x": "2012-12-01 00:00:00", - "y": 19.4 - }, - { - "x": "2013-01-01 00:00:00", - "y": 19 - }, - { - "x": "2013-02-01 00:00:00", - "y": 15.3 - }, - { - "x": "2013-03-01 00:00:00", - "y": 19.9 - }, - { - "x": "2013-04-01 00:00:00", - "y": 20.5 - }, - { - "x": "2013-05-01 00:00:00", - "y": 20.8 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.2 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25.7 - }, - { - "x": "2013-08-01 00:00:00", - "y": 23.1 - }, - { - "x": "2013-09-01 00:00:00", - "y": 23 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 19.5 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20 - }, - { - "x": "2014-01-01 00:00:00", - "y": 20 - }, - { - "x": "2014-02-01 00:00:00", - "y": 19.6 - }, - { - "x": "2014-03-01 00:00:00", - "y": 21.1 - }, - { - "x": "2014-04-01 00:00:00", - "y": 21.6 - }, - { - "x": "2014-05-01 00:00:00", - "y": 22.3 - }, - { - "x": "2014-06-01 00:00:00", - "y": 25.9 - }, - { - "x": "2015-09-01 00:00:00", - "y": 22.7 - }, - { - "x": "2015-10-01 00:00:00", - "y": 21.3 - }, - { - "x": "2015-11-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-12-01 00:00:00", - "y": 19.9 - }, - { - "x": "2016-01-01 00:00:00", - "y": 19.6 - }, - { - "x": "2016-02-01 00:00:00", - "y": 17.6 - }, - { - "x": "2016-03-01 00:00:00", - "y": 19.9 - }, - { - "x": "2016-04-01 00:00:00", - "y": 19.5 - }, - { - "x": "2016-05-01 00:00:00", - "y": 21.6 - }, - { - "x": "2016-06-01 00:00:00", - "y": 23.5 - }, - { - "x": "2016-07-01 00:00:00", - "y": 25.4 - }, - { - "x": "2016-08-01 00:00:00", - "y": 25.1 - }, - { - "x": "2016-09-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-03-01 00:00:00", - "y": 21.8 - }, - { - "x": "2017-04-01 00:00:00", - "y": 20.6 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.8 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24.9 - }, - { - "x": "2017-07-01 00:00:00", - "y": 24.9 - }, - { - "x": "2017-08-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-09-01 00:00:00", - "y": 23.2 - }, - { - "x": "2019-03-01 00:00:00", - "y": 22.7 - }, - { - "x": "2019-04-01 00:00:00", - "y": 22.6 - }, - { - "x": "2019-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2019-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2019-07-01 00:00:00", - "y": 25.6 - }, - { - "x": "2019-08-01 00:00:00", - "y": 23.9 - } - ], - "name": "Mezzanine", - "unit": "°C", - "hide": false - }, - "Extraction_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22 - }, - { - "x": "2012-07-01 00:00:00", - "y": 22.4 - }, - { - "x": "2012-08-01 00:00:00", - "y": 24.6 - }, - { - "x": "2012-09-01 00:00:00", - "y": 21.7 - }, - { - "x": "2012-10-01 00:00:00", - "y": 19.2 - }, - { - "x": "2012-11-01 00:00:00", - "y": 17.3 - }, - { - "x": "2012-12-01 00:00:00", - "y": 18.4 - }, - { - "x": "2013-01-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-02-01 00:00:00", - "y": 16.2 - }, - { - "x": "2013-03-01 00:00:00", - "y": 20.8 - }, - { - "x": "2013-04-01 00:00:00", - "y": 21.4 - }, - { - "x": "2013-05-01 00:00:00", - "y": 21.7 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25.5 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.3 - }, - { - "x": "2013-11-01 00:00:00", - "y": 19.3 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-11-01 00:00:00", - "y": 20.8 - }, - { - "x": "2014-12-01 00:00:00", - "y": 18.8 - }, - { - "x": "2015-01-01 00:00:00", - "y": -90.2 - }, - { - "x": "2017-03-01 00:00:00", - "y": 24 - }, - { - "x": "2017-04-01 00:00:00", - "y": 20.4 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.7 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2017-07-01 00:00:00", - "y": 24.7 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 22.8 - }, - { - "x": "2017-10-01 00:00:00", - "y": 21.8 - }, - { - "x": "2017-11-01 00:00:00", - "y": 17.9 - } - ], - "name": "Extraction", - "unit": "°C", - "hide": true - }, - "Bureau_temperature": { - "data": [ - { - "x": "2012-08-01 00:00:00", - "y": 26 - }, - { - "x": "2012-09-01 00:00:00", - "y": 26.3 - }, - { - "x": "2012-10-01 00:00:00", - "y": 24.8 - }, - { - "x": "2012-11-01 00:00:00", - "y": 24.4 - }, - { - "x": "2012-12-01 00:00:00", - "y": 23.6 - }, - { - "x": "2013-01-01 00:00:00", - "y": 23.9 - }, - { - "x": "2013-02-01 00:00:00", - "y": 18 - }, - { - "x": "2013-03-01 00:00:00", - "y": 23.2 - }, - { - "x": "2013-04-01 00:00:00", - "y": 22.6 - }, - { - "x": "2013-05-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.6 - }, - { - "x": "2013-07-01 00:00:00", - "y": 26.1 - }, - { - "x": "2013-08-01 00:00:00", - "y": 23.9 - }, - { - "x": "2013-09-01 00:00:00", - "y": 23.5 - }, - { - "x": "2013-10-01 00:00:00", - "y": 22.2 - }, - { - "x": "2013-11-01 00:00:00", - "y": 23.7 - }, - { - "x": "2013-12-01 00:00:00", - "y": 23.9 - }, - { - "x": "2014-01-01 00:00:00", - "y": 23.5 - }, - { - "x": "2014-02-01 00:00:00", - "y": 22.7 - }, - { - "x": "2014-03-01 00:00:00", - "y": 22.8 - }, - { - "x": "2014-04-01 00:00:00", - "y": 22.9 - }, - { - "x": "2014-05-01 00:00:00", - "y": 23.6 - }, - { - "x": "2014-06-01 00:00:00", - "y": 27 - }, - { - "x": "2014-10-01 00:00:00", - "y": 24 - }, - { - "x": "2014-11-01 00:00:00", - "y": 22.5 - }, - { - "x": "2014-12-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-01-01 00:00:00", - "y": 23.5 - }, - { - "x": "2015-02-01 00:00:00", - "y": 23.7 - }, - { - "x": "2015-03-01 00:00:00", - "y": 22.4 - }, - { - "x": "2015-04-01 00:00:00", - "y": 23.3 - }, - { - "x": "2015-05-01 00:00:00", - "y": 23.2 - }, - { - "x": "2015-06-01 00:00:00", - "y": 26 - }, - { - "x": "2015-07-01 00:00:00", - "y": 26.3 - }, - { - "x": "2015-08-01 00:00:00", - "y": 24.3 - }, - { - "x": "2015-09-01 00:00:00", - "y": 23.7 - }, - { - "x": "2015-10-01 00:00:00", - "y": 22.6 - }, - { - "x": "2015-11-01 00:00:00", - "y": 22.5 - }, - { - "x": "2015-12-01 00:00:00", - "y": 22 - }, - { - "x": "2016-01-01 00:00:00", - "y": 22.8 - }, - { - "x": "2016-02-01 00:00:00", - "y": 20.8 - }, - { - "x": "2016-03-01 00:00:00", - "y": 22.8 - }, - { - "x": "2016-04-01 00:00:00", - "y": 22.1 - }, - { - "x": "2016-05-01 00:00:00", - "y": 23.1 - }, - { - "x": "2016-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2016-07-01 00:00:00", - "y": 26.3 - }, - { - "x": "2016-08-01 00:00:00", - "y": 26 - }, - { - "x": "2016-09-01 00:00:00", - "y": 24.9 - }, - { - "x": "2017-03-01 00:00:00", - "y": 22.9 - }, - { - "x": "2017-04-01 00:00:00", - "y": 23.9 - }, - { - "x": "2017-05-01 00:00:00", - "y": 24.6 - }, - { - "x": "2017-06-01 00:00:00", - "y": 25.2 - }, - { - "x": "2017-07-01 00:00:00", - "y": 33.8 - }, - { - "x": "2017-08-01 00:00:00", - "y": 38.6 - }, - { - "x": "2017-09-01 00:00:00", - "y": 35.3 - }, - { - "x": "2017-10-01 00:00:00", - "y": 35.2 - }, - { - "x": "2017-11-01 00:00:00", - "y": 36.2 - }, - { - "x": "2017-12-01 00:00:00", - "y": 24.3 - }, - { - "x": "2018-01-01 00:00:00", - "y": 23.6 - }, - { - "x": "2018-02-01 00:00:00", - "y": 24.6 - }, - { - "x": "2018-03-01 00:00:00", - "y": 22.7 - }, - { - "x": "2018-04-01 00:00:00", - "y": 24.8 - }, - { - "x": "2018-05-01 00:00:00", - "y": 26.1 - }, - { - "x": "2018-06-01 00:00:00", - "y": 26.5 - }, - { - "x": "2018-07-01 00:00:00", - "y": 30 - }, - { - "x": "2018-08-01 00:00:00", - "y": 27.5 - }, - { - "x": "2019-03-01 00:00:00", - "y": 25.3 - }, - { - "x": "2019-04-01 00:00:00", - "y": 26.1 - }, - { - "x": "2019-05-01 00:00:00", - "y": 25.2 - }, - { - "x": "2019-06-01 00:00:00", - "y": 27.3 - }, - { - "x": "2019-07-01 00:00:00", - "y": 30.2 - }, - { - "x": "2019-08-01 00:00:00", - "y": 25.6 - }, - { - "x": "2020-03-01 00:00:00", - "y": 36 - }, - { - "x": "2020-04-01 00:00:00", - "y": 35.2 - }, - { - "x": "2020-05-01 00:00:00", - "y": 37.4 - } - ], - "name": "Bureau", - "unit": "°C", - "hide": false - }, - "Temp_Nord_temperature": { - "data": [ - { - "x": "2012-08-01 00:00:00", - "y": 22.9 - }, - { - "x": "2012-09-01 00:00:00", - "y": 15.4 - }, - { - "x": "2012-10-01 00:00:00", - "y": 12.8 - }, - { - "x": "2012-11-01 00:00:00", - "y": 8.5 - }, - { - "x": "2012-12-01 00:00:00", - "y": 18.1 - }, - { - "x": "2013-01-01 00:00:00", - "y": 22 - }, - { - "x": "2013-02-01 00:00:00", - "y": 16.8 - }, - { - "x": "2013-03-01 00:00:00", - "y": 21.2 - }, - { - "x": "2013-04-01 00:00:00", - "y": 21.3 - }, - { - "x": "2013-05-01 00:00:00", - "y": 21.9 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-07-01 00:00:00", - "y": 26.2 - }, - { - "x": "2013-08-01 00:00:00", - "y": 24.5 - }, - { - "x": "2013-09-01 00:00:00", - "y": 23.6 - }, - { - "x": "2013-10-01 00:00:00", - "y": 22 - }, - { - "x": "2013-11-01 00:00:00", - "y": 22.5 - }, - { - "x": "2013-12-01 00:00:00", - "y": 22.7 - }, - { - "x": "2014-01-01 00:00:00", - "y": 22.5 - }, - { - "x": "2014-02-01 00:00:00", - "y": 20.7 - }, - { - "x": "2014-03-01 00:00:00", - "y": 21.5 - }, - { - "x": "2014-04-01 00:00:00", - "y": 22.4 - }, - { - "x": "2014-05-01 00:00:00", - "y": 23.4 - }, - { - "x": "2014-06-01 00:00:00", - "y": 26.8 - }, - { - "x": "2014-10-01 00:00:00", - "y": 23.7 - }, - { - "x": "2014-11-01 00:00:00", - "y": 22.1 - }, - { - "x": "2014-12-01 00:00:00", - "y": 19.2 - } - ], - "name": "Temp_Nord", - "unit": "°C", - "hide": true - }, - "Chambre_RDC_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 63 - }, - { - "x": "2012-07-01 00:00:00", - "y": 59 - }, - { - "x": "2012-08-01 00:00:00", - "y": 56 - }, - { - "x": "2012-09-01 00:00:00", - "y": 54 - }, - { - "x": "2012-10-01 00:00:00", - "y": 59 - }, - { - "x": "2012-11-01 00:00:00", - "y": 67 - }, - { - "x": "2012-12-01 00:00:00", - "y": 62 - }, - { - "x": "2013-01-01 00:00:00", - "y": 46 - }, - { - "x": "2013-02-01 00:00:00", - "y": 42 - }, - { - "x": "2013-03-01 00:00:00", - "y": 44 - }, - { - "x": "2013-04-01 00:00:00", - "y": 47 - }, - { - "x": "2013-05-01 00:00:00", - "y": 50 - }, - { - "x": "2013-06-01 00:00:00", - "y": 56 - }, - { - "x": "2013-07-01 00:00:00", - "y": 60 - }, - { - "x": "2013-08-01 00:00:00", - "y": 59 - }, - { - "x": "2013-09-01 00:00:00", - "y": 59 - }, - { - "x": "2013-10-01 00:00:00", - "y": 62 - }, - { - "x": "2013-11-01 00:00:00", - "y": 49 - }, - { - "x": "2013-12-01 00:00:00", - "y": 45 - }, - { - "x": "2014-01-01 00:00:00", - "y": 52 - }, - { - "x": "2014-02-01 00:00:00", - "y": 48 - }, - { - "x": "2014-03-01 00:00:00", - "y": 47 - }, - { - "x": "2014-04-01 00:00:00", - "y": 48 - }, - { - "x": "2014-05-01 00:00:00", - "y": 53 - }, - { - "x": "2014-06-01 00:00:00", - "y": 63 - }, - { - "x": "2014-10-01 00:00:00", - "y": 57 - }, - { - "x": "2014-11-01 00:00:00", - "y": 56 - }, - { - "x": "2014-12-01 00:00:00", - "y": 47 - }, - { - "x": "2015-01-01 00:00:00", - "y": 47 - }, - { - "x": "2015-02-01 00:00:00", - "y": 43 - }, - { - "x": "2015-03-01 00:00:00", - "y": 47 - }, - { - "x": "2015-04-01 00:00:00", - "y": 47 - }, - { - "x": "2015-05-01 00:00:00", - "y": 46 - }, - { - "x": "2015-06-01 00:00:00", - "y": 56 - }, - { - "x": "2015-07-01 00:00:00", - "y": 54 - }, - { - "x": "2015-08-01 00:00:00", - "y": 59 - }, - { - "x": "2015-09-01 00:00:00", - "y": 54 - }, - { - "x": "2015-10-01 00:00:00", - "y": 57 - }, - { - "x": "2015-11-01 00:00:00", - "y": 59 - }, - { - "x": "2015-12-01 00:00:00", - "y": 63 - }, - { - "x": "2016-01-01 00:00:00", - "y": 64 - }, - { - "x": "2016-02-01 00:00:00", - "y": 59 - }, - { - "x": "2016-03-01 00:00:00", - "y": 55 - }, - { - "x": "2016-04-01 00:00:00", - "y": 53 - }, - { - "x": "2016-05-01 00:00:00", - "y": 52 - }, - { - "x": "2016-06-01 00:00:00", - "y": 61 - }, - { - "x": "2016-07-01 00:00:00", - "y": 58 - }, - { - "x": "2016-08-01 00:00:00", - "y": 52 - }, - { - "x": "2016-09-01 00:00:00", - "y": 54 - }, - { - "x": "2017-03-01 00:00:00", - "y": 56 - }, - { - "x": "2017-04-01 00:00:00", - "y": 51 - }, - { - "x": "2017-05-01 00:00:00", - "y": 58 - }, - { - "x": "2017-06-01 00:00:00", - "y": 60 - }, - { - "x": "2017-07-01 00:00:00", - "y": 60 - }, - { - "x": "2017-08-01 00:00:00", - "y": 59 - }, - { - "x": "2017-09-01 00:00:00", - "y": 55 - }, - { - "x": "2017-10-01 00:00:00", - "y": 54 - }, - { - "x": "2017-11-01 00:00:00", - "y": 60 - }, - { - "x": "2017-12-01 00:00:00", - "y": 49 - }, - { - "x": "2018-01-01 00:00:00", - "y": 51 - }, - { - "x": "2018-02-01 00:00:00", - "y": 43 - }, - { - "x": "2018-03-01 00:00:00", - "y": 44 - }, - { - "x": "2018-04-01 00:00:00", - "y": 49 - }, - { - "x": "2018-05-01 00:00:00", - "y": 59 - }, - { - "x": "2018-06-01 00:00:00", - "y": 61 - }, - { - "x": "2018-07-01 00:00:00", - "y": 56 - }, - { - "x": "2018-08-01 00:00:00", - "y": 51 - }, - { - "x": "2019-03-01 00:00:00", - "y": 41 - }, - { - "x": "2019-04-01 00:00:00", - "y": 43 - }, - { - "x": "2019-05-01 00:00:00", - "y": 50 - }, - { - "x": "2019-06-01 00:00:00", - "y": 57 - }, - { - "x": "2019-07-01 00:00:00", - "y": 52 - }, - { - "x": "2019-08-01 00:00:00", - "y": 48 - }, - { - "x": "2020-03-01 00:00:00", - "y": 51 - } - ], - "name": "Chambre_RDC", - "unit": "%", - "hide": false - }, - "Exterieure_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 63 - }, - { - "x": "2012-07-01 00:00:00", - "y": 59 - }, - { - "x": "2012-08-01 00:00:00", - "y": 50 - }, - { - "x": "2012-09-01 00:00:00", - "y": 49 - }, - { - "x": "2012-10-01 00:00:00", - "y": 53 - }, - { - "x": "2012-11-01 00:00:00", - "y": 69 - }, - { - "x": "2012-12-01 00:00:00", - "y": 82 - }, - { - "x": "2013-01-01 00:00:00", - "y": 85 - }, - { - "x": "2013-02-01 00:00:00", - "y": 80 - }, - { - "x": "2013-03-01 00:00:00", - "y": 72 - }, - { - "x": "2013-04-01 00:00:00", - "y": 67 - }, - { - "x": "2013-05-01 00:00:00", - "y": 74 - }, - { - "x": "2013-06-01 00:00:00", - "y": 70 - }, - { - "x": "2013-07-01 00:00:00", - "y": 40 - }, - { - "x": "2013-10-01 00:00:00", - "y": 75 - }, - { - "x": "2013-11-01 00:00:00", - "y": 84 - }, - { - "x": "2013-12-01 00:00:00", - "y": 74 - }, - { - "x": "2014-01-01 00:00:00", - "y": 79 - }, - { - "x": "2014-02-01 00:00:00", - "y": 74 - }, - { - "x": "2014-03-01 00:00:00", - "y": 65 - }, - { - "x": "2014-04-01 00:00:00", - "y": 66 - }, - { - "x": "2014-05-01 00:00:00", - "y": 67 - }, - { - "x": "2014-06-01 00:00:00", - "y": 68 - }, - { - "x": "2014-10-01 00:00:00", - "y": 76 - }, - { - "x": "2014-11-01 00:00:00", - "y": 79 - }, - { - "x": "2014-12-01 00:00:00", - "y": 82 - }, - { - "x": "2015-01-01 00:00:00", - "y": 81 - }, - { - "x": "2015-02-01 00:00:00", - "y": 70 - }, - { - "x": "2015-03-01 00:00:00", - "y": 69 - }, - { - "x": "2015-04-01 00:00:00", - "y": 60 - }, - { - "x": "2015-05-01 00:00:00", - "y": 82 - }, - { - "x": "2015-06-01 00:00:00", - "y": 68 - }, - { - "x": "2015-07-01 00:00:00", - "y": 55 - }, - { - "x": "2015-08-01 00:00:00", - "y": 59 - }, - { - "x": "2015-09-01 00:00:00", - "y": 65 - }, - { - "x": "2015-10-01 00:00:00", - "y": 74 - }, - { - "x": "2015-11-01 00:00:00", - "y": 75 - }, - { - "x": "2015-12-01 00:00:00", - "y": 69 - }, - { - "x": "2016-01-01 00:00:00", - "y": 78 - }, - { - "x": "2016-02-01 00:00:00", - "y": 76 - }, - { - "x": "2016-03-01 00:00:00", - "y": 67 - }, - { - "x": "2016-04-01 00:00:00", - "y": 67 - }, - { - "x": "2016-05-01 00:00:00", - "y": 64 - }, - { - "x": "2016-06-01 00:00:00", - "y": 68 - }, - { - "x": "2016-07-01 00:00:00", - "y": 54 - }, - { - "x": "2016-08-01 00:00:00", - "y": 48 - }, - { - "x": "2017-03-01 00:00:00", - "y": 49 - }, - { - "x": "2017-04-01 00:00:00", - "y": 46 - }, - { - "x": "2017-05-01 00:00:00", - "y": 48 - }, - { - "x": "2017-06-01 00:00:00", - "y": 41 - }, - { - "x": "2017-07-01 00:00:00", - "y": 48 - }, - { - "x": "2017-08-01 00:00:00", - "y": 62 - }, - { - "x": "2017-09-01 00:00:00", - "y": 54 - }, - { - "x": "2017-10-01 00:00:00", - "y": 56 - }, - { - "x": "2017-11-01 00:00:00", - "y": 59 - }, - { - "x": "2017-12-01 00:00:00", - "y": 62 - }, - { - "x": "2018-03-01 00:00:00", - "y": 50 - }, - { - "x": "2018-04-01 00:00:00", - "y": 41 - }, - { - "x": "2018-05-01 00:00:00", - "y": 61 - }, - { - "x": "2018-06-01 00:00:00", - "y": 43 - }, - { - "x": "2018-07-01 00:00:00", - "y": 35 - }, - { - "x": "2018-08-01 00:00:00", - "y": 37 - } - ], - "name": "Exterieure", - "unit": "%", - "hide": false - }, - "Sejour_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 60 - }, - { - "x": "2012-07-01 00:00:00", - "y": 57 - }, - { - "x": "2012-08-01 00:00:00", - "y": 54 - }, - { - "x": "2012-09-01 00:00:00", - "y": 52 - }, - { - "x": "2012-10-01 00:00:00", - "y": 55 - }, - { - "x": "2012-11-01 00:00:00", - "y": 63 - }, - { - "x": "2012-12-01 00:00:00", - "y": 61 - }, - { - "x": "2013-01-01 00:00:00", - "y": 45 - }, - { - "x": "2013-02-01 00:00:00", - "y": 41 - }, - { - "x": "2013-03-01 00:00:00", - "y": 43 - }, - { - "x": "2013-04-01 00:00:00", - "y": 45 - }, - { - "x": "2013-05-01 00:00:00", - "y": 52 - }, - { - "x": "2013-06-01 00:00:00", - "y": 57 - }, - { - "x": "2013-07-01 00:00:00", - "y": 60 - }, - { - "x": "2013-08-01 00:00:00", - "y": 58 - }, - { - "x": "2013-09-01 00:00:00", - "y": 56 - }, - { - "x": "2013-10-01 00:00:00", - "y": 60 - }, - { - "x": "2013-11-01 00:00:00", - "y": 48 - }, - { - "x": "2013-12-01 00:00:00", - "y": 44 - }, - { - "x": "2014-01-01 00:00:00", - "y": 51 - }, - { - "x": "2014-02-01 00:00:00", - "y": 46 - }, - { - "x": "2014-03-01 00:00:00", - "y": 44 - }, - { - "x": "2014-04-01 00:00:00", - "y": 45 - }, - { - "x": "2014-05-01 00:00:00", - "y": 49 - }, - { - "x": "2014-06-01 00:00:00", - "y": 61 - }, - { - "x": "2014-10-01 00:00:00", - "y": 54 - }, - { - "x": "2014-11-01 00:00:00", - "y": 52 - }, - { - "x": "2014-12-01 00:00:00", - "y": 46 - }, - { - "x": "2015-01-01 00:00:00", - "y": 46 - }, - { - "x": "2015-02-01 00:00:00", - "y": 41 - }, - { - "x": "2015-03-01 00:00:00", - "y": 45 - }, - { - "x": "2015-04-01 00:00:00", - "y": 44 - }, - { - "x": "2015-05-01 00:00:00", - "y": 47 - }, - { - "x": "2015-06-01 00:00:00", - "y": 54 - }, - { - "x": "2015-07-01 00:00:00", - "y": 53 - }, - { - "x": "2015-08-01 00:00:00", - "y": 55 - }, - { - "x": "2015-09-01 00:00:00", - "y": 49 - }, - { - "x": "2015-10-01 00:00:00", - "y": 54 - }, - { - "x": "2015-11-01 00:00:00", - "y": 55 - }, - { - "x": "2015-12-01 00:00:00", - "y": 59 - }, - { - "x": "2016-01-01 00:00:00", - "y": 63 - }, - { - "x": "2016-02-01 00:00:00", - "y": 60 - }, - { - "x": "2016-03-01 00:00:00", - "y": 52 - }, - { - "x": "2016-04-01 00:00:00", - "y": 50 - }, - { - "x": "2016-05-01 00:00:00", - "y": 48 - }, - { - "x": "2016-06-01 00:00:00", - "y": 57 - }, - { - "x": "2016-07-01 00:00:00", - "y": 55 - }, - { - "x": "2016-08-01 00:00:00", - "y": 49 - }, - { - "x": "2016-09-01 00:00:00", - "y": 51 - }, - { - "x": "2017-03-01 00:00:00", - "y": 51 - }, - { - "x": "2017-04-01 00:00:00", - "y": 47 - }, - { - "x": "2017-05-01 00:00:00", - "y": 54 - }, - { - "x": "2017-06-01 00:00:00", - "y": 57 - }, - { - "x": "2017-07-01 00:00:00", - "y": 57 - }, - { - "x": "2017-08-01 00:00:00", - "y": 57 - }, - { - "x": "2017-09-01 00:00:00", - "y": 52 - }, - { - "x": "2017-10-01 00:00:00", - "y": 50 - }, - { - "x": "2017-11-01 00:00:00", - "y": 56 - }, - { - "x": "2017-12-01 00:00:00", - "y": 47 - }, - { - "x": "2018-01-01 00:00:00", - "y": 50 - }, - { - "x": "2018-02-01 00:00:00", - "y": 41 - }, - { - "x": "2018-03-01 00:00:00", - "y": 41 - }, - { - "x": "2018-04-01 00:00:00", - "y": 46 - }, - { - "x": "2018-05-01 00:00:00", - "y": 56 - }, - { - "x": "2018-06-01 00:00:00", - "y": 58 - }, - { - "x": "2018-07-01 00:00:00", - "y": 54 - }, - { - "x": "2018-08-01 00:00:00", - "y": 48 - }, - { - "x": "2019-03-01 00:00:00", - "y": 36 - }, - { - "x": "2019-04-01 00:00:00", - "y": 39 - }, - { - "x": "2019-05-01 00:00:00", - "y": 46 - }, - { - "x": "2019-06-01 00:00:00", - "y": 54 - }, - { - "x": "2019-07-01 00:00:00", - "y": 49 - }, - { - "x": "2019-08-01 00:00:00", - "y": 45 - }, - { - "x": "2020-03-01 00:00:00", - "y": 45 - } - ], - "name": "Sejour", - "unit": "%", - "hide": false - }, - "Soufflage_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 64 - }, - { - "x": "2012-07-01 00:00:00", - "y": 59 - }, - { - "x": "2012-08-01 00:00:00", - "y": 58 - }, - { - "x": "2012-09-01 00:00:00", - "y": 60 - }, - { - "x": "2012-10-01 00:00:00", - "y": 71 - }, - { - "x": "2012-11-01 00:00:00", - "y": 84 - }, - { - "x": "2012-12-01 00:00:00", - "y": 66 - }, - { - "x": "2013-01-01 00:00:00", - "y": 40 - }, - { - "x": "2013-02-01 00:00:00", - "y": 41 - }, - { - "x": "2013-03-01 00:00:00", - "y": 38 - }, - { - "x": "2013-04-01 00:00:00", - "y": 39 - }, - { - "x": "2013-05-01 00:00:00", - "y": 43 - }, - { - "x": "2013-06-01 00:00:00", - "y": 50 - }, - { - "x": "2013-07-01 00:00:00", - "y": 57 - }, - { - "x": "2013-08-01 00:00:00", - "y": 58 - }, - { - "x": "2013-09-01 00:00:00", - "y": 55 - }, - { - "x": "2013-10-01 00:00:00", - "y": 57 - }, - { - "x": "2013-11-01 00:00:00", - "y": 47 - }, - { - "x": "2013-12-01 00:00:00", - "y": 40 - }, - { - "x": "2014-01-01 00:00:00", - "y": 48 - }, - { - "x": "2014-02-01 00:00:00", - "y": 40 - }, - { - "x": "2014-03-01 00:00:00", - "y": 37 - }, - { - "x": "2014-04-01 00:00:00", - "y": 45 - }, - { - "x": "2014-11-01 00:00:00", - "y": 47 - }, - { - "x": "2014-12-01 00:00:00", - "y": 82 - }, - { - "x": "2015-01-01 00:00:00", - "y": 84 - }, - { - "x": "2015-02-01 00:00:00", - "y": 78 - }, - { - "x": "2015-03-01 00:00:00", - "y": 72 - }, - { - "x": "2015-04-01 00:00:00", - "y": 54 - }, - { - "x": "2015-05-01 00:00:00", - "y": 75 - }, - { - "x": "2015-06-01 00:00:00", - "y": 72 - }, - { - "x": "2015-07-01 00:00:00", - "y": 60 - }, - { - "x": "2015-08-01 00:00:00", - "y": 61 - }, - { - "x": "2015-09-01 00:00:00", - "y": 61 - }, - { - "x": "2015-10-01 00:00:00", - "y": 80 - }, - { - "x": "2015-11-01 00:00:00", - "y": 88 - }, - { - "x": "2015-12-01 00:00:00", - "y": 90 - }, - { - "x": "2016-01-01 00:00:00", - "y": 96 - }, - { - "x": "2016-02-01 00:00:00", - "y": 97 - }, - { - "x": "2017-03-01 00:00:00", - "y": 68 - }, - { - "x": "2017-04-01 00:00:00", - "y": 64 - }, - { - "x": "2017-05-01 00:00:00", - "y": 71 - }, - { - "x": "2017-06-01 00:00:00", - "y": 73 - }, - { - "x": "2017-07-01 00:00:00", - "y": 74 - }, - { - "x": "2017-08-01 00:00:00", - "y": 76 - }, - { - "x": "2017-09-01 00:00:00", - "y": 72 - }, - { - "x": "2017-10-01 00:00:00", - "y": 72 - }, - { - "x": "2017-11-01 00:00:00", - "y": 82 - }, - { - "x": "2017-12-01 00:00:00", - "y": 67 - }, - { - "x": "2018-01-01 00:00:00", - "y": 72 - }, - { - "x": "2018-02-01 00:00:00", - "y": 57 - }, - { - "x": "2018-03-01 00:00:00", - "y": 59 - } - ], - "name": "Soufflage", - "unit": "%", - "hide": true - }, - "Mezzanine_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 59 - }, - { - "x": "2012-07-01 00:00:00", - "y": 56 - }, - { - "x": "2012-08-01 00:00:00", - "y": 52 - }, - { - "x": "2012-09-01 00:00:00", - "y": 52 - }, - { - "x": "2012-10-01 00:00:00", - "y": 56 - }, - { - "x": "2012-11-01 00:00:00", - "y": 64 - }, - { - "x": "2012-12-01 00:00:00", - "y": 64 - }, - { - "x": "2013-01-01 00:00:00", - "y": 49 - }, - { - "x": "2013-02-01 00:00:00", - "y": 43 - }, - { - "x": "2013-03-01 00:00:00", - "y": 45 - }, - { - "x": "2013-04-01 00:00:00", - "y": 46 - }, - { - "x": "2013-05-01 00:00:00", - "y": 53 - }, - { - "x": "2013-06-01 00:00:00", - "y": 57 - }, - { - "x": "2013-07-01 00:00:00", - "y": 58 - }, - { - "x": "2013-08-01 00:00:00", - "y": 57 - }, - { - "x": "2013-09-01 00:00:00", - "y": 57 - }, - { - "x": "2013-10-01 00:00:00", - "y": 61 - }, - { - "x": "2013-11-01 00:00:00", - "y": 51 - }, - { - "x": "2013-12-01 00:00:00", - "y": 45 - }, - { - "x": "2014-01-01 00:00:00", - "y": 54 - }, - { - "x": "2014-02-01 00:00:00", - "y": 48 - }, - { - "x": "2014-03-01 00:00:00", - "y": 45 - }, - { - "x": "2014-04-01 00:00:00", - "y": 46 - }, - { - "x": "2014-05-01 00:00:00", - "y": 50 - }, - { - "x": "2014-06-01 00:00:00", - "y": 60 - }, - { - "x": "2015-09-01 00:00:00", - "y": 52 - }, - { - "x": "2015-10-01 00:00:00", - "y": 55 - }, - { - "x": "2015-11-01 00:00:00", - "y": 57 - }, - { - "x": "2015-12-01 00:00:00", - "y": 60 - }, - { - "x": "2016-01-01 00:00:00", - "y": 66 - }, - { - "x": "2016-02-01 00:00:00", - "y": 65 - }, - { - "x": "2016-03-01 00:00:00", - "y": 55 - }, - { - "x": "2016-04-01 00:00:00", - "y": 51 - }, - { - "x": "2016-05-01 00:00:00", - "y": 50 - }, - { - "x": "2016-06-01 00:00:00", - "y": 58 - }, - { - "x": "2016-07-01 00:00:00", - "y": 55 - }, - { - "x": "2016-08-01 00:00:00", - "y": 49 - }, - { - "x": "2016-09-01 00:00:00", - "y": 52 - }, - { - "x": "2017-03-01 00:00:00", - "y": 54 - }, - { - "x": "2017-04-01 00:00:00", - "y": 50 - }, - { - "x": "2017-05-01 00:00:00", - "y": 55 - }, - { - "x": "2017-06-01 00:00:00", - "y": 55 - }, - { - "x": "2017-07-01 00:00:00", - "y": 57 - }, - { - "x": "2017-08-01 00:00:00", - "y": 56 - }, - { - "x": "2017-09-01 00:00:00", - "y": 54 - }, - { - "x": "2019-03-01 00:00:00", - "y": 39 - }, - { - "x": "2019-04-01 00:00:00", - "y": 40 - }, - { - "x": "2019-05-01 00:00:00", - "y": 48 - }, - { - "x": "2019-06-01 00:00:00", - "y": 53 - }, - { - "x": "2019-07-01 00:00:00", - "y": 48 - }, - { - "x": "2019-08-01 00:00:00", - "y": 46 - } - ], - "name": "Mezzanine", - "unit": "%", - "hide": false - }, - "Extraction_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 64 - }, - { - "x": "2012-07-01 00:00:00", - "y": 60 - }, - { - "x": "2012-08-01 00:00:00", - "y": 56 - }, - { - "x": "2012-09-01 00:00:00", - "y": 59 - }, - { - "x": "2012-10-01 00:00:00", - "y": 65 - }, - { - "x": "2012-11-01 00:00:00", - "y": 77 - }, - { - "x": "2012-12-01 00:00:00", - "y": 62 - }, - { - "x": "2013-01-01 00:00:00", - "y": 43 - }, - { - "x": "2013-02-01 00:00:00", - "y": 40 - }, - { - "x": "2013-03-01 00:00:00", - "y": 40 - }, - { - "x": "2013-04-01 00:00:00", - "y": 42 - }, - { - "x": "2013-05-01 00:00:00", - "y": 45 - }, - { - "x": "2013-06-01 00:00:00", - "y": 52 - }, - { - "x": "2013-07-01 00:00:00", - "y": 57 - }, - { - "x": "2013-08-01 00:00:00", - "y": 57 - }, - { - "x": "2013-09-01 00:00:00", - "y": 55 - }, - { - "x": "2013-10-01 00:00:00", - "y": 58 - }, - { - "x": "2013-11-01 00:00:00", - "y": 47 - }, - { - "x": "2013-12-01 00:00:00", - "y": 39 - }, - { - "x": "2014-11-01 00:00:00", - "y": 55 - }, - { - "x": "2014-12-01 00:00:00", - "y": 47 - }, - { - "x": "2015-01-01 00:00:00", - "y": 89 - }, - { - "x": "2017-03-01 00:00:00", - "y": 50 - }, - { - "x": "2017-04-01 00:00:00", - "y": 50 - }, - { - "x": "2017-05-01 00:00:00", - "y": 56 - }, - { - "x": "2017-06-01 00:00:00", - "y": 59 - }, - { - "x": "2017-07-01 00:00:00", - "y": 58 - }, - { - "x": "2017-08-01 00:00:00", - "y": 60 - }, - { - "x": "2017-09-01 00:00:00", - "y": 55 - }, - { - "x": "2017-10-01 00:00:00", - "y": 54 - }, - { - "x": "2017-11-01 00:00:00", - "y": 57 - } - ], - "name": "Extraction", - "unit": "%", - "hide": true - } -} diff --git a/modules/private/websites/papa/maison_bbc_static/favicon.ico b/modules/private/websites/papa/maison_bbc_static/favicon.ico deleted file mode 100644 index 03990f9a1187d7c350f0c0b812b3140d52f19ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmaivF$%&!5Jlgzf>^n0VXKLa<-(@7NUmXOZ(-6YT6hL?3u{3O3y&b=9^z~kK|yeq zH}n5zrdUw&j4_0oD;S3atwYo>uI4TbkzhvGrdnYfVR*8uc4% zW1dPGH3}m!$g)_plOWMf=ixeYWX@WhLqIGp^Ijxg7ll|nS+G(%*t-6vlK;PX^x-go UjfL|J+6&x=aGk(y0natO0BwpQ6951J diff --git a/modules/private/websites/papa/maison_bbc_static/index.html b/modules/private/websites/papa/maison_bbc_static/index.html deleted file mode 100644 index 78c318c..0000000 --- a/modules/private/websites/papa/maison_bbc_static/index.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - Pause - - - - - - - - -
-

Site web en pause !

-
- -

Le site est actuellement en pause.

-
-

Données historiques

-
- - - - -
- -
- - - - diff --git a/modules/private/websites/papa/maison_bbc_static/lamaison.png b/modules/private/websites/papa/maison_bbc_static/lamaison.png deleted file mode 100644 index dad243c2d097b3e893559b93ea396ce64fbbe0cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259991 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 b?ui{9e+l2SlaMuS5L#1N>h%k-u4vVpjEy#7y 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℞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 diff --git a/modules/private/websites/papa/surveillance.nix b/modules/private/websites/papa/surveillance.nix deleted file mode 100644 index a8e5149..0000000 --- a/modules/private/websites/papa/surveillance.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.papa.surveillance; - varDir = "/var/lib/ftp/papa"; - apacheUser = config.services.httpd.Prod.user; -in { - options.myServices.websites.papa.surveillance.enable = lib.mkEnableOption "enable Papa surveillance's website"; - - config = lib.mkIf cfg.enable { - security.acme.certs."ftp".extraDomains."surveillance.maison.bbc.bouya.org" = null; - - services.cron = { - systemCronJobs = let - script = pkgs.writeScript "cleanup-papa" '' - #!${pkgs.stdenv.shell} - d=$(date -d "7 days ago" +%Y%m%d) - for i in /var/lib/ftp/papa/*/20[0-9][0-9][0-9][0-9][0-9][0-9]; do - if [ "$d" -gt $(basename $i) ]; then - rm -rf "$i" - fi - done - ''; - in - [ - '' - 0 6 * * * ${apacheUser} ${script} - '' - ]; - }; - - services.websites.env.production.vhostConfs.papa_surveillance = { - certName = "papa"; - certMainHost = "surveillance.maison.bbc.bouya.org"; - hosts = [ "surveillance.maison.bbc.bouya.org" ]; - root = varDir; - extraConfig = [ - '' - Use Apaxy "${varDir}" "title .duplicity-ignore" - - Use LDAPConnect - Options Indexes - AllowOverride None - Require ldap-group cn=surveillance.maison.bbc.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/patrick_fodella/altermondia.nix b/modules/private/websites/patrick_fodella/altermondia.nix deleted file mode 100644 index 2a41aa3..0000000 --- a/modules/private/websites/patrick_fodella/altermondia.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.patrick_fodella.altermondia; - varDir = "/var/lib/ftp/patrick_fodella/altermondia"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.patrick_fodella.altermondia.enable = lib.mkEnableOption "enable Patrick Fodella Altermondia's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "altermondia.org"; } ]; - - system.activationScripts.patrick_fodella_altermondia = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_altermondia - ''; - }; - systemd.services.phpfpm-patrick_fodella_altermondia.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-patrick_fodella_altermondia.wants = [ "mysql.service" ]; - services.phpfpm.pools.patrick_fodella_altermondia = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_altermondia:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_altermondia"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.patrick_fodella_altermondia = { - certName = "patrick_fodella"; - addToCerts = true; - hosts = ["altermondia.org" "www.altermondia.org" ]; - root = varDir; - extraConfig = [ - '' - Use Stats altermondia.org - - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^altermondia\.org$" [NC] - RewriteRule ^(.+)$ https://altermondia.org$1 [R=302,L] - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_altermondia.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/patrick_fodella/ecolyeu.nix b/modules/private/websites/patrick_fodella/ecolyeu.nix deleted file mode 100644 index 00dab76..0000000 --- a/modules/private/websites/patrick_fodella/ecolyeu.nix +++ /dev/null @@ -1,72 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.patrick_fodella.ecolyeu; - varDir = "/var/lib/ftp/patrick_fodella/ecolyeu_pessicart"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.patrick_fodella.ecolyeu.enable = lib.mkEnableOption "enable Patrick Fodella Ecolyeu's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "ecolyeu-pessicart-nice.fr"; } ]; - - system.activationScripts.patrick_fodella_ecolyeu = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_ecolyeu - ''; - }; - systemd.services.phpfpm-patrick_fodella_ecolyeu.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-patrick_fodella_ecolyeu.wants = [ "mysql.service" ]; - services.phpfpm.pools.patrick_fodella_ecolyeu = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.patrick_fodella_ecolyeu = { - certName = "patrick_fodella"; - certMainHost = "ecolyeu-pessicart-nice.fr"; - hosts = ["ecolyeu-pessicart-nice.fr" "www.ecolyeu-pessicart-nice.fr" ]; - root = varDir; - extraConfig = [ - '' - Use Stats ecolyeu-pessicart-nice.fr - - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^www\.ecolyeu-pessicart-nice\.fr$" [NC] - RewriteRule ^(.+)$ https://www.ecolyeu-pessicart-nice.fr$1 [R=302,L] - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_ecolyeu.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/piedsjaloux/app/default.nix b/modules/private/websites/piedsjaloux/app/default.nix deleted file mode 100644 index 4525a18..0000000 --- a/modules/private/websites/piedsjaloux/app/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, fetchgit, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - version = sources.websites-piedsjaloux-app.version; - pname = "piedsjaloux"; - name = "${pname}-${version}"; - src = sources.websites-piedsjaloux-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - ''; - # /!\ miniatures and data need to be in the same physical dir due to a - # bug in leapt.im (searches for data/../miniatures) - postInstall = '' - cd $out - rm app/config/parameters.yml - ln -sf ${secretsPath} app/config/parameters.yml - rm -rf var/{logs,cache,data,miniatures,tmp} - ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/ - ''; - passthru = { - inherit varDir environment secretsPath; - webRoot = "${app}/web"; - }; - }); -in app diff --git a/modules/private/websites/piedsjaloux/app/php-packages.nix b/modules/private/websites/piedsjaloux/app/php-packages.nix deleted file mode 100644 index 7b99936..0000000 --- a/modules/private/websites/piedsjaloux/app/php-packages.nix +++ /dev/null @@ -1,1009 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl, fetchgit ? null }: -{ - packages = { - "behat/transliterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"; - src = fetchurl { - url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c; - sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0"; - }; - }; - }; - "components/bootstrap" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f"; - src = fetchurl { - url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f; - sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg"; - }; - }; - }; - "components/jquery" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649"; - src = fetchurl { - url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649; - sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb"; - }; - }; - }; - "components/jqueryui" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1"; - src = fetchurl { - url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1; - sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9"; - }; - }; - }; - "composer/ca-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660"; - src = fetchurl { - url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660; - sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p"; - }; - }; - }; - "container-interop/container-interop" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "container-interop-container-interop-79cbf1341c22ec75643d841642dd5d6acd83bdb8"; - src = fetchurl { - url = https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8; - sha256 = "1pxm461g5flcq50yabr01nw8w17n3g7klpman9ps3im4z0604m52"; - }; - }; - }; - "dmishh/settings-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "dmishh-settings-bundle-0ee48b015691694a8dcbd3ee654d33386e7bf478"; - src = fetchurl { - url = https://api.github.com/repos/dmishh/SettingsBundle/zipball/0ee48b015691694a8dcbd3ee654d33386e7bf478; - sha256 = "0m2fw5shvnkqlz0nm27ggpmkipfh377y1hjsw343zv1nn72nxfqf"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5; - sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57; - sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf; - sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d; - sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9; - sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d; - sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927; - sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa"; - }; - }; - }; - "doctrine/doctrine-migrations-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce; - sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn"; - }; - }; - }; - "doctrine/event-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3; - sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a; - sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda; - sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/migrations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6; - sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8; - sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls"; - }; - }; - }; - "doctrine/persistence" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38; - sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7"; - }; - }; - }; - "doctrine/reflection" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6; - sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy"; - }; - }; - }; - "eko/feedbundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "eko-feedbundle-d4e626616d9ccf6527212d3bdda15f9af3838e4f"; - src = fetchurl { - url = https://api.github.com/repos/eko/FeedBundle/zipball/d4e626616d9ccf6527212d3bdda15f9af3838e4f; - sha256 = "145f4mq2bpsdayaiqmgz1asmjx2is4v327h2ny2wp03knnkjvnfq"; - }; - }; - }; - "fig/link-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac; - sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64"; - }; - }; - }; - "gedmo/doctrine-extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27"; - src = fetchurl { - url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27; - sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb"; - }; - }; - }; - "gregwar/captcha" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gregwar-captcha-cf953dd79748406e0292cea8c565399681e4d345"; - src = fetchurl { - url = https://api.github.com/repos/Gregwar/Captcha/zipball/cf953dd79748406e0292cea8c565399681e4d345; - sha256 = "153m7bkhs3drxk0jfbq67a8vr1m13g7isc4ck44k5hyfzpcazb5i"; - }; - }; - }; - "gregwar/captcha-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gregwar-captcha-bundle-c2d5468556890dd25e0b53bd345fc205562c86f7"; - src = fetchurl { - url = https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/c2d5468556890dd25e0b53bd345fc205562c86f7; - sha256 = "04wcvqq457h6v7mzmrar946swd9akk27fmfig4qj8hpxzj250cgk"; - }; - }; - }; - "helios-ag/fm-bbcode-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "helios-ag-fm-bbcode-bundle-d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363"; - src = fetchurl { - url = https://api.github.com/repos/helios-ag/FMBbCodeBundle/zipball/d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363; - sha256 = "13g9ddd2p3nf1vrbkf6l00qdqz89rq6d8l20p68dmiy7mb6kpynl"; - }; - }; - }; - "immae/piedsjaloux-ckeditor-component" = { - targetDir = ""; - src = fetchgit { - name = "immae-piedsjaloux-ckeditor-component-9946db9daaa76448d0e43247472cdedd2a5ea22a"; - url = "https://git.immae.eu/perso/Immae/Projets/packagist/piedsjaloux-ckeditor-component.git"; - rev = "9946db9daaa76448d0e43247472cdedd2a5ea22a"; - sha256 = "183rgl23li3bqsynfmvv2s7jvlmqf6a5pskgrcxlaxcrr0d09n8c"; - }; - }; - "incenteev/composer-parameter-handler" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550"; - src = fetchurl { - url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550; - sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "kriswallsmith/assetic" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1"; - src = fetchurl { - url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1; - sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8"; - }; - }; - }; - "leapt/im-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1"; - src = fetchurl { - url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1; - sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a"; - }; - }; - }; - "luxifer/doctrine-functions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c"; - src = fetchurl { - url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c; - sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9"; - }; - }; - }; - "mjohnson/decoda" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "mjohnson-decoda-8cd0928b78a4bf5ade48b80c934370fc1f5f84a1"; - src = fetchurl { - url = https://api.github.com/repos/milesj/decoda/zipball/8cd0928b78a4bf5ade48b80c934370fc1f5f84a1; - sha256 = "0wcxz9yirz4zir06xvnlchqgppmyasymak06gn46jn6v6c9dsykc"; - }; - }; - }; - "monolog/monolog" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"; - src = fetchurl { - url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266; - sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png"; - }; - }; - }; - "ocramius/package-versions" = { - targetDir = ""; - needsModifyRights = true; - src = composerEnv.buildZipPackage { - name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f; - sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881"; - }; - }; - }; - "ocramius/proxy-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1; - sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn"; - }; - }; - }; - "paragonie/random_compat" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"; - src = fetchurl { - url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95; - sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/link" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562; - sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd; - sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "robloach/component-installer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7"; - src = fetchurl { - url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7; - sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9"; - }; - }; - }; - "sensio/distribution-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b; - sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a; - sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck"; - }; - }; - }; - "sensiolabs/security-checker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1; - sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi"; - }; - }; - }; - "swiftmailer/swiftmailer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950"; - src = fetchurl { - url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950; - sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d"; - }; - }; - }; - "symfony/assetic-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c; - sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc"; - }; - }; - }; - "symfony/monolog-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff"; - src = fetchurl { - url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff; - sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7"; - }; - }; - }; - "symfony/polyfill-apcu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2; - sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r"; - }; - }; - }; - "symfony/polyfill-ctype" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19; - sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644; - sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494; - sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi"; - }; - }; - }; - "symfony/polyfill-php56" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af; - sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk"; - }; - }; - }; - "symfony/polyfill-php70" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224; - sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik"; - }; - }; - }; - "symfony/polyfill-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c; - sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i"; - }; - }; - }; - "symfony/swiftmailer-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec"; - src = fetchurl { - url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec; - sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01"; - }; - }; - }; - "symfony/symfony" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412"; - src = fetchurl { - url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412; - sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q"; - }; - }; - }; - "twig/extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202; - sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1; - sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n"; - }; - }; - }; - "zendframework/zend-code" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb; - sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1"; - }; - }; - }; - "zendframework/zend-escaper" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-escaper-31d8aafae982f9568287cb4dce987e6aff8fd074"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074; - sha256 = "16gwqh9zpclc3fmf89cf738mxfh36ar3wdf9i0wvby0g0nhknkd7"; - }; - }; - }; - "zendframework/zend-eventmanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd; - sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n"; - }; - }; - }; - "zendframework/zend-feed" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-feed-6641f4cf3f4586c63f83fd70b6d19966025c8888"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-feed/zipball/6641f4cf3f4586c63f83fd70b6d19966025c8888; - sha256 = "0wl2pf4cq0snlp3gbl2ia662i48yils464qlfqf7gdmbn1ryzcpi"; - }; - }; - }; - "zendframework/zend-http" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-http-2c8aed3d25522618573194e7cc51351f8cd4a45b"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-http/zipball/2c8aed3d25522618573194e7cc51351f8cd4a45b; - sha256 = "1vy6b24ihwv1g08hjnw4pd7c5171g866jnlr3j6fg0xqv79s4dn9"; - }; - }; - }; - "zendframework/zend-loader" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-loader-78f11749ea340f6ca316bca5958eef80b38f9b6c"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-loader/zipball/78f11749ea340f6ca316bca5958eef80b38f9b6c; - sha256 = "056zp0xchc4ckijg969im5him3j4cji6hsy26fiaycwprniaqdmg"; - }; - }; - }; - "zendframework/zend-servicemanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-servicemanager-a1ed6140d0d3ee803fec96582593ed024950067b"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-servicemanager/zipball/a1ed6140d0d3ee803fec96582593ed024950067b; - sha256 = "0s3aplkilrd8b18xh55h9m1yvnp9b6vnlgby4gqhqv8npnxxqir9"; - }; - }; - }; - "zendframework/zend-stdlib" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-stdlib-66536006722aff9e62d1b331025089b7ec71c065"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065; - sha256 = "0cl0lcgqb5aja6iijp0wrclxra57imwsmhkfpahdl2bsgs1inf2f"; - }; - }; - }; - "zendframework/zend-uri" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-uri-3b6463645c6766f78ce537c70cb4fdabee1e725f"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-uri/zipball/3b6463645c6766f78ce537c70cb4fdabee1e725f; - sha256 = "0zkb88y9qbgshm8ys5yjxhz6a7fhxl7waygwn37pqsbvz74mbbvp"; - }; - }; - }; - "zendframework/zend-validator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-validator-f0789b4c4c099afdd2ecc58cc209a26c64bd4f17"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-validator/zipball/f0789b4c4c099afdd2ecc58cc209a26c64bd4f17; - sha256 = "1lwxbr3jlldll4ccw5cn2ny1cbzh279mnfz7m1djqc8qnw16c8jl"; - }; - }; - }; - }; - devPackages = { - "doctrine/data-fixtures" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a; - sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm"; - }; - }; - }; - "doctrine/doctrine-fixtures-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273; - sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf"; - }; - }; - }; - "fzaninotto/faker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d"; - src = fetchurl { - url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d; - sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi"; - }; - }; - }; - "league/factory-muffin" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a"; - src = fetchurl { - url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a; - sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq"; - }; - }; - }; - "league/factory-muffin-faker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426"; - src = fetchurl { - url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426; - sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1"; - }; - }; - }; - "mikey179/vfsStream" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145"; - src = fetchurl { - url = https://github.com/bovigo/vfsStream/archive/v1.6.5.zip; - sha256 = "16vi7ci8nxq5hxnzzjmmia73gdm55qcwn006c6hgdwa3i58dnr4l"; - }; - }; - }; - "phpdocumentor/reflection-common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"; - src = fetchurl { - url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6; - sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2"; - }; - }; - }; - "phpdocumentor/reflection-docblock" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08"; - src = fetchurl { - url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08; - sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x"; - }; - }; - }; - "phpdocumentor/type-resolver" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7"; - src = fetchurl { - url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7; - sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb"; - }; - }; - }; - "phpspec/prophecy" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06"; - src = fetchurl { - url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06; - sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6"; - }; - }; - }; - "phpunit/php-code-coverage" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979; - sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d"; - }; - }; - }; - "phpunit/php-file-iterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4; - sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060"; - }; - }; - }; - "phpunit/php-text-template" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686; - sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76"; - }; - }; - }; - "phpunit/php-timer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f; - sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr"; - }; - }; - }; - "phpunit/php-token-stream" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16; - sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk"; - }; - }; - }; - "phpunit/phpunit" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517; - sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6"; - }; - }; - }; - "phpunit/phpunit-mock-objects" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983; - sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i"; - }; - }; - }; - "sebastian/comparator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be; - sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq"; - }; - }; - }; - "sebastian/diff" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4; - sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6"; - }; - }; - }; - "sebastian/environment" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea; - sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0"; - }; - }; - }; - "sebastian/exporter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4; - sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn"; - }; - }; - }; - "sebastian/global-state" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4; - sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb"; - }; - }; - }; - "sebastian/recursion-context" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7; - sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm"; - }; - }; - }; - "sebastian/version" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6; - sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz"; - }; - }; - }; - "sensio/generator-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65; - sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3"; - }; - }; - }; - "symfony/phpunit-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5; - sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj"; - }; - }; - }; - "webmozart/assert" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9"; - src = fetchurl { - url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9; - sha256 = "04w7rrjy43k93376an7xhnxqn2ibbw5fra7rqky7j1dl1f0hkn6d"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/piedsjaloux/integration.nix b/modules/private/websites/piedsjaloux/integration.nix deleted file mode 100644 index 3502964..0000000 --- a/modules/private/websites/piedsjaloux/integration.nix +++ /dev/null @@ -1,135 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.piedsjaloux.integration; - webRoot = "/var/lib/ftp/immae/piedsjaloux/web"; - cfg = config.myServices.websites.piedsjaloux.integration; - pcfg = config.services.phpApplication; - texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; }; -in { - options.myServices.websites.piedsjaloux.integration.enable = lib.mkEnableOption "enable PiedsJaloux's website in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.piedsjaloux_integration = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - inherit webRoot; - varDir = "/var/lib/ftp/immae/piedsjaloux_var"; - varDirPaths = { - "tmp" = "0700"; - }; - app = "/var/lib/ftp/immae/piedsjaloux"; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - PATH = lib.makeBinPath [ - pkgs.apg pkgs.unzip - # below ones don't need to be in the PATH but they’re used in - # secrets - pkgs.imagemagick texlive - ]; - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/piedsjaloux/integration" - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/piedsjaloux/integration" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - pdflatex: "${texlive}/bin/pdflatex" - leapt_im: - binary_path: ${pkgs.imagemagick}/bin - ''; - }; - - services.websites.env.integration.vhostConfs.piedsjaloux_integration = { - certName = "integration"; - addToCerts = true; - hosts = [ "test.pj.immae.dev" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_integration}|fcgi://localhost" - - - - Use LDAPConnect - Require ldap-group cn=pj.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/piedsjaloux/production.nix b/modules/private/websites/piedsjaloux/production.nix deleted file mode 100644 index 422c7f0..0000000 --- a/modules/private/websites/piedsjaloux/production.nix +++ /dev/null @@ -1,106 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.piedsjaloux.production; - app = pkgs.callPackage ./app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/piedsjaloux_production"; - secretsPath = config.secrets.fullPaths."websites/piedsjaloux/production"; - }; - cfg = config.myServices.websites.piedsjaloux.production; - pcfg = config.services.phpApplication; - texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; }; -in { - options.myServices.websites.piedsjaloux.production.enable = lib.mkEnableOption "enable PiedsJaloux's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "piedsjaloux.fr"; } ]; - services.phpApplication.apps.piedsjaloux_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - inherit (app) webRoot varDir; - varDirPaths = { - "tmp" = "0700"; - }; - inherit app; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpEnv = { - PATH = lib.makeBinPath [ - pkgs.apg pkgs.unzip - # below ones don't need to be in the PATH but they’re used in - # secrets - pkgs.imagemagick texlive - ]; - }; - phpWatchFiles = [ - app.secretsPath - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/piedsjaloux/production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - pdflatex: "${texlive}/bin/pdflatex" - leapt_im: - binary_path: ${pkgs.imagemagick}/bin - ''; - }; - - services.websites.env.production.vhostConfs.piedsjaloux_production = { - certName = "piedsjaloux"; - certMainHost = "piedsjaloux.fr"; - hosts = [ "piedsjaloux.fr" "www.piedsjaloux.fr" ]; - root = app.webRoot; - extraConfig = [ - '' - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^www.piedsjaloux\.fr$" [NC] - RewriteRule ^(.+)$ https://www.piedsjaloux.fr$1 [R=302,L] - - - SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_production}|fcgi://localhost" - - - Use Stats piedsjaloux.fr - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/ressourcerie_banon/cloud.nix b/modules/private/websites/ressourcerie_banon/cloud.nix deleted file mode 100644 index 5179218..0000000 --- a/modules/private/websites/ressourcerie_banon/cloud.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.ressourcerie_banon.cloud; - nextcloud = config.myServices.tools.cloud.farm.package; -in { - options.myServices.websites.ressourcerie_banon.cloud.enable = lib.mkEnableOption "enable Ressourcerie Banon’s cloud"; - - config = lib.mkIf cfg.enable { - myServices.tools.cloud.farm.instances = [ "ressourcerie_banon" ]; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.ressourcerie_banon_cloud = { - certName = "ressourcerie_banon"; - addToCerts = true; - hosts = ["cloud.le-garage-autonome.org"]; - root = nextcloud; - extraConfig = [ config.myServices.tools.cloud.farm.vhosts.ressourcerie_banon ]; - }; - }; -} - diff --git a/modules/private/websites/ressourcerie_banon/cryptpad.nix b/modules/private/websites/ressourcerie_banon/cryptpad.nix deleted file mode 100644 index 7aea728..0000000 --- a/modules/private/websites/ressourcerie_banon/cryptpad.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.ressourcerie_banon.cryptpad; - envCfg = config.myEnv.tools.cryptpad.ressourcerie_banon; - port = envCfg.port; - configFile = pkgs.writeText "config.js" '' - // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js - module.exports = { - httpUnsafeOrigin: 'https://${domain}', - httpPort: ${toString port}, - adminEmail: '${envCfg.email}', - filePath: './datastore/', - archivePath: './data/archive', - pinPath: './data/pins', - taskPath: './data/tasks', - blockPath: './block', - blobPath: './blob', - blobStagingPath: './data/blobstage', - decreePath: './data/decrees', - logPath: './data/logs', - logToStdout: false, - logLevel: 'info', - logFeedback: false, - verbose: false, - inactiveTime: false, - adminKeys: ${builtins.toJSON envCfg.admins}, - }; - ''; - domain = "pad.le-garage-autonome.org"; -in { - options.myServices.websites.ressourcerie_banon.cryptpad.enable = lib.mkEnableOption "Enable Ressourcerie Banon’s cryptpad"; - - config = lib.mkIf cfg.enable { - myServices.tools.cryptpad.farm.hosts.ressourcerie_banon = { - inherit domain port; - config = configFile; - }; - services.websites.env.production.modules = [ "proxy_wstunnel" ]; - services.websites.env.production.vhostConfs.ressourcerie_banon_cryptpad = { - certName = "ressourcerie_banon"; - addToCerts = true; - hosts = [domain]; - root = config.myServices.tools.cryptpad.farm.vhostRoots.ressourcerie_banon; - extraConfig = [ - config.myServices.tools.cryptpad.farm.vhosts.ressourcerie_banon - ]; - }; - }; -} diff --git a/modules/private/websites/ressourcerie_banon/production.nix b/modules/private/websites/ressourcerie_banon/production.nix deleted file mode 100644 index fa00d92..0000000 --- a/modules/private/websites/ressourcerie_banon/production.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.ressourcerie_banon.production; - varDir = "/var/lib/ftp/ressourcerie_banon"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.ressourcerie_banon.production.enable = lib.mkEnableOption "enable Ressourcerie Banon's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "ressourcerie-banon.org"; } ]; - - system.activationScripts.ressourcerie_banon = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/ressourcerie_banon - ''; - }; - systemd.services.phpfpm-ressourcerie_banon.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-ressourcerie_banon.wants = [ "mysql.service" ]; - services.phpfpm.pools.ressourcerie_banon = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/ressourcerie_banon:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/ressourcerie_banon"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.ressourcerie_banon = { - certName = "ressourcerie_banon"; - certMainHost = "ressourcerie-banon.org"; - hosts = ["ressourcerie-banon.org" "www.ressourcerie-banon.org" "ressourcerie-sault.org" "www.ressourcerie-sault.org" "le-garage-autonome.org" - "www.le-garage-autonome.org"]; - root = varDir; - extraConfig = [ - '' - Use Stats ressourcerie-banon.org - - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^ressourcerie-banon\.org$" [NC] - RewriteRule ^(.+)$ https://ressourcerie-banon.org$1 [R=302,L] - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.ressourcerie_banon.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/richie/production.nix b/modules/private/websites/richie/production.nix deleted file mode 100644 index a548cff..0000000 --- a/modules/private/websites/richie/production.nix +++ /dev/null @@ -1,106 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.richie.production; - vardir = "/var/lib/richie_production"; - richieSrc = pkgs.stdenv.mkDerivation rec { - version = pkgs.sources.websites-richie-app.version; - pname = "richie"; - name = "${pname}-${version}"; - src = pkgs.sources.websites-richie-app; - phases = "installPhase"; - installPhase = '' - cp -a $src $out - chmod -R u+w $out - ln -sf ${vardir}/files $out/ - ln -sf ${vardir}/drapeaux $out/images/ - ln -sf ${vardir}/photos $out/ - sed -i "s@localedef --list-archive@localedef --list-archive /run/current-system/sw/lib/locale/locale-archive@" $out/admin/parametres.php - ''; - }; - secretPath = config.secrets.fullPaths."websites/richie/production"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in -{ - options.myServices.websites.richie.production.enable = lib.mkEnableOption "enable Richie's website"; - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "europe-richie.org"; } ]; - - secrets.keys."websites/richie/production" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = with config.myEnv.websites.richie; '' - Auth('${smtp_mailer.user}', '${smtp_mailer.password}'); - ?> - ''; - }; - system.activationScripts.richie_production = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/richie_production - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${vardir} - ''; - }; - services.phpfpm.pools.richie_production = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "${vardir}:/var/lib/php/sessions/richie_production:${secretPath}:${richieSrc}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/richie_production"; - }; - phpEnv = { - PATH = "/run/current-system/sw/bin:${lib.makeBinPath [ pkgs.imagemagick ]}"; - BDD_CONNECT = secretPath; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - date.timezone = 'Europe/Paris' - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.richie_production = { - certName = "richie"; - addToCerts = true; - certMainHost = "europe-richie.org"; - hosts = [ "europe-richie.org" "www.europe-richie.org" ]; - root = richieSrc; - extraConfig = [ - '' - Use Stats europe-richie.org - ErrorDocument 404 /404.html - - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.richie_production.socket}|fcgi://localhost" - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/syden/peertube.nix b/modules/private/websites/syden/peertube.nix deleted file mode 100644 index 64d4a5d..0000000 --- a/modules/private/websites/syden/peertube.nix +++ /dev/null @@ -1,132 +0,0 @@ -{ lib, pkgs, config, ... }: -let - scfg = config.myServices.websites.syden.peertube; - name = "peertube"; - dataDir = "/var/lib/syden_peertube"; - package = (pkgs.mylibs.flakeCompat ../../../../flakes/private/peertube).packages.x86_64-linux.peertube_syden; - env = config.myEnv.tools.syden_peertube; -in -{ - options.myServices.websites.syden.peertube.enable = lib.mkEnableOption "enable Syden's website"; - - config = lib.mkIf scfg.enable { - users.users.peertube = { - uid = config.ids.uids.peertube; - group = "peertube"; - description = "Peertube user"; - useDefaultShell = true; - extraGroups = [ "keys" ]; - }; - users.groups.peertube.gid = config.ids.gids.peertube; - - secrets.keys."websites/syden/peertube" = { - user = "peertube"; - group = "peertube"; - permissions = "0640"; - text = '' - listen: - hostname: 'localhost' - port: ${toString env.listenPort} - webserver: - https: true - hostname: 'record-links.immae.eu' - port: 443 - database: - hostname: '${env.postgresql.socket}' - port: 5432 - suffix: '_syden' - username: '${env.postgresql.user}' - password: '${env.postgresql.password}' - pool: - max: 5 - redis: - socket: '${env.redis.socket}' - auth: null - db: ${env.redis.db} - smtp: - transport: sendmail - sendmail: '/run/wrappers/bin/sendmail' - from_address: 'peertube@tools.immae.eu' - storage: - tmp: '${dataDir}/storage/tmp/' - avatars: '${dataDir}/storage/avatars/' - videos: '${dataDir}/storage/videos/' - streaming_playlists: '${dataDir}/storage/streaming-playlists/' - redundancy: '${dataDir}/storage/videos/' - logs: '${dataDir}/storage/logs/' - previews: '${dataDir}/storage/previews/' - thumbnails: '${dataDir}/storage/thumbnails/' - torrents: '${dataDir}/storage/torrents/' - captions: '${dataDir}/storage/captions/' - cache: '${dataDir}/storage/cache/' - plugins: '${dataDir}/storage/plugins/' - client_overrides: '${dataDir}/storage/client-overrides/' - ''; - }; - - services.filesWatcher.syden_peertube = { - restart = true; - paths = [ config.secrets.fullPaths."websites/syden/peertube" ]; - }; - - systemd.services.syden_peertube = { - description = "Peertube"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "postgresql.service" ]; - wants = [ "postgresql.service" ]; - - environment.NODE_CONFIG_DIR = "${dataDir}/config"; - environment.NODE_ENV = "production"; - environment.HOME = package; - - path = [ pkgs.nodejs pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ]; - - script = '' - install -m 0750 -d ${dataDir}/config - ln -sf ${config.secrets.fullPaths."websites/syden/peertube"} ${dataDir}/config/production.yaml - ln -sf ${package}/config/default.yaml ${dataDir}/config/default.yaml - exec npm run start - ''; - - serviceConfig = { - User = "peertube"; - Group = "peertube"; - WorkingDirectory = package; - StateDirectory = "syden_peertube"; - StateDirectoryMode = 0750; - PrivateTmp = true; - ProtectHome = true; - ProtectControlGroups = true; - Restart = "always"; - Type = "simple"; - TimeoutSec = 60; - }; - - unitConfig.RequiresMountsFor = dataDir; - }; - - services.websites.env.production.vhostConfs.syden_peertube = { - certName = "syden"; - addToCerts = true; - certMainHost = "record-links.immae.eu"; - hosts = [ "record-links.immae.eu" ]; - root = null; - extraConfig = [ '' - RewriteEngine On - - RewriteCond %{REQUEST_URI} ^/socket.io [NC] - RewriteCond %{QUERY_STRING} transport=websocket [NC] - RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L] - - RewriteCond %{REQUEST_URI} ^/tracker/socket [NC] - RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L] - - ProxyPass / http://localhost:${toString env.listenPort}/ - ProxyPassReverse / http://localhost:${toString env.listenPort}/ - - ProxyPreserveHost On - RequestHeader set X-Real-IP %{REMOTE_ADDR}s - '' ]; - }; - }; -} diff --git a/modules/private/websites/telio_tortay/production.nix b/modules/private/websites/telio_tortay/production.nix deleted file mode 100644 index 16eca74..0000000 --- a/modules/private/websites/telio_tortay/production.nix +++ /dev/null @@ -1,81 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.telio_tortay.production; - varDir = "/var/lib/ftp/telio_tortay"; - env = config.myEnv.websites.telio_tortay; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.telio_tortay.production.enable = lib.mkEnableOption "enable Telio Tortay's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "telio-tortay.immae.eu"; } ]; - - security.acme.certs."ftp".extraDomains."telio-tortay.immae.eu" = null; - - system.activationScripts.telio_tortay = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/telio_tortay/logs - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/telio_tortay - ''; - }; - systemd.services.phpfpm-telio_tortay.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-telio_tortay.wants = [ "mysql.service" ]; - services.phpfpm.pools.telio_tortay = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/telio_tortay:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/telio_tortay"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.telio_tortay = { - certName = "telio_tortay"; - certMainHost = "telio-tortay.immae.eu"; - hosts = ["telio-tortay.immae.eu" "realistesmedia.fr" "www.realistesmedia.fr" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - Use Stats telio-tortay.immae.eu - ServerAdmin ${env.server_admin} - ErrorLog "${varDir}/logs/error_log" - CustomLog "${varDir}/logs/access_log" combined - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.telio_tortay.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/assets/default.nix b/modules/private/websites/tools/assets/default.nix deleted file mode 100644 index 0eb476d..0000000 --- a/modules/private/websites/tools/assets/default.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.tools.assets; - assets_urls = lib.mapAttrs (k: v: pkgs.fetchurl v) config.myEnv.tools.assets; - assets = pkgs.runCommand "assets" {} ('' - mkdir -p $out - cp -a ${./static}/* $out/ - '' + builtins.concatStringsSep "\n" - (lib.mapAttrsToList (k: v: '' - install -D -m644 -T ${v} $out/${k} - '') assets_urls)); -in -{ - options.myServices.websites.tools.assets = { - enable = lib.mkEnableOption "Enable assets website"; - }; - config = lib.mkIf cfg.enable { - services.websites.env.tools.vhostConfs.assets = { - certName = "eldiron"; - addToCerts = true; - hosts = [ "assets.immae.eu" ]; - root = assets; - extraConfig = [ - '' - Use Apaxy "${assets}" "title" - - Options Indexes FollowSymlinks - AllowOverride None - Require all granted - Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT" - Header always set Cache-Control "public, max-age=31536000, immutable" - Header always set Access-Control-Allow-Origin "*" - Header always set Access-Control-Expose-Headers "*" - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/cloud/default.nix b/modules/private/websites/tools/cloud/default.nix deleted file mode 100644 index 44163de..0000000 --- a/modules/private/websites/tools/cloud/default.nix +++ /dev/null @@ -1,184 +0,0 @@ -{ lib, pkgs, config, ... }: -let - nextcloud = pkgs.webapps.nextcloud.withApps (a: [ - a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts - a.cookbook a.deck a.extract a.files_markdown a.files_readmemd - a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps a.metadata a.music - a.notes a.ocsms a.passman a.polls a.spreed a.tasks - ]); - env = config.myEnv.tools.nextcloud; - varDir = "/var/lib/nextcloud"; - cfg = config.myServices.websites.tools.cloud; - phpFpm = rec { - basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps); - pool = { - "listen.owner" = "wwwrun"; - "listen.group" = "wwwrun"; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[output_buffering]" = "0"; - "php_admin_value[max_execution_time]" = "1800"; - "php_admin_value[zend_extension]" = "opcache"; - #already enabled by default? - #"php_value[opcache.enable]" = "1"; - "php_value[opcache.enable_cli]" = "1"; - "php_value[opcache.interned_strings_buffer]" = "8"; - "php_value[opcache.max_accelerated_files]" = "10000"; - "php_value[opcache.memory_consumption]" = "128"; - "php_value[opcache.save_comments]" = "1"; - "php_value[opcache.revalidate_freq]" = "1"; - "php_admin_value[memory_limit]" = "512M"; - - "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - }; - }; -in { - options.myServices.websites.tools.cloud = { - enable = lib.mkEnableOption "enable cloud website"; - }; - - config = lib.mkIf cfg.enable { - services.websites.env.tools.modules = [ "proxy_fcgi" ]; - - services.websites.env.tools.vhostConfs.cloud = { - certName = "eldiron"; - addToCerts = true; - hosts = ["cloud.immae.eu" ]; - root = nextcloud; - extraConfig = [ - '' - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - - AcceptPathInfo On - DirectoryIndex index.php - Options FollowSymlinks - Require all granted - AllowOverride all - - - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" - - - CGIPassAuth on - SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost" - - - - '' - ]; - }; - - secrets.keys."webapps/tools-nextcloud" = { - user = "wwwrun"; - group = "wwwrun"; - permissions = "0600"; - # This file is not actually included, see activationScript below - text = '' - '${env.instance_id}', - 'datadirectory' => '/var/lib/nextcloud/', - 'passwordsalt' => '${env.password_salt}', - 'debug' => false, - 'dbtype' => 'pgsql', - 'version' => implode($OC_Version, '.'), - 'dbname' => '${env.postgresql.database}', - 'dbhost' => '${env.postgresql.socket}', - 'dbtableprefix' => 'oc_', - 'dbuser' => '${env.postgresql.user}', - 'dbpassword' => '${env.postgresql.password}', - 'installed' => true, - 'maxZipInputSize' => 0, - 'allowZipDownload' => true, - 'forcessl' => true, - 'theme' => ${"''"}, - 'maintenance' => false, - 'trusted_domains' => - array ( - 0 => 'cloud.immae.eu', - ), - 'secret' => '${env.secret}', - 'appstoreenabled' => false, - 'appstore.experimental.enabled' => true, - 'loglevel' => 2, - 'trashbin_retention_obligation' => 'auto', - 'htaccess.RewriteBase' => '/', - 'mail_smtpmode' => 'sendmail', - 'mail_smtphost' => '127.0.0.1', - 'mail_smtpname' => ''', - 'mail_smtppassword' => ''', - 'mail_from_address' => 'nextcloud', - 'mail_smtpauth' => false, - 'mail_domain' => 'tools.immae.eu', - 'memcache.local' => '\\OC\\Memcache\\APCu', - 'memcache.locking' => '\\OC\\Memcache\\Redis', - 'filelocking.enabled' => true, - 'redis' => - array ( - 'host' => '${env.redis.socket}', - 'port' => 0, - 'dbindex' => ${env.redis.db}, - ), - 'overwrite.cli.url' => 'https://cloud.immae.eu', - 'ldapIgnoreNamingRules' => false, - 'ldapProviderFactory' => '\\OCA\\User_LDAP\\LDAPProviderFactory', - 'has_rebuilt_cache' => true, - ); - ''; - }; - users.users.root.packages = let - occ = pkgs.writeScriptBin "nextcloud-occ" '' - #! ${pkgs.stdenv.shell} - cd ${nextcloud} - NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \ - exec \ - sudo -E -u wwwrun ${pkgs.php74}/bin/php \ - -c ${pkgs.php74}/etc/php.ini \ - occ $* - ''; - in [ occ ]; - - system.activationScripts.nextcloud = { - deps = [ "secrets" ]; - text = let - confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig; - in - '' - install -m 0755 -o wwwrun -g wwwrun -d ${varDir} - install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions - ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: - "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json" - ) confs)} - #install -D -m 0600 -o wwwrun -g wwwrun -T ${config.secrets.fullPaths."webapps/tools-nextcloud"} ${varDir}/config/config.php - ''; - }; - - services.phpfpm.pools.nextcloud = { - user = "wwwrun"; - group = "wwwrun"; - settings = phpFpm.pool; - phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache ]); - }; - - services.cron = { - enable = true; - systemCronJobs = let - script = pkgs.writeScriptBin "nextcloud-cron" '' - #! ${pkgs.stdenv.shell} - export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive - export PATH=/run/wrappers/bin:$PATH - ${pkgs.php74}/bin/php -d memory_limit=2048M -f ${nextcloud}/cron.php - ''; - in [ - '' - */15 * * * * wwwrun ${script}/bin/nextcloud-cron - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/cloud/farm.nix b/modules/private/websites/tools/cloud/farm.nix deleted file mode 100644 index 7be774c..0000000 --- a/modules/private/websites/tools/cloud/farm.nix +++ /dev/null @@ -1,123 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.tools.cloud.farm; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - nextcloud = (pkgs.webapps.nextcloud.override { varDir = null; }).withApps (a: [ - a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts - a.cookbook a.deck a.extract a.files_markdown a.files_readmemd - a.flowupload a.gpxedit a.gpxpod a.impersonate a.keeweb a.maps - a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed - a.tasks - ]); - toVardir = name: "/var/lib/nextcloud_farm/${name}"; - varDirs = map toVardir cfg.instances; - phpBaseDir = builtins.concatStringsSep ":" ([ nextcloud ] ++ varDirs ++ nextcloud.apps); - toVhost = name: '' - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - SetEnv NEXTCLOUD_CONFIG_DIR "${toVardir name}" - - AcceptPathInfo On - DirectoryIndex index.php - Options FollowSymlinks - Require all granted - AllowOverride all - - - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" - - - CGIPassAuth on - SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud_farm.socket}|fcgi://localhost" - - - - ''; -in -{ - options.myServices.tools.cloud.farm = { - instances = lib.mkOption { - description = "Instances names for the nextcloud Farm"; - default = []; - type = lib.types.listOf lib.types.str; - }; - vhosts = lib.mkOption { - description = "Instance vhosts configs"; - readOnly = true; - type = lib.types.attrsOf lib.types.str; - default = lib.genAttrs cfg.instances toVhost; - }; - package = lib.mkOption { - description = "Nextcloud derivation"; - readOnly = true; - type = lib.types.package; - default = nextcloud; - }; - }; - - config = lib.mkIf (builtins.length cfg.instances > 0) { - system.activationScripts.cloud_farm_vardirs = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs} - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/nextcloud_farm/phpSessions - ''; - }; - systemd.services.phpfpm-nextcloud_farm.after = lib.mkAfter [ "postgresql.service" ]; - systemd.services.phpfpm-nextcloud_farm.wants = [ "postgresql.service" ]; - services.phpfpm.pools.nextcloud_farm = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[output_buffering]" = "0"; - "php_admin_value[max_execution_time]" = "1800"; - "php_admin_value[zend_extension]" = "opcache"; - #already enabled by default? - #"php_value[opcache.enable]" = "1"; - "php_value[opcache.enable_cli]" = "1"; - "php_value[opcache.interned_strings_buffer]" = "8"; - "php_value[opcache.max_accelerated_files]" = "10000"; - "php_value[opcache.memory_consumption]" = "128"; - "php_value[opcache.save_comments]" = "1"; - "php_value[opcache.revalidate_freq]" = "1"; - "php_admin_value[memory_limit]" = "512M"; - - "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/nextcloud_farm/phpSessions"; - }; - phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache ]); - }; - users.users.root.packages = let - toOcc = name: pkgs.writeScriptBin "nextcloud-occ-${name}" '' - #! ${pkgs.stdenv.shell} - cd ${nextcloud} - NEXTCLOUD_CONFIG_DIR="${toVardir name}" \ - exec \ - sudo -E -u wwwrun ${pkgs.php74}/bin/php \ - -c ${pkgs.php74}/etc/php.ini \ - occ $* - ''; - in map toOcc cfg.instances; - services.cron = { - enable = true; - systemCronJobs = let - toScript = name: pkgs.writeScriptBin "nextcloud-cron" '' - #! ${pkgs.stdenv.shell} - export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive - export PATH=/run/wrappers/bin:$PATH - export NEXTCLOUD_CONFIG_DIR="${toVardir name}" - ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php - ''; - toLine = name: '' - */15 * * * * wwwrun ${toScript name}/bin/nextcloud-cron - ''; - in map toLine cfg.instances; - }; - }; -} diff --git a/modules/private/websites/tools/cryptpad/default.nix b/modules/private/websites/tools/cryptpad/default.nix deleted file mode 100644 index 69b9877..0000000 --- a/modules/private/websites/tools/cryptpad/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ config, pkgs, lib, ... }: -let - cfg = config.myServices.websites.tools.cryptpad; - envCfg = config.myEnv.tools.cryptpad.immaeEu; - domain = "cryptpad.immae.eu"; - port = envCfg.port; - configFile = pkgs.writeText "config.js" '' - // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js - module.exports = { - httpUnsafeOrigin: 'https://${domain}', - httpPort: ${toString port}, - adminEmail: '${envCfg.email}', - filePath: './datastore/', - archivePath: './data/archive', - pinPath: './data/pins', - taskPath: './data/tasks', - blockPath: './block', - blobPath: './blob', - blobStagingPath: './data/blobstage', - decreePath: './data/decrees', - logPath: './data/logs', - logToStdout: false, - logLevel: 'info', - logFeedback: false, - verbose: false, - inactiveTime: false, - maxUploadSize: 100 * 1024 * 1024, - adminKeys: ${builtins.toJSON envCfg.admins}, - }; - ''; -in -{ - options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad"; - config = lib.mkIf cfg.enable { - myServices.tools.cryptpad.farm.hosts.immaeEu = { - inherit domain port; - config = configFile; - }; - services.websites.env.tools.modules = [ "proxy_wstunnel" ]; - services.websites.env.tools.vhostConfs.cryptpad = { - certName = "eldiron"; - addToCerts = true; - hosts = [domain]; - root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu; - extraConfig = [ - config.myServices.tools.cryptpad.farm.vhosts.immaeEu - ]; - }; - }; -} diff --git a/modules/private/websites/tools/dav/default.nix b/modules/private/websites/tools/dav/default.nix deleted file mode 100644 index b3aa03d..0000000 --- a/modules/private/websites/tools/dav/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ lib, pkgs, config, ... }: -let - infcloud = rec { - root = pkgs.webapps.infcloud; - vhostConf = '' - Alias /carddavmate ${root} - Alias /caldavzap ${root} - Alias /infcloud ${root} - - AllowOverride All - Options FollowSymlinks - Require all granted - DirectoryIndex index.html - - ''; - }; - davical = pkgs.callPackage ./davical.nix { - env = config.myEnv.tools.davical; - inherit (pkgs.webapps) davical awl; - inherit config; - }; - - cfg = config.myServices.websites.tools.dav; -in { - options.myServices.websites.tools.dav = { - enable = lib.mkEnableOption "enable dav website"; - }; - - config = lib.mkIf cfg.enable { - system.activationScripts.davical = davical.activationScript; - secrets.keys = davical.keys; - services.websites.env.tools.modules = davical.apache.modules; - - services.websites.env.tools.vhostConfs.dav = { - certName = "eldiron"; - addToCerts = true; - hosts = ["dav.immae.eu" ]; - root = ./www; - extraConfig = [ - infcloud.vhostConf - (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket) - ]; - }; - - services.phpfpm.pools = { - davical = { - user = config.services.httpd.Tools.user; - group = config.services.httpd.Tools.group; - settings = davical.phpFpm.pool; - phpPackage = pkgs.php72; - }; - }; - }; -} - diff --git a/modules/private/websites/tools/db/default.nix b/modules/private/websites/tools/db/default.nix deleted file mode 100644 index fc8d989..0000000 --- a/modules/private/websites/tools/db/default.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../../commons/adminer.nix { inherit config; }; - - cfg = config.myServices.websites.tools.db; -in { - options.myServices.websites.tools.db = { - enable = lib.mkEnableOption "enable database's website"; - }; - - config = lib.mkIf cfg.enable { - services.websites.env.tools.modules = adminer.apache.modules; - services.websites.env.tools.vhostConfs.db-1 = { - certName = "eldiron"; - addToCerts = true; - hosts = ["db-1.immae.eu" ]; - root = null; - extraConfig = [ (adminer.apache.vhostConf null) ]; - }; - }; -} diff --git a/modules/private/websites/tools/git/default.nix b/modules/private/websites/tools/git/default.nix deleted file mode 100644 index 8f611ee..0000000 --- a/modules/private/websites/tools/git/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ lib, pkgs, config, ... }: -let - mantisbt = pkgs.callPackage ./mantisbt.nix { - inherit (pkgs.webapps) mantisbt_2 mantisbt_2-plugins; - env = config.myEnv.tools.mantisbt; - inherit config; - }; - gitweb = pkgs.callPackage ./gitweb.nix { - gitoliteDir = config.myServices.gitolite.gitoliteDir; - }; - - cfg = config.myServices.websites.tools.git; -in { - options.myServices.websites.tools.git = { - enable = lib.mkEnableOption "enable git's website"; - }; - - config = lib.mkIf cfg.enable { - secrets.keys = mantisbt.keys; - services.websites.env.tools.modules = - gitweb.apache.modules ++ - mantisbt.apache.modules; - - system.activationScripts.mantisbt = mantisbt.activationScript; - services.websites.env.tools.vhostConfs.git = { - certName = "eldiron"; - addToCerts = true; - hosts = ["git.immae.eu" ]; - root = gitweb.apache.root; - extraConfig = [ - gitweb.apache.vhostConf - (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket) - '' - RewriteEngine on - RewriteCond %{REQUEST_URI} ^/releases - RewriteRule /releases(.*) https://release.immae.eu$1 [P,L] - '' - ]; - }; - services.phpfpm.pools = { - mantisbt = { - user = config.services.httpd.Tools.user; - group = config.services.httpd.Tools.group; - settings = mantisbt.phpFpm.pool; - phpPackage = pkgs.php72; - }; - }; - }; -} diff --git a/modules/private/websites/tools/im/default.nix b/modules/private/websites/tools/im/default.nix deleted file mode 100644 index 94dc4f8..0000000 --- a/modules/private/websites/tools/im/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ config, lib, pkgs, ... }: -let - cfg = config.myServices.websites.tools.im; -in -{ - options.myServices.websites.tools.im = { - enable = lib.mkEnableOption "enable im website"; - }; - - config = lib.mkIf cfg.enable { - services.websites.env.tools.vhostConfs.im = { - certName = "eldiron"; - addToCerts = true; - hosts = ["im.immae.fr"]; - root = ./www; - extraConfig = [ - '' - Alias /glowing-bear ${pkgs.glowing-bear} - Alias /converse ${./www}/converse.html - ProxyPreserveHost On - - ProxyPass http://localhost:5280/bosh - ProxyPassReverse http://localhost:5280/bosh - - - ProxyPass ws://localhost:5280/ws - - ProxyPass /upload http://localhost:5280/upload - ProxyPassReverse /upload http://localhost:5280/upload - ProxyPass /admin http://localhost:5280/admin - ProxyPassReverse /admin http://localhost:5280/admin - ProxyPass /api http://localhost:5280/api - ProxyPassReverse /api http://localhost:5280/api - - AllowOverride none - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/mail/default.nix b/modules/private/websites/tools/mail/default.nix deleted file mode 100644 index 390f7ad..0000000 --- a/modules/private/websites/tools/mail/default.nix +++ /dev/null @@ -1,79 +0,0 @@ -{ lib, pkgs, config, ... }: -let - roundcubemail = pkgs.callPackage ./roundcubemail.nix { - inherit (pkgs.webapps) roundcubemail; - env = config.myEnv.tools.roundcubemail; - inherit config; - }; - rainloop = pkgs.callPackage ./rainloop.nix { - rainloop = pkgs.rainloop-community; - }; - cfg = config.myServices.websites.tools.email; - pcfg = config.services.phpfpm.pools; -in -{ - options.myServices.websites.tools.email = { - enable = lib.mkEnableOption "enable email website"; - }; - - imports = [ - ./mta-sts.nix - ]; - - config = lib.mkIf cfg.enable { - secrets.keys = roundcubemail.keys; - - services.websites.env.tools.modules = - [ "proxy_fcgi" ] - ++ rainloop.apache.modules - ++ roundcubemail.apache.modules; - - services.websites.env.tools.vhostConfs.mail = { - certName = "mail"; - addToCerts = true; - hosts = ["mail.immae.eu"]; - root = ./www; - extraConfig = [ - (rainloop.apache.vhostConf pcfg.rainloop.socket) - (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket) - '' - - Require all granted - Options -Indexes - - '' - ]; - }; - systemd.services = { - phpfpm-rainloop = { - after = lib.mkAfter rainloop.phpFpm.serviceDeps; - wants = rainloop.phpFpm.serviceDeps; - }; - phpfpm-roundcubemail = { - after = lib.mkAfter roundcubemail.phpFpm.serviceDeps; - wants = roundcubemail.phpFpm.serviceDeps; - }; - }; - - services.phpfpm.pools.roundcubemail = { - user = "wwwrun"; - group = "wwwrun"; - settings = roundcubemail.phpFpm.pool; - phpOptions = config.services.phpfpm.phpOptions + '' - date.timezone = 'CET' - ''; - phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]); - }; - services.phpfpm.pools.rainloop = { - user = "wwwrun"; - group = "wwwrun"; - settings = rainloop.phpFpm.pool; - phpPackage = pkgs.php72; - }; - system.activationScripts = { - roundcubemail = roundcubemail.activationScript; - rainloop = rainloop.activationScript; - }; - }; - -} diff --git a/modules/private/websites/tools/tools/adminer.nix b/modules/private/websites/tools/tools/adminer.nix deleted file mode 100644 index c280684..0000000 --- a/modules/private/websites/tools/tools/adminer.nix +++ /dev/null @@ -1,46 +0,0 @@ -{ webapps, php74, myPhpPackages, lib, forcePhpSocket ? null }: -rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/adminer - ''; - }; - webRoot = webapps.adminer; - phpFpm = rec { - user = apache.user; - group = apache.group; - phpPackage = php74.withExtensions ({ enabled, all }: (lib.remove all.mysqli enabled) ++ [myPhpPackages.mysqli_pam]); - settings = { - "listen.owner" = apache.user; - "listen.group" = apache.group; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - #"php_admin_flag[log_errors]" = "on"; - # Needed to avoid clashes in browser cookies (same domain) - "php_value[session.name]" = "AdminerPHPSESSID"; - "php_admin_value[open_basedir]" = "${webRoot}:/tmp:/var/lib/php/sessions/adminer"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/adminer"; - }; - }; - apache = rec { - user = "wwwrun"; - group = "wwwrun"; - modules = [ "proxy_fcgi" ]; - root = webRoot; - vhostConf = socket: '' - Alias /adminer ${webRoot} - - DirectoryIndex index.php - - SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost" - - - Use LDAPConnect - Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu - Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu - - ''; - }; -} diff --git a/modules/private/websites/tools/tools/csp_reports.nix b/modules/private/websites/tools/tools/csp_reports.nix deleted file mode 100644 index 9b3f0cf..0000000 --- a/modules/private/websites/tools/tools/csp_reports.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ env }: -rec { - keys."webapps/tools-csp-reports.conf" = { - user = "wwwrun"; - group = "wwwrun"; - permissions = "0400"; - text = with env.postgresql; '' - env[CSP_REPORT_URI] = "host=${socket} dbname=${database} user=${user} password=${password}" - ''; - }; -} diff --git a/modules/private/websites/tools/tools/dokuwiki.nix b/modules/private/websites/tools/tools/dokuwiki.nix deleted file mode 100644 index aee495a..0000000 --- a/modules/private/websites/tools/tools/dokuwiki.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ lib, stdenv, dokuwiki, dokuwiki-plugins }: -rec { - varDir = "/var/lib/dokuwiki"; - activationScript = { - deps = [ "wrappers" ]; - text = '' - if [ ! -d ${varDir} ]; then - install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ - ${varDir}/animals - cp -a ${webRoot}/conf.dist ${varDir}/conf - cp -a ${webRoot}/data.dist ${varDir}/data - cp -a ${webRoot}/ - chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data - chmod -R 755 ${varDir}/config ${varDir}/data - fi - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions - ''; - }; - webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]); - apache = rec { - user = "wwwrun"; - group = "wwwrun"; - modules = [ "proxy_fcgi" ]; - root = webRoot; - vhostConf = socket: '' - Alias /dokuwiki "${root}" - - DirectoryIndex index.php - - SetHandler "proxy:unix:${socket}|fcgi://localhost" - - - AllowOverride All - Options +FollowSymlinks - Require all granted - - ''; - }; - phpFpm = rec { - serviceDeps = [ "openldap.service" ]; - basedir = builtins.concatStringsSep ":" ( - [ webRoot varDir ] ++ webRoot.plugins); - pool = { - "listen.owner" = apache.user; - "listen.group" = apache.group; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - # Needed to avoid clashes in browser cookies (same domain) - "php_value[session.name]" = "DokuwikiPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - }; - }; -} diff --git a/modules/private/websites/tools/tools/landing.nix b/modules/private/websites/tools/tools/landing.nix deleted file mode 100644 index 2acc323..0000000 --- a/modules/private/websites/tools/tools/landing.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ sources, stdenv, yarn2nix-moretea }: -let - yarnModules = yarn2nix-moretea.mkYarnModules rec { - name = "landing"; - pname = name; - version = "v1.0.0"; - packageJSON = "${sources.webapps-landing}/package.json"; - yarnLock = "${sources.webapps-landing}/yarn.lock"; - yarnNix = ./landing/yarn-packages.nix; - }; -in - stdenv.mkDerivation rec { - pname = "landing"; - version = "v1.0.0"; - src = sources.webapps-landing; - - buildInputs = [ yarnModules yarn2nix-moretea.yarn ]; - configurePhase = '' - ln -s ${yarnModules}/node_modules . - ''; - buildPhase = '' - yarn build - ''; - installPhase = '' - cp -a dist $out - cp ${./landing}/*.php $out/ - ln -s service-worker.js $out/worker.js - ''; - } diff --git a/modules/private/websites/tools/tools/landing/report_csp_violation.php b/modules/private/websites/tools/tools/landing/report_csp_violation.php deleted file mode 100644 index 30140b2..0000000 --- a/modules/private/websites/tools/tools/landing/report_csp_violation.php +++ /dev/null @@ -1,22 +0,0 @@ - ${cfg.dataDir}/schedule.yml - fi - ./bin/bundle exec rails db:migrate - ''; - - script = '' - exec ${cfg.workdir}/script/server - ''; - - serviceConfig = { - User = cfg.user; - PrivateTmp = true; - Restart = "always"; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StandardInput = "null"; - KillMode = "control-group"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - }; -} diff --git a/modules/webapps/etherpad-lite.nix b/modules/webapps/etherpad-lite.nix deleted file mode 100644 index 2e09952..0000000 --- a/modules/webapps/etherpad-lite.nix +++ /dev/null @@ -1,162 +0,0 @@ -{ lib, pkgs, config, ... }: -let - name = "etherpad-lite"; - cfg = config.services.etherpad-lite; - - uid = config.ids.uids.etherpad-lite; - gid = config.ids.gids.etherpad-lite; -in -{ - options.services.etherpad-lite = { - enable = lib.mkEnableOption "Enable Etherpad lite’s service"; - user = lib.mkOption { - type = lib.types.str; - default = name; - description = "User account under which Etherpad lite runs"; - }; - group = lib.mkOption { - type = lib.types.str; - default = name; - description = "Group under which Etherpad lite runs"; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/${name}"; - description = '' - The directory where Etherpad lite stores its data. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/${name}"; - description = '' - The directory where Etherpad lite stores its sockets. - ''; - }; - configFile = lib.mkOption { - type = lib.types.path; - description = '' - The config file path for Etherpad lite. - ''; - }; - sessionKeyFile = lib.mkOption { - type = lib.types.path; - description = '' - The Session key file path for Etherpad lite. - ''; - }; - apiKeyFile = lib.mkOption { - type = lib.types.path; - description = '' - The API key file path for Etherpad lite. - ''; - }; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.webapps.etherpad-lite; - description = '' - Etherpad lite package to use. - ''; - example = lib.literalExample '' - pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]); - ''; - }; - modules = lib.mkOption { - type = lib.types.listOf lib.types.package; - default = []; - description = '' - Etherpad lite modules to use. - DEPRECATED: use package directly - ''; - }; - # Output variables - workdir = lib.mkOption { - type = lib.types.package; - default = cfg.package.withModules (_: cfg.modules); - description = '' - Adjusted Etherpad lite package with plugins - ''; - readOnly = true; - }; - systemdStateDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if varDir is outside of /var/lib - default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; - lib.strings.removePrefix "/var/lib/" cfg.dataDir; - description = '' - Adjusted Etherpad lite data directory for systemd - ''; - readOnly = true; - }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Etherpad lite sockets directory for systemd - ''; - readOnly = true; - }; - sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - node = "${cfg.socketsDir}/etherpad-lite.sock"; - }; - readOnly = true; - description = '' - Etherpad lite sockets - ''; - }; - }; - - config = lib.mkIf cfg.enable { - systemd.services.etherpad-lite = { - description = "Etherpad-lite"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "postgresql.service" ]; - wants = [ "postgresql.service" ]; - - environment.NODE_ENV = "production"; - environment.HOME = cfg.workdir; - - path = [ pkgs.nodejs ]; - - script = '' - exec ${pkgs.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \ - --sessionkey ${cfg.sessionKeyFile} \ - --apikey ${cfg.apiKeyFile} \ - --settings ${cfg.configFile} - ''; - - postStart = '' - while [ ! -S ${cfg.sockets.node} ]; do - sleep 0.5 - done - chmod a+w ${cfg.sockets.node} - ''; - serviceConfig = { - DynamicUser = true; - User = cfg.user; - Group = cfg.group; - WorkingDirectory = cfg.workdir; - PrivateTmp = true; - NoNewPrivileges = true; - PrivateDevices = true; - ProtectHome = true; - ProtectControlGroups = true; - ProtectKernelModules = true; - Restart = "always"; - Type = "simple"; - TimeoutSec = 60; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StateDirectory= cfg.systemdStateDirectory; - ExecStartPre = [ - "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized" - "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}" - ]; - }; - }; - - }; -} diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix deleted file mode 100644 index df2dbb2..0000000 --- a/modules/webapps/mastodon.nix +++ /dev/null @@ -1,265 +0,0 @@ -{ lib, pkgs, config, ... }: -let - name = "mastodon"; - cfg = config.services.mastodon; - - uid = config.ids.uids.mastodon; - gid = config.ids.gids.mastodon; -in -{ - options.services.mastodon = { - enable = lib.mkEnableOption "Enable Mastodon’s service"; - user = lib.mkOption { - type = lib.types.str; - default = name; - description = "User account under which Mastodon runs"; - }; - group = lib.mkOption { - type = lib.types.str; - default = name; - description = "Group under which Mastodon runs"; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/${name}"; - description = '' - The directory where Mastodon stores its data. - ''; - }; - socketsPrefix = lib.mkOption { - type = lib.types.str; - default = "live"; - description = '' - The prefix to use for Mastodon sockets. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/${name}"; - description = '' - The directory where Mastodon puts runtime files and sockets. - ''; - }; - configFile = lib.mkOption { - type = lib.types.path; - description = '' - The configuration file path for Mastodon. - ''; - }; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.webapps.mastodon; - description = '' - Mastodon package to use. - ''; - }; - # Output variables - workdir = lib.mkOption { - type = lib.types.package; - default = cfg.package.override { varDir = cfg.dataDir; }; - description = '' - Adjusted mastodon package with overriden varDir - ''; - readOnly = true; - }; - systemdStateDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if varDir is outside of /var/lib - default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; - lib.strings.removePrefix "/var/lib/" cfg.dataDir; - description = '' - Adjusted Mastodon data directory for systemd - ''; - readOnly = true; - }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Mastodon sockets directory for systemd - ''; - readOnly = true; - }; - sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - node = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock"; - rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock"; - }; - readOnly = true; - description = '' - Mastodon sockets - ''; - }; - }; - - config = lib.mkIf cfg.enable { - users.users = lib.optionalAttrs (cfg.user == name) { - "${name}" = { - inherit uid; - group = cfg.group; - description = "Mastodon user"; - home = cfg.dataDir; - useDefaultShell = true; - }; - }; - users.groups = lib.optionalAttrs (cfg.group == name) { - "${name}" = { - inherit gid; - }; - }; - - systemd.slices.mastodon = { - description = "Mastodon slice"; - }; - - systemd.services.mastodon-streaming = { - description = "Mastodon Streaming"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "mastodon-web.service" ]; - - environment.NODE_ENV = "production"; - environment.SOCKET = cfg.sockets.node; - - path = [ pkgs.nodejs pkgs.bashInteractive ]; - - script = '' - exec npm run start - ''; - - postStart = '' - while [ ! -S $SOCKET ]; do - sleep 0.5 - done - chmod a+w $SOCKET - ''; - - postStop = '' - rm $SOCKET - ''; - - serviceConfig = { - Slice = "mastodon.slice"; - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 15; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mastodon-web = { - description = "Mastodon Web app"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - environment.RAILS_ENV = "production"; - environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; - environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; - environment.SOCKET = cfg.sockets.rails; - - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ]; - - preStart = '' - install -m 0755 -d ${cfg.dataDir}/tmp/cache - ./bin/bundle exec rails db:migrate - ''; - - script = '' - exec ./bin/bundle exec puma -C config/puma.rb - ''; - - postStart = '' - exec ./bin/tootctl cache clear - ''; - serviceConfig = { - Slice = "mastodon.slice"; - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 60; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mastodon-cleanup = { - description = "Cleanup mastodon"; - startAt = "daily"; - restartIfChanged = false; - - environment.RAILS_ENV = "production"; - environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; - environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; - environment.SOCKET = cfg.sockets.rails; - - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; - - script = '' - exec ./bin/tootctl media remove --days 30 - ''; - - serviceConfig = { - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Type = "oneshot"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mastodon-sidekiq = { - description = "Mastodon Sidekiq"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "mastodon-web.service" ]; - - environment.RAILS_ENV="production"; - environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; - environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; - environment.DB_POOL="5"; - - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ]; - - script = '' - exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push - ''; - - serviceConfig = { - Slice = "mastodon.slice"; - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 15; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - }; -} diff --git a/modules/webapps/mediagoblin.nix b/modules/webapps/mediagoblin.nix deleted file mode 100644 index 3fe5e38..0000000 --- a/modules/webapps/mediagoblin.nix +++ /dev/null @@ -1,231 +0,0 @@ -{ lib, pkgs, config, ... }: -let - name = "mediagoblin"; - cfg = config.services.mediagoblin; - - uid = config.ids.uids.mediagoblin; - gid = config.ids.gids.mediagoblin; - - paste_local = pkgs.writeText "paste_local.ini" '' - [DEFAULT] - debug = false - - [pipeline:main] - pipeline = mediagoblin - - [app:mediagoblin] - use = egg:mediagoblin#app - config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini - /mgoblin_static = ${cfg.package}/mediagoblin/static - - [loggers] - keys = root - - [handlers] - keys = console - - [formatters] - keys = generic - - [logger_root] - level = INFO - handlers = console - - [handler_console] - class = StreamHandler - args = (sys.stderr,) - level = NOTSET - formatter = generic - - [formatter_generic] - format = %(levelname)-7.7s [%(name)s] %(message)s - - [filter:errors] - use = egg:mediagoblin#errors - debug = false - - [server:main] - use = egg:waitress#main - unix_socket = ${cfg.sockets.paster} - unix_socket_perms = 777 - url_scheme = https - ''; -in -{ - options.services.mediagoblin = { - enable = lib.mkEnableOption "Enable Mediagoblin’s service"; - user = lib.mkOption { - type = lib.types.str; - default = name; - description = "User account under which Mediagoblin runs"; - }; - group = lib.mkOption { - type = lib.types.str; - default = name; - description = "Group under which Mediagoblin runs"; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/${name}"; - description = '' - The directory where Mediagoblin stores its data. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/${name}"; - description = '' - The directory where Mediagoblin puts runtime files and sockets. - ''; - }; - configFile = lib.mkOption { - type = lib.types.path; - description = '' - The configuration file path for Mediagoblin. - ''; - }; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.webapps.mediagoblin; - example = lib.literalExample '' - pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]) - ''; - description = '' - Mediagoblin package to use. - ''; - }; - systemdStateDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if varDir is outside of /var/lib - default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; - lib.strings.removePrefix "/var/lib/" cfg.dataDir; - description = '' - Adjusted Mediagoblin data directory for systemd - ''; - readOnly = true; - }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Mediagoblin sockets directory for systemd - ''; - readOnly = true; - }; - sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - paster = "${cfg.socketsDir}/mediagoblin.sock"; - }; - readOnly = true; - description = '' - Mediagoblin sockets - ''; - }; - pids = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - paster = "${cfg.socketsDir}/mediagoblin.pid"; - celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid"; - }; - readOnly = true; - description = '' - Mediagoblin pid files - ''; - }; - }; - - config = lib.mkIf cfg.enable { - users.users = lib.optionalAttrs (cfg.user == name) { - "${name}" = { - inherit uid; - group = cfg.group; - description = "Mediagoblin user"; - home = cfg.dataDir; - useDefaultShell = true; - }; - }; - users.groups = lib.optionalAttrs (cfg.group == name) { - "${name}" = { - inherit gid; - }; - }; - - systemd.slices.mediagoblin = { - description = "Mediagoblin slice"; - }; - systemd.services.mediagoblin-web = { - description = "Mediagoblin service"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - wants = [ "postgresql.service" "redis.service" ]; - - environment.SCRIPT_NAME = "/mediagoblin/"; - - script = '' - exec ./bin/paster serve \ - ${paste_local} \ - --pid-file=${cfg.pids.paster} - ''; - preStop = '' - exec ./bin/paster serve \ - --pid-file=${cfg.pids.paster} \ - ${paste_local} stop - ''; - preStart = '' - if [ -d ${cfg.dataDir}/plugin_static/ ]; then - rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth - ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth - fi - ./bin/gmg -cf ${cfg.configFile} dbupdate - ''; - - serviceConfig = { - Slice = "mediagoblin.slice"; - User = cfg.user; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 15; - Type = "simple"; - WorkingDirectory = cfg.package; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StateDirectory= cfg.systemdStateDirectory; - PIDFile = cfg.pids.paster; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mediagoblin-celeryd = { - description = "Mediagoblin service"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "mediagoblin-web.service" ]; - - environment.MEDIAGOBLIN_CONFIG = cfg.configFile; - environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery"; - - script = '' - exec ./bin/celery worker \ - --logfile=${cfg.dataDir}/celery.log \ - --loglevel=INFO - ''; - - serviceConfig = { - Slice = "mediagoblin.slice"; - User = cfg.user; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 60; - Type = "simple"; - WorkingDirectory = cfg.package; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StateDirectory= cfg.systemdStateDirectory; - PIDFile = cfg.pids.celery; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - }; -} diff --git a/modules/websites/default.nix b/modules/websites/default.nix deleted file mode 100644 index 6658c66..0000000 --- a/modules/websites/default.nix +++ /dev/null @@ -1,281 +0,0 @@ -{ lib, config, pkgs, ... }: with lib; -let - cfg = config.services.websites; -in -{ - options.services.websites = with types; { - certs = mkOption { - description = "Default websites configuration for certificates as accepted by acme"; - }; - env = mkOption { - default = {}; - description = "Each type of website to enable will target a distinct httpd server"; - type = attrsOf (submodule { - options = { - enable = mkEnableOption "Enable websites of this type"; - adminAddr = mkOption { - type = str; - description = "Admin e-mail address of the instance"; - }; - httpdName = mkOption { - type = str; - description = "Name of the httpd instance to assign this type to"; - }; - ips = mkOption { - type = listOf str; - default = []; - description = "ips to listen to"; - }; - modules = mkOption { - type = listOf str; - default = []; - description = "Additional modules to load in Apache"; - }; - extraConfig = mkOption { - type = listOf lines; - default = []; - description = "Additional configuration to append to Apache"; - }; - nosslVhost = mkOption { - description = "A default nossl vhost for captive portals"; - default = {}; - type = submodule { - options = { - enable = mkEnableOption "Add default no-ssl vhost for this instance"; - host = mkOption { - type = str; - description = "The hostname to use for this vhost"; - }; - root = mkOption { - type = path; - default = ./nosslVhost; - description = "The root folder to serve"; - }; - indexFile = mkOption { - type = str; - default = "index.html"; - description = "The index file to show."; - }; - }; - }; - }; - fallbackVhost = mkOption { - description = "The fallback vhost that will be defined as first vhost in Apache"; - type = submodule { - options = { - certName = mkOption { type = str; }; - hosts = mkOption { type = listOf str; }; - root = mkOption { type = nullOr path; }; - forceSSL = mkOption { - type = bool; - default = true; - description = '' - Automatically create a corresponding non-ssl vhost - that will only redirect to the ssl version - ''; - }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }; - }; - vhostNoSSLConfs = mkOption { - default = {}; - description = "List of no ssl vhosts to define for Apache"; - type = attrsOf (submodule { - options = { - hosts = mkOption { type = listOf str; }; - root = mkOption { type = nullOr path; }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }); - }; - vhostConfs = mkOption { - default = {}; - description = "List of vhosts to define for Apache"; - type = attrsOf (submodule { - options = { - certName = mkOption { type = str; }; - addToCerts = mkOption { - type = bool; - default = false; - description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null"; - }; - certMainHost = mkOption { - type = nullOr str; - description = "Use that host as 'main host' for acme certs"; - default = null; - }; - hosts = mkOption { type = listOf str; }; - root = mkOption { type = nullOr path; }; - forceSSL = mkOption { - type = bool; - default = true; - description = '' - Automatically create a corresponding non-ssl vhost - that will only redirect to the ssl version - ''; - }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }); - }; - watchPaths = mkOption { - type = listOf str; - default = []; - description = '' - Paths to watch that should trigger a reload of httpd - ''; - }; - }; - }); - }; - }; - - config.services.httpd = let - nosslVhost = ips: cfg: { - listen = map (ip: { inherit ip; port = 80; }) ips; - hostName = cfg.host; - logFormat = "combinedVhost"; - documentRoot = cfg.root; - extraConfig = '' - - DirectoryIndex ${cfg.indexFile} - AllowOverride None - Require all granted - - RewriteEngine on - RewriteRule ^/(.+) / [L] - - ''; - }; - toVhost = ips: vhostConf: { - forceSSL = vhostConf.forceSSL or true; - useACMEHost = vhostConf.certName; - logFormat = "combinedVhost"; - listen = if vhostConf.forceSSL - then lists.flatten (map (ip: [{ inherit ip; port = 443; ssl = true; } { inherit ip; port = 80; }]) ips) - else map (ip: { inherit ip; port = 443; ssl = true; }) ips; - hostName = builtins.head vhostConf.hosts; - serverAliases = builtins.tail vhostConf.hosts or []; - documentRoot = vhostConf.root; - extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; - }; - toVhostNoSSL = ips: vhostConf: { - logFormat = "combinedVhost"; - listen = map (ip: { inherit ip; port = 80; }) ips; - hostName = builtins.head vhostConf.hosts; - serverAliases = builtins.tail vhostConf.hosts or []; - documentRoot = vhostConf.root; - extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; - }; - in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - icfg.httpdName (mkIf icfg.enable { - enable = true; - logPerVirtualHost = true; - multiProcessingModule = "worker"; - # https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.0.2t&guideline=5.4 - # test with https://www.ssllabs.com/ssltest/analyze.html?d=www.immae.eu&s=176.9.151.154&latest - sslProtocols = "all -SSLv3 -TLSv1 -TLSv1.1"; - sslCiphers = builtins.concatStringsSep ":" [ - "ECDHE-ECDSA-AES128-GCM-SHA256" "ECDHE-RSA-AES128-GCM-SHA256" - "ECDHE-ECDSA-AES256-GCM-SHA384" "ECDHE-RSA-AES256-GCM-SHA384" - "ECDHE-ECDSA-CHACHA20-POLY1305" "ECDHE-RSA-CHACHA20-POLY1305" - "DHE-RSA-AES128-GCM-SHA256" "DHE-RSA-AES256-GCM-SHA384" - ]; - inherit (icfg) adminAddr; - logFormat = "combinedVhost"; - extraModules = lists.unique icfg.modules; - extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig; - - virtualHosts = with attrsets; { - ___fallbackVhost = toVhost icfg.ips icfg.fallbackVhost; - } // (optionalAttrs icfg.nosslVhost.enable { - nosslVhost = nosslVhost icfg.ips icfg.nosslVhost; - }) // (mapAttrs' (n: v: nameValuePair ("nossl_" + n) (toVhostNoSSL icfg.ips v)) icfg.vhostNoSSLConfs) - // (mapAttrs' (n: v: nameValuePair ("ssl_" + n) (toVhost icfg.ips v)) icfg.vhostConfs); - }) - ) cfg.env; - - config.services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - "httpd${icfg.httpdName}" { - paths = icfg.watchPaths; - waitTime = 5; - } - ) cfg.env; - - config.security.acme.certs = let - typesToManage = attrsets.filterAttrs (k: v: v.enable) cfg.env; - flatVhosts = lists.flatten (attrsets.mapAttrsToList (k: v: - attrValues v.vhostConfs - ) typesToManage); - groupedCerts = attrsets.filterAttrs - (_: group: builtins.any (v: v.addToCerts || !isNull v.certMainHost) group) - (lists.groupBy (v: v.certName) flatVhosts); - groupToDomain = group: - let - nonNull = builtins.filter (v: !isNull v.certMainHost) group; - domains = lists.unique (map (v: v.certMainHost) nonNull); - in - if builtins.length domains == 0 - then null - else assert (builtins.length domains == 1); (elemAt domains 0); - extraDomains = group: - let - mainDomain = groupToDomain group; - in - lists.remove mainDomain ( - lists.unique ( - lists.flatten (map (c: optionals (c.addToCerts || !isNull c.certMainHost) c.hosts) group) - ) - ); - in attrsets.mapAttrs (k: g: - if (!isNull (groupToDomain g)) - then cfg.certs // { - domain = groupToDomain g; - extraDomains = builtins.listToAttrs ( - map (d: attrsets.nameValuePair d null) (extraDomains g)); - } - else { - extraDomains = builtins.listToAttrs ( - map (d: attrsets.nameValuePair d null) (extraDomains g)); - } - ) groupedCerts; - - config.systemd.services = let - package = httpdName: config.services.httpd.${httpdName}.package.out; - cfgFile = httpdName: config.services.httpd.${httpdName}.configFile; - serviceChange = attrsets.mapAttrs' (name: icfg: - attrsets.nameValuePair - "httpd${icfg.httpdName}" { - stopIfChanged = false; - serviceConfig.ExecStart = - lib.mkForce "@${package icfg.httpdName}/bin/httpd httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf"; - serviceConfig.ExecStop = - lib.mkForce "${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -k graceful-stop"; - serviceConfig.ExecReload = - lib.mkForce "${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -k graceful"; - } - ) cfg.env; - serviceReload = attrsets.mapAttrs' (name: icfg: - attrsets.nameValuePair - "httpd${icfg.httpdName}-config-reload" { - wants = [ "httpd${icfg.httpdName}.service" ]; - wantedBy = [ "multi-user.target" ]; - restartTriggers = [ (cfgFile icfg.httpdName) ]; - # commented, because can cause extra delays during activate for this config: - # services.nginx.virtualHosts."_".locations."/".proxyPass = "http://blabla:3000"; - # stopIfChanged = false; - serviceConfig.Type = "oneshot"; - serviceConfig.TimeoutSec = 60; - script = '' - if ${pkgs.systemd}/bin/systemctl -q is-active httpd${icfg.httpdName}.service ; then - ${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -t && \ - ${pkgs.systemd}/bin/systemctl reload httpd${icfg.httpdName}.service - fi - ''; - serviceConfig.RemainAfterExit = true; - } - ) cfg.env; - in - serviceChange // serviceReload; -} diff --git a/modules/websites/httpd-service-builder.nix b/modules/websites/httpd-service-builder.nix deleted file mode 100644 index 1f7488d..0000000 --- a/modules/websites/httpd-service-builder.nix +++ /dev/null @@ -1,735 +0,0 @@ -# to help backporting this builder should stay as close as possible to -# nixos/modules/services/web-servers/apache-httpd/default.nix -{ httpdName, withUsers ? true }: -{ config, lib, pkgs, ... }: - -with lib; - -let - - cfg = config.services.httpd."${httpdName}"; - - runtimeDir = "/run/httpd_${httpdName}"; - - pkg = cfg.package.out; - - httpdConf = cfg.configFile; - - php = cfg.phpPackage.override { apacheHttpd = pkg.dev; /* otherwise it only gets .out */ }; - - phpMajorVersion = lib.versions.major (lib.getVersion php); - - mod_perl = pkgs.apacheHttpdPackages.mod_perl.override { apacheHttpd = pkg; }; - - vhosts = attrValues cfg.virtualHosts; - - mkListenInfo = hostOpts: - if hostOpts.listen != [] then hostOpts.listen - else ( - optional (hostOpts.onlySSL || hostOpts.addSSL || hostOpts.forceSSL) { ip = "*"; port = 443; ssl = true; } ++ - optional (!hostOpts.onlySSL) { ip = "*"; port = 80; ssl = false; } - ); - - listenInfo = unique (concatMap mkListenInfo vhosts); - - enableHttp2 = any (vhost: vhost.http2) vhosts; - enableSSL = any (listen: listen.ssl) listenInfo; - enableUserDir = any (vhost: vhost.enableUserDir) vhosts; - - # NOTE: generally speaking order of modules is very important - modules = - [ # required apache modules our httpd service cannot run without - "authn_core" "authz_core" - "log_config" - "mime" "autoindex" "negotiation" "dir" - "alias" "rewrite" - "unixd" "slotmem_shm" "socache_shmcb" - "mpm_${cfg.multiProcessingModule}" - ] - ++ (if cfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ]) - ++ optional enableHttp2 "http2" - ++ optional enableSSL "ssl" - ++ optional enableUserDir "userdir" - ++ optional cfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; } - ++ optional cfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; } - ++ optional cfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; } - ++ cfg.extraModules; - - loggingConf = (if cfg.logFormat != "none" then '' - ErrorLog ${cfg.logDir}/error.log - - LogLevel notice - - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - LogFormat "%h %l %u %t \"%r\" %>s %b" common - LogFormat "%{Referer}i -> %U" referer - LogFormat "%{User-agent}i" agent - - CustomLog ${cfg.logDir}/access.log ${cfg.logFormat} - '' else '' - ErrorLog /dev/null - ''); - - - browserHacks = '' - - BrowserMatch "Mozilla/2" nokeepalive - BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 - BrowserMatch "RealPlayer 4\.0" force-response-1.0 - BrowserMatch "Java/1\.0" force-response-1.0 - BrowserMatch "JDK/1\.0" force-response-1.0 - BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully - BrowserMatch "^WebDrive" redirect-carefully - BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully - BrowserMatch "^gnome-vfs" redirect-carefully - - ''; - - - sslConf = '' - - SSLSessionCache shmcb:${runtimeDir}/ssl_scache(512000) - - Mutex posixsem - - SSLRandomSeed startup builtin - SSLRandomSeed connect builtin - - SSLProtocol ${cfg.sslProtocols} - SSLCipherSuite ${cfg.sslCiphers} - SSLHonorCipherOrder on - - ''; - - - mimeConf = '' - TypesConfig ${pkg}/conf/mime.types - - AddType application/x-x509-ca-cert .crt - AddType application/x-pkcs7-crl .crl - AddType application/x-httpd-php .php .phtml - - - MIMEMagicFile ${pkg}/conf/magic - - ''; - - mkVHostConf = hostOpts: - let - adminAddr = if hostOpts.adminAddr != null then hostOpts.adminAddr else cfg.adminAddr; - listen = filter (listen: !listen.ssl) (mkListenInfo hostOpts); - listenSSL = filter (listen: listen.ssl) (mkListenInfo hostOpts); - - useACME = hostOpts.enableACME || hostOpts.useACMEHost != null; - sslCertDir = - if hostOpts.enableACME then config.security.acme.certs.${hostOpts.hostName}.directory - else if hostOpts.useACMEHost != null then config.security.acme.certs.${hostOpts.useACMEHost}.directory - else abort "This case should never happen."; - - sslServerCert = if useACME then "${sslCertDir}/full.pem" else hostOpts.sslServerCert; - sslServerKey = if useACME then "${sslCertDir}/key.pem" else hostOpts.sslServerKey; - sslServerChain = if useACME then "${sslCertDir}/fullchain.pem" else hostOpts.sslServerChain; - - acmeChallenge = optionalString useACME '' - Alias /.well-known/acme-challenge/ "${hostOpts.acmeRoot}/.well-known/acme-challenge/" - - AllowOverride None - Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec - Require method GET POST OPTIONS - Require all granted - - ''; - in - optionalString (listen != []) '' - - ServerName ${hostOpts.hostName} - ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases} - ServerAdmin ${adminAddr} - - SSLEngine off - - ${acmeChallenge} - ${if hostOpts.forceSSL then '' - - RewriteEngine on - RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge [NC] - RewriteCond %{HTTPS} off - RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} - - '' else mkVHostCommonConf hostOpts} - - '' + - optionalString (listenSSL != []) '' - - ServerName ${hostOpts.hostName} - ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases} - ServerAdmin ${adminAddr} - SSLEngine on - SSLCertificateFile ${sslServerCert} - SSLCertificateKeyFile ${sslServerKey} - ${optionalString hostOpts.http2 "Protocols h2 h2c http/1.1"} - ${acmeChallenge} - ${mkVHostCommonConf hostOpts} - - '' - ; - - mkVHostCommonConf = hostOpts: - let - documentRoot = if hostOpts.documentRoot != null - then hostOpts.documentRoot - else pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out" - ; - - mkLocations = locations: concatStringsSep "\n" (map (config: '' - - ${optionalString (config.proxyPass != null) '' - - ProxyPass ${config.proxyPass} - ProxyPassReverse ${config.proxyPass} - - ''} - ${optionalString (config.index != null) '' - - DirectoryIndex ${config.index} - - ''} - ${optionalString (config.alias != null) '' - - Alias "${config.alias}" - - ''} - ${config.extraConfig} - - '') (sortProperties (mapAttrsToList (k: v: v // { location = k; }) locations))); - in - '' - ${optionalString cfg.logPerVirtualHost '' - ErrorLog ${cfg.logDir}/error-${hostOpts.hostName}.log - CustomLog ${cfg.logDir}/access-${hostOpts.hostName}.log ${hostOpts.logFormat} - ''} - - ${optionalString (hostOpts.robotsEntries != "") '' - Alias /robots.txt ${pkgs.writeText "robots.txt" hostOpts.robotsEntries} - ''} - - DocumentRoot "${documentRoot}" - - - Options Indexes FollowSymLinks - AllowOverride None - Require all granted - - - ${optionalString hostOpts.enableUserDir '' - UserDir public_html - UserDir disabled root - - AllowOverride FileInfo AuthConfig Limit Indexes - Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec - - Require all granted - - - Require all denied - - - ''} - - ${optionalString (hostOpts.globalRedirect != null && hostOpts.globalRedirect != "") '' - RedirectPermanent / ${hostOpts.globalRedirect} - ''} - - ${ - let makeDirConf = elem: '' - Alias ${elem.urlPath} ${elem.dir}/ - - Options +Indexes - Require all granted - AllowOverride All - - ''; - in concatMapStrings makeDirConf hostOpts.servedDirs - } - - ${mkLocations hostOpts.locations} - ${hostOpts.extraConfig} - '' - ; - - - confFile = pkgs.writeText "httpd.conf" '' - - ServerRoot ${pkg} - ServerName ${config.networking.hostName} - DefaultRuntimeDir ${runtimeDir}/runtime - - PidFile ${runtimeDir}/httpd.pid - - ${optionalString (cfg.multiProcessingModule != "prefork") '' - # mod_cgid requires this. - ScriptSock ${runtimeDir}/cgisock - ''} - - - MaxClients ${toString cfg.maxClients} - MaxRequestsPerChild ${toString cfg.maxRequestsPerChild} - - - ${let - toStr = listen: "Listen ${listen.ip}:${toString listen.port} ${if listen.ssl then "https" else "http"}"; - uniqueListen = uniqList {inputList = map toStr listenInfo;}; - in concatStringsSep "\n" uniqueListen - } - - User ${cfg.user} - Group ${cfg.group} - - ${let - mkModule = module: - if isString module then { name = module; path = "${pkg}/modules/mod_${module}.so"; } - else if isAttrs module then { inherit (module) name path; } - else throw "Expecting either a string or attribute set including a name and path."; - in - concatMapStringsSep "\n" (module: "LoadModule ${module.name}_module ${module.path}") (unique (map mkModule modules)) - } - - AddHandler type-map var - - - Require all denied - - - ${mimeConf} - ${loggingConf} - ${browserHacks} - - Include ${pkg}/conf/extra/httpd-default.conf - Include ${pkg}/conf/extra/httpd-autoindex.conf - Include ${pkg}/conf/extra/httpd-multilang-errordoc.conf - Include ${pkg}/conf/extra/httpd-languages.conf - - TraceEnable off - - ${sslConf} - - # Fascist default - deny access to everything. - - Options FollowSymLinks - AllowOverride None - Require all denied - - - ${cfg.extraConfig} - - ${concatMapStringsSep "\n" mkVHostConf vhosts} - ''; - - # Generate the PHP configuration file. Should probably be factored - # out into a separate module. - phpIni = pkgs.runCommand "php.ini" - { options = cfg.phpOptions; - preferLocalBuild = true; - } - '' - cat ${php}/etc/php.ini > $out - echo "$options" >> $out - ''; - -in - - -{ - - imports = [ - (mkRemovedOptionModule [ "services" "httpd" httpdName "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.") - - # virtualHosts options - (mkRemovedOptionModule [ "services" "httpd" httpdName "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - ]; - - # interface - - options = { - - services.httpd."${httpdName}" = { - - enable = mkEnableOption "the Apache HTTP Server"; - - package = mkOption { - type = types.package; - default = pkgs.apacheHttpd; - defaultText = "pkgs.apacheHttpd"; - description = '' - Overridable attribute of the Apache HTTP Server package to use. - ''; - }; - - configFile = mkOption { - type = types.path; - default = confFile; - defaultText = "confFile"; - example = literalExample ''pkgs.writeText "httpd.conf" "# my custom config file ..."''; - description = '' - Override the configuration file used by Apache. By default, - NixOS generates one automatically. - ''; - }; - - extraConfig = mkOption { - type = types.lines; - default = ""; - description = '' - Configuration lines appended to the generated Apache - configuration file. Note that this mechanism will not work - when is overridden. - ''; - }; - - extraModules = mkOption { - type = types.listOf types.unspecified; - default = []; - example = literalExample '' - [ - "proxy_connect" - { name = "jk"; path = "''${pkgs.tomcat_connectors}/modules/mod_jk.so"; } - ] - ''; - description = '' - Additional Apache modules to be used. These can be - specified as a string in the case of modules distributed - with Apache, or as an attribute set specifying the - name and path of the - module. - ''; - }; - - adminAddr = mkOption { - type = types.str; - example = "admin@example.org"; - description = "E-mail address of the server administrator."; - }; - - logFormat = mkOption { - type = types.str; - default = "common"; - example = "combined"; - description = '' - Log format for log files. Possible values are: combined, common, referer, agent. - See for more details. - ''; - }; - - logPerVirtualHost = mkOption { - type = types.bool; - default = true; - description = '' - If enabled, each virtual host gets its own - access.log and - error.log, namely suffixed by the - of the virtual host. - ''; - }; - - user = mkOption { - type = types.str; - default = "wwwrun"; - description = '' - User account under which httpd runs. - ''; - }; - - group = mkOption { - type = types.str; - default = "wwwrun"; - description = '' - Group under which httpd runs. - ''; - }; - - logDir = mkOption { - type = types.path; - default = "/var/log/httpd"; - description = '' - Directory for Apache's log files. It is created automatically. - ''; - }; - - virtualHosts = mkOption { - type = with types; attrsOf (submodule (import )); - default = { - localhost = { - documentRoot = "${pkg}/htdocs"; - }; - }; - example = literalExample '' - { - "foo.example.com" = { - forceSSL = true; - documentRoot = "/var/www/foo.example.com" - }; - "bar.example.com" = { - addSSL = true; - documentRoot = "/var/www/bar.example.com"; - }; - } - ''; - description = '' - Specification of the virtual hosts served by Apache. Each - element should be an attribute set specifying the - configuration of the virtual host. - ''; - }; - - enableMellon = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the mod_auth_mellon module."; - }; - - enablePHP = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the PHP module."; - }; - - phpPackage = mkOption { - type = types.package; - default = pkgs.php; - defaultText = "pkgs.php"; - description = '' - Overridable attribute of the PHP package to use. - ''; - }; - - enablePerl = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the Perl module (mod_perl)."; - }; - - phpOptions = mkOption { - type = types.lines; - default = ""; - example = - '' - date.timezone = "CET" - ''; - description = '' - Options appended to the PHP configuration file php.ini. - ''; - }; - - multiProcessingModule = mkOption { - type = types.enum [ "event" "prefork" "worker" ]; - default = "prefork"; - example = "worker"; - description = - '' - Multi-processing module to be used by Apache. Available - modules are prefork (the default; - handles each request in a separate child process), - worker (hybrid approach that starts a - number of child processes each running a number of - threads) and event (a recent variant of - worker that handles persistent - connections more efficiently). - ''; - }; - - maxClients = mkOption { - type = types.int; - default = 150; - example = 8; - description = "Maximum number of httpd processes (prefork)"; - }; - - maxRequestsPerChild = mkOption { - type = types.int; - default = 0; - example = 500; - description = '' - Maximum number of httpd requests answered per httpd child (prefork), 0 means unlimited. - ''; - }; - - sslCiphers = mkOption { - type = types.str; - default = "HIGH:!aNULL:!MD5:!EXP"; - description = "Cipher Suite available for negotiation in SSL proxy handshake."; - }; - - sslProtocols = mkOption { - type = types.str; - default = "All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1"; - example = "All -SSLv2 -SSLv3"; - description = "Allowed SSL/TLS protocol versions."; - }; - }; - - }; - - # implementation - - config = mkIf cfg.enable { - - assertions = [ - { - assertion = all (hostOpts: !hostOpts.enableSSL) vhosts; - message = '' - The option `services.httpd.virtualHosts..enableSSL` no longer has any effect; please remove it. - Select one of `services.httpd.virtualHosts..addSSL`, `services.httpd.virtualHosts..forceSSL`, - or `services.httpd.virtualHosts..onlySSL`. - ''; - } - { - assertion = all (hostOpts: with hostOpts; !(addSSL && onlySSL) && !(forceSSL && onlySSL) && !(addSSL && forceSSL)) vhosts; - message = '' - Options `services.httpd.virtualHosts..addSSL`, - `services.httpd.virtualHosts..onlySSL` and `services.httpd.virtualHosts..forceSSL` - are mutually exclusive. - ''; - } - { - assertion = all (hostOpts: !(hostOpts.enableACME && hostOpts.useACMEHost != null)) vhosts; - message = '' - Options `services.httpd.virtualHosts..enableACME` and - `services.httpd.virtualHosts..useACMEHost` are mutually exclusive. - ''; - } - ]; - - warnings = - mapAttrsToList (name: hostOpts: '' - Using config.services.httpd.virtualHosts."${name}".servedFiles is deprecated and will become unsupported in a future release. Your configuration will continue to work as is but please migrate your configuration to config.services.httpd.virtualHosts."${name}".locations before the 20.09 release of NixOS. - '') (filterAttrs (name: hostOpts: hostOpts.servedFiles != []) cfg.virtualHosts); - - users.users = optionalAttrs (withUsers && cfg.user == "wwwrun") { - wwwrun = { - group = cfg.group; - description = "Apache httpd user"; - uid = config.ids.uids.wwwrun; - }; - }; - - users.groups = optionalAttrs (withUsers && cfg.group == "wwwrun") { - wwwrun.gid = config.ids.gids.wwwrun; - }; - - security.acme.certs = mapAttrs (name: hostOpts: { - user = cfg.user; - group = mkDefault cfg.group; - email = if hostOpts.adminAddr != null then hostOpts.adminAddr else cfg.adminAddr; - webroot = hostOpts.acmeRoot; - extraDomains = genAttrs hostOpts.serverAliases (alias: null); - postRun = "systemctl reload httpd.service"; - }) (filterAttrs (name: hostOpts: hostOpts.enableACME) cfg.virtualHosts); - - environment.systemPackages = [ pkg ]; - - # required for "apachectl configtest" - environment.etc."httpd/httpd_${httpdName}.conf".source = httpdConf; - - services.httpd."${httpdName}" = { phpOptions = - '' - ; Needed for PHP's mail() function. - sendmail_path = sendmail -t -i - - ; Don't advertise PHP - expose_php = off - '' + optionalString (config.time.timeZone != null) '' - - ; Apparently PHP doesn't use $TZ. - date.timezone = "${config.time.timeZone}" - ''; - - extraModules = mkBefore [ - # HTTP authentication mechanisms: basic and digest. - "auth_basic" "auth_digest" - - # Authentication: is the user who he claims to be? - "authn_file" "authn_dbm" "authn_anon" - - # Authorization: is the user allowed access? - "authz_user" "authz_groupfile" "authz_host" - - # Other modules. - "ext_filter" "include" "env" "mime_magic" - "cern_meta" "expires" "headers" "usertrack" "setenvif" - "dav" "status" "asis" "info" "dav_fs" - "vhost_alias" "imagemap" "actions" "speling" - "proxy" "proxy_http" - "cache" "cache_disk" - - # For compatibility with old configurations, the new module mod_access_compat is provided. - "access_compat" - ]; - }; - - systemd.tmpfiles.rules = - let - svc = config.systemd.services."httpd${httpdName}".serviceConfig; - in - [ - "d '${cfg.logDir}' 0700 ${svc.User} ${svc.Group}" - "Z '${cfg.logDir}' - ${svc.User} ${svc.Group}" - ]; - - systemd.services."httpd${httpdName}" = - let - vhostsACME = filter (hostOpts: hostOpts.enableACME) vhosts; - in - { description = "Apache HTTPD"; - - wantedBy = [ "multi-user.target" ]; - wants = concatLists (map (hostOpts: [ "acme-${hostOpts.hostName}.service" "acme-selfsigned-${hostOpts.hostName}.service" ]) vhostsACME); - after = [ "network.target" "fs.target" ] ++ map (hostOpts: "acme-selfsigned-${hostOpts.hostName}.service") vhostsACME; - - path = - [ pkg pkgs.coreutils pkgs.gnugrep ] - ++ optional cfg.enablePHP pkgs.system-sendmail; # Needed for PHP's mail() function. - - environment = - optionalAttrs cfg.enablePHP { PHPRC = phpIni; } - // optionalAttrs cfg.enableMellon { LD_LIBRARY_PATH = "${pkgs.xmlsec}/lib"; }; - - preStart = - '' - # Get rid of old semaphores. These tend to accumulate across - # server restarts, eventually preventing it from restarting - # successfully. - for i in $(${pkgs.utillinux}/bin/ipcs -s | grep ' ${cfg.user} ' | cut -f2 -d ' '); do - ${pkgs.utillinux}/bin/ipcrm -s $i - done - ''; - - serviceConfig = { - ExecStart = "@${pkg}/bin/httpd httpd -f ${httpdConf}"; - ExecStop = "${pkg}/bin/httpd -f ${httpdConf} -k graceful-stop"; - ExecReload = "${pkg}/bin/httpd -f ${httpdConf} -k graceful"; - User = "root"; - Group = cfg.group; - Type = "forking"; - PIDFile = "${runtimeDir}/httpd.pid"; - Restart = "always"; - RestartSec = "5s"; - RuntimeDirectory = "httpd_${httpdName} httpd_${httpdName}/runtime"; - RuntimeDirectoryMode = "0750"; - }; - }; - - }; -} diff --git a/modules/websites/httpd-service-builder.patch b/modules/websites/httpd-service-builder.patch deleted file mode 100644 index f0ad836..0000000 --- a/modules/websites/httpd-service-builder.patch +++ /dev/null @@ -1,150 +0,0 @@ ---- /nix/store/xj651aslybfsma20hpbi5nznfcffq8ky-nixexprs.tar.xz/nixos/modules/services/web-servers/apache-httpd/default.nix 1970-01-01 01:00:01.000000000 +0100 -+++ modules/websites/httpd-service-builder.nix 2020-04-04 03:08:29.068490345 +0200 -@@ -1,12 +1,15 @@ -+# to help backporting this builder should stay as close as possible to -+# nixos/modules/services/web-servers/apache-httpd/default.nix -+{ httpdName, withUsers ? true }: - { config, lib, pkgs, ... }: - - with lib; - - let - -- cfg = config.services.httpd; -+ cfg = config.services.httpd."${httpdName}"; - -- runtimeDir = "/run/httpd"; -+ runtimeDir = "/run/httpd_${httpdName}"; - - pkg = cfg.package.out; - -@@ -318,13 +321,6 @@ - Require all denied - - -- # But do allow access to files in the store so that we don't have -- # to generate clauses for every generated file that we -- # want to serve. -- -- Require all granted -- -- - ${cfg.extraConfig} - - ${concatMapStringsSep "\n" mkVHostConf vhosts} -@@ -347,30 +343,30 @@ - { - - imports = [ -- (mkRemovedOptionModule [ "services" "httpd" "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.") -- (mkRemovedOptionModule [ "services" "httpd" "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.") - - # virtualHosts options -- (mkRemovedOptionModule [ "services" "httpd" "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - ]; - - # interface - - options = { - -- services.httpd = { -+ services.httpd."${httpdName}" = { - - enable = mkEnableOption "the Apache HTTP Server"; - -@@ -622,7 +618,7 @@ - Using config.services.httpd.virtualHosts."${name}".servedFiles is deprecated and will become unsupported in a future release. Your configuration will continue to work as is but please migrate your configuration to config.services.httpd.virtualHosts."${name}".locations before the 20.09 release of NixOS. - '') (filterAttrs (name: hostOpts: hostOpts.servedFiles != []) cfg.virtualHosts); - -- users.users = optionalAttrs (cfg.user == "wwwrun") { -+ users.users = optionalAttrs (withUsers && cfg.user == "wwwrun") { - wwwrun = { - group = cfg.group; - description = "Apache httpd user"; -@@ -630,7 +626,7 @@ - }; - }; - -- users.groups = optionalAttrs (cfg.group == "wwwrun") { -+ users.groups = optionalAttrs (withUsers && cfg.group == "wwwrun") { - wwwrun.gid = config.ids.gids.wwwrun; - }; - -@@ -646,9 +642,9 @@ - environment.systemPackages = [ pkg ]; - - # required for "apachectl configtest" -- environment.etc."httpd/httpd.conf".source = httpdConf; -+ environment.etc."httpd/httpd_${httpdName}.conf".source = httpdConf; - -- services.httpd.phpOptions = -+ services.httpd."${httpdName}" = { phpOptions = - '' - ; Needed for PHP's mail() function. - sendmail_path = sendmail -t -i -@@ -661,7 +657,7 @@ - date.timezone = "${config.time.timeZone}" - ''; - -- services.httpd.extraModules = mkBefore [ -+ extraModules = mkBefore [ - # HTTP authentication mechanisms: basic and digest. - "auth_basic" "auth_digest" - -@@ -682,17 +678,18 @@ - # For compatibility with old configurations, the new module mod_access_compat is provided. - "access_compat" - ]; -+ }; - - systemd.tmpfiles.rules = - let -- svc = config.systemd.services.httpd.serviceConfig; -+ svc = config.systemd.services."httpd${httpdName}".serviceConfig; - in - [ - "d '${cfg.logDir}' 0700 ${svc.User} ${svc.Group}" - "Z '${cfg.logDir}' - ${svc.User} ${svc.Group}" - ]; - -- systemd.services.httpd = -+ systemd.services."httpd${httpdName}" = - let - vhostsACME = filter (hostOpts: hostOpts.enableACME) vhosts; - in -@@ -730,7 +727,7 @@ - PIDFile = "${runtimeDir}/httpd.pid"; - Restart = "always"; - RestartSec = "5s"; -- RuntimeDirectory = "httpd httpd/runtime"; -+ RuntimeDirectory = "httpd_${httpdName} httpd_${httpdName}/runtime"; - RuntimeDirectoryMode = "0750"; - }; - }; diff --git a/modules/websites/php-application.nix b/modules/websites/php-application.nix deleted file mode 100644 index 3a43a45..0000000 --- a/modules/websites/php-application.nix +++ /dev/null @@ -1,224 +0,0 @@ -{ lib, config, pkgs, ... }: -with lib; -let - cfg = config.services.phpApplication; - cfgByEnv = lists.groupBy (x: x.websiteEnv) (builtins.attrValues cfg.apps); -in -{ - options = with types; { - services.phpApplication.apps = mkOption { - default = {}; - description = '' - php applications to define - ''; - type = attrsOf (submodule { - options = { - varDir = mkOption { - type = nullOr path; - description = '' - Path to application’s vardir. - ''; - }; - varDirPaths = mkOption { - type = attrsOf str; - default = {}; - description = '' - Map of additional folders => mode to create under varDir - ''; - }; - mode = mkOption { - type = str; - default = "0700"; - description = '' - Mode to apply to the vardir - ''; - }; - phpSession = mkOption { - type = bool; - default = true; - description = "Handle phpsession files separately in vardir"; - }; - phpListen = mkOption { - type = nullOr str; - default = null; - description = "Name of the socket to listen to. Defaults to app name if null"; - }; - phpPool = mkOption { - type = attrsOf str; - default = {}; - description = "Pool configuration to append"; - }; - phpEnv = mkOption { - type = attrsOf str; - default = {}; - description = "Pool environment to append"; - }; - phpPackage = mkOption { - type = attrsOf str; - default = pkgs.php; - description = "Php package to use"; - }; - phpOptions = mkOption { - type = lines; - default = ""; - description = "php configuration to append"; - }; - phpOpenbasedir = mkOption { - type = listOf path; - default = []; - description = '' - paths to add to php open_basedir configuration in addition to app and vardir - ''; - }; - phpWatchFiles = mkOption { - type = listOf path; - default = []; - description = '' - Path to other files to watch to trigger preStart scripts - ''; - }; - websiteEnv = mkOption { - type = str; - description = '' - website instance name to use - ''; - }; - httpdUser = mkOption { - type = str; - default = config.services.httpd.user; - description = '' - httpd user to run the prestart scripts as. - ''; - }; - httpdGroup = mkOption { - type = str; - default = config.services.httpd.group; - description = '' - httpd group to run the prestart scripts as. - ''; - }; - httpdWatchFiles = mkOption { - type = listOf path; - default = []; - description = '' - Path to other files to watch to trigger httpd reload - ''; - }; - app = mkOption { - type = path; - description = '' - Path to application root - ''; - }; - webRoot = mkOption { - type = nullOr path; - description = '' - Path to the web root path of the application. May differ from the application itself (usually a subdirectory) - ''; - }; - preStartActions = mkOption { - type = listOf str; - default = []; - description = '' - List of actions to run as apache user at preStart when - whatchFiles or app dir changed. - ''; - }; - serviceDeps = mkOption { - type = listOf str; - default = []; - description = '' - List of systemd services this application depends on - ''; - }; - }; - }); - }; - # Read-only variables - services.phpApplication.phpListenPaths = mkOption { - type = attrsOf path; - default = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - name config.services.phpfpm.pools."${name}".socket - ) cfg.apps; - readOnly = true; - description = '' - Full paths to listen for php - ''; - }; - }; - - config = { - services.websites.env = attrsets.mapAttrs' (name: cfgs: attrsets.nameValuePair - name { - modules = [ "proxy_fcgi" ]; - watchPaths = builtins.concatLists (map (c: c.httpdWatchFiles) cfgs); - } - ) cfgByEnv; - - services.phpfpm.pools = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - name { - user = icfg.httpdUser; - group = icfg.httpdUser; - settings = { - "listen.owner" = icfg.httpdUser; - "listen.group" = icfg.httpdGroup; - "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" ([icfg.app icfg.varDir] ++ icfg.phpWatchFiles ++ icfg.phpOpenbasedir); - } - // optionalAttrs (icfg.phpSession) { "php_admin_value[session.save_path]" = "${icfg.varDir}/phpSessions"; } - // icfg.phpPool; - phpOptions = config.services.phpfpm.phpOptions + icfg.phpOptions; - inherit (icfg) phpEnv phpPackage; - } - ) cfg.apps; - - services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - "phpfpm-${name}" { - restart = true; - paths = icfg.phpWatchFiles; - } - ) (attrsets.filterAttrs (n: v: builtins.length v.phpWatchFiles > 0) cfg.apps); - - systemd.services = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - "phpfpm-${name}" { - after = lib.mkAfter icfg.serviceDeps; - wants = icfg.serviceDeps; - preStart = lib.mkAfter (optionalString (!isNull icfg.varDir) '' - watchFilesChanged() { - ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 1"} - [ ! -f "${icfg.varDir}"/watchedFiles ] \ - || ! sha512sum -c --status ${icfg.varDir}/watchedFiles - } - appDirChanged() { - [ ! -f "${icfg.varDir}/currentWebappDir" -o \ - "${icfg.app}" != "$(cat ${icfg.varDir}/currentWebappDir 2>/dev/null)" ] - } - updateWatchFiles() { - ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 0"} - sha512sum ${builtins.concatStringsSep " " icfg.phpWatchFiles} > ${icfg.varDir}/watchedFiles - } - - if watchFilesChanged || appDirChanged; then - pushd ${icfg.app} > /dev/null - ${builtins.concatStringsSep "\n " (map (c: "/run/wrappers/bin/sudo -u ${icfg.httpdUser} ${c}") icfg.preStartActions) } - popd > /dev/null - echo -n "${icfg.app}" > ${icfg.varDir}/currentWebappDir - updateWatchFiles - fi - ''); - } - ) cfg.apps; - - system.activationScripts = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - name { - deps = []; - text = optionalString (!isNull icfg.varDir) '' - install -m ${icfg.mode} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir} - '' + optionalString (icfg.phpSession) '' - install -m 0700 -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/phpSessions - '' + builtins.concatStringsSep "\n" (attrsets.mapAttrsToList (n: v: '' - install -m ${v} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/${n} - '') icfg.varDirPaths); - } - ) cfg.apps; - }; -} diff --git a/modules/zrepl.nix b/modules/zrepl.nix deleted file mode 100644 index 5bcc17b..0000000 --- a/modules/zrepl.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ config, lib, pkgs, ... }: -let - cfg = config.services.zrepl; -in -{ - options = { - services.zrepl = { - enable = lib.mkEnableOption "Enable the zrepl daemon"; - - config = lib.mkOption { - type = lib.types.lines; - default = ""; - description = "Configuration"; - }; - }; - }; - - config = lib.mkIf cfg.enable { - secrets.keys = { - "zrepl/zrepl.yml" = { - permissions = "0400"; - text = cfg.config; - user = config.systemd.services.zrepl.serviceConfig.User or "root"; - group = config.systemd.services.zrepl.serviceConfig.Group or "root"; - }; - }; - services.filesWatcher.zrepl = { - restart = true; - paths = [ config.secrets.fullPaths."zrepl/zrepl.yml" ]; - }; - systemd.services.zrepl = { - description = "zrepl daemon"; - wantedBy = [ "multi-user.target" ]; - path = [ pkgs.zfs pkgs.openssh ]; - serviceConfig = { - ExecStart = - let configFile = config.secrets.fullPaths."zrepl/zrepl.yml"; - in "${pkgs.zrepl}/bin/zrepl daemon --config ${configFile}"; - Type = "simple"; - RuntimeDirectory= "zrepl"; - RuntimeDirectoryMode= "0700"; - }; - }; - }; -} diff --git a/nix/README.md b/nix/README.md deleted file mode 100644 index 7bf996c..0000000 --- a/nix/README.md +++ /dev/null @@ -1,2 +0,0 @@ -This directory is handled by niv, but it prefers to have a directory -named "nix" diff --git a/nix/sources.json b/nix/sources.json deleted file mode 100644 index 1a1cf5a..0000000 --- a/nix/sources.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "buildbot-cours-deps": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Cours", - "rev": "33f139f2e2ea0a16b8ed813c5436e5a5bb506f6d", - "type": "git" - }, - "buildbot-cours-nixpkgs": { - "branch": "nixos-unstable", - "description": "Frozen nixpkgs snapshot for texlive", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "fce7562cf46727fdaf801b232116bc9ce0512049", - "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "buildbot-denise-aventuriers-nixpkgs": { - "branch": "nixos-unstable", - "description": "Frozen nixpkgs snapshot for texlive", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "8e2b14aceb1d40c7e8b84c03a7c78955359872bb", - "sha256": "0zzjpd9smr7rxzrdf6raw9kbj42fbvafxb5bz36lcxgv290pgsm8", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/8e2b14aceb1d40c7e8b84c03a7c78955359872bb.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "buildbot-history-deps": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/History", - "rev": "5f2aae4f9c92107accfc6fb6db6cb3c1f97ed9dc", - "type": "git" - }, - "buildbot-normalesup-deps": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Projets/Sites/Normalesup", - "rev": "de294da4027e80a7b8bf7ec8c393ca0b60218575", - "type": "git" - }, - "buildbot-normalesup-nixpkgs": { - "description": "Frozen nixpkgs snapshot for texlive", - "revision": "173017.85f820d6e41", - "sha256": "0fs390gvz8d3n7v4zj538gf3n1b14sikbf0ijrxgxib5i0704mdb", - "type": "tarball", - "url": "https://releases.nixos.org/nixos/19.03/nixos-19.03.173017.85f820d6e41/nixexprs.tar.xz", - "url_template": "https://releases.nixos.org/nixos//nixos-./nixexprs.tar.xz", - "version": "19.03" - }, - "buildbot-plugin-buildslist": { - "ref": "master", - "repo": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist", - "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", - "type": "git", - "version": "f1d42ba-master" - }, - "home-manager": { - "branch": "master", - "description": "Manage a user environment using Nix", - "homepage": "https://rycee.gitlab.io/home-manager/", - "owner": "rycee", - "repo": "home-manager", - "rev": "6cf6b587b575493e7718bf08b209013d7dcf4d58", - "sha256": "0666ayxazbphjn5xcrczv8m7k2q62k224fvf0kz1lx9qjn93wkvr", - "type": "tarball", - "url": "https://github.com/rycee/home-manager/archive/6cf6b587b575493e7718bf08b209013d7dcf4d58.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "niv": { - "branch": "master", - "description": "Easy dependency management for Nix projects", - "homepage": "https://github.com/nmattia/niv", - "owner": "nmattia", - "repo": "niv", - "rev": "372f96bff217a7a019de27667d04118cffa9841b", - "sha256": "1l0z6162zw60pdcdj03aq64qgf1vyzmf24i9pxca64i4sprl1b7p", - "type": "tarball", - "url": "https://github.com/nmattia/niv/archive/372f96bff217a7a019de27667d04118cffa9841b.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "fce7562cf46727fdaf801b232116bc9ce0512049", - "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs-home-manager": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", - "sha256": "1ak7jqx94fjhc68xh1lh35kh3w3ndbadprrb762qgvcfb8351x8v", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs-nix": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "891f607d5301d6730cb1f9dcf3618bcb1ab7f10e", - "sha256": "1cr39f0sbr0h5d83dv1q34mcpwnkwwbdk5fqlyqp2mnxghzwssng", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/891f607d5301d6730cb1f9dcf3618bcb1ab7f10e.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs-nixops": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", - "sha256": "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "webapps-landing": { - "ref": "gitolite_local/local_changes", - "repo": "https://git.immae.eu/github/bastienwirtz/homer.git", - "rev": "bb60c5b869931f305f15c5bfa9cdb3f68702f01f", - "type": "git", - "version": "e0a72b7-local" - }, - "webapps-surfer": { - "ref": "master", - "repo": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git", - "rev": "476177380452c9c7c5b1624805feedc824c5995e", - "type": "git", - "version": "4761773-master" - }, - "webapps-ttrss": { - "ref": "master", - "repo": "https://git.tt-rss.org/fox/tt-rss.git", - "rev": "986ca251f995f7754a0470d3e0c44538a545081f", - "type": "git", - "version": "986ca25-master" - }, - "websites-chloe-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Chloe", - "rev": "882f166999a59081ad896f26318e6a04db9f9f43", - "type": "git", - "version": "882f166-master" - }, - "websites-connexionswing-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Projets/Connexionswing", - "rev": "ed5874396d35766e0810a6d4e78e1a8f6b170835", - "type": "git", - "version": "ed58743-master" - }, - "websites-florian-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/florian_telles/stabilo", - "rev": "1793d5c7912d1b20ad1df1ac59be9d7f1220e919", - "type": "git", - "version": "1793d5c-master" - }, - "websites-isabelle-aten": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Aten", - "rev": "b99537fdad41291afb4f1bb8b2e2aa4081c71fae", - "type": "git", - "version": "b99537f-master" - }, - "websites-isabelle-iridologie": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Iridologie", - "rev": "2f2ec6b003f4de97e9f8651db540c9114ac877c2", - "type": "git", - "version": "2f2ec6b-master" - }, - "websites-ludivine-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Ludivine", - "rev": "eae633b7c5e92184b24141ebf267d51dbc5d2acc", - "type": "git", - "version": "0dacc32-master" - }, - "websites-piedsjaloux-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/Pieds_jaloux/NewSite", - "rev": "2b67b9897180af3d34f87648362337dbf3981158", - "type": "git", - "version": "2b67b98-master" - }, - "websites-richie-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Richie", - "rev": "2a09e29dd9fc4f6abc5add82744bedf1978a35d5", - "type": "git", - "version": "2a09e29-master" - } -} diff --git a/nix/sources.nix b/nix/sources.nix deleted file mode 100644 index 45c97d1..0000000 --- a/nix/sources.nix +++ /dev/null @@ -1,135 +0,0 @@ -# This file has been generated by Niv. - -let - - # - # The fetchers. fetch_ fetches specs of type . - # - - fetch_file = pkgs: spec: - if spec.builtin or true then - builtins_fetchurl { inherit (spec) url sha256; } - else - pkgs.fetchurl { inherit (spec) url sha256; }; - - fetch_tarball = pkgs: name: spec: - let - ok = str: ! builtins.isNull (builtins.match "[a-zA-Z0-9+-._?=]" str); - # sanitize the name, though nix will still fail if name starts with period - name' = stringAsChars (x: if ! ok x then "-" else x) "${name}-src"; - in - if spec.builtin or true then - builtins_fetchTarball { name = name'; inherit (spec) url sha256; } - else - pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; - - fetch_git = spec: - builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; }; - - fetch_builtin-tarball = name: throw - ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=tarball -a builtin=true''; - - fetch_builtin-url = name: throw - ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=file -a builtin=true''; - - # - # Various helpers - # - - # The set of packages used when specs are fetched using non-builtins. - mkPkgs = sources: - let - sourcesNixpkgs = - import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {}; - hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; - hasThisAsNixpkgsPath = == ./.; - in - if builtins.hasAttr "nixpkgs" sources - then sourcesNixpkgs - else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then - import {} - else - abort - '' - Please specify either (through -I or NIX_PATH=nixpkgs=...) or - add a package called "nixpkgs" to your sources.json. - ''; - - # The actual fetching function. - fetch = pkgs: name: spec: - - if ! builtins.hasAttr "type" spec then - abort "ERROR: niv spec ${name} does not have a 'type' attribute" - else if spec.type == "file" then fetch_file pkgs spec - else if spec.type == "tarball" then fetch_tarball pkgs name spec - else if spec.type == "git" then fetch_git spec - else if spec.type == "builtin-tarball" then fetch_builtin-tarball name - else if spec.type == "builtin-url" then fetch_builtin-url name - else - abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; - - # Ports of functions for older nix versions - - # a Nix version of mapAttrs if the built-in doesn't exist - mapAttrs = builtins.mapAttrs or ( - f: set: with builtins; - listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) - ); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 - range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 - stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 - stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); - concatStrings = builtins.concatStringsSep ""; - - # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchTarball; - in - if lessThan nixVersion "1.12" then - fetchTarball { inherit name url; } - else - fetchTarball attrs; - - # fetchurl version that is compatible between all the versions of Nix - builtins_fetchurl = { url, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchurl; - in - if lessThan nixVersion "1.12" then - fetchurl { inherit url; } - else - fetchurl attrs; - - # Create the final "sources" from the config - mkSources = config: - mapAttrs ( - name: spec: - if builtins.hasAttr "outPath" spec - then abort - "The values in sources.json should not have an 'outPath' attribute" - else - spec // { outPath = fetch config.pkgs name spec; } - ) config.sources; - - # The "config" used by the fetchers - mkConfig = - { sourcesFile ? ./sources.json - , sources ? builtins.fromJSON (builtins.readFile sourcesFile) - , pkgs ? mkPkgs sources - }: rec { - # The sources, i.e. the attribute set of spec name to spec - inherit sources; - - # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers - inherit pkgs; - }; -in -mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); } diff --git a/nixops/.gitignore b/nixops/.gitignore deleted file mode 100644 index 2ea467b..0000000 --- a/nixops/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/state diff --git a/nixops/.sops.yaml b/nixops/.sops.yaml deleted file mode 100644 index 04826a2..0000000 --- a/nixops/.sops.yaml +++ /dev/null @@ -1,19 +0,0 @@ -keys: - - &Immae F82806FDA1BF5B9A1B3014E7C9FCED6CA6B79454 - # obtained with: ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age - - &eldiron age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj - - &monitoring-1 age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k - - &backup-2 age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr - - &dilion age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a - - &quatresaisons age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7 -creation_rules: - - path_regex: vars.yml - key_groups: - - pgp: - - *Immae - age: - - *eldiron - - *monitoring-1 - - *backup-2 - - *dilion - - *quatresaisons diff --git a/nixops/Makefile b/nixops/Makefile deleted file mode 100644 index fb9da4c..0000000 --- a/nixops/Makefile +++ /dev/null @@ -1,102 +0,0 @@ -ifndef NIXOPS_ENV_LOADED - $(error "Please load environment with direnv") -endif - -###### Current channel information -nix-info: - @version=$$(nix eval --raw nixpkgs.lib.version) && \ - mainversion=$$(echo $$version | cut -d"." -f -2) && \ - echo "https://releases.nixos.org/nixos/$$mainversion/nixos-$$version/nixexprs.tar.xz" && \ - nix-instantiate --find-file nixpkgs -.PHONY: nix-info - -###### Initial setup -setup: - ./scripts/setup -.PHONY: setup - -###### Morph regular tasks -PROFILE=/nix/var/nix/profiles/per-user/immae/morph/immaeEu -TARGET ?= -MORPH_ARGS ?= -ifdef TARGET - # multiple targets: --on="{machine1,machine2}" (works with * glob too) - override MORPH_ARGS +=--on=$(TARGET) -endif -SSH_ARGS ?= - -edit_env: - $(EDITOR) secrets/environment.nix || true - git -C secrets add environment.nix || true - git -C secrets commit -m "Edit environment.nix" environment.nix || true - -edit_vars: - sops secrets/vars.yml || true - git -C secrets add vars.yml || true - git -C secrets commit -m "Edit password for vars.yml using sops." vars.yml || true - -ssh-eldiron: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@eldiron $(SSH_ARGS)' - -ssh-dilion: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@dilion $(SSH_ARGS)' - -ssh-backup-2: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@backup-2 $(SSH_ARGS)' - -ssh-monitoring-1: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@monitoring-1 $(SSH_ARGS)' - -ssh-4c: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@quatresaisons $(SSH_ARGS)' - -debug: - ./scripts/with_env morph build --show-trace default.nix $(MORPH_ARGS) - -build: - ./scripts/with_env morph build default.nix $(MORPH_ARGS) - -dry-run: - ./scripts/with_env morph build --dry-run default.nix $(MORPH_ARGS) - -upload: - ./scripts/with_env morph push default.nix $(MORPH_ARGS) - -deploy: - ./scripts/with_env morph deploy default.nix switch --keep-result --upload-secrets $(MORPH_ARGS) - nix-env -p $(PROFILE) --set .gcroots/default.nix - -next-boot: - ./scripts/with_env morph deploy default.nix boot --keep-result --upload-secrets $(MORPH_ARGS) - nix-env -p $(PROFILE) --set .gcroots/default.nix - -deploy-reboot: - ./scripts/with_env morph deploy default.nix boot --reboot --upload-secrets $(MORPH_ARGS) - -.PHONY: ssh-eldiron ssh-dilion ssh-monitoring-1 ssh-backup-2 debug build upload deploy deploy-reboot - -###### Cleanup generations and garbage collection -GEN ?= "+3" - -list-generations: - nix-env -p $(PROFILE) --list-generations - $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations" -.PHONY: list-generations - -delete-generations: - @echo "making sure that a complete build is done before cleaning up" - $(MAKE) build MORPH_ARGS=--keep-result - nix-env -p $(PROFILE) --delete-generations $(GEN) - $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" - $(MAKE) ssh-dilion SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" - $(MAKE) ssh-backup-2 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" - $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" -.PHONY: delete-generations - -cleanup: delete-generations - nix-store --gc - $(MAKE) ssh-eldiron SSH_ARGS="nix-store --gc" - $(MAKE) ssh-dilion SSH_ARGS="nix-store --gc" - $(MAKE) ssh-backup-2 SSH_ARGS="nix-store --gc" - $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-store --gc" -.PHONY: cleanup diff --git a/nixops/default.nix b/nixops/default.nix deleted file mode 100644 index 1241443..0000000 --- a/nixops/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - dilion = import ../modules/private/system/dilion.nix; - eldiron = import ../modules/private/system/eldiron.nix; - backup-2 = import ../modules/private/system/backup-2.nix; - monitoring-1 = import ../modules/private/system/monitoring-1.nix; - - quatresaisons = import ../modules/private/system/quatresaisons.nix; -} diff --git a/nixops/scripts/with_env b/nixops/scripts/with_env deleted file mode 100755 index c570ccf..0000000 --- a/nixops/scripts/with_env +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -if [ -z "$NIXOPS_ENV_LOADED" ]; then - echo "Please load the environment with direnv" - exit 1; -fi - -umask 0077 -TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files) -chmod go-rwx $TEMP - -finish() { - rm -rf "$TEMP" -} - -trap finish EXIT - -sops -d secrets/vars.yml | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519 - -export SSH_IDENTITY_FILE="$TEMP/id_ed25519" - -"$@" diff --git a/nixops/secrets b/nixops/secrets deleted file mode 160000 index 8c6277e..0000000 --- a/nixops/secrets +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8c6277e3c2762e13d5f1f2ac06d2e815e02fab82 diff --git a/overlays/bonfire/default.nix b/overlays/bonfire/default.nix deleted file mode 100644 index 6dc1034..0000000 --- a/overlays/bonfire/default.nix +++ /dev/null @@ -1,36 +0,0 @@ -self: super: { - bonfire = let - click = self.python3Packages.click.overridePythonAttrs(old: rec { - version = "6.7"; - src = self.python3Packages.fetchPypi { - pname = "click"; - inherit version; - sha256 = "02qkfpykbq35id8glfgwc38yc430427yd05z1wc5cnld8zgicmgi"; - }; - postPatch = '' - substituteInPlace click/_unicodefun.py --replace "'locale'" "'${self.locale}/bin/locale'" - ''; - doCheck = false; - }); - keyring = self.python3Packages.keyring.overridePythonAttrs(old: rec { - version = "20.0.1"; - src = self.python3Packages.fetchPypi { - pname = "keyring"; - inherit version; - sha256 = "963bfa7f090269d30bdc5e25589e5fd9dad2cf2a7c6f176a7f2386910e5d0d8d"; - }; - }); - in - super.bonfire.overridePythonAttrs(old: { - version = "0.0.8"; - src = self.fetchFromGitHub { - owner = "blue-yonder"; - repo = "bonfire"; - rev = "0a0f18469d484aba6871fa7421bbb2c00ccefcb0"; - sha256 = "1y2r537ibghhmk6jngw0zwvh1vn2bihqcvji50ffh1j0qc6q3x6x"; - }; - postPatch = ""; - propagatedBuildInputs = self.lib.subtractLists [ self.python3Packages.click self.python3Packages.keyring ] old.propagatedBuildInputs ++ [ click keyring ]; - meta.broken = false; - }); -} diff --git a/overlays/bugwarrior/default.nix b/overlays/bugwarrior/default.nix deleted file mode 100644 index 2b25985..0000000 --- a/overlays/bugwarrior/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - bugwarrior = super.python3Packages.bugwarrior.overridePythonAttrs(old: rec { - patches = old.patches or [] ++ [ ./mantisbt.patch ]; - }); -} diff --git a/overlays/bugwarrior/mantisbt.patch b/overlays/bugwarrior/mantisbt.patch deleted file mode 100644 index 85e5af1..0000000 --- a/overlays/bugwarrior/mantisbt.patch +++ /dev/null @@ -1,379 +0,0 @@ -diff --git a/bugwarrior/services/mantisbt.py b/bugwarrior/services/mantisbt.py -new file mode 100644 -index 0000000..e54af0d ---- /dev/null -+++ b/bugwarrior/services/mantisbt.py -@@ -0,0 +1,361 @@ -+from builtins import filter -+import re -+import six -+ -+import requests -+from jinja2 import Template -+ -+from bugwarrior.config import asbool, aslist, die -+from bugwarrior.services import IssueService, Issue, ServiceClient -+ -+import logging -+log = logging.getLogger(__name__) -+ -+ -+class MantisbtClient(ServiceClient): -+ def __init__(self, host, token): -+ self.host = host -+ self.session = requests.Session() -+ self.session.headers['Authorization'] = token -+ -+ def _api_url(self, path, **context): -+ """ Build the full url to the API endpoint """ -+ baseurl = "https://{}/api/rest".format(self.host) -+ return baseurl + path.format(**context) -+ -+ def get_user(self): -+ return self.json_response(self.session.get(self._api_url("/users/me"))) -+ -+ def get_projects(self): -+ return self._getter(self._api_url("/projects"), subkey="projects") -+ -+ def get_issues(self): -+ url = self._api_url("/issues?page_size=50") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def get_assigned_issues(self): -+ """ Returns all issues assigned to authenticated user. -+ """ -+ url = self._api_url("/issues?page_size=50&filter_id=assigned") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def get_monitored_issues(self): -+ """ Returns all issues monitored by authenticated user. -+ """ -+ url = self._api_url("/issues?page_size=50&filter_id=monitored") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def get_reported_issues(self): -+ """ Returns all issues reported by authenticated user. -+ """ -+ url = self._api_url("/issues?page_size=50&filter_id=reported") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def _getter(self, url, page_size=None, subkey=None): -+ """ Pagination utility. Obnoxious. """ -+ -+ results = [] -+ link = dict(next=url) -+ page_number = 1 -+ -+ while 'next' in link: -+ if page_size is not None: -+ response = self.session.get(link['next'] + "&page=" + str(page_number)) -+ else: -+ response = self.session.get(link['next']) -+ -+ json_res = self.json_response(response) -+ -+ if subkey is not None: -+ json_res = json_res[subkey] -+ -+ results += json_res -+ -+ if page_size is not None and len(json_res) == page_size: -+ page_number += 1 -+ else: -+ break -+ -+ return results -+ -+class MantisbtIssue(Issue): -+ TITLE = 'mantisbttitle' -+ BODY = 'mantisbtbody' -+ CREATED_AT = 'mantisbtcreatedon' -+ UPDATED_AT = 'mantisbtupdatedat' -+ CLOSED_AT = 'mantisbtclosedon' -+ URL = 'mantisbturl' -+ PROJECT = 'mantisbtproject' -+ NUMBER = 'mantisbtnumber' -+ USER = 'mantisbtuser' -+ CATEGORY = 'mantisbtcategory' -+ STATE = 'mantisbtstate' -+ -+ UDAS = { -+ TITLE: { -+ 'type': 'string', -+ 'label': 'Mantisbt Title', -+ }, -+ BODY: { -+ 'type': 'string', -+ 'label': 'Mantisbt Body', -+ }, -+ CREATED_AT: { -+ 'type': 'date', -+ 'label': 'Mantisbt Created', -+ }, -+ UPDATED_AT: { -+ 'type': 'date', -+ 'label': 'Mantisbt Updated', -+ }, -+ CLOSED_AT: { -+ 'type': 'date', -+ 'label': 'Mantisbt Closed', -+ }, -+ PROJECT: { -+ 'type': 'string', -+ 'label': 'Mantisbt Project', -+ }, -+ URL: { -+ 'type': 'string', -+ 'label': 'Mantisbt URL', -+ }, -+ NUMBER: { -+ 'type': 'numeric', -+ 'label': 'Mantisbt Issue #', -+ }, -+ USER: { -+ 'type': 'string', -+ 'label': 'Mantisbt User', -+ }, -+ CATEGORY: { -+ 'type': 'string', -+ 'label': 'Mantisbt Category', -+ }, -+ STATE: { -+ 'type': 'string', -+ 'label': 'Mantisbt State', -+ } -+ } -+ UNIQUE_KEY = (URL, NUMBER, ) -+ -+ def _normalize_tag(self, label): -+ return re.sub(r'[^a-zA-Z0-9]', '_', label) -+ -+ def to_taskwarrior(self): -+ body = self.record.get('description') -+ if body: -+ body = body.replace('\r\n', '\n') -+ -+ created = self.parse_date(self.record.get('created_at')) -+ updated = self.parse_date(self.record.get('updated_at')) -+ closed_date = None -+ if self.record["status"]["name"] in ["closed", "resolved"]: -+ for history in self.record.get("history", []): -+ if history.get("field", {}).get("name", "") == "status"\ -+ and history.get("new_value", {}).get("name", "") in ["closed", "resolved"]: -+ closed_date = history["created_at"] -+ closed = self.parse_date(closed_date) -+ -+ return { -+ 'project': self.record['project']['name'], -+ 'priority': self.origin['default_priority'], -+ 'annotations': self.get_annotations(), -+ 'tags': self.get_tags(), -+ 'entry': created, -+ 'end': closed, -+ -+ self.TITLE: self.record.get('summary'), -+ self.BODY: body, -+ self.CREATED_AT: created, -+ self.UPDATED_AT: updated, -+ self.CLOSED_AT: closed, -+ self.URL: self.get_url(), -+ self.PROJECT: self.record['project'].get('name'), -+ self.NUMBER: self.record['id'], -+ self.USER: self.record['reporter'].get('name'), -+ self.CATEGORY: self.record['category'].get('name'), -+ self.STATE: self.record['status'].get('label'), -+ } -+ -+ def get_url(self): -+ return "https://{}view.php?id={}".format(self.extra['host'], self.record["id"]) -+ -+ def get_annotations(self): -+ annotations = [] -+ -+ context = self.record.copy() -+ annotation_template = Template(self.origin['annotation_template']) -+ -+ for annotation_dict in self.record.get('notes', []): -+ context.update({ -+ 'text': annotation_dict['text'], -+ 'date': annotation_dict['created_at'], -+ 'author': annotation_dict['reporter'].get('name', 'unknown'), -+ 'view': annotation_dict['view_state']['label'], -+ }) -+ annotations.append( -+ annotation_template.render(context) -+ ) -+ return annotations -+ -+ def get_tags(self): -+ tags = [] -+ -+ context = self.record.copy() -+ tag_template = Template(self.origin['tag_template']) -+ -+ for tag_dict in self.record.get('tags', []): -+ context.update({ -+ 'tag': self._normalize_tag(tag_dict['name']) -+ }) -+ tags.append( -+ tag_template.render(context) -+ ) -+ -+ return tags -+ -+ def get_default_description(self): -+ return self.build_default_description( -+ title=self.record['summary'], -+ url=self.get_processed_url(self.get_url()), -+ number=self.record['id'], -+ ) -+ -+ -+class MantisbtService(IssueService): -+ ISSUE_CLASS = MantisbtIssue -+ CONFIG_PREFIX = 'mantisbt' -+ -+ def __init__(self, *args, **kw): -+ super(MantisbtService, self).__init__(*args, **kw) -+ -+ self.host = self.config.get('host', 'www.mantisbt.org/bugs/') -+ -+ token = self.get_password('token') -+ -+ self.client = MantisbtClient(self.host, token) -+ self.user = None -+ -+ self.exclude_projects = self.config.get('exclude_projects', [], aslist) -+ self.include_projects = self.config.get('include_projects', [], aslist) -+ -+ self.involved_issues = self.config.get( -+ 'involved_issues', default=True, to_type=asbool -+ ) -+ self.assigned_issues = self.config.get( -+ 'assigned_issues', default=False, to_type=asbool -+ ) -+ self.monitored_issues = self.config.get( -+ 'monitored_issues', default=False, to_type=asbool -+ ) -+ self.reported_issues = self.config.get( -+ 'reported_issues', default=False, to_type=asbool -+ ) -+ self.tag_template = self.config.get( -+ 'tag_template', default='{{tag}}', to_type=six.text_type -+ ) -+ self.annotation_template = self.config.get( -+ 'annotation_template', default='{{date}} {{author}} ({{view}}): {{text}}', to_type=six.text_type -+ ) -+ -+ def get_service_metadata(self): -+ return { -+ 'tag_template': self.tag_template, -+ 'annotation_template': self.annotation_template, -+ } -+ -+ def filter_involved_issues(self, issue): -+ _, issue = issue -+ user = self.client.get_user() -+ uid = user["id"] -+ if issue["reporter"]["id"] != uid and \ -+ issue.get("handler", {}).get("id") != uid and \ -+ all([ x.get("user", {}).get("id") != uid for x in issue.get("history", [])]) and \ -+ all([ x.get("user", {}).get("id") != uid for x in issue.get("monitors", [])]): -+ return False -+ return self.filter_project_name(issue["project"]["name"]) -+ -+ def filter_issues(self, issue): -+ _, issue = issue -+ return self.filter_project_name(issue["project"]["name"]) -+ -+ def filter_project_name(self, name): -+ if self.exclude_projects: -+ if name in self.exclude_projects: -+ return False -+ -+ if self.include_projects: -+ if name in self.include_projects: -+ return True -+ else: -+ return False -+ -+ return True -+ -+ @staticmethod -+ def get_keyring_service(service_config): -+ host = service_config.get('host', 'www.mantisbt.org/bugs/') -+ username = service_config.get('username', default='nousername') -+ return "mantisbt://{username}@{host}".format(username=username, -+ host=host) -+ -+ @staticmethod -+ def to_issue_dict(issues): -+ return { i['id']: i for i in issues } -+ -+ def get_owner(self, issue): -+ return issue.get("handler", {}).get("name") -+ -+ def get_author(self, issue): -+ return issue.get("reporter", {}).get("name") -+ -+ def issues(self): -+ issues = {} -+ is_limited = self.assigned_issues or self.monitored_issues or self.reported_issues -+ -+ if self.assigned_issues: -+ issues.update( -+ filter(self.filter_issues, self.to_issue_dict(self.client.get_assigned_issues()).items()) -+ ) -+ if self.monitored_issues: -+ issues.update( -+ filter(self.filter_issues, self.to_issue_dict(self.client.get_monitored_issues()).items()) -+ ) -+ if self.reported_issues: -+ issues.update( -+ filter(self.filter_issues, self.to_issue_dict(self.client.get_reported_issues()).items()) -+ ) -+ -+ if not is_limited: -+ all_issues = self.to_issue_dict(self.client.get_issues()) -+ if self.involved_issues: -+ issues.update( -+ filter(self.filter_involved_issues, all_issues.items()) -+ ) -+ else: -+ issues.update( -+ filter(self.filter_issues, all_issues.items()) -+ ) -+ -+ log.debug(" Found %i issues.", len(issues)) -+ if not is_limited: -+ issues = list(filter(self.include, issues.values())) -+ else: -+ issues = list(issues.values()) -+ log.debug(" Pruned down to %i issues.", len(issues)) -+ -+ for issue in issues: -+ issue_obj = self.get_issue_for_record(issue) -+ extra = { -+ 'host': self.host -+ } -+ issue_obj.update_extra(extra) -+ yield issue_obj -+ -+ @classmethod -+ def validate_config(cls, service_config, target): -+ if 'token' not in service_config: -+ die("[%s] has no 'mantisbt.token'" % target) -+ -+ super(MantisbtService, cls).validate_config(service_config, target) -diff --git a/setup.py b/setup.py -index d6d957a..665e36e 100644 ---- a/setup.py -+++ b/setup.py -@@ -80,6 +80,7 @@ setup(name='bugwarrior', - activecollab2=bugwarrior.services.activecollab2:ActiveCollab2Service - activecollab=bugwarrior.services.activecollab:ActiveCollabService - jira=bugwarrior.services.jira:JiraService -+ mantisbt=bugwarrior.services.mantisbt:MantisbtService - megaplan=bugwarrior.services.megaplan:MegaplanService - phabricator=bugwarrior.services.phab:PhabricatorService - versionone=bugwarrior.services.versionone:VersionOneService diff --git a/overlays/bundix/default.nix b/overlays/bundix/default.nix deleted file mode 100644 index 6c4046c..0000000 --- a/overlays/bundix/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - bundix = super.bundix.overrideAttrs (old: { - preBuild = (old.preBuild or "") + '' - sed -i -e "/case obj/a\ when nil\n nil" lib/bundix/nixer.rb - ''; - }); -} diff --git a/overlays/databases/mysql/default.nix b/overlays/databases/mysql/default.nix deleted file mode 100644 index f9e5791..0000000 --- a/overlays/databases/mysql/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -self: super: rec { - mariadb_pam = super.mariadb.overrideAttrs(old: { - cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ]; - buildInputs = old.buildInputs ++ [ self.pam ]; - outputs = old.outputs ++ [ "dev" ]; - postInstall = '' - mkdir -p $dev $dev/lib $dev/share - cp -a $out/include $dev - cp -a $out/lib/{libmariadbclient.a,libmysqlclient.a,libmysqlclient_r.a,libmysqlservices.a} $dev/lib - cp -a $out/lib/pkgconfig $dev/lib - cp -a $out/share/aclocal $dev/share - '' + old.postInstall; - }); - # This patched version includes C headers from the server part (see - # above). It seems to be required to build pam support in clients. - libmysqlclient_pam = super.libmysqlclient.overrideAttrs(old: { - prePatch = old.prePatch or "" + '' - sed -i -e '/define INCLUDE/s|"$| -I@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@/@INSTALL_INCLUDEDIR@/mysql/server -I@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@/@INSTALL_INCLUDEDIR@/mysql/server/private"|' mariadb_config/mariadb_config.c.in - ''; - postInstall = old.postInstall or "" + '' - cp -a ${mariadb_pam.dev}/include/* $out/include/mariadb - ''; - }); -} diff --git a/overlays/default.nix b/overlays/default.nix deleted file mode 100644 index bdc99d2..0000000 --- a/overlays/default.nix +++ /dev/null @@ -1,48 +0,0 @@ -let - flakeCompat = import ../lib/flake-compat.nix; - flakes = builtins.foldl' (a: b: a // b) {} (map (n: (flakeCompat n).overlays) [ - ../flakes/backports - ../flakes/openarc - ../flakes/opendmarc - ../flakes/peertube - ../flakes/private/peertube - ]); -in flakes // { - mylibs = self: super: { mylibs = import ../lib { pkgs = self; }; }; - mypkgs = self: super: import ../pkgs { pkgs = self; }; - - bitlbee = import ./bitlbee; - bitlbee-discord = import ./bitlbee-discord; - bonfire = import ./bonfire; - bundix = import ./bundix; - bugwarrior = import ./bugwarrior; - dwm = import ./dwm; - elinks = import ./elinks; - gitweb = import ./gitweb; - gitolite = import ./gitolite; - goaccess = import ./goaccess; - kanboard = import ./kanboard; - ledger = import ./ledger; - lesspipe = import ./lesspipe; - mysql = import ./databases/mysql; - neomutt = import ./neomutt; - nixops = import ./nixops; - pass = import ./pass; - pelican = import ./pelican; - php-packages = import ./php-packages; - postfix = import ./postfix; - postgresql = import ./databases/postgresql; - procps-ng = import ./procps-ng; - sc-im = import ./sc-im; - shaarli = import ./shaarli; - slrn = import ./slrn; - taskwarrior = import ./taskwarrior; - vcsh = import ./vcsh; - weechat = import ./weechat; - ympd = import ./ympd; - doing = import ./doing; - khal = import ./khal; - nix-direnv = import ./nix-direnv; - morph = import ./morph; -} -// import ./python-packages diff --git a/overlays/doing/default.nix b/overlays/doing/default.nix deleted file mode 100644 index 7f95fb6..0000000 --- a/overlays/doing/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -self: super: { - defaultGemConfig = super.defaultGemConfig // { - doing = attrs: { - postInstall = '' - installPath=$(cat $out/nix-support/gem-meta/install-path) - sed -i $installPath/lib/doing/wwid.rb -e "/Create a backup copy for the undo command/ {n;d}" - ''; - }; - }; -} diff --git a/overlays/dwm/default.nix b/overlays/dwm/default.nix deleted file mode 100644 index 96ed3ff..0000000 --- a/overlays/dwm/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - dwm = super.dwm.overrideAttrs(old: rec { - postPatch = '' - cp ${./dwm_config.h} ./config.h - ''; - }); -} diff --git a/overlays/dwm/dwm_config.h b/overlays/dwm/dwm_config.h deleted file mode 100644 index b1587e8..0000000 --- a/overlays/dwm/dwm_config.h +++ /dev/null @@ -1,98 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Nextcloud", NULL, NULL, 9 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[M]", monocle }, /* first entry is default */ - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ -}; - -/* key definitions */ -#define MODKEY Mod1Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY, XK_t, spawn, {.v = termcmd } }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_Return, zoom, {0} }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/overlays/elinks/default.nix b/overlays/elinks/default.nix deleted file mode 100644 index 1744dc0..0000000 --- a/overlays/elinks/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -self: super: { - elinks = super.elinks.overrideAttrs (old: - self.mylibs.fetchedGithub ./elinks.json // rec { - preConfigure = ''sh autogen.sh''; - buildInputs = old.buildInputs ++ (with self; [ gettext automake autoconf ]); - configureFlags = [ - "--disable-smb" "--without-x" "--enable-cgi" - "--enable-leds" "--enable-256-colors" - "--enable-html-highlight" "--with-zlib" - ]; - patches = []; - } - ); -} diff --git a/overlays/elinks/elinks.json b/overlays/elinks/elinks.json deleted file mode 100644 index ea13b1f..0000000 --- a/overlays/elinks/elinks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "f86be65-master", - "meta": { - "name": "elinks", - "url": "https://github.com/nabetaro/elinks", - "branch": "master" - }, - "github": { - "owner": "nabetaro", - "repo": "elinks", - "rev": "f86be659718c0cd0a67f88b42f07044c23d0d028", - "sha256": "1jxb7xgawcjkb3gw4gqyw26g02709wwdbhyczfckh3l4njxhy14m", - "fetchSubmodules": true - } -} diff --git a/overlays/kanboard/default.nix b/overlays/kanboard/default.nix deleted file mode 100644 index 05f2882..0000000 --- a/overlays/kanboard/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -self: super: { - kanboard = { kanboard_config ? "/etc/kanboard/config.php" }: - super.kanboard.overrideAttrs(old: rec { - name = "kanboard-${version}"; - version = "1.2.9"; - src = self.fetchFromGitHub { - owner = "kanboard"; - repo = "kanboard"; - rev = "c4152316b14936556edf3bcc4d11f16ba31b8ae7"; - sha256 = "1hdr95cpxgdzrzhffs63gdl0g7122ma2zg8bkqwp42p5xphx0xan"; - }; - installPhase = '' - cp -a . $out - ln -s ${kanboard_config} $out/config.php - mv $out/data $out/dataold - ''; - }); -} diff --git a/overlays/khal/default.nix b/overlays/khal/default.nix deleted file mode 100644 index 597cc0e..0000000 --- a/overlays/khal/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -self: super: { - khal = super.khal.overridePythonAttrs(old: { - postPatch = '' - sed -i "s/Invalid value for \"ics\"/Invalid value for \\\'ics\\\'/" tests/cli_test.py - sed -i "s/Invalid value for \"\[ICS\]\"/Invalid value for \\\'[ICS]\\\'/" tests/cli_test.py - ''; - }); -} diff --git a/overlays/ledger/default.nix b/overlays/ledger/default.nix deleted file mode 100644 index 9f2df57..0000000 --- a/overlays/ledger/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -self: super: { - ledger = super.ledger.overrideAttrs(old: rec { - #name = "${old.pname}-${version}"; - #version = "3.2.1"; - #src = self.fetchFromGitHub { - # owner = "ledger"; - # repo = "ledger"; - # rev = "v${version}"; - # sha256 = "0x6jxwss3wwzbzlwmnwb8yzjk8f9wfawif4f1b74z2qg6hc4r7f6"; - #}; - patches = old.patches or [] ++ [ - (self.fetchpatch { - name = "xdgconfig.patch"; - url = "https://github.com/ledger/ledger/commit/c79674649dee7577d6061e3d0776922257520fd0.patch"; - sha256 = "0n82mjz9i17800r7vs45sxpss14rivsf1j8hrv7jal24iyfm01dz"; - excludes = [ "doc/NEWS.md" ]; - }) - ]; - }); -} diff --git a/overlays/lesspipe/default.nix b/overlays/lesspipe/default.nix deleted file mode 100644 index e53feae..0000000 --- a/overlays/lesspipe/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - lesspipe = super.lesspipe.overrideAttrs(old: { - configureFlags = (old.configureFlags or []) ++ [ "--yes" ]; - }); -} diff --git a/overlays/morph/default.nix b/overlays/morph/default.nix deleted file mode 100644 index 448f051..0000000 --- a/overlays/morph/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - morph = super.morph.overrideAttrs(old: { - patches = (old.patches or []) ++ [ ./verbose_nix.patch ./dry-run.patch ]; - }); -} diff --git a/overlays/neomutt/default.nix b/overlays/neomutt/default.nix deleted file mode 100644 index f03290a..0000000 --- a/overlays/neomutt/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - neomutt = super.neomutt.overrideAttrs(old: { - patches = old.patches or [] ++ [ - ./tx.patch - ]; - }); -} diff --git a/overlays/neomutt/tx.patch b/overlays/neomutt/tx.patch deleted file mode 100644 index c8736df..0000000 --- a/overlays/neomutt/tx.patch +++ /dev/null @@ -1,44 +0,0 @@ -commit 61ae454e1579d02736c48e3468a3237429214cdf -Author: Ismaël Bouya -Date: Tue Jun 2 13:03:04 2020 +0200 - - Add %tx to index_format - -diff --git a/hdrline.c b/hdrline.c -index 9224c6641..1594ed729 100644 ---- a/hdrline.c -+++ b/hdrline.c -@@ -575,6 +575,7 @@ static const char *index_format_str(char *buf, size_t buflen, size_t col, int co - const struct Address *from = TAILQ_FIRST(&e->env->from); - const struct Address *to = TAILQ_FIRST(&e->env->to); - const struct Address *cc = TAILQ_FIRST(&e->env->cc); -+ const struct Address *x_orig_to = TAILQ_FIRST(&e->env->x_original_to); - - buf[0] = '\0'; - switch (op) -@@ -1192,13 +1193,18 @@ static const char *index_format_str(char *buf, size_t buflen, size_t col, int co - - case 't': - tmp[0] = '\0'; -- if (!check_for_mailing_list(&e->env->to, "To ", tmp, sizeof(tmp)) && -- !check_for_mailing_list(&e->env->cc, "Cc ", tmp, sizeof(tmp))) -- { -- if (to) -- snprintf(tmp, sizeof(tmp), "To %s", mutt_get_name(to)); -- else if (cc) -- snprintf(tmp, sizeof(tmp), "Cc %s", mutt_get_name(cc)); -+ if (src[0] == 'x') { -+ snprintf(tmp, sizeof(tmp), "%s", mutt_get_name(x_orig_to)); -+ src++; -+ } else { -+ if (!check_for_mailing_list(&e->env->to, "To ", tmp, sizeof(tmp)) && -+ !check_for_mailing_list(&e->env->cc, "Cc ", tmp, sizeof(tmp))) -+ { -+ if (to) -+ snprintf(tmp, sizeof(tmp), "To %s", mutt_get_name(to)); -+ else if (cc) -+ snprintf(tmp, sizeof(tmp), "Cc %s", mutt_get_name(cc)); -+ } - } - mutt_format_s(buf, buflen, prec, tmp); - break; diff --git a/overlays/nix-direnv/default.nix b/overlays/nix-direnv/default.nix deleted file mode 100644 index c4c96e2..0000000 --- a/overlays/nix-direnv/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - nix-direnv = super.nix-direnv.overrideAttrs (old: { - postPatch = old.postPatch + '' - sed -i -e 's/TEMPDIR "$old_tmp"/TEMPDIR "$old_tmpdir"/' direnvrc - ''; - }); -} diff --git a/overlays/nixops/default.nix b/overlays/nixops/default.nix deleted file mode 100644 index 14aec3b..0000000 --- a/overlays/nixops/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -self: super: { - nixops = super.nixops.overrideAttrs (old: { - patches = [ - ./fix_glibc.patch - (self.fetchpatch { - name = "hetzner_cloud.patch"; - url = "https://github.com/goodraven/nixops/commit/272e50d0b0262e49cdcaad42cdab57aad183d1c2.patch"; - sha256 = "12wcrb0155ald52m7fbr2m5rrxdnwdwripq91ckscgsk42mdc517"; - }) - ]; - preConfigure = (old.preConfigure or "") + '' - # https://github.com/NixOS/nixops/issues/1216 - sed -i -e "/Register the paths in the Nix database./s/#.*$/export USER=root/" nix/libvirtd-image.nix - - sed -i -e '/^import sys$/s/$/; sys.tracebacklimit = 0/' scripts/nixops - sed -i -e "/'keyFile'/s/'path'/'string'/" nixops/backends/__init__.py - sed -i -e "/security.initialRootPassword/d" nix/hetzner.nix - ''; - }); -} diff --git a/overlays/nixops/fix_glibc.patch b/overlays/nixops/fix_glibc.patch deleted file mode 100644 index 1aeb093..0000000 --- a/overlays/nixops/fix_glibc.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/nix/hetzner-bootstrap.nix b/nix/hetzner-bootstrap.nix -index 035e6f9..def42a1 100644 ---- a/nix/hetzner-bootstrap.nix -+++ b/nix/hetzner-bootstrap.nix -@@ -3,9 +3,7 @@ with import { system = "x86_64-linux"; }; - let - pkgsNative = import {}; - -- nixpart = python2Packages.nixpart0.override { -- useNixUdev = false; -- }; -+ nixpart = python2Packages.nixpart0; - - generateConfig = (import { - configuration = {}; diff --git a/overlays/nixops/hetzner_cloud.patch b/overlays/nixops/hetzner_cloud.patch deleted file mode 100644 index b75c116..0000000 --- a/overlays/nixops/hetzner_cloud.patch +++ /dev/null @@ -1,480 +0,0 @@ -From 272e50d0b0262e49cdcaad42cdab57aad183d1c2 Mon Sep 17 00:00:00 2001 -From: goodraven - -Date: Thu, 3 May 2018 22:24:58 -0700 -Subject: [PATCH] Initial commit adding support for hetzner cloud - -This is based on the digital ocean backend. It also uses nixos-infect. I extended nixos-infect to be generic -for both backends. - -Fixes #855 ---- - examples/trivial-hetzner-cloud.nix | 12 ++ - nix/eval-machine-info.nix | 1 + - nix/hetzner-cloud.nix | 56 +++++++ - nix/options.nix | 1 + - nixops/backends/hetzner_cloud.py | 230 +++++++++++++++++++++++++++++ - nixops/data/nixos-infect | 77 +++++++--- - 6 files changed, 354 insertions(+), 23 deletions(-) - create mode 100644 examples/trivial-hetzner-cloud.nix - create mode 100644 nix/hetzner-cloud.nix - create mode 100644 nixops/backends/hetzner_cloud.py - -diff --git a/examples/trivial-hetzner-cloud.nix b/examples/trivial-hetzner-cloud.nix -new file mode 100644 -index 000000000..c61add6bb ---- /dev/null -+++ b/examples/trivial-hetzner-cloud.nix -@@ -0,0 +1,12 @@ -+{ -+ resources.sshKeyPairs.ssh-key = {}; -+ -+ machine = { config, pkgs, ... }: { -+ services.openssh.enable = true; -+ -+ deployment.targetEnv = "hetznerCloud"; -+ deployment.hetznerCloud.serverType = "cx11"; -+ -+ networking.firewall.allowedTCPPorts = [ 22 ]; -+ }; -+} -diff --git a/nix/eval-machine-info.nix b/nix/eval-machine-info.nix -index 2884b4b47..6a7205786 100644 ---- a/nix/eval-machine-info.nix -+++ b/nix/eval-machine-info.nix -@@ -309,6 +309,7 @@ rec { - digitalOcean = optionalAttrs (v.config.deployment.targetEnv == "digitalOcean") v.config.deployment.digitalOcean; - gce = optionalAttrs (v.config.deployment.targetEnv == "gce") v.config.deployment.gce; - hetzner = optionalAttrs (v.config.deployment.targetEnv == "hetzner") v.config.deployment.hetzner; -+ hetznerCloud = optionalAttrs (v.config.deployment.targetEnv == "hetznerCloud") v.config.deployment.hetznerCloud; - container = optionalAttrs (v.config.deployment.targetEnv == "container") v.config.deployment.container; - route53 = v.config.deployment.route53; - virtualbox = -diff --git a/nix/hetzner-cloud.nix b/nix/hetzner-cloud.nix -new file mode 100644 -index 000000000..21d148c1a ---- /dev/null -+++ b/nix/hetzner-cloud.nix -@@ -0,0 +1,56 @@ -+{ config, pkgs, lib, utils, ... }: -+ -+with utils; -+with lib; -+with import ./lib.nix lib; -+ -+let -+ cfg = config.deployment.hetznerCloud; -+in -+{ -+ ###### interface -+ options = { -+ -+ deployment.hetznerCloud.authToken = mkOption { -+ default = ""; -+ example = "8b2f4e96af3997853bfd4cd8998958eab871d9614e35d63fab45a5ddf981c4da"; -+ type = types.str; -+ description = '' -+ The API auth token. We're checking the environment for -+ HETZNER_CLOUD_AUTH_TOKEN first and if that is -+ not set we try this auth token. -+ ''; -+ }; -+ -+ deployment.hetznerCloud.datacenter = mkOption { -+ example = "fsn1-dc8"; -+ default = null; -+ type = types.nullOr types.str; -+ description = '' -+ The datacenter. -+ ''; -+ }; -+ -+ deployment.hetznerCloud.location = mkOption { -+ example = "fsn1"; -+ default = null; -+ type = types.nullOr types.str; -+ description = '' -+ The location. -+ ''; -+ }; -+ -+ deployment.hetznerCloud.serverType = mkOption { -+ example = "cx11"; -+ type = types.str; -+ description = '' -+ Name or id of server types. -+ ''; -+ }; -+ }; -+ -+ config = mkIf (config.deployment.targetEnv == "hetznerCloud") { -+ nixpkgs.system = mkOverride 900 "x86_64-linux"; -+ services.openssh.enable = true; -+ }; -+} -diff --git a/nix/options.nix b/nix/options.nix -index 0866c3ab8..db021f74d 100644 ---- a/nix/options.nix -+++ b/nix/options.nix -@@ -22,6 +22,7 @@ in - ./keys.nix - ./gce.nix - ./hetzner.nix -+ ./hetzner-cloud.nix - ./container.nix - ./libvirtd.nix - ]; -diff --git a/nixops/backends/hetzner_cloud.py b/nixops/backends/hetzner_cloud.py -new file mode 100644 -index 000000000..a2cb176b9 ---- /dev/null -+++ b/nixops/backends/hetzner_cloud.py -@@ -0,0 +1,230 @@ -+# -*- coding: utf-8 -*- -+""" -+A backend for hetzner cloud. -+ -+This backend uses nixos-infect (which uses nixos LUSTRATE) to infect a -+hetzner cloud instance. The setup requires two reboots, one for -+the infect itself, another after we pushed the nixos image. -+""" -+import os -+import os.path -+import time -+import socket -+ -+import requests -+ -+import nixops.resources -+from nixops.backends import MachineDefinition, MachineState -+from nixops.nix_expr import Function, RawValue -+import nixops.util -+import nixops.known_hosts -+ -+infect_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'data', 'nixos-infect')) -+ -+API_HOST = 'api.hetzner.cloud' -+ -+class ApiError(Exception): -+ pass -+ -+class ApiNotFoundError(ApiError): -+ pass -+ -+class HetznerCloudDefinition(MachineDefinition): -+ @classmethod -+ def get_type(cls): -+ return "hetznerCloud" -+ -+ def __init__(self, xml, config): -+ MachineDefinition.__init__(self, xml, config) -+ self.auth_token = config["hetznerCloud"]["authToken"] -+ self.location = config["hetznerCloud"]["location"] -+ self.datacenter = config["hetznerCloud"]["datacenter"] -+ self.server_type = config["hetznerCloud"]["serverType"] -+ -+ def show_type(self): -+ return "{0} [{1}]".format(self.get_type(), self.location or self.datacenter or 'any location') -+ -+ -+class HetznerCloudState(MachineState): -+ @classmethod -+ def get_type(cls): -+ return "hetznerCloud" -+ -+ state = nixops.util.attr_property("state", MachineState.MISSING, int) # override -+ public_ipv4 = nixops.util.attr_property("publicIpv4", None) -+ public_ipv6 = nixops.util.attr_property("publicIpv6", None) -+ location = nixops.util.attr_property("hetznerCloud.location", None) -+ datacenter = nixops.util.attr_property("hetznerCloud.datacenter", None) -+ server_type = nixops.util.attr_property("hetznerCloud.serverType", None) -+ auth_token = nixops.util.attr_property("hetznerCloud.authToken", None) -+ server_id = nixops.util.attr_property("hetznerCloud.serverId", None, int) -+ -+ def __init__(self, depl, name, id): -+ MachineState.__init__(self, depl, name, id) -+ self.name = name -+ -+ def get_ssh_name(self): -+ return self.public_ipv4 -+ -+ def get_ssh_flags(self, *args, **kwargs): -+ super_flags = super(HetznerCloudState, self).get_ssh_flags(*args, **kwargs) -+ return super_flags + [ -+ '-o', 'UserKnownHostsFile=/dev/null', -+ '-o', 'StrictHostKeyChecking=no', -+ '-i', self.get_ssh_private_key_file(), -+ ] -+ -+ def get_physical_spec(self): -+ return Function("{ ... }", { -+ 'imports': [ RawValue('') ], -+ ('boot', 'loader', 'grub', 'device'): 'nodev', -+ ('fileSystems', '/'): { 'device': '/dev/sda1', 'fsType': 'ext4'}, -+ ('users', 'extraUsers', 'root', 'openssh', 'authorizedKeys', 'keys'): [self.depl.active_resources.get('ssh-key').public_key], -+ }) -+ -+ def get_ssh_private_key_file(self): -+ return self.write_ssh_private_key(self.depl.active_resources.get('ssh-key').private_key) -+ -+ def create_after(self, resources, defn): -+ # make sure the ssh key exists before we do anything else -+ return { -+ r for r in resources if -+ isinstance(r, nixops.resources.ssh_keypair.SSHKeyPairState) -+ } -+ -+ def get_auth_token(self): -+ return os.environ.get('HETZNER_CLOUD_AUTH_TOKEN', self.auth_token) -+ -+ def _api(self, path, method=None, data=None, json=True): -+ """Basic wrapper around requests that handles auth and serialization.""" -+ assert path[0] == '/' -+ url = 'https://%s%s' % (API_HOST, path) -+ token = self.get_auth_token() -+ if not token: -+ raise Exception('No hetzner cloud auth token set') -+ headers = { -+ 'Authorization': 'Bearer '+self.get_auth_token(), -+ } -+ res = requests.request( -+ method=method, -+ url=url, -+ json=data, -+ headers=headers) -+ -+ if res.status_code == 404: -+ raise ApiNotFoundError('Not Found: %r' % path) -+ elif not res.ok: -+ raise ApiError('Response for %s %s has status code %d: %s' % (method, path, res.status_code, res.content)) -+ if not json: -+ return -+ try: -+ res_data = res.json() -+ except ValueError as e: -+ raise ApiError('Response for %s %s has invalid JSON (%s): %r' % (method, path, e, res.content)) -+ return res_data -+ -+ -+ def destroy(self, wipe=False): -+ if not self.server_id: -+ self.log('server {} was never made'.format(self.name)) -+ return -+ self.log('destroying server {} with id {}'.format(self.name, self.server_id)) -+ try: -+ res = self._api('/v1/servers/%s' % (self.server_id), method='DELETE') -+ except ApiNotFoundError: -+ self.log("server not found - assuming it's been destroyed already") -+ -+ self.public_ipv4 = None -+ self.server_id = None -+ -+ return True -+ -+ def _create_ssh_key(self, public_key): -+ """Create or get an ssh key and return an id.""" -+ public_key = public_key.strip() -+ res = self._api('/v1/ssh_keys', method='GET') -+ name = 'nixops-%s-%s' % (self.depl.uuid, self.name) -+ deletes = [] -+ for key in res['ssh_keys']: -+ if key['public_key'].strip() == public_key: -+ return key['id'] -+ if key['name'] == name: -+ deletes.append(key['id']) -+ for d in deletes: -+ # This reply is empty, so don't decode json. -+ self._api('/v1/ssh_keys/%d' % d, method='DELETE', json=False) -+ res = self._api('/v1/ssh_keys', method='POST', data={ -+ 'name': name, -+ 'public_key': public_key, -+ }) -+ return res['ssh_key']['id'] -+ -+ def create(self, defn, check, allow_reboot, allow_recreate): -+ ssh_key = self.depl.active_resources.get('ssh-key') -+ if ssh_key is None: -+ raise Exception('Please specify a ssh-key resource (resources.sshKeyPairs.ssh-key = {}).') -+ -+ self.set_common_state(defn) -+ -+ if self.server_id is not None: -+ return -+ -+ ssh_key_id = self._create_ssh_key(ssh_key.public_key) -+ -+ req = { -+ 'name': self.name, -+ 'server_type': defn.server_type, -+ 'start_after_create': True, -+ 'image': 'debian-9', -+ 'ssh_keys': [ -+ ssh_key_id, -+ ], -+ } -+ -+ if defn.datacenter: -+ req['datacenter'] = defn.datacenter -+ elif defn.location: -+ req['location'] = defn.location -+ -+ self.log_start("creating server ...") -+ create_res = self._api('/v1/servers', method='POST', data=req) -+ self.server_id = create_res['server']['id'] -+ self.public_ipv4 = create_res['server']['public_net']['ipv4']['ip'] -+ self.public_ipv6 = create_res['server']['public_net']['ipv6']['ip'] -+ self.datacenter = create_res['server']['datacenter']['name'] -+ self.location = create_res['server']['datacenter']['location']['name'] -+ -+ action = create_res['action'] -+ action_path = '/v1/servers/%d/actions/%d' % (self.server_id, action['id']) -+ -+ while action['status'] == 'running': -+ time.sleep(1) -+ res = self._api(action_path, method='GET') -+ action = res['action'] -+ -+ if action['status'] != 'success': -+ raise Exception('unexpected status: %s' % action['status']) -+ -+ self.log_end("{}".format(self.public_ipv4)) -+ -+ self.wait_for_ssh() -+ self.log_start("running nixos-infect") -+ self.run_command('bash &1', stdin=open(infect_path)) -+ self.reboot_sync() -+ -+ def reboot(self, hard=False): -+ if hard: -+ self.log("sending hard reset to server...") -+ res = self._api('/v1/servers/%d/actions/reset' % self.server_id, method='POST') -+ action = res['action'] -+ action_path = '/v1/servers/%d/actions/%d' % (self.server_id, action['id']) -+ while action['status'] == 'running': -+ time.sleep(1) -+ res = self._api(action_path, method='GET') -+ action = res['action'] -+ if action['status'] != 'success': -+ raise Exception('unexpected status: %s' % action['status']) -+ self.wait_for_ssh() -+ self.state = self.STARTING -+ else: -+ MachineState.reboot(self, hard=hard) -diff --git a/nixops/data/nixos-infect b/nixops/data/nixos-infect -index 66634357b..437a2ec61 100644 ---- a/nixops/data/nixos-infect -+++ b/nixops/data/nixos-infect -@@ -68,26 +68,49 @@ makeConf() { - } - EOF - # (nixos-generate-config will add qemu-user and bind-mounts, so avoid) -+ local disk -+ if [ -e /dev/sda ]; then -+ disk=/dev/sda -+ else -+ disk=/dev/vda -+ fi - cat > /etc/nixos/hardware-configuration.nix << EOF - { ... }: - { - imports = [ ]; -- boot.loader.grub.device = "/dev/vda"; -- fileSystems."/" = { device = "/dev/vda1"; fsType = "ext4"; }; -+ boot.loader.grub.device = "${disk}"; -+ fileSystems."/" = { device = "${disk}1"; fsType = "ext4"; }; - } - EOF - - local IFS=$'\n' -- ens3_ip4s=($(ip address show dev eth0 | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- ens3_ip6s=($(ip address show dev eth0 | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- ens4_ip4s=($(ip address show dev eth1 | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- ens4_ip6s=($(ip address show dev eth1 | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- gateway=($(ip route show dev eth0 | grep default | sed -r 's|default via ([0-9.]+).*|\1|')) -- gateway6=($(ip -6 route show dev eth0 | grep default | sed -r 's|default via ([0-9a-f:]+).*|\1|')) -- ether0=($(ip address show dev eth0 | grep link/ether | sed -r 's|.*link/ether ([0-9a-f:]+) .*|\1|')) -- ether1=($(ip address show dev eth1 | grep link/ether | sed -r 's|.*link/ether ([0-9a-f:]+) .*|\1|')) -+ gateway=($(ip route show | grep default | sed -r 's|default via ([0-9.]+).*|\1|')) -+ gateway6=($(ip -6 route show | grep default | sed -r 's|default via ([0-9a-f:]+).*|\1|')) -+ interfaces=($(ip link | awk -F ': ' '/^[0-9]*: / {if ($2 != "lo") {print $2}}')) - nameservers=($(grep ^nameserver /etc/resolv.conf | cut -f2 -d' ')) - -+ # Predict the predictable name for each interface since that is enabled in -+ # the nixos system. -+ declare -A predictable_names -+ for interface in ${interfaces[@]}; do -+ # udevadm prints out the candidate names which will be selected if -+ # available in this order. -+ local name=$(udevadm info /sys/class/net/$interface | awk -F = ' -+ /^E: ID_NET_NAME_FROM_DATABASE=/ {arr[1]=$2} -+ /^E: ID_NET_NAME_ONBOARD=/ {arr[2]=$2} -+ /^E: ID_NET_NAME_SLOT=/ {arr[3]=$2} -+ /^E: ID_NET_NAME_PATH=/ {arr[4]=$2} -+ /^E: ID_NET_NAME_MAC=/ {arr[5]=$2} -+ END {for (i=1;i<6;i++) {if (length(arr[i]) > 0) { print arr[i]; break}}}') -+ if [ -z "$name" ]; then -+ echo Could not determine predictable name for interface $interface -+ fi -+ predictable_names[$interface]=$name -+ done -+ -+ # Take a gamble on the first interface being able to reach the gateway. -+ local default_interface=${predictable_names[${interfaces[0]}]} -+ - cat > /etc/nixos/networking.nix << EOF - { ... }: { - # This file was populated at runtime with the networking -@@ -96,25 +119,27 @@ EOF - nameservers = [$(for a in ${nameservers[@]}; do echo -n " - \"$a\""; done) - ]; -- defaultGateway = "${gateway}"; -- defaultGateway6 = "${gateway6}"; -+ defaultGateway = {address = "${gateway}"; interface = "${default_interface}";}; -+ defaultGateway6 = {address = "${gateway6}"; interface = "${default_interface}";}; - interfaces = { -- ens3 = { -- ip4 = [$(for a in ${ens3_ip4s[@]}; do echo -n " -- $a"; done) -- ]; -- ip6 = [$(for a in ${ens3_ip6s[@]}; do echo -n " -- $a"; done) -- ]; -- }; -- ens4 = { -- ip4 = [$(for a in ${ens4_ip4s[@]}; do echo -n " -+EOF -+ -+ for interface in ${interfaces[@]}; do -+ ip4s=($(ip address show dev $interface | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -+ ip6s=($(ip address show dev $interface | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -+ cat >> /etc/nixos/networking.nix << EOF -+ ${predictable_names[$interface]} = { -+ ip4 = [$(for a in ${ip4s[@]}; do echo -n " - $a"; done) - ]; -- ip6 = [$(for a in ${ens4_ip6s[@]}; do echo -n " -+ ip6 = [$(for a in ${ip6s[@]}; do echo -n " - $a"; done) - ]; - }; -+EOF -+ done -+ -+ cat >> /etc/nixos/networking.nix << EOF - }; - }; - } -@@ -154,6 +179,12 @@ export HOME="/root" - groupadd -r nixbld -g 30000 - seq 1 10 | xargs -I{} useradd -c "Nix build user {}" -d /var/empty -g nixbld -G nixbld -M -N -r -s `which nologin` nixbld{} - -+if ! which curl >/dev/null 2>/dev/null; then -+ if which apt-get >/dev/null 2>/dev/null; then -+ apt-get update && apt-get install -y curl -+ fi -+fi -+ - curl https://nixos.org/nix/install | sh - - source ~/.nix-profile/etc/profile.d/nix.sh diff --git a/overlays/pass/default.nix b/overlays/pass/default.nix deleted file mode 100644 index ad8facd..0000000 --- a/overlays/pass/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - pass = super.pass.overrideAttrs (old: rec { - patches = old.patches ++ [ ./pass-fix-pass-init.patch ]; - }); -} diff --git a/overlays/pass/pass-fix-pass-init.patch b/overlays/pass/pass-fix-pass-init.patch deleted file mode 100644 index 10a76c1..0000000 --- a/overlays/pass/pass-fix-pass-init.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 33e8f1cd0065639a948d7b5ba3f93d43bdf7f3be Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= -Date: Sun, 11 Nov 2018 19:47:33 +0100 -Subject: [PATCH] Fix pass init for some gpg keys - -This fixes the pass init for gpg keys which have their main key as -encryption key. This may happen for instance with RSA keys and specific -configuration. ---- - src/password-store.sh | 2 +- - tests/t0300-reencryption.sh | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/password-store.sh b/src/password-store.sh -index d89d455..44d122e 100755 ---- a/src/password-store.sh -+++ b/src/password-store.sh -@@ -124,7 +124,7 @@ reencrypt_path() { - IFS=";" eval 'GPG_RECIPIENTS+=( $group )' # http://unix.stackexchange.com/a/92190 - unset "GPG_RECIPIENTS[$index]" - done -- gpg_keys="$($GPG $PASSWORD_STORE_GPG_OPTS --list-keys --with-colons "${GPG_RECIPIENTS[@]}" | sed -n 's/^sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u)" -+ gpg_keys="$($GPG $PASSWORD_STORE_GPG_OPTS --list-keys --with-colons "${GPG_RECIPIENTS[@]}" | sed -n 's/^[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u)" - fi - current_keys="$(LC_ALL=C $GPG $PASSWORD_STORE_GPG_OPTS -v --no-secmem-warning --no-permission-warning --decrypt --list-only --keyid-format long "$passfile" 2>&1 | sed -n 's/^gpg: public key is \([A-F0-9]\+\)$/\1/p' | LC_ALL=C sort -u)" - -diff --git a/tests/t0300-reencryption.sh b/tests/t0300-reencryption.sh -index 3c88987..57d873f 100755 ---- a/tests/t0300-reencryption.sh -+++ b/tests/t0300-reencryption.sh -@@ -7,7 +7,7 @@ cd "$(dirname "$0")" - INITIAL_PASSWORD="will this password live? a big question indeed..." - - canonicalize_gpg_keys() { -- $GPG --list-keys --with-colons "$@" | sed -n 's/sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u -+ $GPG --list-keys --with-colons "$@" | sed -n 's/[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u - } - gpg_keys_from_encrypted_file() { - $GPG -v --no-secmem-warning --no-permission-warning --decrypt --list-only --keyid-format long "$1" 2>&1 | grep "public key is" | cut -d ' ' -f 5 | LC_ALL=C sort -u --- -2.19.1 - diff --git a/overlays/pelican/default.nix b/overlays/pelican/default.nix deleted file mode 100644 index 4f8aece..0000000 --- a/overlays/pelican/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - pelican = with self.python3Packages; - pelican.overrideAttrs(old: { - propagatedBuildInputs = old.propagatedBuildInputs ++ [ pyyaml markdown ]; - doInstallCheck = false; - }); -} diff --git a/overlays/php-packages/default.nix b/overlays/php-packages/default.nix deleted file mode 100644 index 90fb613..0000000 --- a/overlays/php-packages/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -self: super: rec { - myPhpPackages.mysqli_pam = self.php74.extensions.mysqli.overrideAttrs(old: { - configureFlags = [ "--with-mysqli=${self.libmysqlclient_pam}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; - patches = old.patches or [] ++ [ ./mysqli_patch.patch ]; -}); -} diff --git a/overlays/procps-ng/default.nix b/overlays/procps-ng/default.nix deleted file mode 100644 index 2d43a11..0000000 --- a/overlays/procps-ng/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - procps-ng = super.procps-ng.overrideAttrs(old: { - configureFlags = old.configureFlags ++ [ "--enable-watch8bit" ]; - }); -} diff --git a/overlays/python-packages/buildbot.nix b/overlays/python-packages/buildbot.nix deleted file mode 100644 index ccf2f6a..0000000 --- a/overlays/python-packages/buildbot.nix +++ /dev/null @@ -1,8 +0,0 @@ -self: super: { - pythonOverrides = self.buildPythonOverrides (pyself: pysuper: { - buildbot-plugins = pysuper.buildbot-plugins // { - buildslist = self.python3PackagesPlus.buildbot-plugins.buildslist; - }; - buildbot-full = pysuper.buildbot-full.withPlugins [ pyself.buildbot-plugins.buildslist ]; - }) super.pythonOverrides; -} diff --git a/overlays/python-packages/default.nix b/overlays/python-packages/default.nix deleted file mode 100644 index 601eed1..0000000 --- a/overlays/python-packages/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -let - fromMyPythonPackages = name: self: super: { - pythonOverrides = self.buildPythonOverrides (pyself: pysuper: { - "${name}" = self."${pyself.python.pname}PackagesPlus"."${name}"; - }) super.pythonOverrides; - }; -in -{ - # https://github.com/NixOS/nixpkgs/issues/44426 - # needs to come before all other in alphabetical order (or make use of - # lib.mkBefore) - __pythonOverlayFix = self: super: let - pyNames = [ "python3" "python36" "python37" "python38" ]; - overriddenPython = name: [ - { inherit name; value = super.${name}.override { packageOverrides = self.pythonOverrides; }; } - { name = "${name}Packages"; value = self.recurseIntoAttrs self.${name}.pkgs; } - ]; - overriddenPythons = builtins.concatLists (map overriddenPython pyNames); - in { - pythonOverrides = pyself: pysuper: {}; - buildPythonOverrides = newOverrides: currentOverrides: super.lib.composeExtensions newOverrides currentOverrides; - } // super.lib.attrsets.listToAttrs overriddenPythons; - - - blivet3 = fromMyPythonPackages "blivet3"; - buildbot = import ./buildbot.nix; - wokkel = fromMyPythonPackages "wokkel"; - pymilter = fromMyPythonPackages "pymilter"; -} diff --git a/overlays/sc-im/default.nix b/overlays/sc-im/default.nix deleted file mode 100644 index f728655..0000000 --- a/overlays/sc-im/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -self: super: { - sc-im = super.sc-im.overrideAttrs (old: { - buildPhase = '' - cd src - sed -i Makefile -e 's@\...name.info@.local/state/$(name)info@' - cd .. - '' + old.buildPhase; - }); -} diff --git a/overlays/shaarli/default.nix b/overlays/shaarli/default.nix deleted file mode 100644 index 3b37ee8..0000000 --- a/overlays/shaarli/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -self: super: { - shaarli = varDir: super.shaarli.overrideAttrs (old: rec { - version = "0.10.2"; - src = self.fetchurl { - url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz"; - sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78"; - }; - patchPhase = ""; - patches = (old.patches or []) ++ [ ./shaarli_ldap.patch ]; - installPhase = (old.installPhase or "") + '' - cp .htaccess $out/ - ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/ - ''; - }); -} diff --git a/overlays/slrn/default.nix b/overlays/slrn/default.nix deleted file mode 100644 index 1bf5fe2..0000000 --- a/overlays/slrn/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - slrn = super.slrn.overrideAttrs (old: rec { - configureFlags = old.configureFlags ++ [ "--with-slrnpull" ]; - }); -} diff --git a/overlays/vcsh/default.nix b/overlays/vcsh/default.nix deleted file mode 100644 index eb4d48e..0000000 --- a/overlays/vcsh/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - vcsh = super.vcsh.overrideAttrs(old: { - patchPhase = old.patchPhase or "" + '' - sed -i -e 's@-r "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME"@-f "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME"@' vcsh - ''; - }); -} diff --git a/overlays/weechat/default.nix b/overlays/weechat/default.nix deleted file mode 100644 index e8cc792..0000000 --- a/overlays/weechat/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -self: super: { - weechat = super.weechat.override { - configure = { availablePlugins, ... }: { - plugins = with self; with availablePlugins; [ - (python.withPackages (ps: with ps; [websocket_client emoji])) - perl - ruby - ]; - }; - }; - -} diff --git a/overlays/ympd/default.nix b/overlays/ympd/default.nix deleted file mode 100644 index dda17aa..0000000 --- a/overlays/ympd/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - ympd = super.ympd.overrideAttrs(old: self.mylibs.fetchedGithub ./ympd.json // { - patches = (old.patches or []) ++ [ ./ympd-password-env.patch ]; - }); -} diff --git a/overlays/ympd/ympd.json b/overlays/ympd/ympd.json deleted file mode 100644 index 51f06d5..0000000 --- a/overlays/ympd/ympd.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "612f8fc-master", - "meta": { - "name": "ympd", - "url": "https://github.com/notandy/ympd", - "branch": "master" - }, - "github": { - "owner": "notandy", - "repo": "ympd", - "rev": "612f8fc0b2c47fc89d403e4a044541c6b2b238c8", - "sha256": "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9", - "fetchSubmodules": true - } -} diff --git a/pkgs/cnagios/cnagios.json b/pkgs/cnagios/cnagios.json deleted file mode 100644 index 4c1c385..0000000 --- a/pkgs/cnagios/cnagios.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "3bd27fb-master", - "meta": { - "name": "cnagios", - "url": "https://github.com/dannywarren/cnagios", - "branch": "master" - }, - "github": { - "owner": "dannywarren", - "repo": "cnagios", - "rev": "3bd27fb40e68f61ffd01bea6234b919a667b6fe4", - "sha256": "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb", - "fetchSubmodules": true - } -} diff --git a/pkgs/crypto/cardano/daedalus.json b/pkgs/crypto/cardano/daedalus.json deleted file mode 100644 index dcd14c5..0000000 --- a/pkgs/crypto/cardano/daedalus.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "0.15.1", - "meta": { - "name": "daedalus", - "url": "https://github.com/input-output-hk/daedalus", - "branch": "refs/tags/0.15.1" - }, - "github": { - "owner": "input-output-hk", - "repo": "daedalus", - "rev": "998fd3189c9a54fac496dfef7a6224714c67bc80", - "sha256": "1r3gwfv6hn7lzp4h2s6849m7x12nxadsql358ss615krvdlnb6rr", - "fetchSubmodules": true - } -} diff --git a/pkgs/crypto/iota-cli-app/iota-cli-app.json b/pkgs/crypto/iota-cli-app/iota-cli-app.json deleted file mode 100644 index 6b47dec..0000000 --- a/pkgs/crypto/iota-cli-app/iota-cli-app.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d7e2e08-master", - "meta": { - "name": "iota-cli-app", - "url": "https://github.com/iotaledger/cli-app", - "branch": "master" - }, - "github": { - "owner": "iotaledger", - "repo": "cli-app", - "rev": "d7e2e0856ae6bd34890fefb4245c07cd467a5032", - "sha256": "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b", - "fetchSubmodules": true - } -} diff --git a/pkgs/default.nix b/pkgs/default.nix deleted file mode 100644 index 5f5df82..0000000 --- a/pkgs/default.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ pkgs }: -with pkgs; -let - mylibs = import ../lib { inherit pkgs; }; -in -rec { - sources = import ../nix/sources.nix; - myEnvironments = callPackage ../environments {}; - boinctui = callPackage ./boinctui {}; - cnagios = callPackage ./cnagios { inherit mylibs; }; - commento = callPackage ./commento {}; - flrn = callPackage ./flrn { inherit mylibs; slang = callPackage ./slang_1 {}; }; - genius = callPackage ./genius {}; - mtop = callPackage ./mtop {}; - muttprint = callPackage ./muttprint {}; - mutt-ics = callPackage ./mutt-ics { inherit mylibs; }; - nagios-cli = callPackage ./nagios-cli { inherit mylibs; }; - nagnu = callPackage ./nagnu { inherit mylibs; }; - nb = callPackage ./nb {}; - note = callPackage ./note {}; - notmuch-python2 = callPackage ./notmuch/notmuch-python { pythonPackages = python2Packages; }; - notmuch-python3 = callPackage ./notmuch/notmuch-python { pythonPackages = python3Packages; }; - notmuch-vim = callPackage ./notmuch/notmuch-vim {}; - pgloader = callPackage ./pgloader {}; - predixy = callPackage ./predixy { inherit mylibs; }; - rrsync_sudo = callPackage ./rrsync_sudo {}; - signaldctl = callPackage ./signaldctl {}; - telegram-history-dump = callPackage ./telegram-history-dump { inherit mylibs; }; - telegramircd = callPackage ./telegramircd { inherit mylibs; telethon = callPackage ./telethon_sync {}; }; - terminal-velocity = callPackage ./terminal-velocity {}; - tiv = callPackage ./tiv {}; - twins = callPackage ./twins {}; - umami = callPackage ./umami {}; - unicodeDoc = callPackage ./unicode {}; - - cardano = callPackage ./crypto/cardano { inherit mylibs; }; - cardano-cli = callPackage ./crypto/cardano-cli {}; - iota-cli-app = callPackage ./crypto/iota-cli-app { inherit mylibs; }; - sia = callPackage ./crypto/sia {}; - - proftpd = callPackage ./proftpd {}; - pure-ftpd = callPackage ./pure-ftpd {}; - - composerEnv = callPackage ./composer-env {}; - webapps = callPackage ./webapps { inherit mylibs composerEnv; }; - - monitoring-plugins = callPackage ./monitoring-plugins {}; - naemon = callPackage ./naemon { inherit mylibs monitoring-plugins; }; - naemon-livestatus = callPackage ./naemon-livestatus { inherit mylibs naemon; }; - gearmand = callPackage ./gearmand {}; - status_engine = { - module = callPackage ./status_engine/module.nix { inherit mylibs; }; - worker = callPackage ./status_engine/worker.nix { inherit mylibs composerEnv; }; - interface = callPackage ./status_engine/interface.nix { inherit composerEnv; }; - }; - - python3PackagesPlus = callPackage ./python-packages { - python = python3; - inherit mylibs; - }; - dovecot_deleted-to-trash = callPackage ./dovecot/plugins/deleted_to_trash { - inherit mylibs; - }; -} diff --git a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json b/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json deleted file mode 100644 index 2987a02..0000000 --- a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "81b0754-master", - "meta": { - "name": "dovecot-deleted_to_trash", - "url": "https://github.com/lexbrugman/dovecot_deleted_to_trash", - "branch": "master" - }, - "github": { - "owner": "lexbrugman", - "repo": "dovecot_deleted_to_trash", - "rev": "81b07549accfc36467bf8527a53c295c7a02dbb9", - "sha256": "1b3k31g898s4fa0a9l4kvjsdyds772waaay84sjdxv09jw6mqs0f", - "fetchSubmodules": true - } -} diff --git a/pkgs/flrn/flrn.json b/pkgs/flrn/flrn.json deleted file mode 100644 index 3d7a944..0000000 --- a/pkgs/flrn/flrn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "860d642-master", - "meta": { - "name": "flrn", - "url": "https://github.com/Cigaes/flrn", - "branch": "master" - }, - "github": { - "owner": "Cigaes", - "repo": "flrn", - "rev": "860d642bd6389a209c8b697bd044f78d23406509", - "sha256": "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c", - "fetchSubmodules": true - } -} diff --git a/pkgs/mutt-ics/default.nix b/pkgs/mutt-ics/default.nix deleted file mode 100644 index a8a529b..0000000 --- a/pkgs/mutt-ics/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ python3Packages, mylibs }: -with python3Packages; -buildPythonApplication (mylibs.fetchedGithub ./mutt-ics.json // { - propagatedBuildInputs = [ icalendar ]; -}) diff --git a/pkgs/mutt-ics/mutt-ics.json b/pkgs/mutt-ics/mutt-ics.json deleted file mode 100644 index ae8ed37..0000000 --- a/pkgs/mutt-ics/mutt-ics.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d291187-master", - "meta": { - "name": "mutt-ics", - "url": "https://github.com/dmedvinsky/mutt-ics", - "branch": "master" - }, - "github": { - "owner": "dmedvinsky", - "repo": "mutt-ics", - "rev": "d29118788f291f67d34fefa6eda9f95846a2fe34", - "sha256": "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92", - "fetchSubmodules": true - } -} diff --git a/pkgs/naemon-livestatus/naemon-livestatus.json b/pkgs/naemon-livestatus/naemon-livestatus.json deleted file mode 100644 index c648d2b..0000000 --- a/pkgs/naemon-livestatus/naemon-livestatus.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "33dbcfe-master", - "meta": { - "name": "naemon-livestatus", - "url": "https://github.com/naemon/naemon-livestatus", - "branch": "master" - }, - "github": { - "owner": "naemon", - "repo": "naemon-livestatus", - "rev": "33dbcfe18e42158f25c27cff95a1e07b73be53b0", - "sha256": "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6", - "fetchSubmodules": true - } -} diff --git a/pkgs/naemon/naemon.json b/pkgs/naemon/naemon.json deleted file mode 100644 index 2dc9809..0000000 --- a/pkgs/naemon/naemon.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d7ac1c8-master", - "meta": { - "name": "naemon", - "url": "https://github.com/naemon/naemon-core", - "branch": "master" - }, - "github": { - "owner": "naemon", - "repo": "naemon-core", - "rev": "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54", - "sha256": "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m", - "fetchSubmodules": true - } -} diff --git a/pkgs/nagios-cli/default.nix b/pkgs/nagios-cli/default.nix deleted file mode 100644 index 7d7e7cc..0000000 --- a/pkgs/nagios-cli/default.nix +++ /dev/null @@ -1,2 +0,0 @@ -{ python2Packages, mylibs }: -python2Packages.buildPythonApplication (mylibs.fetchedGithub ./nagios-cli.json) diff --git a/pkgs/nagios-cli/nagios-cli.json b/pkgs/nagios-cli/nagios-cli.json deleted file mode 100644 index fc91227..0000000 --- a/pkgs/nagios-cli/nagios-cli.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "edc51ea-master", - "meta": { - "name": "nagios-cli", - "url": "https://github.com/tehmaze/nagios-cli", - "branch": "master" - }, - "github": { - "owner": "tehmaze", - "repo": "nagios-cli", - "rev": "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9", - "sha256": "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp", - "fetchSubmodules": true - } -} diff --git a/pkgs/nagnu/default.nix b/pkgs/nagnu/default.nix deleted file mode 100644 index 2b9c0ec..0000000 --- a/pkgs/nagnu/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ stdenv, mylibs, ncurses, curl }: -stdenv.mkDerivation (mylibs.fetchedGithub ./nagnu.json // rec { - buildInputs = [ ncurses curl ]; - installPhase = '' - mkdir -p $out/bin - cp nagnu $out/bin - mkdir -p $out/share/doc/nagnu - cp nagnu.conf.sample $out/share/doc/nagnu - mkdir -p $out/share/man/man8 - cp docs/nagnu.8 $out/share/man/man8 - ''; -}) diff --git a/pkgs/nagnu/nagnu.json b/pkgs/nagnu/nagnu.json deleted file mode 100644 index 60a8b07..0000000 --- a/pkgs/nagnu/nagnu.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "c7e65fc-master", - "meta": { - "name": "nagnu", - "url": "https://github.com/frlen/nagnu", - "branch": "master" - }, - "github": { - "owner": "frlen", - "repo": "nagnu", - "rev": "c7e65fc02f46a3756a4cc47953ea2f3e57a84728", - "sha256": "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3", - "fetchSubmodules": true - } -} diff --git a/pkgs/pgloader/default.nix b/pkgs/pgloader/default.nix deleted file mode 100644 index 6093ada..0000000 --- a/pkgs/pgloader/default.nix +++ /dev/null @@ -1,40 +0,0 @@ -# https://github.com/NixOS/nixpkgs/pull/61702 -{ stdenv, fetchurl, makeWrapper, sbcl, sqlite, freetds, libzip, curl, git, cacert, openssl }: -stdenv.mkDerivation rec { - pname = "pgloader"; - version = "3.6.1"; - name = "${pname}-${version}"; - - src = fetchurl { - url = "https://github.com/dimitri/pgloader/releases/download/v3.6.1/pgloader-bundle-3.6.1.tgz"; - sha256 = "1sm8xmq30d1biin5br0y3vrv4fydbrzfqglz1hnvrkdyxrg7d6f9"; - }; - - nativeBuildInputs = [ git makeWrapper ]; - buildInputs = [ sbcl cacert sqlite freetds libzip curl openssl ]; - - LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath [ sqlite libzip curl git openssl freetds ]; - - buildPhase = '' - export PATH=$PATH:$out/bin - export HOME=$TMPDIR - - make pgloader - ''; - - dontStrip = true; - enableParallelBuilding = false; - - installPhase = '' - install -Dm755 bin/pgloader "$out/bin/pgloader" - wrapProgram $out/bin/pgloader --prefix LD_LIBRARY_PATH : "${LD_LIBRARY_PATH}" - ''; - - meta = with stdenv.lib; { - homepage = https://pgloader.io/; - description = "pgloader loads data into PostgreSQL and allows you to implement Continuous Migration from your current database to PostgreSQL"; - maintainers = with maintainers; [ mguentner ]; - license = licenses.postgresql; - platforms = platforms.all; - }; -} diff --git a/pkgs/predixy/default.nix b/pkgs/predixy/default.nix deleted file mode 100644 index 7e7a9ba..0000000 --- a/pkgs/predixy/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./predixy.json // { - installPhase = '' - mkdir -p $out/bin - cp src/predixy $out/bin - mkdir -p $out/share - cp -r doc $out/share - cp -r conf $out/share/doc - ''; -}) diff --git a/pkgs/predixy/predixy.json b/pkgs/predixy/predixy.json deleted file mode 100644 index 9f9759c..0000000 --- a/pkgs/predixy/predixy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "dacf3fb-master", - "meta": { - "name": "predixy", - "url": "https://github.com/joyieldInc/predixy", - "branch": "master" - }, - "github": { - "owner": "joyieldInc", - "repo": "predixy", - "rev": "dacf3fb30c2602dc044040df04e194d44b49c1be", - "sha256": "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9", - "fetchSubmodules": true - } -} diff --git a/pkgs/python-packages/blivet/default.nix b/pkgs/python-packages/blivet/default.nix deleted file mode 100644 index 108d548..0000000 --- a/pkgs/python-packages/blivet/default.nix +++ /dev/null @@ -1,118 +0,0 @@ -{ lib, writeText, poetry2nix, python, pythonPackages, - gobject-introspection, libblockdev, libbytesize, fetchFromGitHub, - pkg-config, parted, systemd, - with_dmraid ? false, - with_fs_btrfs ? false, - with_fs_fat ? false, - with_fs_f2fs ? false, - with_fs_hfs_plus ? false, - with_fs_jfs ? false, - with_fs_nfs ? false, - with_fs_nfsv4 ? false, - with_fs_ntfs ? false, - with_fs_reiserfs ? false, - with_fs_xfs ? false, - with_luks ? false, - with_lvm ? false, - with_mdadm ? false, - with_multipath ? false, - with_optical ? false, - with_iscsi ? false, - dmraid, multipath_tools, lvm2, eject, kmod, utillinux, lsof, - openiscsi, coreutils, dosfstools, e2fsprogs, jfsutils, btrfs-progs, - xfsprogs, f2fs-tools, hfsprogs, nfs-utils, ntfs3g, ntfsprogs, - reiserfsprogs, devicemapper, cryptsetup, mdadm -}@args: -let - # FIXME: blivet/tasks/fsmount.py links to /sbin - additionalPackages = - lib.optionals with_dmraid [ dmraid ] - ++ lib.optionals with_fs_btrfs [ btrfs-progs ] - ++ lib.optionals with_fs_fat [ dosfstools ] - ++ lib.optionals with_fs_f2fs [ f2fs-tools ] - ++ lib.optionals with_fs_hfs_plus [ hfsprogs ] - ++ lib.optionals with_fs_jfs [ jfsutils ] - ++ lib.optionals with_fs_nfs [ nfs-utils ] - ++ lib.optionals with_fs_ntfs [ ntfs3g ntfsprogs ] - ++ lib.optionals with_fs_reiserfs [ reiserfsprogs ] - ++ lib.optionals with_fs_xfs [ xfsprogs.bin ] - ++ lib.optionals with_luks [ devicemapper cryptsetup ] - ++ lib.optionals with_lvm [ lvm2 ] - ++ lib.optionals with_mdadm [ mdadm ] - ++ lib.optionals with_multipath [ multipath_tools ] - ++ lib.optionals with_optical [ eject ] - ++ lib.optionals with_iscsi [ openiscsi ]; -in -# nix-shell -E "with import {}; pkgs.mkShell { buildInputs = [ python3 python3Packages.blivet3 ]; }" -# nix-shell -E "with import {}; pkgs.mkShell { buildInputs = [ (python3.withPackages(p: [ p.blivet3 ])) ]; }" -poetry2nix.mkPoetryApplication { - inherit python; - propagatedBuildInputs = [ - gobject-introspection - (pythonPackages.toPythonModule libblockdev) - (pythonPackages.toPythonModule libbytesize) - ]; - src = fetchFromGitHub { - owner = "storaged-project"; - repo = "blivet"; - rev = "blivet-3.3.0"; - sha256 = "0ynxm37cxxr2sf2hj18hrdxs1qfw6dgdagkvv5f6g4fmp51m7c3c"; - }; - overrides = poetry2nix.overrides.withDefaults (self: super: { - pyparted = super.pyparted.overridePythonAttrs (old: { - buildInputs = old.buildInputs ++ [ parted ]; - nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ]; - }); - selinux = super.selinux.overridePythonAttrs (old: { - buildInputs = old.buildInputs ++ [ self.setuptools-scm-git-archive ]; - nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ]; - }); - }); - patches = [ ./fix_path.patch ]; - postPatch = let - runtimePaths = lib.makeBinPath ([ - systemd utillinux kmod e2fsprogs mdadm lsof coreutils - ] ++ additionalPackages); - libraryPath = builtins.concatStringsSep " " (map (v: "-rpath ${v}/lib -L ${v}/lib") [ systemd.lib ]); - giLibraryPath = lib.makeSearchPath "lib/girepository-1.0" [libblockdev gobject-introspection]; - addGiPath = writeText "add-gi-path" '' - import os - newGiPath = "${giLibraryPath}" - if newGiPath not in os.environ.get("GI_TYPELIB_PATH", ""): - os.environ["GI_TYPELIB_PATH"] = os.environ.get("GI_TYPELIB_PATH", "") + ":" + newGiPath - ''; - addPath = writeText "add-path" '' - import os - newPath = "${runtimePaths}" - newLibraryPath = "${libraryPath}" - if newPath not in os.environ.get("PATH", ""): - os.environ["PATH"] = os.environ.get("PATH", "") + ":" + newPath - os.environ["NIX_LDFLAGS"] = os.environ.get("NIX_LDFLAGS", "") + " " + newLibraryPath - ''; - in - '' - prepend() { - mv "$1" "$1.bak" - cat ${addPath} "$1.bak" > $1 - rm -f "$1.bak" - } - prepend "blivet/__init__.py" - prepend "blivet/iscsi.py" - prepend "blivet/tasks/availability.py" - prepend "blivet/util.py" - prepend "blivet/udev.py" - prependGi() { - mv "$1" "$1.bak" - cat ${addGiPath} "$1.bak" > $1 - rm -f "$1.bak" - } - grep -rl require_version blivet/ | while read i; do prependGi "$i"; done - sed -i -e "s@/lib/modules@/run/booted-system/kernel-modules/lib/modules/@" blivet/tasks/fsmount.py - ''; - postInstall = let - in '' - rm -rf $out/lib/python*/site-packages/{etc,usr} - ''; - pyproject = ./pyproject.toml; - poetrylock = ./poetry.lock; -} diff --git a/pkgs/python-packages/blivet/fix_path.patch b/pkgs/python-packages/blivet/fix_path.patch deleted file mode 100644 index 29c4052..0000000 --- a/pkgs/python-packages/blivet/fix_path.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/blivet/tasks/fsmount.py b/blivet/tasks/fsmount.py -index 15f79a3e..bb3fe873 100644 ---- a/blivet/tasks/fsmount.py -+++ b/blivet/tasks/fsmount.py -@@ -19,6 +19,7 @@ - # - # Red Hat Author(s): Anne Mulhern - -+from distutils.spawn import find_executable - import os - - from ..errors import FSError -@@ -58,7 +59,7 @@ class FSMount(task.BasicApplication, fstask.FSTask): - @property - def _can_mount(self): - return (self.mount_type in fslib.kernel_filesystems) or \ -- (os.access("/sbin/mount.%s" % (self.mount_type,), os.X_OK)) or \ -+ (find_executable("mount.%s" % (self.mount_type,)) is not None) or \ - self._has_driver - - @property diff --git a/pkgs/python-packages/blivet/poetry.lock b/pkgs/python-packages/blivet/poetry.lock deleted file mode 100644 index c45011a..0000000 --- a/pkgs/python-packages/blivet/poetry.lock +++ /dev/null @@ -1,96 +0,0 @@ -[[package]] -name = "distro" -version = "1.5.0" -description = "Distro - an OS platform information API" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pycairo" -version = "1.19.1" -description = "Python interface for cairo" -category = "main" -optional = false -python-versions = ">=3.5, <4" - -[[package]] -name = "pygobject" -version = "3.36.1" -description = "Python bindings for GObject Introspection" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.dependencies] -pycairo = ">=1.11.1" - -[[package]] -name = "pyparted" -version = "3.11.6" -description = "Python bindings for GNU parted" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyudev" -version = "0.22.0" -description = "A libudev binding" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[[package]] -name = "selinux" -version = "0.2.1" -description = "shim selinux module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.dependencies] -distro = ">=1.3.0" -setuptools = ">=39.0" - -[[package]] -name = "six" -version = "1.15.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[metadata] -lock-version = "1.0" -python-versions = "^3.8" -content-hash = "636edb46b1deb0f6d5db636b0bc6639205335c9915480b156a417067137548f8" - -[metadata.files] -distro = [ - {file = "distro-1.5.0-py2.py3-none-any.whl", hash = "sha256:df74eed763e18d10d0da624258524ae80486432cd17392d9c3d96f5e83cd2799"}, - {file = "distro-1.5.0.tar.gz", hash = "sha256:0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92"}, -] -pycairo = [ - {file = "pycairo-1.19.1.tar.gz", hash = "sha256:2c143183280feb67f5beb4e543fd49990c28e7df427301ede04fc550d3562e84"}, -] -pygobject = [ - {file = "PyGObject-3.36.1.tar.gz", hash = "sha256:012a589aec687bfa809a1ff9f5cd775dc7f6fcec1a6bc7fe88e1002a68f8ba34"}, -] -pyparted = [ - {file = "pyparted-3.11.6.tar.gz", hash = "sha256:727ccdf308c194069aa9797f7a6a973bc95b2e407cdf5d58d6c8bc4c9dec92dc"}, -] -pyudev = [ - {file = "pyudev-0.22.0.tar.gz", hash = "sha256:69bb1beb7ac52855b6d1b9fe909eefb0017f38d917cba9939602c6880035b276"}, -] -selinux = [ - {file = "selinux-0.2.1-py2.py3-none-any.whl", hash = "sha256:820adcf1b4451c9cc7759848797703263ba0eb6a4cad76d73548a9e0d57b7926"}, - {file = "selinux-0.2.1.tar.gz", hash = "sha256:d435f514e834e3fdc0941f6a29d086b80b2ea51b28112aee6254bd104ee42a74"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] diff --git a/pkgs/python-packages/blivet/pyproject.toml b/pkgs/python-packages/blivet/pyproject.toml deleted file mode 100644 index cf86aa1..0000000 --- a/pkgs/python-packages/blivet/pyproject.toml +++ /dev/null @@ -1,20 +0,0 @@ -[tool.poetry] -name = "blivet" -version = "3.3.0" -description = "A python module for system storage configuration" -authors = ["David Lehman "] -license = "GPL-2.0-or-later" - -[tool.poetry.dependencies] -python = "^3.8" -six = "^1.15.0" -pyudev = "^0.22.0" -pyparted = "^3.11.6" -selinux = "^0.2.1" -pygobject = "^3.36.1" - -[tool.poetry.dev-dependencies] - -[build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" diff --git a/pkgs/python-packages/buildbot/plugins/default.nix b/pkgs/python-packages/buildbot/plugins/default.nix deleted file mode 100644 index 22a8507..0000000 --- a/pkgs/python-packages/buildbot/plugins/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ callPackage, python }: -{ - buildslist = callPackage ./buildslist { - pythonPackages = python.pkgs; - }; -} diff --git a/pkgs/python-packages/default.nix b/pkgs/python-packages/default.nix deleted file mode 100644 index 441c5bc..0000000 --- a/pkgs/python-packages/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ mylibs, callPackage, python }: -{ - blivet3 = callPackage ./blivet { inherit python; pythonPackages = python.pkgs; }; - buildbot-plugins = callPackage ./buildbot/plugins { inherit python; }; - wokkel = callPackage ./wokkel.nix { pythonPackages = python.pkgs; }; - pymilter = callPackage ./pymilter.nix { pythonPackages = python.pkgs; }; -} diff --git a/pkgs/python-packages/pymilter.nix b/pkgs/python-packages/pymilter.nix deleted file mode 100644 index 736794e..0000000 --- a/pkgs/python-packages/pymilter.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ pythonPackages, libmilter }: with pythonPackages; -buildPythonPackage rec { - pname = "pymilter"; - version = "1.0.4"; - src = fetchPypi { - inherit pname version; - sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k"; - }; - doCheck = false; - buildInputs = [ libmilter ]; -} diff --git a/pkgs/python-packages/wokkel.nix b/pkgs/python-packages/wokkel.nix deleted file mode 100644 index 3237f2b..0000000 --- a/pkgs/python-packages/wokkel.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ pythonPackages }: with pythonPackages; -buildPythonPackage rec { - pname = "wokkel"; - version = "18.0.0"; - src = fetchPypi { - inherit pname version; - sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016"; - }; - propagatedBuildInputs = [ twisted.extras.tls twisted incremental dateutil ]; - doCheck = false; -} diff --git a/pkgs/status_engine/module.json b/pkgs/status_engine/module.json deleted file mode 100644 index 5ed06d2..0000000 --- a/pkgs/status_engine/module.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d461e95-master", - "meta": { - "name": "statusengine-module", - "url": "https://github.com/statusengine/module", - "branch": "master" - }, - "github": { - "owner": "statusengine", - "repo": "module", - "rev": "d461e95a11fffaac604d11ac42d237b5e13071bc", - "sha256": "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n", - "fetchSubmodules": true - } -} diff --git a/pkgs/status_engine/module.nix b/pkgs/status_engine/module.nix deleted file mode 100644 index 43d2b09..0000000 --- a/pkgs/status_engine/module.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ stdenv, mylibs, gearmand, json_c, libuuid, libevent, pkgconfig, glib }: -stdenv.mkDerivation (mylibs.fetchedGithub ./module.json // { - patches = [ ./host_perfdata.patch ]; - buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ]; - makeFlags = "all"; - installPhase = '' - mkdir -p $out/lib/status-engine - cp -a src/bin/* $out/lib/status-engine - ''; -}) diff --git a/pkgs/status_engine/worker.json b/pkgs/status_engine/worker.json deleted file mode 100644 index 301bab5..0000000 --- a/pkgs/status_engine/worker.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "02267d4-master", - "meta": { - "name": "worker", - "url": "https://github.com/statusengine/worker", - "branch": "master" - }, - "github": { - "owner": "statusengine", - "repo": "worker", - "rev": "02267d495ae69137d6765dc6b0f453f80216f1cf", - "sha256": "06ci4mkmifdf1z15yc8rxl44ppi45vjz4s136yaccq9d8vk9iyd4", - "fetchSubmodules": true - } -} diff --git a/pkgs/status_engine/worker.nix b/pkgs/status_engine/worker.nix deleted file mode 100644 index 1232303..0000000 --- a/pkgs/status_engine/worker.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ stdenv, mylibs, composerEnv, fetchurl, gearmand, callPackage, php73, config_file ? "/var/lib/status_engine/ui.yml" }: -let - gearman = php73.buildPecl rec { - version = "2.0.6"; - pname = "gearman"; - src = fetchurl { - url = "https://github.com/wcgallego/pecl-gearman/archive/${pname}-${version}.tar.gz"; - sha256 = "0bliga4j41xkvdfh6bqi6k8x6mfxbi5sl9gix97axs7w0ncyfprz"; - }; - configureFlags = [ "--with-gearman=${gearmand}" ]; - nativeBuildInputs = [ gearmand ]; - }; -in -(composerEnv.override { - php = php73.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath json iconv])); -}).buildPackage (mylibs.fetchedGithub ./worker.json // - import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec { - postInstall = '' - ln -s ${config_file} $out/etc/config.yml - ''; - preInstall = '' - cp ${./worker_composer.lock} $out/composer.lock - ''; -}) diff --git a/pkgs/status_engine/worker_composer.lock b/pkgs/status_engine/worker_composer.lock deleted file mode 100644 index 63f2646..0000000 --- a/pkgs/status_engine/worker_composer.lock +++ /dev/null @@ -1,1457 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "0b9940904a72531dd233d2c1b0ea28a0", - "packages": [ - { - "name": "crate/crate-dbal", - "version": "0.3.1", - "source": { - "type": "git", - "url": "https://github.com/crate/crate-dbal.git", - "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9", - "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9", - "shasum": "" - }, - "require": { - "crate/crate-pdo": "~0.6.0", - "doctrine/dbal": "~2.5.5", - "php": "~5.5|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "Crate\\DBAL": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A Doctrine Database Abstraction Layer for the Crate.io DBMS", - "homepage": "https://github.com/crate/crate-dbal", - "keywords": [ - "crate", - "database", - "dbal", - "doctrine" - ], - "time": "2017-04-07T13:26:54+00:00" - }, - { - "name": "crate/crate-pdo", - "version": "0.6.3", - "source": { - "type": "git", - "url": "https://github.com/crate/crate-pdo.git", - "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3", - "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "guzzlehttp/guzzle": "~6.0", - "php": "~5.5|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "Crate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A PDO adapter for interacting with the Crate.io DBMS", - "homepage": "https://github.com/crate/crate-pdo", - "keywords": [ - "crate", - "database", - "pdo" - ], - "time": "2017-07-17T12:50:03+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.10.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d", - "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2020-05-25T17:24:27+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3", - "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2020-05-27T16:24:54+00:00" - }, - { - "name": "doctrine/collections", - "version": "1.6.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "fc0206348e17e530d09463fef07ba8968406cd6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d", - "reference": "fc0206348e17e530d09463fef07ba8968406cd6d", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", - "type": "tidelift" - } - ], - "time": "2020-05-25T19:24:35+00:00" - }, - { - "name": "doctrine/common", - "version": "v2.7.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9", - "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": "~5.6|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" - ], - "time": "2017-07-22T08:35:12+00:00" - }, - { - "name": "doctrine/dbal", - "version": "v2.5.13", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "729340d8d1eec8f01bff708e12e449a3415af873" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873", - "reference": "729340d8d1eec8f01bff708e12e449a3415af873", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.4,<2.8-dev", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*", - "symfony/console": "2.*||^3.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" - ], - "time": "2017-07-22T20:44:48+00:00" - }, - { - "name": "doctrine/inflector", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2020-05-29T07:19:59+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.4", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d", - "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "1.17.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2020-05-25T19:35:05+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" - }, - "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2019-07-01T23:21:34+00:00" - }, - { - "name": "php-amqplib/php-amqplib", - "version": "v2.11.3", - "source": { - "type": "git", - "url": "https://github.com/php-amqplib/php-amqplib.git", - "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742", - "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-sockets": "*", - "php": ">=5.6.3", - "phpseclib/phpseclib": "^2.0.0" - }, - "conflict": { - "php": "7.4.0 - 7.4.1" - }, - "replace": { - "videlalvaro/php-amqplib": "self.version" - }, - "require-dev": { - "ext-curl": "*", - "nategood/httpful": "^0.2.20", - "phpunit/phpunit": "^5.7|^6.5|^7.0", - "squizlabs/php_codesniffer": "^2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11-dev" - } - }, - "autoload": { - "psr-4": { - "PhpAmqpLib\\": "PhpAmqpLib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Alvaro Videla", - "role": "Original Maintainer" - }, - { - "name": "Raúl Araya", - "email": "nubeiro@gmail.com", - "role": "Maintainer" - }, - { - "name": "Luke Bakken", - "email": "luke@bakken.io", - "role": "Maintainer" - }, - { - "name": "RamÅ«nas Dronga", - "email": "github@ramuno.lt", - "role": "Maintainer" - } - ], - "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", - "homepage": "https://github.com/php-amqplib/php-amqplib/", - "keywords": [ - "message", - "queue", - "rabbitmq" - ], - "time": "2020-05-13T13:56:11+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.27", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc", - "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "sami/sami": "~2.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2020-04-04T23:17:33+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/console", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41", - "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1|~3.0.0", - "symfony/process": "~2.1|~3.0.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2015-11-30T12:35:10+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a", - "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "f048e612a3905f34931127360bdd2def19a5e582" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", - "reference": "f048e612a3905f34931127360bdd2def19a5e582", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/yaml", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "f79824187de95064a2f5038904c4d7f0227fedb5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5", - "reference": "f79824187de95064a2f5038904c4d7f0227fedb5", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2015-11-30T12:35:10+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.5.9", - "ext-redis": "*", - "ext-gearman": "*", - "ext-mbstring": "*", - "ext-bcmath": "*", - "ext-json": "*", - "ext-iconv": "*" - }, - "platform-dev": [], - "plugin-api-version": "1.1.0" -} diff --git a/pkgs/status_engine/worker_php_packages.nix b/pkgs/status_engine/worker_php_packages.nix deleted file mode 100644 index 1d956ad..0000000 --- a/pkgs/status_engine/worker_php_packages.nix +++ /dev/null @@ -1,217 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl }: -{ - packages = { - "crate/crate-dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "crate-crate-dbal-3329f19d39f648bdd7613e5c8dc7e230f45814d9"; - src = fetchurl { - url = https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9; - sha256 = "013z63zcvrnmxphdm6qqy0if1397lmbb0g3yrpjbka98pg8zm99g"; - }; - }; - }; - "crate/crate-pdo" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "crate-crate-pdo-31a88d1004235327a4651a10a5b98a7803b3cde3"; - src = fetchurl { - url = https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3; - sha256 = "194f6daj9ghlwyplp86nazh1av6jadqznwqijqgr1g3dfmgb3y16"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-5db60a4969eba0e0c197a19c077780aadbc43c5d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d; - sha256 = "1a8psmvs90x4nflfvjvp6j9yjmq6z9jgsb3plrp5c7iy7snkq1v2"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-35a4a70cd94e09e2259dfae7488afc6b474ecbd3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3; - sha256 = "1fk0c8vhjgl7j4b2vd4k7sshdrqysqwcp9mlxbapf8x7nmpa6i9b"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-fc0206348e17e530d09463fef07ba8968406cd6d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d; - sha256 = "1aqnjna5cc5hyy6wypmayvl5lgz2qbym6innmr3qaq9nff6r9qlf"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9; - sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873; - sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-4650c8b30c753a76bf44fb2ed00117d6f367490c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c; - sha256 = "13jnzwpzz63i6zipmhb22lv35l5gq6wmji0532c94331wcq5bvv9"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-e864bbf5904cb8f5bb334f99209b48018522f042"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042; - sha256 = "11lg9fcy0crb8inklajhx3kyffdbx7xzdj8kwl21xsgq9nm9iwvv"; - }; - }; - }; - "guzzlehttp/guzzle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "guzzlehttp-guzzle-a4a1b6930528a8f7ee03518e6442ec7a44155d9d"; - src = fetchurl { - url = https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d; - sha256 = "0midln6ji6b990vkc0syn631nf6r94lv5600dcc26lcivz8c4gk3"; - }; - }; - }; - "guzzlehttp/promises" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "guzzlehttp-promises-a59da6cf61d80060647ff4d3eb2c03a2bc694646"; - src = fetchurl { - url = https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646; - sha256 = "1kpl91fzalcgkcs16lpakvzcnbkry3id4ynx6xhq477p4fipdciz"; - }; - }; - }; - "guzzlehttp/psr7" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "guzzlehttp-psr7-239400de7a173fe9901b9ac7c06497751f00727a"; - src = fetchurl { - url = https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a; - sha256 = "0mfq93x7ayix6l3v5jkk40a9hnmrxaqr9vk1r26q39d1s6292ma7"; - }; - }; - }; - "php-amqplib/php-amqplib" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "php-amqplib-php-amqplib-6353c5d2d3021a301914bc6566e695c99cfeb742"; - src = fetchurl { - url = https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742; - sha256 = "1nadc5afkn1fiws2w1wh0n032pr5b4dzfg1dcqyf2jnh0nsgq0xp"; - }; - }; - }; - "phpseclib/phpseclib" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpseclib-phpseclib-34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"; - src = fetchurl { - url = https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc; - sha256 = "1jlc8plx0v0rq3zqhc19a01r7xx7a2p6gl7mkzf2hn0kss50plz5"; - }; - }; - }; - "psr/http-message" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-http-message-f6561bf28d520154e4b0ec72be95418abe6d9363"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363; - sha256 = "195dd67hva9bmr52iadr4kyp2gw2f5l51lplfiay2pv6l9y4cf45"; - }; - }; - }; - "ralouphie/getallheaders" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ralouphie-getallheaders-120b605dfeb996808c31b6477290a714d356e822"; - src = fetchurl { - url = https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822; - sha256 = "1bv7ndkkankrqlr2b4kw7qp3fl0dxi6bp26bnim6dnlhavd6a0gg"; - }; - }; - }; - "symfony/console" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-console-d232bfc100dfd32b18ccbcab4bcc8f28697b7e41"; - src = fetchurl { - url = https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41; - sha256 = "16kgs7x60y3vj0bbmljj80hq1x8fb6w1g0fd1j2hc1cbphgj8x67"; - }; - }; - }; - "symfony/polyfill-intl-idn" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-idn-3bff59ea7047e925be6b7f2059d60af31bb46d6a"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a; - sha256 = "0c26v3xpchyiqckp663n7i3hgswbzy56r0jdwjizrsgqq731h6fp"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-fa79b11539418b02fc5e1897267673ba2c19419c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c; - sha256 = "17m46mkkcv7fsxf71si0cq8xdf6b1k272mc5bfwgl00h8s9bk0rs"; - }; - }; - }; - "symfony/polyfill-php72" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php72-f048e612a3905f34931127360bdd2def19a5e582"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582; - sha256 = "1lkjxh17nfaglh7v2m3zw2fy6b2w8nmxr7jb1gqqpvg74yqqz83f"; - }; - }; - }; - "symfony/yaml" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-yaml-f79824187de95064a2f5038904c4d7f0227fedb5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5; - sha256 = "1pwx4bckfjz0afz62q02vl0i4wmg3c6f963jrhlx247b1z6isram"; - }; - }; - }; - }; -} diff --git a/pkgs/telegram-history-dump/default.nix b/pkgs/telegram-history-dump/default.nix deleted file mode 100644 index 050b351..0000000 --- a/pkgs/telegram-history-dump/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ stdenv, ruby, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./telegram-history-dump.json // { - installPhase = '' - mkdir -p $out/lib $out/bin - cp -a $src $out/lib/telegram-history-dump - ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump - ''; - buildInputs = [ ruby ]; -}) diff --git a/pkgs/telegram-history-dump/telegram-history-dump.json b/pkgs/telegram-history-dump/telegram-history-dump.json deleted file mode 100644 index 487df73..0000000 --- a/pkgs/telegram-history-dump/telegram-history-dump.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "468ea91-master", - "meta": { - "name": "telegram-history-dump", - "url": "https://github.com/tvdstaaij/telegram-history-dump", - "branch": "master" - }, - "github": { - "owner": "tvdstaaij", - "repo": "telegram-history-dump", - "rev": "468ea91e543529b54bc2c5ea28b1ea17f362fd3e", - "sha256": "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh", - "fetchSubmodules": true - } -} diff --git a/pkgs/telegramircd/telegramircd.json b/pkgs/telegramircd/telegramircd.json deleted file mode 100644 index 3d219f8..0000000 --- a/pkgs/telegramircd/telegramircd.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "40a0c7c-master", - "meta": { - "name": "telegramircd", - "url": "https://github.com/MaskRay/telegramircd", - "branch": "master" - }, - "github": { - "owner": "MaskRay", - "repo": "telegramircd", - "rev": "40a0c7cf60492bde3f44d43f06f62e3792480139", - "sha256": "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/adminer/default.nix b/pkgs/webapps/adminer/default.nix deleted file mode 100644 index 203b565..0000000 --- a/pkgs/webapps/adminer/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ stdenv, fetchurl }: -stdenv.mkDerivation rec { - version = "4.7.1"; - name = "adminer-${version}"; - src = fetchurl { - url = "https://github.com/vrana/adminer/releases/download/v${version}/${name}.php"; - sha256 = "00gnck9vd44wc6ihf7hh4ma6jvdsw69xgjlkbrdf6irnni6rnvhn"; - }; - phases = "installPhase"; - installPhase = '' - mkdir -p $out - cp $src $out/index.php - ''; -} diff --git a/pkgs/webapps/default.nix b/pkgs/webapps/default.nix deleted file mode 100644 index cbee0b3..0000000 --- a/pkgs/webapps/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ callPackage, mylibs, composerEnv }: -rec { - adminer = callPackage ./adminer {}; - apache-theme = callPackage ./apache-theme {}; - awl = callPackage ./awl {}; - davical = callPackage ./davical {}; - diaspora = callPackage ./diaspora { inherit mylibs; }; - dokuwiki = callPackage ./dokuwiki { inherit mylibs; }; - etherpad-lite = callPackage ./etherpad-lite {}; - grocy = callPackage ./grocy { inherit mylibs composerEnv; }; - infcloud = callPackage ./infcloud {}; - mantisbt_2 = callPackage ./mantisbt_2 {}; - mastodon = callPackage ./mastodon { inherit mylibs; }; - mediagoblin = callPackage ./mediagoblin { inherit mylibs; }; - nextcloud = callPackage ./nextcloud {}; - peertube = (mylibs.flakeCompat ../../flakes/peertube).default; - phpbb = callPackage ./phpbb {}; - phpldapadmin = callPackage ./phpldapadmin {}; - rompr = callPackage ./rompr { inherit mylibs; }; - roundcubemail = callPackage ./roundcubemail {}; - spip = callPackage ./spip {}; - surfer = callPackage ./surfer { inherit mylibs; }; - taskwarrior-web = callPackage ./taskwarrior-web { inherit mylibs; }; - ttrss = callPackage ./ttrss {}; - wallabag = callPackage ./wallabag { inherit composerEnv; }; - yourls = callPackage ./yourls { inherit mylibs; }; -} diff --git a/pkgs/webapps/diaspora/default.nix b/pkgs/webapps/diaspora/default.nix deleted file mode 100644 index b435347..0000000 --- a/pkgs/webapps/diaspora/default.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora", - mylibs, stdenv, bundlerEnv, writeText, - cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }: -let - diaspora_src = stdenv.mkDerivation (mylibs.fetchedGithub ./diaspora.json // rec { - buildPhase = '' - ${if ldap then "patch -p1 < ${./ldap.patch}" else ""} - # FIXME: bundlerEnv below doesn't take postgresql group for some - # reason - echo 'gem "pg", "1.1.3"' >> Gemfile - ''; - installPhase = '' - cp -a . $out - ''; - }); - gems = bundlerEnv { - name = "diaspora-env"; - gemfile = "${diaspora_src}/Gemfile"; - lockfile = "${diaspora_src}/Gemfile.lock"; - gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix; - groups = [ "postgresql" "default" "production" ]; - gemConfig = defaultGemConfig // { - kostya-sigar = attrs: { - buildInputs = [ perl ]; - }; - }; - }; - build_config = writeText "diaspora.yml" '' - configuration: - environment: - certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt' - ${if podmin_email != null then '' - # dummy comment for indentation - admins: - podmin_email: '${podmin_email}' - '' else ""} - production: - environment: - ''; - dummy_token = writeText "secret_token.rb" '' - Diaspora::Application.config.secret_key_base = 'dummy' - ''; -in -stdenv.mkDerivation { - name = "diaspora"; - inherit diaspora_src; - builder = writeText "build_diaspora" '' - source $stdenv/setup - cp -a $diaspora_src $out - cd $out - chmod -R u+rwX . - tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru} - ln -s database.yml.example config/database.yml - ln -s ${build_config} config/diaspora.yml - ln -s ${dummy_token} config/initializers/secret_token.rb - ln -sf ${varDir}/schedule.yml config/schedule.yml - ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem - ln -sf ${varDir}/uploads public/uploads - RAILS_ENV=production ${gems}/bin/rake assets:precompile - ln -sf ${config_dir}/database.yml config/database.yml - ln -sf ${config_dir}/diaspora.yml config/diaspora.yml - ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb - rm -rf tmp log - ln -sf ${varDir}/tmp tmp - ln -sf ${varDir}/log log - ''; - propagatedBuildInputs = [ gems nodejs which git ]; - passthru = { inherit gems varDir; }; -} diff --git a/pkgs/webapps/diaspora/diaspora.json b/pkgs/webapps/diaspora/diaspora.json deleted file mode 100644 index e6795aa..0000000 --- a/pkgs/webapps/diaspora/diaspora.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "v0.7.10.0", - "meta": { - "name": "diaspora", - "url": "https://github.com/diaspora/diaspora", - "branch": "refs/tags/v0.7.10.0" - }, - "github": { - "owner": "diaspora", - "repo": "diaspora", - "rev": "f0085cf5bb1c45bdfba866f628153d299e56eca8", - "sha256": "02mnb40rdkk6jlnvpy61fad59gbpgnlwz1k35w4wfqdwzq0znaqp", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/dokuwiki/dokuwiki.json b/pkgs/webapps/dokuwiki/dokuwiki.json deleted file mode 100644 index fc03252..0000000 --- a/pkgs/webapps/dokuwiki/dokuwiki.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "release_stable_2018-04-22b", - "meta": { - "name": "dokuwiki", - "url": "https://github.com/splitbrain/dokuwiki", - "branch": "refs/tags/release_stable_2018-04-22b" - }, - "github": { - "owner": "splitbrain", - "repo": "dokuwiki", - "rev": "871dae1320b40211626c7ec665f5e6d5290aca95", - "sha256": "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/etherpad-lite/etherpad-lite.json b/pkgs/webapps/etherpad-lite/etherpad-lite.json deleted file mode 100644 index 0d68df1..0000000 --- a/pkgs/webapps/etherpad-lite/etherpad-lite.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "1.8.3", - "meta": { - "name": "etherpad-lite", - "url": "https://github.com/ether/etherpad-lite", - "branch": "refs/tags/1.8.3" - }, - "github": { - "owner": "ether", - "repo": "etherpad-lite", - "rev": "62101147a0c3495dc80daa87ab53a3366321a205", - "sha256": "1d726qldw3bil4x7j39aqk7m71kyjvxklai5238rrd5v82z28c1y", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/grocy/grocy.json b/pkgs/webapps/grocy/grocy.json deleted file mode 100644 index cd75c18..0000000 --- a/pkgs/webapps/grocy/grocy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d7738aa-master", - "meta": { - "name": "grocy", - "url": "https://github.com/grocy/grocy/", - "branch": "master" - }, - "github": { - "owner": "grocy", - "repo": "grocy", - "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", - "sha256": "13zxzq71hvs3dzywrdwqflnkx6dpdc40l9klm4slv0fmmyclbbdf", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/mastodon/mastodon.json b/pkgs/webapps/mastodon/mastodon.json deleted file mode 100644 index a0a6cfd..0000000 --- a/pkgs/webapps/mastodon/mastodon.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "v2.9.4", - "meta": { - "name": "mastodon", - "url": "https://github.com/tootsuite/mastodon", - "branch": "refs/tags/v2.9.4" - }, - "github": { - "owner": "tootsuite", - "repo": "mastodon", - "rev": "9bace2dd88d127d396794375c8fcb2132619a799", - "sha256": "1x9pai1q73lsq1i685w7z4v3w478iyij65mar13k4hq9zdz9d2b0", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/mediagoblin/tempita.json b/pkgs/webapps/mediagoblin/tempita.json deleted file mode 100644 index 5371e17..0000000 --- a/pkgs/webapps/mediagoblin/tempita.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "47414a7-master", - "meta": { - "name": "tempita", - "url": "https://github.com/gjhiggins/tempita", - "branch": "master" - }, - "github": { - "owner": "gjhiggins", - "repo": "tempita", - "rev": "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d", - "sha256": "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/nextcloud/apps/apporder.nix b/pkgs/webapps/nextcloud/apps/apporder.nix deleted file mode 100644 index 29fd6e2..0000000 --- a/pkgs/webapps/nextcloud/apps/apporder.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "apporder"; - version = "0.9.0"; - url = "https://github.com/juliushaertl/apporder/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "1add4i892n4bpmpxwrsr7x99fjyj5rk6maw04iwhviqqqr28fsw6"; -} diff --git a/pkgs/webapps/nextcloud/apps/audioplayer.nix b/pkgs/webapps/nextcloud/apps/audioplayer.nix deleted file mode 100644 index a49776f..0000000 --- a/pkgs/webapps/nextcloud/apps/audioplayer.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "audioplayer"; - version = "2.10.0"; - url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; - sha256 = "122wc05b0m8s5ksdhsiws98aqph894i7cffjkhfhq66c40a728s3"; -} diff --git a/pkgs/webapps/nextcloud/apps/bookmarks.nix b/pkgs/webapps/nextcloud/apps/bookmarks.nix deleted file mode 100644 index 1065c34..0000000 --- a/pkgs/webapps/nextcloud/apps/bookmarks.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "bookmarks"; - version = "3.0.10"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "0y12iqcc6yp25cisg7mg40ddx72531zdvsp2gcl37qi8vqf162ji"; -} diff --git a/pkgs/webapps/nextcloud/apps/calendar.nix b/pkgs/webapps/nextcloud/apps/calendar.nix deleted file mode 100644 index bc3ccea..0000000 --- a/pkgs/webapps/nextcloud/apps/calendar.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "calendar"; - version = "2.0.3"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "17pjsa657p9n1kslqkfcxd6n4ssh2yd4f5l5ww79mixfs34idbl9"; -} diff --git a/pkgs/webapps/nextcloud/apps/carnet.nix b/pkgs/webapps/nextcloud/apps/carnet.nix deleted file mode 100644 index 879ab17..0000000 --- a/pkgs/webapps/nextcloud/apps/carnet.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 13 && nextcloudVersion <= 18; -buildApp rec { - appName = "carnet"; - version = "0.20.0"; - url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz"; - sha256 = "1hbvs88vj830xalyq8fv8xlnf7livsj1xmnjl4xgla803ch4aym8"; -} diff --git a/pkgs/webapps/nextcloud/apps/circles.nix b/pkgs/webapps/nextcloud/apps/circles.nix deleted file mode 100644 index 64a4f2f..0000000 --- a/pkgs/webapps/nextcloud/apps/circles.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 18 && nextcloudVersion <= 18; -buildApp rec { - appName = "circles"; - version = "0.18.9"; - url = "https://github.com/nextcloud/circles/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "1a58zrjg4cc0igq14s5zfc5zva83mahmfr0mxvhvnasw7rwkpyzr"; -} diff --git a/pkgs/webapps/nextcloud/apps/contacts.nix b/pkgs/webapps/nextcloud/apps/contacts.nix deleted file mode 100644 index d80f0b5..0000000 --- a/pkgs/webapps/nextcloud/apps/contacts.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "contacts"; - version = "3.3.0"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "187avlksg4k7ci3jz4djfq8zfyq5jpvhbw2dzlp76wlppm1al4m0"; -} diff --git a/pkgs/webapps/nextcloud/apps/cookbook.nix b/pkgs/webapps/nextcloud/apps/cookbook.nix deleted file mode 100644 index 63cac0d..0000000 --- a/pkgs/webapps/nextcloud/apps/cookbook.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 14 && nextcloudVersion <= 19; -buildApp rec { - appName = "cookbook"; - version = "0.6.5"; - url = "https://github.com/mrzapp/nextcloud-cookbook/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "068dxdxy9ix37970mn348blkdrrnkzad26zgyx4f5s19wm439p5j"; - installPhase = '' - sed -i -e "s/application..ld..json/application[^\"|\\\\']*ld[^\"|\\\\']*json/" lib/Service/RecipeService.php - mkdir -p $out - cp -R . $out/ - ''; -} - diff --git a/pkgs/webapps/nextcloud/apps/deck.nix b/pkgs/webapps/nextcloud/apps/deck.nix deleted file mode 100644 index ec693c6..0000000 --- a/pkgs/webapps/nextcloud/apps/deck.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion == 18; -buildApp rec { - appName = "deck"; - version = "1.0.0"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "13r9vd5bf75slrzhvi6bybazhh1vcx0n4a8a7hf97bxr7pq2f91j"; -} diff --git a/pkgs/webapps/nextcloud/apps/extract.nix b/pkgs/webapps/nextcloud/apps/extract.nix deleted file mode 100644 index daa9d2d..0000000 --- a/pkgs/webapps/nextcloud/apps/extract.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 13 && nextcloudVersion <= 19; -buildApp rec { - appName = "extract"; - version = "1.2.4"; - url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz"; - sha256 = "0f1csv0warga12a1hkgdcnhnfiwfv5z2ab3mri4frn2qlh12wyby"; -} diff --git a/pkgs/webapps/nextcloud/apps/files_markdown.nix b/pkgs/webapps/nextcloud/apps/files_markdown.nix deleted file mode 100644 index 5810ec9..0000000 --- a/pkgs/webapps/nextcloud/apps/files_markdown.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "files_markdown"; - version = "2.2.0"; - url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "05f793pznkkdgmr3wfqfbhwcg8s8kcvpfxnhzyj0pbw19srls2aw"; -} diff --git a/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/pkgs/webapps/nextcloud/apps/files_readmemd.nix deleted file mode 100644 index c9728c0..0000000 --- a/pkgs/webapps/nextcloud/apps/files_readmemd.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "files_readmemd"; - version = "1.1.4"; - url = "https://gitlab.univ-nantes.fr/uncloud/files_readmemd/-/wikis/uploads/e1d280e855f37e5f0a421c757868113c/${appName}.tar.gz"; - sha256 = "1sfaghbyzfv3hg5vhj1nprb85zsl6lcr2x88ks6l9ndv49nfbvm9"; -} diff --git a/pkgs/webapps/nextcloud/apps/flowupload.nix b/pkgs/webapps/nextcloud/apps/flowupload.nix deleted file mode 100644 index 516ee32..0000000 --- a/pkgs/webapps/nextcloud/apps/flowupload.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 15 && nextcloudVersion <= 18; -buildApp rec { - appName = "flowupload"; - version = "0.1.8"; - url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; - sha256 = "0llg5cr4fgqg512znp9bga77y7vdsi2pgsyl4m3a54c557zyjah3"; -} diff --git a/pkgs/webapps/nextcloud/apps/gpxedit.nix b/pkgs/webapps/nextcloud/apps/gpxedit.nix deleted file mode 100644 index cd3e878..0000000 --- a/pkgs/webapps/nextcloud/apps/gpxedit.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 14 && nextcloudVersion <= 19; -buildApp rec { - appName = "gpxedit"; - version = "0.0.13"; - url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/a7c638d1b038514d07bb5c787b6e7961/${appName}-${version}.tar.gz"; - sha256 = "1b15iqaq8fj3khpx3lh0fyqkhmj6x44fc59pg3cp3jrh3bpg0534"; - otherConfig = { - mimetypealiases = { - "application/gpx+xml" = "gpx"; - }; - mimetypemapping = { - "gpx" = ["application/gpx+xml"]; - }; - }; -} diff --git a/pkgs/webapps/nextcloud/apps/gpxpod.nix b/pkgs/webapps/nextcloud/apps/gpxpod.nix deleted file mode 100644 index 0750144..0000000 --- a/pkgs/webapps/nextcloud/apps/gpxpod.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 14 && nextcloudVersion <= 19; -buildApp rec { - appName = "gpxpod"; - version = "4.2.1"; - url = "https://gitlab.com/eneiluj/gpxpod-oc/wikis/uploads/0361f9dc50633f0f39d929442935435c/${appName}-${version}.tar.gz"; - sha256 = "0ycpychq6g8axdprvd0ahgdy2pwfdbfyf1pxk4cprr4ab986aq1x"; - otherConfig = { - mimetypealiases = { - "application/gpx+xml" = "gpx"; - }; - mimetypemapping = { - "gpx" = ["application/gpx+xml"]; - }; - }; -} diff --git a/pkgs/webapps/nextcloud/apps/impersonate.nix b/pkgs/webapps/nextcloud/apps/impersonate.nix deleted file mode 100644 index 66cc893..0000000 --- a/pkgs/webapps/nextcloud/apps/impersonate.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 18 && nextcloudVersion < 19; -buildApp rec { - appName = "impersonate"; - version = "1.5.2"; - url = "https://github.com/nextcloud/impersonate/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "03fm9d2p6ap9gyiw5anmlwsdmiyklrkpdgchfx2zfgxn38pjrz6d"; -} - diff --git a/pkgs/webapps/nextcloud/apps/keeweb.nix b/pkgs/webapps/nextcloud/apps/keeweb.nix deleted file mode 100644 index 4ea1399..0000000 --- a/pkgs/webapps/nextcloud/apps/keeweb.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 11 && nextcloudVersion <= 18; -buildApp rec { - appName = "keeweb"; - version = "0.6.2"; - url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "067801qz0fcfvmb14ja1ringzk53j1wp7ys2fl7lnlhf45r81vxx"; - installPhase = '' - mkdir -p $out - cp -R . $out/ - ''; - otherConfig = { - mimetypemapping = { - "kdbx" = ["application/x-kdbx"]; - }; - }; -} diff --git a/pkgs/webapps/nextcloud/apps/maps.nix b/pkgs/webapps/nextcloud/apps/maps.nix deleted file mode 100644 index 898df6c..0000000 --- a/pkgs/webapps/nextcloud/apps/maps.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "maps"; - version = "0.1.6"; - url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "1yh5h96c91lgz58zcm7zdpblvsc6c6nflx8pldfds102x292mprk"; -} diff --git a/pkgs/webapps/nextcloud/apps/metadata.nix b/pkgs/webapps/nextcloud/apps/metadata.nix deleted file mode 100644 index 2d62f53..0000000 --- a/pkgs/webapps/nextcloud/apps/metadata.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 13 && nextcloudVersion <= 19; -buildApp rec { - appName = "metadata"; - version = "0.11.1"; - url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "11napkv5s29xk1gmbfvy610ab1kc06qxqzw606ix5x0d1x4m3h0c"; -} diff --git a/pkgs/webapps/nextcloud/apps/music.nix b/pkgs/webapps/nextcloud/apps/music.nix deleted file mode 100644 index e430dd9..0000000 --- a/pkgs/webapps/nextcloud/apps/music.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 9 && nextcloudVersion <= 19; -buildApp rec { - appName = "music"; - version = "0.14.1"; - url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}.zip"; - zip = true; - sha256 = "06svn24qix0nbikwi0kxnli402vq99851bn5ljcsm10r74bnlw83"; -} diff --git a/pkgs/webapps/nextcloud/apps/notes.nix b/pkgs/webapps/nextcloud/apps/notes.nix deleted file mode 100644 index 7a06bbc..0000000 --- a/pkgs/webapps/nextcloud/apps/notes.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "notes"; - version = "3.3.0"; - url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}.tar.gz"; - sha256 = "03k0ijma7sccwqq9ch3bvgbg9kxr2wk0bmkxzxrc9in1d40d3k7f"; -} diff --git a/pkgs/webapps/nextcloud/apps/ocsms.nix b/pkgs/webapps/nextcloud/apps/ocsms.nix deleted file mode 100644 index aee1ff2..0000000 --- a/pkgs/webapps/nextcloud/apps/ocsms.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "ocsms"; - version = "2.1.7"; - url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; - sha256 = "1pfdzq16nbh4wfmkmif0dxacxg0fy4n4cp2d1hbq9k2z9awcx1vh"; - installPhase = '' - mkdir -p $out - cp -R . $out/ - ''; -} diff --git a/pkgs/webapps/nextcloud/apps/passman.nix b/pkgs/webapps/nextcloud/apps/passman.nix deleted file mode 100644 index 2de4882..0000000 --- a/pkgs/webapps/nextcloud/apps/passman.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 18; -buildApp rec { - # FIXME: it creates a /settings/user/additional setting url which - # doesn’t work - appName = "passman"; - version = "2.3.5"; - url = "https://releases.passman.cc/${appName}_${version}.tar.gz"; - sha256 = "05gc288n43c7dhmq1jqfn8cfw7sycwdfhn36j8rh8nbx1irldbjn"; -} diff --git a/pkgs/webapps/nextcloud/apps/polls.nix b/pkgs/webapps/nextcloud/apps/polls.nix deleted file mode 100644 index 69e1102..0000000 --- a/pkgs/webapps/nextcloud/apps/polls.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "polls"; - version = "1.4.3"; - url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "07l5x5xblk6w8f6mqz3a5hjpry8qc3zgqi49z6bp5ipnzj0s6wm4"; -} diff --git a/pkgs/webapps/nextcloud/apps/social.nix b/pkgs/webapps/nextcloud/apps/social.nix deleted file mode 100644 index 75b790a..0000000 --- a/pkgs/webapps/nextcloud/apps/social.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "social"; - version = "0.3.1"; - url = "https://github.com/nextcloud/social/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "03hh6vr34p33dphrjqmc7s8mvsk5n7dl817j8qkf75203y8szhdy"; -} - diff --git a/pkgs/webapps/nextcloud/apps/spreed.nix b/pkgs/webapps/nextcloud/apps/spreed.nix deleted file mode 100644 index b52c8c5..0000000 --- a/pkgs/webapps/nextcloud/apps/spreed.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion == 18; -buildApp rec { - appName = "spreed"; - version = "8.0.8"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "19szk61ixzzrabs63l2fihx7k4f6a8k4kdzpa0xxzv5w9ssqjhbj"; -} diff --git a/pkgs/webapps/nextcloud/apps/tasks.nix b/pkgs/webapps/nextcloud/apps/tasks.nix deleted file mode 100644 index a2de465..0000000 --- a/pkgs/webapps/nextcloud/apps/tasks.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "tasks"; - version = "0.12.2"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "092fg7dpx69jp5z0ka14ay6bnfdcnjq8zk2gc3rwpzc3llpdnqph"; -} diff --git a/pkgs/webapps/nextcloud/default.nix b/pkgs/webapps/nextcloud/default.nix deleted file mode 100644 index 5017fd2..0000000 --- a/pkgs/webapps/nextcloud/default.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ varDir ? "/var/lib/nextcloud", nextcloudVersion ? 18, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl }: -let - appNames = [ - "apporder" "audioplayer" "bookmarks" "calendar" "carnet" "circles" - "contacts" "cookbook" "deck" "extract" "files_markdown" - "files_readmemd" "flowupload" "gpxedit" "gpxpod" "impersonate" - "keeweb" "maps" "metadata" "music" "notes" "ocsms" "passman" "polls" - "spreed" "social" "tasks" - ]; - allApps = lib.attrsets.genAttrs appNames - (name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; }); - buildApp = { appName, version, url, sha256, zip ? false, otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }: - stdenv.mkDerivation rec { - name = "nextcloud-app-${appName}-${version}"; - inherit version; - phases = "unpackPhase installPhase"; - inherit installPhase; - src = (if zip then fetchzip else fetchurl) { inherit url sha256; }; - passthru = { - inherit appName otherConfig; - }; - }; - toPassthru = pkg: apps: otherConfig: { - inherit apps otherConfig allApps buildApp varDir; - withApps = withApps pkg; - }; - withApps = pkg: toApps: - let - apps = toApps allApps; - toInstallApp = n: '' - ln -sf ${n} $out/apps/${n.appName} - ''; - zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps); - appConfigs = with lib.attrsets; with lib.lists; { - mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []); - mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or [])); - }; - newNextcloud = pkg.overrideAttrs(old: { - installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps); - passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs; - }); - in newNextcloud; - package = stdenv.mkDerivation rec { - name = "nextcloud-${version}"; - version = "${builtins.toString nextcloudVersion}.0.4"; - - src = fetchurl { - url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2"; - sha256 = "0aa3f4xbkzacfw0h9aic0ywk5mqlwka83qaszizj8lmk68kf3n7s"; - }; - - installPhase = '' - mkdir -p $out/ - cp -R . $out/ - rm -r $out/config - '' + lib.optionalString (varDir != null) '' - ln -sf ${varDir}/config $out/config - ''; - - passthru = toPassthru package [] otherConfig; - meta = { - description = "Sharing solution for files, calendars, contacts and more"; - homepage = https://nextcloud.com; - maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ]; - license = lib.licenses.agpl3Plus; - platforms = with lib.platforms; unix; - }; - }; -in package diff --git a/pkgs/webapps/rompr/default.nix b/pkgs/webapps/rompr/default.nix deleted file mode 100644 index 2accf00..0000000 --- a/pkgs/webapps/rompr/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ varDir ? "/var/lib/rompr", stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./rompr.json // { - installPhase = '' - cp -a . $out - ln -sf ${varDir}/prefs $out/prefs - ln -sf ${varDir}/albumart $out/albumart - ''; -}) diff --git a/pkgs/webapps/rompr/rompr.json b/pkgs/webapps/rompr/rompr.json deleted file mode 100644 index 778d915..0000000 --- a/pkgs/webapps/rompr/rompr.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "1.24", - "meta": { - "name": "rompr", - "url": "https://github.com/fatg3erman/RompR", - "branch": "refs/tags/1.24" - }, - "github": { - "owner": "fatg3erman", - "repo": "RompR", - "rev": "0d8f597027ac71b320963fe3f33f461a136312ad", - "sha256": "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json b/pkgs/webapps/taskwarrior-web/taskwarrior-web.json deleted file mode 100644 index 70f396d..0000000 --- a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "a79cfe2-master", - "meta": { - "name": "taskwarrior-web", - "url": "https://github.com/theunraveler/taskwarrior-web", - "branch": "master" - }, - "github": { - "owner": "theunraveler", - "repo": "taskwarrior-web", - "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", - "sha256": "028rb4wry2an19707bvy4n305f3s0hipg214224p1m0mb61c3cq4", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json b/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json deleted file mode 100644 index e57fcce..0000000 --- a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "0ea2092-master", - "meta": { - "name": "ttrss-af_feedmod", - "url": "https://github.com/mbirth/ttrss_plugin-af_feedmod", - "branch": "master" - }, - "github": { - "owner": "mbirth", - "repo": "ttrss_plugin-af_feedmod", - "rev": "0ea2092dd34067ecd898802cfca3570023d1ecfe", - "sha256": "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix deleted file mode 100644 index 8512be3..0000000 --- a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ patched ? false, stdenv, mylibs, lib }: -stdenv.mkDerivation (mylibs.fetchedGithub ./af_feedmod.json // { - patches = lib.optionals patched [ ./type_replace.patch ]; - installPhase = '' - mkdir $out - cp init.php $out - ''; - passthru.pluginName = "af_feedmod"; -}) diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json b/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json deleted file mode 100644 index c8aaab5..0000000 --- a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "4d751b0-master", - "meta": { - "name": "ttrss-auth-ldap", - "url": "https://github.com/hydrian/TTRSS-Auth-LDAP", - "branch": "master" - }, - "github": { - "owner": "hydrian", - "repo": "TTRSS-Auth-LDAP", - "rev": "4d751b095c29a8dbe2dc7bb07777742956136e94", - "sha256": "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix deleted file mode 100644 index 424a9f7..0000000 --- a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./auth-ldap.json // { - installPhase = '' - mkdir $out - cp plugins/auth_ldap/init.php $out - ''; - passthru.pluginName = "auth_ldap"; -}) diff --git a/pkgs/webapps/ttrss/plugins/feediron/default.nix b/pkgs/webapps/ttrss/plugins/feediron/default.nix deleted file mode 100644 index 80bfda4..0000000 --- a/pkgs/webapps/ttrss/plugins/feediron/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ patched ? false, stdenv, mylibs, lib }: -stdenv.mkDerivation (mylibs.fetchedGithub ./feediron.json // { - patches = lib.optionals patched [ ./json_reformat.patch ]; - installPhase = '' - mkdir $out - cp -a . $out - ''; - passthru.pluginName = "feediron"; -}) diff --git a/pkgs/webapps/ttrss/plugins/feediron/feediron.json b/pkgs/webapps/ttrss/plugins/feediron/feediron.json deleted file mode 100644 index 5dbec92..0000000 --- a/pkgs/webapps/ttrss/plugins/feediron/feediron.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "407168c-master", - "meta": { - "name": "ttrss-feediron", - "url": "https://github.com/m42e/ttrss_plugin-feediron", - "branch": "master" - }, - "github": { - "owner": "m42e", - "repo": "ttrss_plugin-feediron", - "rev": "407168c628880b5ced572cc549db6d50e866d3c8", - "sha256": "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix deleted file mode 100644 index 3540f73..0000000 --- a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./ff_instagram.json // { - installPhase = '' - mkdir $out - cp -a . $out - ''; - passthru.pluginName = "ff_instagram"; -}) diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json b/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json deleted file mode 100644 index 1f241b9..0000000 --- a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "0366ffb-master", - "meta": { - "name": "ttrss-ff_instagram", - "url": "https://github.com/wltb/ff_instagram", - "branch": "master" - }, - "github": { - "owner": "wltb", - "repo": "ff_instagram", - "rev": "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8", - "sha256": "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix deleted file mode 100644 index 2cf3e05..0000000 --- a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./tumblr_gdpr_ua.json // { - installPhase = '' - mkdir $out - cp -a . $out - ''; - passthru.pluginName = "tumblr_gdpr_ua"; -}) diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json deleted file mode 100644 index eafbcfe..0000000 --- a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "287c584-master", - "meta": { - "name": "ttrss-tumblr_gdpr_ua", - "url": "https://github.com/hkockerbeck/ttrss-tumblr-gdpr-ua", - "branch": "master" - }, - "github": { - "owner": "hkockerbeck", - "repo": "ttrss-tumblr-gdpr-ua", - "rev": "287c584e68845d524f920156bff0b2eaa6f65117", - "sha256": "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/yourls/plugins/ldap/default.nix b/pkgs/webapps/yourls/plugins/ldap/default.nix deleted file mode 100644 index 01dc6fb..0000000 --- a/pkgs/webapps/yourls/plugins/ldap/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./ldap.json // rec { - installPhase = '' - mkdir -p $out - cp plugin.php $out - ''; - passthru.pluginName = "ldap"; -}) diff --git a/pkgs/webapps/yourls/plugins/ldap/ldap.json b/pkgs/webapps/yourls/plugins/ldap/ldap.json deleted file mode 100644 index 9411e4a..0000000 --- a/pkgs/webapps/yourls/plugins/ldap/ldap.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "2a3cb03-master", - "meta": { - "name": "yourls-ldap-plugin", - "url": "https://github.com/k3a/yourls-ldap-plugin", - "branch": "master" - }, - "github": { - "owner": "k3a", - "repo": "yourls-ldap-plugin", - "rev": "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615", - "sha256": "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/yourls/yourls.json b/pkgs/webapps/yourls/yourls.json deleted file mode 100644 index 0a79b18..0000000 --- a/pkgs/webapps/yourls/yourls.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "1.7.3", - "meta": { - "name": "yourls", - "url": "https://github.com/YOURLS/YOURLS", - "branch": "refs/tags/1.7.3" - }, - "github": { - "owner": "YOURLS", - "repo": "YOURLS", - "rev": "077018822d3594229daa8343310d0b40804b9ddc", - "sha256": "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd", - "fetchSubmodules": true - } -} diff --git a/scripts/fetch_version b/scripts/fetch_version deleted file mode 100755 index 5c4715a..0000000 --- a/scripts/fetch_version +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo "$0 file.json" - echo "$0 [-n|--name name] [-b|--branch branch_or_rev] [-f|--file out_file] [-h|--help] (-u|--url) url" - exit -} - -branch="master" -while [[ $# -gt 0 ]]; do - a="$1" - shift - case "$a" in - *.json) - file=$a - content=$(cat $a) - name="$(echo "$content" | jq -r ".meta.name")" - url="$(echo "$content" | jq -r ".meta.url")" - branch="$(echo "$content" | jq -r ".meta.branch")" - ;; - -n|--name) - name=$1 - shift - ;; - -u|--url) - url=$1 - shift - ;; - -b|--branch) - branch=$1 - shift - ;; - -f|--file) - file=$1 - shift - ;; - -h|--help) - usage - ;; - esac -done -if [ -z "$url" ]; then - usage -fi -if [ -z "$name" ]; then - name=$(echo "$url" | cut -d"/" -f5) -fi -if [ -z "$file" ]; then - file=$name.json -fi - -# function fetch_ledger () { -# pushd $HOME/projets/ledger >/dev/null 2>/dev/null -# git fetch origin -# tag="$(git describe origin/next | sed -e "s/^v//")" -# rev="$(git show-ref -s refs/remotes/origin/next)" -# sha="$(nix-prefetch-url --unpack file://<(git archive --format=tar.gz HEAD) 2>/dev/null)" -# popd >/dev/null 2>/dev/null -# } - -# awk_describe='BEGIN { -# FS = "[ /^]+" -# while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) { -# if (!sha) -# sha = substr($0, 1, 7) -# tag = $3 -# } -# while ("curl -s " ARGV[1] "/releases/tag/" tag | getline) -# if ($3 ~ "commits") -# com = $2 -# printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha -# }' - -function get_ref () { - case "$1" in - refs/*) - echo "$1" - ;; - *) - echo "refs/heads/$1" - ;; - esac -} - -function get_name () { - branch="$1" - rev="$2" - minirev=${rev:0:7} - - case "$branch" in - refs/tags/*) - b="${branch#refs/tags/}" - echo "${b//\//-}" - ;; - refs/heads/*) - b=${branch#refs/heads/} - echo "$minirev-${b//\//-}" - ;; - refs/*) - b=${branch#refs/} - echo "$minirev-${b//\//-}" - ;; - *) - echo "$minirev-${branch//\//-}" - ;; - esac -} - -function fetch_github () { - rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)" - sha="$(nix-prefetch-url --unpack $url/archive/$rev.tar.gz)" - # Différent du git-describe et github-spécifique - #tag=$(echo "$awk_describe" | awk -f - $url | sed -e "s/^v//") - tag=$(get_name $branch $rev) -} - -function fetch_other () { - rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)" - sha="$(nix-prefetch-git --url $url --rev $(get_ref $branch) | jq -r '.sha256')" - tag=$(get_name $branch $rev) -} - -case "$url" in - https://*github.com/*) - fetch_github 2>/dev/null - owner=$(echo "$url" | cut -d"/" -f4) - repo=$(echo "$url" | cut -d"/" -f5) - - F='{ - "tag": $tag, - "meta": { - "name": $name, - "url": $url, - "branch": $branch - }, - "github": { - "owner": $owner, - "repo": $repo, - "rev": $rev, - "sha256": $sha, - "fetchSubmodules": true - } - }' - ;; - *) - fetch_other 2>/dev/null - F='{ - "tag": $tag, - "meta": { - "name": $name, - "url": $url, - "branch": $branch - }, - "git": { - "url": $url, - "rev": $rev, - "sha256": $sha, - "fetchSubmodules": true - } - }' - ;; -esac - -jq -n \ - --arg name "$name" \ - --arg owner "$owner" \ - --arg repo "$repo" \ - --arg tag "$tag" \ - --arg rev "$rev" \ - --arg url "$url" \ - --arg branch "$branch" \ - --arg sha "$sha" \ - "$F" > $file diff --git a/scripts/make-nur b/scripts/make-nur index 127f8bd..2b7278f 100755 --- a/scripts/make-nur +++ b/scripts/make-nur @@ -19,7 +19,7 @@ git rebase --onto=$nur_root $first_commit master # The list below musn't get shrinked, it is used by filter-branch on # every commit clean_folder=' - rm -rf config lib/private modules/private pkgs/private nixops + rm -rf config lib/private modules/private pkgs/private deploy for broken in pkgs/crypto/cardano/default.nix; do if [ -f $broken ]; then rm -f $broken diff --git a/scripts/refresh_flakes b/scripts/refresh_flakes new file mode 100755 index 0000000..2bbcad6 --- /dev/null +++ b/scripts/refresh_flakes @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -e + +declare -A refreshed + +while [ -n "$1" ]; do + case "$1" in + --no-new-inputs) + no_new_inputs="y" + shift;; + *) + flake_or_dir="$1" + shift;; + esac +done + +refresh_deps() { + local flake + local inputs=() + local depname + local deppath + flake="$(realpath $1)" + if [ "${refreshed[$flake]}" = 1 ]; then + return + fi + pushd "$flake" 2>/dev/null >/dev/null + if [ -z "$no_new_inputs" ]; then + nix --no-warn-dirty flake lock + fi + if [ ! -e "$flake/flake.lock" ]; then + popd 2>/dev/null >/dev/null + refreshed[$flake]=1 + return + fi + + deps=$(jq -r '. as $root | .nodes[.root].inputs|values|to_entries|map({ key: .key, value: $root.nodes[.value].original.path })[]|select(.value != null)|.key + " " + .value' < flake.lock) + if [ -n "$deps" ]; then + while read depname deppath; do + refresh_deps "$deppath" + inputs+=(--update-input "$depname") + done <<<"$deps" + fi + nix --no-warn-dirty flake lock "${inputs[@]}" + popd 2>/dev/null >/dev/null + refreshed[$flake]=1 +} + +git_dir=$(git rev-parse --show-toplevel) + +# If argument is given (flake.nix or directory containing), refresh that argument +# Otherwise, if we are in a subdirectory containing a flake.nix, refresh that +# Otherwise, refresh all +if [ -n "$flake_or_dir" ]; then + if [ -d "$flake_or_dir" -a -e "$1/flake.nix" ]; then + refresh_deps "$flake_or_dir" + elif [ -f "$flake_or_dir" -a -e "$(dirname $flake_or_dir)/flake.nix" ]; then + refresh_deps "$(dirname $flake_or_dir)" + else + echo "No flake.nix file in specified location" + exit 1 + fi +else + if [ "$(pwd)" != "$git_dir" -a -e "$(pwd)/flake.nix" ]; then + refresh_deps "$(pwd)" + else + find $git_dir -name "flake.lock" | while read flake; do + refresh_deps "$(dirname $flake)" + done + fi +fi diff --git a/nixops/scripts/setup b/scripts/setup similarity index 100% rename from nixops/scripts/setup rename to scripts/setup diff --git a/scripts/update_flake b/scripts/update_flake new file mode 100755 index 0000000..3a9cd17 --- /dev/null +++ b/scripts/update_flake @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +searched_file="$1" + +get_inputs() { + flake=$1 + name=$2 + cat "$flake" | jq -r --arg name "$name" '.nodes|to_entries[]|select(.value.original.path != null and (.value.original.path|test("(../)+" + $name)))|.key' +} + +find flakes -name "flake.lock" | while read flake; do + for input in $(get_inputs "$flake" "$searched_file"); do + echo "updating $input in $(dirname "$flake")" + pushd "$(dirname "$flake")" >/dev/null 2>/dev/null + nix flake update --update-input "$input" + popd >/dev/null 2>/dev/null + done +done diff --git a/scripts/with_env b/scripts/with_env new file mode 100755 index 0000000..783d86c --- /dev/null +++ b/scripts/with_env @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +if [ -z "$SOPS_VARS_FILE" ]; then + echo "Variable SOPS_VARS_FILE is needed with a path to the sops variables" + exit 1; +fi + +umask 0077 +TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files) +chmod go-rwx $TEMP + +finish() { + rm -rf "$TEMP" +} + +trap finish EXIT + +sops -d $SOPS_VARS_FILE | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519 + +cat > $TEMP/ssh_config < { overlays = builtins.attrValues (import ./overlays); }, - pkgs-nix ? import { overlays = builtins.attrValues (import ./overlays); } -}: -let - patchedNix = pkgs-nix.nixUnstable.overrideAttrs(old: { - patches = old.patches ++ [ - # Fix the ETag bug. PR merged. Remove when updating to >= 20210125 - # https://github.com/NixOS/nixpkgs/pull/109309#issuecomment-768331750 - (pkgs-nix.fetchpatch { - url = "https://patch-diff.githubusercontent.com/raw/NixOS/nix/pull/4470.diff"; - sha256 = "sha256-d4RNOKMxa4NMbFgYcqWRv2ByHt8F/XUWV+6P9qHz7S4="; - }) - ]; - }); -in -pkgs.mkShell { - buildInputs = [ patchedNix pkgs.sops pkgs.morph pkgs.niv pkgs.curl pkgs.shellcheck pkgs.jq pkgs.gnumake pkgs.yq ]; -} diff --git a/modules/private/system/backup-2.nix b/systems/backup-2/base.nix similarity index 70% rename from modules/private/system/backup-2.nix rename to systems/backup-2/base.nix index c01a666..97a364c 100644 --- a/modules/private/system/backup-2.nix +++ b/systems/backup-2/base.nix @@ -1,10 +1,5 @@ -{ config, pkgs, resources, name, ... }: +{ config, pkgs, resources, name, lib, nixpkgs, secrets, ... }: { - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ]; secrets.keys = { @@ -22,9 +17,22 @@ }; }; boot.kernelPackages = pkgs.linuxPackages_latest; - myEnv = import ../../../nixops/secrets/environment.nix; - imports = [ ] ++ builtins.attrValues (import ../..); + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + ]; + + imports = + [ + secrets.nixosModules.users-config-backup-2 + (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") + ./databases/mariadb_replication.nix + ./databases/openldap_replication.nix + ./databases/postgresql_replication.nix + ./databases/redis_replication.nix + ./mail/relay.nix + ./monitoring.nix + ]; fileSystems = { "/backup2" = { @@ -36,9 +44,9 @@ networking = { firewall.enable = true; - interfaces."ens3".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips); + interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)); interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) config.hostEnv.ips); @@ -47,9 +55,7 @@ boot.loader.grub.device = "nodev"; - myServices.certificates.enable = true; security.acme.certs."${name}" = { - user = config.services.nginx.user; group = config.services.nginx.group; }; services.nginx = { @@ -65,6 +71,27 @@ enable = true; }; + myServices.chatonsProperties.hostings.rsync-backup = { + file.datetime = "2022-08-27T16:00:00"; + hosting = { + name = "Rsync backups"; + description = "Remote initiated rsync backups"; + website = "backup-2.v.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "rsync"; + website = "https://rsync.samba.org/"; + license.url = "https://rsync.samba.org/GPL.html"; + license.name = "GNU General Public License version 3"; + version = pkgs.rsync.version; + source.url = "https://github.com/WayneD/rsync"; + }; + }; + services.rsyncBackup = { mountpoint = "/backup2"; profiles = config.myEnv.rsync_backup.profiles; @@ -95,8 +122,8 @@ eldiron = { serverId = 2; # mysql resolves "backup-2" host and checks the ip, but uses /etc/hosts which only contains ip4 - host = config.myEnv.servers.eldiron.ips.main.ip4; - port = "3306"; + host = lib.head config.myEnv.servers.eldiron.ips.main.ip4; + port = config.myEnv.databases.mysql.port; user = "backup-2"; password = config.hostEnv.ldap.password; dumpUser = "root"; @@ -133,5 +160,5 @@ # database servers. You should change this only after NixOS release # notes say you should. # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? + system.stateVersion = "23.05"; # Did you read the comment? } diff --git a/modules/private/databases/mariadb_replication.nix b/systems/backup-2/databases/mariadb_replication.nix similarity index 89% rename from modules/private/databases/mariadb_replication.nix rename to systems/backup-2/databases/mariadb_replication.nix index 68e6f7f..8d2b457 100644 --- a/modules/private/databases/mariadb_replication.nix +++ b/systems/backup-2/databases/mariadb_replication.nix @@ -38,7 +38,7 @@ in ''; }; port = lib.mkOption { - type = lib.types.str; + type = lib.types.int; description = '' Port to connect to ''; @@ -73,6 +73,26 @@ in }; config = lib.mkIf cfg.enable { + myServices.chatonsProperties.hostings.mysql-replication = { + file.datetime = "2022-08-27T15:00:00"; + hosting = { + name = "Mysql replication"; + description = "Replication of mysql database"; + website = "db-1.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "MariaDB"; + website = "https://mariadb.org/"; + license.url = "https://github.com/MariaDB/server/blob/10.11/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.mariadb.version; + source.url = "https://github.com/MariaDB/server"; + }; + }; users.users.mysql = { description = "MySQL server user"; group = "mysql"; @@ -87,7 +107,7 @@ in group = "mysql"; permissions = "0400"; text = '' - CHANGE MASTER TO master_host="${hcfg.host}", master_port=${hcfg.port}, master_user="${hcfg.user}", master_password="${hcfg.password}", master_ssl=1, master_use_gtid=slave_pos; + CHANGE MASTER TO master_host="${hcfg.host}", master_port=${builtins.toString hcfg.port}, master_user="${hcfg.user}", master_password="${hcfg.password}", master_ssl=1, master_use_gtid=slave_pos; START SLAVE; ''; }) @@ -192,7 +212,7 @@ in ${hcfg.package}/bin/mysqldump \ --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump_remote"} \ -h ${hcfg.host} \ - -P ${hcfg.port} \ + -P ${builtins.toString hcfg.port} \ --ssl \ --gtid \ --flush-privileges \ diff --git a/modules/private/databases/openldap_replication.nix b/systems/backup-2/databases/openldap_replication.nix similarity index 96% rename from modules/private/databases/openldap_replication.nix rename to systems/backup-2/databases/openldap_replication.nix index b456323..b962224 100644 --- a/modules/private/databases/openldap_replication.nix +++ b/systems/backup-2/databases/openldap_replication.nix @@ -1,19 +1,18 @@ -{ pkgs, config, lib, ... }: +{ pkgs, config, lib, openldap, ... }: let cfg = config.myServices.databasesReplication.openldap; - eldiron_schemas = pkgs.callPackage ./openldap/eldiron_schemas.nix {}; ldapConfig = hcfg: name: pkgs.writeText "slapd.conf" '' include ${pkgs.openldap}/etc/schema/core.schema include ${pkgs.openldap}/etc/schema/cosine.schema include ${pkgs.openldap}/etc/schema/inetorgperson.schema include ${pkgs.openldap}/etc/schema/nis.schema - ${eldiron_schemas} + include ${openldap.immae-schema} pidfile /run/slapd_${name}/slapd.pid argsfile /run/slapd_${name}/slapd.args - moduleload back_hdb - backend hdb - database hdb + moduleload back_mdb + backend mdb + database mdb suffix "${hcfg.base}" rootdn "cn=root,${hcfg.base}" diff --git a/modules/private/databases/postgresql_replication.nix b/systems/backup-2/databases/postgresql_replication.nix similarity index 88% rename from modules/private/databases/postgresql_replication.nix rename to systems/backup-2/databases/postgresql_replication.nix index 135bbed..5351a4f 100644 --- a/modules/private/databases/postgresql_replication.nix +++ b/systems/backup-2/databases/postgresql_replication.nix @@ -50,6 +50,26 @@ in }; config = lib.mkIf cfg.enable { + myServices.chatonsProperties.hostings.postgresql-replication = { + file.datetime = "2022-08-27T15:00:00"; + hosting = { + name = "PostgreSQL replication"; + description = "Replication of PostgreSQL database"; + website = "db-1.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "PostgreSQL"; + website = "https://www.postgresql.org/"; + license.url = "https://www.postgresql.org/about/licence/"; + license.name = "The PostgreSQL Licence"; + version = pkgs.postgresql.version; + source.url = "https://git.postgresql.org/gitweb/?p=postgresql.git;a=summary"; + }; + }; users.users.postgres = { name = "postgres"; uid = config.ids.uids.postgres; @@ -90,6 +110,7 @@ in unix_socket_directories = '${dataDir}' data_directory = '${dataDir}' wal_level = logical + max_connections = 300 ''; }) ]) cfg.hosts)); diff --git a/modules/private/databases/redis_replication.nix b/systems/backup-2/databases/redis_replication.nix similarity index 98% rename from modules/private/databases/redis_replication.nix rename to systems/backup-2/databases/redis_replication.nix index 9e48939..53fa904 100644 --- a/modules/private/databases/redis_replication.nix +++ b/systems/backup-2/databases/redis_replication.nix @@ -63,7 +63,7 @@ in config.redis = { encrypt = true; source = "127.0.0.1:16379"; - target = "${config.myEnv.servers.eldiron.ips.main.ip4}:16379"; + target = "${lib.head config.myEnv.servers.eldiron.ips.main.ip4}:16379"; keyfile = config.secrets.fullPaths."redis/spiped_eldiron_keyfile"; }; }; diff --git a/modules/private/databases/utils.nix b/systems/backup-2/databases/utils.nix similarity index 96% rename from modules/private/databases/utils.nix rename to systems/backup-2/databases/utils.nix index 47988fc..1b3190f 100644 --- a/modules/private/databases/utils.nix +++ b/systems/backup-2/databases/utils.nix @@ -16,7 +16,7 @@ rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e"; }; log2rotate = pkgs.writeScript "log2rotate" '' - #!${pkgs.python3}/bin/python + #!${pkgs.python38}/bin/python ${builtins.readFile "${log2rotateSrc}/log2rotate.py"} ''; diff --git a/systems/backup-2/flake.lock b/systems/backup-2/flake.lock new file mode 100644 index 0000000..46003ba --- /dev/null +++ b/systems/backup-2/flake.lock @@ -0,0 +1,1159 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_3", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_11", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_5", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "root": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_7", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/backup-2/flake.nix b/systems/backup-2/flake.nix new file mode 100644 index 0000000..e6807d6 --- /dev/null +++ b/systems/backup-2/flake.nix @@ -0,0 +1,51 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + openldap.url = "path:../../flakes/private/openldap"; + monitoring.url = "path:../../flakes/private/monitoring"; + mail-relay.url = "path:../../flakes/private/mail-relay"; + milters.url = "path:../../flakes/private/milters"; + openarc.url = "path:../../flakes/private/openarc"; + opendmarc.url = "path:../../flakes/private/opendmarc"; + chatons.url = "path:../../flakes/private/chatons"; + environment.url = "path:../../flakes/private/environment"; + system.url = "path:../../flakes/private/system"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + rsync_backup.url = "path:../../flakes/rsync_backup"; + loginctl-linger.url = "path:../../flakes/loginctl-linger"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "backup-2"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "95.217.19.143"; + targetUser = "root"; + nixosModules = { + base = ./base.nix; + system = inputs.system.nixosModule; + mail-relay = inputs.mail-relay.nixosModule; + milters = inputs.milters.nixosModule; + openarc = inputs.openarc.nixosModule; + opendmarc = inputs.opendmarc.nixosModule; + chatons = inputs.chatons.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + rsync_backup = inputs.rsync_backup.nixosModule; + loginctl-linger = inputs.loginctl-linger.nixosModule; + }; + moduleArgs = { + nixpkgs = inputs.nixpkgs; + openldap = inputs.openldap; + monitoring = inputs.monitoring; + }; + }; +} diff --git a/modules/private/mail/relay.nix b/systems/backup-2/mail/relay.nix similarity index 68% rename from modules/private/mail/relay.nix rename to systems/backup-2/mail/relay.nix index 668d365..1b7e25e 100644 --- a/modules/private/mail/relay.nix +++ b/systems/backup-2/mail/relay.nix @@ -1,17 +1,22 @@ -{ lib, pkgs, config, nodes, name, ... }: +{ lib, pkgs, config, name, nodes, ... }: +let + getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies); + bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones; + receiving_domains = lib.flatten (builtins.attrValues bydomain); +in { + options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services"; config = lib.mkIf config.myServices.mailBackup.enable { - security.acme.certs."mail" = config.myServices.certificates.certConfig // { + myServices.mail.milters.enable = true; + security.acme.certs."mail" = { postRun = '' systemctl restart postfix.service ''; domain = config.hostEnv.fqdn; - extraDomains = let - zonesWithMx = builtins.filter (zone: - lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0 - ) config.myEnv.dns.masterZones; - mxs = map (zone: "${config.myEnv.servers."${name}".mx.subdomain}.${zone.name}") zonesWithMx; - in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs); + extraDomainNames = let + zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) nodes.eldiron.config.myServices.dns.zones); + mxs = map (n: "${config.myEnv.servers."${name}".mx.subdomain}.${n}") zonesWithMx; + in mxs; }; secrets.keys = { "postfix/mysql_alias_maps" = { @@ -112,45 +117,22 @@ }; services.postfix = { mapFiles = let - recipient_maps = let - name = n: i: "relay_${n}_${toString i}"; - pair = n: i: m: lib.attrsets.nameValuePair (name n i) ( - if m.type == "hash" - then pkgs.writeText (name n i) m.content - else null - ); - pairs = n: v: lib.imap1 (i: m: pair n i m) v.recipient_maps; - in lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.listToAttrs (lib.flatten ( - lib.attrsets.mapAttrsToList pairs config.myEnv.mail.postfix.backup_domains - )) - ); - relay_restrictions = lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.mapAttrs' (n: v: - lib.attrsets.nameValuePair "recipient_access_${n}" ( - if lib.attrsets.hasAttr "relay_restrictions" v - then pkgs.writeText "recipient_access_${n}" v.relay_restrictions - else null - ) - ) config.myEnv.mail.postfix.backup_domains - ); virtual_map = { virtual = let cfg = config.myEnv.monitoring.email_check.eldiron; address = "${cfg.mail_address}@${cfg.mail_domain}"; + aliases = config.myEnv.mail.postfix.common_aliases; in pkgs.writeText "postfix-virtual" ( builtins.concatStringsSep "\n" ( - ["${address} 1"] ++ - lib.attrsets.mapAttrsToList ( - n: v: lib.optionalString v.external '' - script_${n}@mail.immae.eu 1 - '' - ) config.myEnv.mail.scripts + [ "${address} 1" + ] ++ + map (a: "${a} 1") config.myEnv.mail.postfix.other_aliases ++ + lib.lists.flatten (map (domain: map (alias: "${alias}@${domain} 1") aliases) receiving_domains) ) ); }; in - recipient_maps // relay_restrictions // virtual_map; + virtual_map; config = { ### postfix module overrides readme_directory = "${pkgs.postfix}/share/postfix/doc"; @@ -163,25 +145,8 @@ alias_database = "\$alias_maps"; ### Relay domains - relay_domains = let - backups = lib.flatten (lib.attrsets.mapAttrsToList (n: v: v.domains or []) config.myEnv.mail.postfix.backup_domains); - virtual_domains = config.myEnv.mail.postfix.additional_mailbox_domains - ++ lib.remove null (lib.flatten (map - (zone: map - (e: if e.receive - then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}" - else null - ) - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - )); - in - backups ++ virtual_domains; + relay_domains = receiving_domains; relay_recipient_maps = let - backup_recipients = lib.flatten (lib.attrsets.mapAttrsToList (n: v: - lib.imap1 (i: m: "${m.type}:/etc/postfix/relay_${n}_${toString i}") v.recipient_maps - ) config.myEnv.mail.postfix.backup_domains); virtual_alias_maps = [ "hash:/etc/postfix/virtual" "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}" @@ -192,14 +157,10 @@ "pgsql:${config.secrets.fullPaths."postfix/sympa_mailbox_maps"}" ]; in - backup_recipients ++ virtual_alias_maps ++ virtual_mailbox_maps; + virtual_alias_maps ++ virtual_mailbox_maps; smtpd_relay_restrictions = [ "defer_unauth_destination" - ] ++ lib.flatten (lib.attrsets.mapAttrsToList (n: v: - if lib.attrsets.hasAttr "relay_restrictions" v - then [ "check_recipient_access hash:/etc/postfix/recipient_access_${n}" ] - else [] - ) config.myEnv.mail.postfix.backup_domains); + ]; ### Additional smtpd configuration smtpd_tls_received_header = "yes"; @@ -210,7 +171,7 @@ smtp_tls_loglevel = "1"; ### Force ip bind for smtp - smtp_bind_address = config.myEnv.servers."${name}".ips.main.ip4; + smtp_bind_address = builtins.head config.myEnv.servers."${name}".ips.main.ip4; smtp_bind_address6 = builtins.head config.myEnv.servers."${name}".ips.main.ip6; smtpd_milters = [ diff --git a/systems/backup-2/monitoring.nix b/systems/backup-2/monitoring.nix new file mode 100644 index 0000000..6d769e3 --- /dev/null +++ b/systems/backup-2/monitoring.nix @@ -0,0 +1,117 @@ +{ config, pkgs, lib, name, openldap, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "file_date" "mysql" "openldap" "redis" "emails" "notify-secondary"]; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = false; + processWarn = "60"; processAlert = "70"; + loadWarn = "4.0"; loadAlert = "6.0"; + load15Warn = "1.0"; load15Alert = "1.0"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + (emailCheck "backup-2" hostFQDN // { + __passive_servicegroups = "webstatus-email"; + }) + { + service_description = "Size on /backup2 partition"; + use = "local-service"; + check_command = ["check_local_disk" "10%" "5%" "/backup2"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "Last backup in /backup2/phare is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"]; + __passive_servicegroups = "webstatus-backup"; + } + { + service_description = "Last backup in /backup2/dilion is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"]; + __passive_servicegroups = "webstatus-backup"; + } + { + service_description = "Last backup in /backup2/ulminfo is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"]; + __passive_servicegroups = "webstatus-backup"; + } + { + service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + { + service_description = "Redis replication for eldiron is up to date"; + use = "local-service"; + check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + { + service_description = "Mysql replication for eldiron is up to date"; + use = "local-service"; + check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + { + service_description = "Openldap replication for eldiron is up to date"; + use = "local-service"; + check_command = let + name = "eldiron"; + hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron; + base = config.myServices.databasesReplication.openldap.base; + ldapConfig = pkgs.writeText "slapd.conf" '' + include ${pkgs.openldap}/etc/schema/core.schema + include ${pkgs.openldap}/etc/schema/cosine.schema + include ${pkgs.openldap}/etc/schema/inetorgperson.schema + include ${pkgs.openldap}/etc/schema/nis.schema + include ${openldap.immae-schema} + moduleload back_mdb + backend mdb + database mdb + + suffix "${hcfg.base}" + directory ${base}/${name}/openldap + ''; + in [ + "check_openldap_replication" + hcfg.url + hcfg.dn + config.secrets.fullPaths."openldap_replication/eldiron/replication_password" + hcfg.base + "${ldapConfig}" + ]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + ]; + } + ]; +} diff --git a/modules/private/system/dilion.nix b/systems/dilion/base.nix similarity index 50% rename from modules/private/system/dilion.nix rename to systems/dilion/base.nix index fa92cd9..ac4bdaf 100644 --- a/modules/private/system/dilion.nix +++ b/systems/dilion/base.nix @@ -1,24 +1,17 @@ -{ config, pkgs, name, lib, ... }: +{ config, pkgs, name, lib, pkgs-no-overlay, secrets, ... }: { - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ]; - nixpkgs.system = lib.mkOverride 900 "x86_64-linux"; boot = { loader = { grub = { - version = 2; devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ]; }; timeout = 1; }; blacklistedKernelModules = [ "nvidiafb" ]; supportedFilesystems = [ "zfs" ]; - kernelPackages = pkgs.linuxPackages_latest; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; kernelModules = [ "kvm-intel" ]; initrd.availableKernelModules = [ "ahci" "sd_mod" ]; initrd.secrets = { @@ -28,12 +21,9 @@ # available in nixos-20.09 #zfs.requestEncryptionCredentials = [ "zpool/root" ]; }; - nix.maxJobs = 8; powerManagement.cpuFreqGovernor = "powersave"; hardware.enableRedistributableFirmware = true; - myEnv = import ../../../nixops/secrets/environment.nix; - swapDevices = [ { label = "swap"; } ]; fileSystems = { "/" = { fsType = "zfs"; device = "zpool/root"; }; @@ -51,14 +41,18 @@ ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0" ''; + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + ]; + networking = { hostId = "27c3048d"; # generated with head -c4 /dev/urandom | od -A none -t x4 firewall.enable = false; interfaces."eth0".ipv4.addresses = - [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ] - ++ pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips); + [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ] + ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)); interfaces."eth0".ipv6.addresses = [ { address = "2a01:4f8:141:53e7::"; prefixLength = 64; } ] ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList @@ -76,8 +70,54 @@ ]; }; - myServices.ssh.modules = [ config.myServices.ssh.predefinedModules.regular ]; - imports = builtins.attrValues (import ../..) ++ [ ./dilion/vms.nix ]; + myServices.ssh.modules.regular.snippet = builtins.readFile ./ssh_ldap_regular.sh; + + imports = [ + secrets.nixosModules.users-config-dilion + ./monitoring.nix + ./vms.nix + ]; + + myServices.vms.libvirt-guests = { + buildbot = { + pool = "zfspool"; + network = "immae"; + cpus = 1; + memory = 3; + diskSize = 10; + destroyVolumeOnExit = true; + }; + }; + myServices.vms.libvirt-images = { + nixos = ./vms/base_configuration.nix; + buildbot = ./vms/buildbot_configuration.nix; + }; + myServices.vms.libvirt-networks.immae = { + bridgeNumber = 1; + ipRange = "192.168.100"; + }; + myServices.vms.libvirt-pools = { + niximages = { + type = "dir"; + target = "/etc/libvirtd/base-images"; + }; + buildbot-disks = rec { + type = "dir"; + target = "/var/lib/libvirt/images/buildbot-disks"; + preStart = '' + mkdir -p ${target} + ''; + }; + zfspool = { + # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs + type = "zfs"; + xml = '' + + zpool/libvirt + + ''; + }; + }; system.nssModules = [ pkgs.libvirt ]; system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ]; @@ -88,20 +128,22 @@ shell = pkgs.bashInteractive; isSystemUser = true; group = "libvirtd"; - packages = [ pkgs.netcat-openbsd ]; + packages = [ pkgs.libressl.nc ]; openssh.authorizedKeys.keys = [ config.myEnv.buildbot.ssh_key.public config.myEnv.sshd.rootKeys.ismael_flony ]; }; + users.groups.backup = {}; users.users.backup = { hashedPassword = "!"; isSystemUser = true; extraGroups = [ "keys" ]; + group = "backup"; shell = pkgs.bashInteractive; openssh.authorizedKeys.keys = let - zreplConfig = config.secrets.fullPaths."zrepl/zrepl.yml"; + zreplConfig = "/etc/zrepl/zrepl.yml"; in ["command=\"${pkgs.zrepl}/bin/zrepl stdinserver --config ${zreplConfig} eldiron\",restrict ${config.myEnv.zrepl_backup.ssh_key.public}"]; }; @@ -115,29 +157,26 @@ } ]; - system.activationScripts.libvirtd_exports = '' - install -m 0755 -o root -g root -d /var/lib/caldance - ''; virtualisation.docker.enable = true; virtualisation.docker.storageDriver = "zfs"; virtualisation.libvirtd.enable = true; - users.extraUsers.immae.extraGroups = [ "libvirtd" "docker" ]; + virtualisation.libvirtd.qemu.package = pkgs-no-overlay.qemu; + systemd.services.libvirtd.path = lib.mkAfter [ config.boot.zfs.package ]; + users.groups.immae = {}; + users.extraUsers.immae.extraGroups = [ "immae" "libvirtd" "docker" ]; systemd.services.libvirtd.postStart = '' install -m 0770 -g libvirtd -d /var/lib/libvirt/images ''; - systemd.services.socat-caldance = { - description = "Forward ssh port to caldance"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - serviceConfig = { - ExecStart = "${pkgs.socat}/bin/socat TCP-LISTEN:8022,fork TCP:caldance:22"; - }; - }; time.timeZone = "Europe/Paris"; nix = { - useSandbox = "relaxed"; + settings = { + sandbox = "relaxed"; + max-jobs = 8; + substituters = [ "https://hydra.iohk.io" "https://cache.nixos.org" ]; + trusted-public-keys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ]; + trusted-users = [ "root" "@wheel"] ; + }; extraOptions = '' keep-outputs = true keep-derivations = true @@ -155,88 +194,116 @@ }) ]; - # This is equivalent to setting environment.sessionVariables.NIX_PATH - nix.nixPath = [ - "home-manager=${pkgs.sources.home-manager.url}" - "nixpkgs=${pkgs.sources.nixpkgs-home-manager.url}" - ]; - nix.binaryCaches = [ "https://hydra.iohk.io" "https://cache.nixos.org" ]; - nix.binaryCachePublicKeys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ]; - myServices.monitoring.enable = true; - myServices.certificates.enable = true; - security.acme.certs."${name}-immae" = config.myServices.certificates.certConfig // { - user = "immae"; + security.acme.certs."${name}-immae" = { + group = "immae"; domain = "dilion.immae.eu"; }; security.acme.certs."${name}" = { - user = config.services.nginx.user; group = config.services.nginx.group; - extraDomains = { - "dilion.immae.dev" = null; - "caldance.cs.immae.dev" = null; - }; + extraDomainNames = [ + "dilion.immae.dev" + ]; }; + systemd.services.nginx.serviceConfig.ProtectHome = "read-only"; services.nginx = { enable = true; recommendedOptimisation = true; recommendedGzipSettings = true; recommendedProxySettings = true; - upstreams = { - caldance.servers."caldance:3031" = {}; - }; virtualHosts = { "dilion.immae.dev" = { - acmeRoot = config.myServices.certificates.webroot; + acmeRoot = config.security.acme.defaults.webroot; useACMEHost = name; forceSSL = true; - root = "/home/immae/www"; - }; - "caldance.cs.immae.dev" = { - acmeRoot = config.myServices.certificates.webroot; - useACMEHost = name; - forceSSL = true; - locations."/".extraConfig = '' - uwsgi_pass caldance; - ''; - locations."/static/".alias = "/var/lib/caldance/caldance/app/www/static/"; - locations."/media/".alias = "/var/lib/caldance/caldance/media/"; - extraConfig = '' - auth_basic "Authentification requise"; - auth_basic_user_file ${pkgs.writeText "htpasswd" config.myEnv.websites.caldance.integration.password}; - ''; + locations."/".root = "/home/immae/www"; }; }; }; - systemd.services.zrepl.serviceConfig.RuntimeDirectory = lib.mkForce "zrepl zrepl/stdinserver"; + secrets.keys = { + "zrepl/${name}.key" = { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${name}".key; + user = "backup"; + group = "root"; + }; + } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${x}".certificate; + user = "backup"; + group = "root"; + }) (builtins.attrNames config.myEnv.zrepl_backup.certs)); + + environment.etc."mdadm.conf" = { + enable = true; + mode = "0644"; + user = "root"; + text = "MAILADDR ${config.myEnv.monitoring.email}"; + }; + + systemd.services.zrepl.serviceConfig.User = "backup"; + systemd.services.zrepl.path = [ pkgs.openssh ]; + # pour eldiron: # zfs allow backup create,mount,receive,destroy,rename,snapshot,hold,bookmark,release zpool/backup + # pour flony: + # zfs allow backup hold,release,bookmark,snapshot,send zpool services.zrepl = { enable = true; - config = '' - global: - control: - sockpath: /run/zrepl/control - serve: - stdinserver: - sockdir: /run/zrepl/stdinserver - jobs: - - type: sink + settings = { + global.control.sockpath = "/run/zrepl/control"; + global.serve.stdinserver.sockdir = "/run/zrepl/stdinserver"; + jobs = [ + { + type = "sink"; # must not change - name: "backup-from-eldiron" - root_fs: "zpool/backup" - serve: - type: stdinserver - client_identities: - - eldiron - ''; + name = "backup-from-eldiron"; + root_fs = "zpool/backup"; + serve.type = "tls"; + serve.listen = ":19000"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/eldiron.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + serve.key = config.secrets.fullPaths."zrepl/dilion.key"; + serve.client_cns = [ "eldiron" ]; + } + { + type = "source"; + # must not change + name = "backup-to-wd-zpool"; + # not encrypted! + serve.type = "tls"; + serve.listen = ":19001"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + serve.key = config.secrets.fullPaths."zrepl/dilion.key"; + serve.client_cns = [ "flony" ]; + filesystems."zpool/libvirt<" = true; + filesystems."zpool/root<" = true; + snapshotting.type = "manual"; + } + { + type = "source"; + # must not change + name = "backup-to-wd-zpool-docker"; + # not encrypted! + serve.type = "tls"; + serve.listen = ":19002"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + serve.key = config.secrets.fullPaths."zrepl/dilion.key"; + serve.client_cns = [ "flony" ]; + filesystems."zpool/docker<" = true; + snapshotting.type = "manual"; + } + ]; + }; }; # This value determines the NixOS release with which your system is # to be compatible, in order to avoid breaking some software such as # database servers. You should change this only after NixOS release # notes say you should. # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? + system.stateVersion = "23.05"; # Did you read the comment? } diff --git a/systems/dilion/flake.lock b/systems/dilion/flake.lock new file mode 100644 index 0000000..6da2d47 --- /dev/null +++ b/systems/dilion/flake.lock @@ -0,0 +1,695 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_2", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_7", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "root": { + "inputs": { + "environment": "environment", + "files-watcher": "files-watcher", + "loginctl-linger": "loginctl-linger", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids", + "nixpkgs": "nixpkgs_5", + "secrets": "secrets_2", + "ssh": "ssh", + "system": "system" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_4", + "mypackages": "mypackages", + "myuids": "myuids_2", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/dilion/flake.nix b/systems/dilion/flake.nix new file mode 100644 index 0000000..9747086 --- /dev/null +++ b/systems/dilion/flake.nix @@ -0,0 +1,43 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + monitoring.url = "path:../../flakes/private/monitoring"; + ssh.url = "path:../../flakes/private/ssh"; + environment.url = "path:../../flakes/private/environment"; + system.url = "path:../../flakes/private/system"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + files-watcher.url = "path:../../flakes/files-watcher"; + loginctl-linger.url = "path:../../flakes/loginctl-linger"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "dilion"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "176.9.10.233"; + targetUser = "root"; + nixosModules = { + base = ./base.nix; + system = inputs.system.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + ssh = inputs.ssh.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + files-watcher = inputs.files-watcher.nixosModule; + loginctl-linger = inputs.loginctl-linger.nixosModule; + }; + moduleArgs = { + nixpkgs = inputs.nixpkgs; + monitoring = inputs.monitoring; + environment = inputs.environment; + pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux; + }; + }; +} diff --git a/systems/dilion/monitoring.nix b/systems/dilion/monitoring.nix new file mode 100644 index 0000000..af7f224 --- /dev/null +++ b/systems/dilion/monitoring.nix @@ -0,0 +1,43 @@ +{ lib, pkgs, config, name, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + zfs_snapshot = name: { + service_description = "ZFS snapshot ${name} happened not too long ago"; + use = "local-service"; + check_command = ["check_zfs_snapshot" name]; + __passive_servicegroups = "webstatus-resources"; + }; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary"]; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = false; + processWarn = "250"; processAlert = "400"; + loadWarn = "1.0"; loadAlert = "1.2"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + { + service_description = "No mdadm array is degraded"; + use = "local-service"; + check_command = ["check_mdadm"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "No ZFS pool is degraded"; + use = "local-service"; + check_command = ["check_zfs"]; + __passive_servicegroups = "webstatus-resources"; + } + (zfs_snapshot "zpool/backup/eldiron/zpool/root") + (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc") + (zfs_snapshot "zpool/backup/eldiron/zpool/root/var") + ]; + } + ]; +} diff --git a/modules/private/ssh/ldap_regular.sh b/systems/dilion/ssh_ldap_regular.sh similarity index 100% rename from modules/private/ssh/ldap_regular.sh rename to systems/dilion/ssh_ldap_regular.sh diff --git a/systems/dilion/vms.nix b/systems/dilion/vms.nix new file mode 100644 index 0000000..189e5ff --- /dev/null +++ b/systems/dilion/vms.nix @@ -0,0 +1,200 @@ +# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS +{ config, pkgs, lib, pkgs-no-overlay, ... }@args: +let + toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2"; +in +{ + options = { + myServices.vms.libvirt-guests = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + network = lib.mkOption { type = lib.types.str; description = "network to attach the guest to"; }; + pool = lib.mkOption { type = lib.types.str; description = "pool to attach the guest to"; }; + cpus = lib.mkOption { type = lib.types.int; default = 1; description = "number of cpus to assign"; }; + memory = lib.mkOption { type = lib.types.int; description = "memory in GiB to assign"; }; + diskSize = lib.mkOption { type = lib.types.int; description = "disk size in GiB"; }; + destroyVolumeOnExit = lib.mkOption { type = lib.types.bool; description = "Whether to destroy the volume on exit"; default = false; }; + extraDevicesXML = lib.mkOption { type = lib.types.lines; description = "Extra device configuration"; default = ""; }; + preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; }; + }; + }); + default = {}; + description = "Libvirt guests to start"; + }; + myServices.vms.libvirt-networks = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + bridgeNumber = lib.mkOption { type = lib.types.int; description = "bridge interface to create virbr"; }; + ipRange = lib.mkOption { type = lib.types.str; example = "192.168.100"; description = "ip4 prefix to use"; }; + }; + }); + description = "Libvirt networks to configure"; + default = {}; + }; + myServices.vms.libvirt-pools = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + type = lib.mkOption { type = lib.types.enum [ "dir" "zfs" ]; description = "Pool type"; }; + target = lib.mkOption { type = lib.types.nullOr lib.types.path; default = null; description = "where to find images"; }; + preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; }; + xml = lib.mkOption { type = lib.types.lines; default = ""; description = "Additional configuration"; }; + }; + }); + }; + myServices.vms.libvirt-images = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = {}; + description = "Attrs of images to create in /etc/libvirtd/base-images"; + }; + }; + config = lib.mkMerge [ + # Define images + { + environment.etc = lib.mapAttrs' + (n: v: lib.nameValuePair "libvirtd/base-images/${n}.qcow2" { source = toImage v; }) + config.myServices.vms.libvirt-images; + } + + # Define networks + { + systemd.services = lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" { + after = [ "libvirtd.service" ]; + requires = [ "libvirtd.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + path = [ config.boot.zfs.package ]; + script = let + xml = pkgs.writeText "libvirt-network-${name}.xml" '' + + ${name} + UUID + + + + + + + + + + ''; + in '' + uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh net-start '${name}' + ''; + preStop = '' + ${pkgs.libvirt}/bin/virsh net-destroy '${name}' + ''; + }) config.myServices.vms.libvirt-networks; + } + + # Define pools + { + systemd.services = lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" { + after = [ "libvirtd.service" ]; + requires = [ "libvirtd.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + path = [ config.boot.zfs.package ]; + script = let + xml = pkgs.writeText "libvirt-pool-${name}.xml" '' + + ${name} + UUID + ${pool.xml} + ${if pool.target != null then '' + + ${pool.target} + + '' else ""} + + ''; + in pool.preStart + '' + uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true + ''; + }) config.myServices.vms.libvirt-pools; + } + + # Define guests + { + systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" { + after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; + requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + path = [ config.boot.zfs.package ]; + script = + let + xml = pkgs.writeText "libvirt-guest-${name}.xml" + '' + + ${name} + UUID + ${builtins.toString guest.memory} + ${builtins.toString guest.cpus} + + hvm + + + /run/current-system/sw/bin/qemu-system-x86_64 + + + + + ${guest.extraDevicesXML} + + + + + + + + + + + ''; + in + guest.preStart + '' + if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then + ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${builtins.toString guest.diskSize}GiB' + volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}') + ${pkgs-no-overlay.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path + fi + uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh start '${name}' + ''; + preStop = '' + ${pkgs.libvirt}/bin/virsh shutdown '${name}' + let "timeout = $(date +%s) + 10" + while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do + if [ "$(date +%s)" -ge "$timeout" ]; then + # Meh, we warned it... + ${pkgs.libvirt}/bin/virsh destroy '${name}' + else + # The machine is still running, let's give it some time to shut down + sleep 0.5 + fi + done + '' + lib.optionalString guest.destroyVolumeOnExit '' + if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then + ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true + ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}' + fi + ''; + }) config.myServices.vms.libvirt-guests; + } + ]; +} diff --git a/modules/private/system/dilion/vms/base_configuration.nix b/systems/dilion/vms/base_configuration.nix similarity index 52% rename from modules/private/system/dilion/vms/base_configuration.nix rename to systems/dilion/vms/base_configuration.nix index e2caba2..7b67886 100644 --- a/modules/private/system/dilion/vms/base_configuration.nix +++ b/systems/dilion/vms/base_configuration.nix @@ -1,12 +1,18 @@ -{ lib, config, ... }@args: +{ lib, config, environment, ... }@args: { - options.myEnv = (import ../../../environment.nix (args // { name = "dummy"; })).options.myEnv; + options.myEnv = (environment.nixosModule (args // { name = "dummy"; })).options.myEnv; config = { + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = lib.mkDefault "23.05"; # Did you read the comment? + fileSystems."/".device = "/dev/disk/by-label/nixos"; boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "virtio_balloon" "virtio_blk" "virtio_pci" "virtio_ring" ]; boot.loader = { grub = { - version = 2; device = "/dev/vda"; }; timeout = 0; diff --git a/modules/private/system/dilion/vms/base_image.nix b/systems/dilion/vms/base_image.nix similarity index 82% rename from modules/private/system/dilion/vms/base_image.nix rename to systems/dilion/vms/base_image.nix index 8de8560..46b90eb 100644 --- a/modules/private/system/dilion/vms/base_image.nix +++ b/systems/dilion/vms/base_image.nix @@ -1,10 +1,14 @@ -configuration_file: { pkgs ? import {}, system ? builtins.currentSystem, myEnv, ... }: +configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }: let - config = (import { - inherit system; + config = (import (nixpkgs + "/nixos/lib/eval-config.nix") { + inherit (pkgs) system; modules = [ { + _module.args.environment = environment; myEnv = myEnv; - imports = [ configuration_file ]; + imports = [ + (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") + configuration_file + ]; # We want our template image to be as small as possible, but the deployed image should be able to be # of any size. Hence we resize on the first boot. @@ -22,7 +26,7 @@ let }; } ]; }).config; -in pkgs.vmTools.runInLinuxVM ( +in pkgs-no-overlay.vmTools.runInLinuxVM ( pkgs.runCommand "nixos-base-image" { memSize = 768; @@ -30,13 +34,13 @@ in pkgs.vmTools.runInLinuxVM ( '' mkdir $out diskImage=image.qcow2 - ${pkgs.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G + ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G mv closure xchg/ ''; postVM = '' echo compressing VM image... - ${pkgs.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2 + ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2 ''; buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ]; exportReferencesGraph = diff --git a/modules/private/system/dilion/vms/buildbot_configuration.nix b/systems/dilion/vms/buildbot_configuration.nix similarity index 87% rename from modules/private/system/dilion/vms/buildbot_configuration.nix rename to systems/dilion/vms/buildbot_configuration.nix index 05b02d4..622f8ba 100644 --- a/modules/private/system/dilion/vms/buildbot_configuration.nix +++ b/systems/dilion/vms/buildbot_configuration.nix @@ -1,9 +1,15 @@ { pkgs, config, lib, ... }: { imports = [ - ./base_configuration.nix ]; + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = "23.05"; # Did you read the comment? + systemd.services.buildbot-worker.serviceConfig.ExecStartPre = let cfg = config.services.buildbot-worker; script = pkgs.writeScript "decode-dmi" '' diff --git a/systems/eldiron/base.nix b/systems/eldiron/base.nix new file mode 100644 index 0000000..cda518e --- /dev/null +++ b/systems/eldiron/base.nix @@ -0,0 +1,371 @@ +{ config, pkgs, lib, php, name, secrets, ... }: +{ + # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age + secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ]; + boot = { + kernelModules = [ "kvm-intel" ]; + blacklistedKernelModules = [ "nvidiafb" ]; + loader.timeout = 1; + loader.grub.devices = [ "/dev/sda" "/dev/sdc" ]; + kernel.sysctl = { + # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md + "net.ipv4.tcp_sack" = 0; + }; + supportedFilesystems = [ "zfs" ]; + kernelParams = ["zfs.zfs_arc_max=6442450944"]; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; + initrd.availableKernelModules = [ "ahci" "sd_mod" ]; + initrd.secrets = { + "/boot/pass.key" = "/boot/pass.key"; + }; + }; + services.udev.extraRules = '' + ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0" + ''; + nix.settings.max-jobs = 8; + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + "nodejs-16.20.2" # for landing page building + ]; + + nixpkgs.overlays = [ + php.overlays.php + ]; + powerManagement.cpuFreqGovernor = "powersave"; + + security.acme.certs."${name}".postRun = builtins.concatStringsSep "\n" [ + (lib.optionalString config.services.websites.env.production.enable "/run/current-system/sw/bin/machinectl shell httpd-production /usr/bin/env systemctl reload httpd.service") + (lib.optionalString config.services.websites.env.integration.enable "/run/current-system/sw/bin/machinectl shell httpd-integration /usr/bin/env systemctl reload httpd.service") + ]; + + fileSystems = { + # pools: + # zpool: ashift=12 + # zfast: ashift=12 + # zfs: + # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy + # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key + # zpool/root/var: atime=on + # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy + # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key + # zfast/root/etc: ø + # zfast/root/nix: ø + # zfast/root/tmp: async=disabled + # zfast/root/var: atime=on + # zfast/root/var/lib: ø + # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata + # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput + # zfast/root/var/lib/postgresql/11.0: ø + # zfast/root/var/lib/postgresql/11.0/pg_wal: ø + "/" = { fsType = "zfs"; device = "zpool/root"; }; + "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; }; + "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; }; + "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; }; + "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; }; + "/var" = { fsType = "zfs"; device = "zpool/root/var"; }; + "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; }; + "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; }; + "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; }; + "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; }; + }; + swapDevices = [ { label = "swap1"; } { label = "swap2"; } ]; + hardware.enableRedistributableFirmware = true; + + services.zfs = { + autoScrub = { + enable = false; + }; + }; + networking = { + hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4 + firewall.enable = true; + firewall.allowedTCPPorts = [ config.myEnv.ports.zrepl_flony ]; + # FIXME: on next reboot, remove the /27 and the localCommands + interfaces."eth0".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)) + ++ [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ]; + interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) + config.hostEnv.ips); + defaultGateway = "176.9.151.65"; + localCommands = '' + # FIXME: Those commands were added by nixops and may not be + # actually needed + ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true + ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true + ip -6 route add default via 'fe80::1' dev eth0 || true + ''; + nameservers = [ + "213.133.98.98" + "213.133.99.99" + "213.133.100.100" + "2a01:4f8:0:a0a1::add:1010" + "2a01:4f8:0:a102::add:9999" + "2a01:4f8:0:a111::add:9898" + ]; + }; + + imports = [ + secrets.nixosModules.users-config-eldiron + ./databases + ./databases/mariadb.nix + ./databases/openldap + ./databases/postgresql.nix + ./databases/redis.nix + + + ./monitoring.nix + ./ejabberd + ./buildbot + ./coturn.nix + ./dns.nix + ./duply_backup.nix + ./gemini + ./gitolite + ./mail + ./websites + ./webstats + ./irc.nix + ./pub + ./tasks + ./ftp.nix + ./mpd.nix + ./vpn + ]; + + myServices.buildbot.enable = true; + myServices.databases.enable = true; + myServices.gitolite.enable = true; + myServices.monitoring.enable = true; + myServices.irc.enable = true; + myServices.pub.enable = true; + myServices.tasks.enable = true; + myServices.mpd.enable = true; + myServices.dns.enable = true; + myServices.websites.enable = true; + myServices.gemini.enable = true; + myServices.mail.enable = true; + myServices.ejabberd.enable = true; + myServices.vpn.enable = true; + myServices.ftp.enable = true; + + myServices.chatonsProperties.hostings.infogerance = { + file.datetime = "2022-08-27T18:50:00"; + hosting = { + name = "Infogérance"; + description = "Administration de serveurs"; + website = "https://www.immae.eu/"; + logo = "https://assets.immae.eu/logo.jpg"; + type = "HOSTEDSERVER"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + + services.netdata.enable = true; + services.netdata.config.global."memory mode" = "none"; + services.netdata.config.health."enabled" = "no"; + services.netdata.config.web.mode = "none"; + users.users."${config.services.netdata.user}".extraGroups = [ "keys" ]; + services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf"; + secrets.keys = { + "ldap/pam_pgsql" = { + user = "root"; + group = "root"; + permissions = "0400"; + text = '' + database = immae + user = immae_auth_read + password = {{ .postgresql.immae_auth_read }} + table = ldap_users + user_column = login + pw_type = function + auth_query = SELECT (mechanism = 'SSHA' AND password = encode(digest( %p || salt, 'sha1'), 'hex')) FROM ldap_users WHERE login = %u OR login || '@' || realm = %u + #pwd_query = WITH newsalt as (select gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( %p || (SELECT * FROM newsalt), 'sha1'), 'hex'), salt = (SELECT * FROM newsalt), mechanism = 'SSHA' WHERE login = %u OR login || '@' || realm = %u + ''; + }; + + "netdata-stream.conf" = { + user = config.services.netdata.user; + group = config.services.netdata.group; + permissions = "0400"; + text = '' + [stream] + enabled = yes + destination = ${config.myEnv.monitoring.netdata_aggregator} + api key = ${config.myEnv.monitoring.netdata_keys.eldiron} + ''; + }; + "zrepl_backup/identity" = { + user = "root"; + group = "root"; + permissions = "0400"; + text = config.myEnv.zrepl_backup.ssh_key.private; + }; + "zrepl/${name}.key" = { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${name}".key; + user = "root"; + group = "root"; + }; + } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${x}".certificate; + user = "root"; + group = "root"; + }) (builtins.attrNames config.myEnv.zrepl_backup.certs)); + + programs.ssh.knownHosts.dilion = { + extraHostNames = ["dilion.immae.eu"]; + publicKey = config.myEnv.servers.dilion.hostKey; + }; + + services.cron = { + enable = true; + mailto = "cron@immae.eu"; + systemCronJobs = [ + '' + 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected" + # Need a way to blacklist properly + # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:" + 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced" + '' + ]; + }; + + environment.systemPackages = [ pkgs.bindfs ]; + + environment.etc."mdadm.conf" = { + enable = true; + mode = "0644"; + user = "root"; + text = "MAILADDR ${config.myEnv.monitoring.email}"; + }; + + systemd.services.zrepl.path = [ pkgs.openssh ]; + services.zrepl = { + enable = true; + settings = { + jobs = [ + { + type = "push"; + # must not change + name = "backup-to-dilion"; + filesystems."zpool/root" = true; + filesystems."zpool/root/etc" = true; + filesystems."zpool/root/var<" = true; + connect = { + address = "dilion.immae.eu:19000"; + type = "tls"; + server_cn = "dilion"; + ca = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt"; + key = config.secrets.fullPaths."zrepl/eldiron.key"; + }; + snapshotting = { + type = "periodic"; + prefix = "zrepl_"; + interval = "1h"; + # hooks = [ + # { + # type = "mysql-lock-tables"; + # dsn = "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/"; + # filesystems."zpool/root/var" = true; + # } + # { + # type = "command"; + # path = pkgs.writeScript "redis-dump" '' + # #!${pkgs.stdenv.shell} + # ${pkgs.redis}/bin/redis-cli bgsave + # ''; + # err_is_fatal = false; + # filesystems."zpool/root/var" = true; + # } + # ]; + }; + send.encrypted = true; + pruning.keep_sender = [ + { type = "regex"; regex = "^manual_.*"; } + { type = "grid"; grid = "24x1h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; } + ]; + pruning.keep_receiver = [ + { type = "regex"; regex = "^manual_.*"; } + { type = "grid"; grid = "6x4h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; } + ]; + } + { + type = "source"; + # must not change + name = "backup-to-wd-zpool"; + serve.type = "tls"; + serve.listen = ":${builtins.toString config.myEnv.ports.zrepl_flony}"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt"; + serve.key = config.secrets.fullPaths."zrepl/eldiron.key"; + serve.client_cns = [ "flony" ]; + filesystems."zpool/root" = true; + filesystems."zpool/root/etc" = true; + filesystems."zpool/root/var<" = true; + filesystems."zfast/root/var<" = true; + send.encrypted = true; + snapshotting.type = "manual"; + } + ]; + }; + }; + + environment.etc."fail2ban/filter.d/postgresql.conf".text = '' + [Definition] + failregex = \S+ FATAL: password authentication failed for user .+$ + \S+ FATAL: PAM authentication failed for user.+$ + \S+ FATAL: no pg_hba.conf entry for host.+$ + ''; + environment.etc."fail2ban/filter.d/mysqld-auth.local".text = '' + [Definition] + _daemon = mysql[-\w]* + ''; + services.fail2ban.jails.dovecot = '' + enabled = true + ''; + services.fail2ban.jails.postfix-sasl = '' + enabled = true + ''; + services.fail2ban.jails.proftpd = '' + enabled = true + ''; + services.fail2ban.jails.postgresql = '' + enabled = true + port = 5432 + logpath = %(syslog_daemon)s + backend = %(default_backend)s + journalmatch = _SYSTEMD_UNIT=postgresql.service + _COMM=postgres + ''; + services.fail2ban.jails.mysqld-auth = '' + enabled = true + journalmatch = _SYSTEMD_UNIT=mysql.service + _COMM=mysqld + ''; + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = "23.05"; # Did you read the comment? + + security.pam.services.ldap.text = '' + # Authentication from ldap for pgsql + auth required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql + account required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql + ''; + services.saslauthd = { + enable = true; + mechanism = "pam"; + }; + environment.etc."sasl2/slapd.conf".text = '' + mech_list: plain + pwcheck_method: saslauthd + saslauthd_path: /run/saslauthd/mux + ''; +} diff --git a/modules/private/buildbot/default.nix b/systems/eldiron/buildbot/default.nix similarity index 70% rename from modules/private/buildbot/default.nix rename to systems/eldiron/buildbot/default.nix index ec28b63..e86b081 100644 --- a/modules/private/buildbot/default.nix +++ b/systems/eldiron/buildbot/default.nix @@ -1,16 +1,7 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, buildbot, ... }: let varDir = "/var/lib/buildbot"; - buildbot_common = pkgs.python3Packages.buildPythonPackage rec { - name = "buildbot_common"; - src = ./common; - format = "other"; - installPhase = '' - mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages} - cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common - ''; - }; - buildbot = pkgs.python3Packages.buildbot-full; + bb-python = buildbot.pythonModule; in { options = { @@ -24,6 +15,80 @@ in }; config = lib.mkIf config.myServices.buildbot.enable { + myEnv.buildbot.projects.test = { + name = "test"; + workerPort = config.myEnv.ports.buildbot_test; + packages = [ pkgs.git pkgs.gzip pkgs.openssh ]; + pythonPathHome = false; + secrets = { + apprise_webhooks = builtins.concatStringsSep "\n" [ + "{{ .apprise_webhooks.matrix_immae_eu_alert }}" + ]; + notify_xmpp_password = "{{ .xmpp.notify_bot }}"; + }; + activationScript = '' + install -m 0755 -o buildbot -g buildbot -d /var/lib/ftp/release.immae.eu/test + ''; + webhookTokens = [ + "{{ .buildbot.webhookTokens.Immae }}" + "{{ .buildbot.webhookTokens.Immae }}" + ]; + }; + + myServices.chatonsProperties.hostings.buildbot = { + file.datetime = "2022-08-21T10:37:00"; + hosting = { + name = "Buildbot"; + description = "Python-based continuous integration testing framework"; + type = "INSTANCE"; + website = "https://git.immae.eu"; + logo = "https://www.buildbot.net/img/icon.png"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/forge-logicielle.html"; + }; + software = { + name = "Buildbot"; + website = "https://www.buildbot.net/"; + license.url = "https://github.com/buildbot/buildbot/blob/master/LICENSE"; + license.name = "GNU General Public License v2.0"; + version = pkgs.buildbot.version; + source.url = "https://github.com/buildbot/buildbot"; + }; + }; + nixpkgs.overlays = [ + (self: super: { + follow-systemd-unit = self.writeScriptBin "follow-systemd-unit" '' + #!${self.stdenv.shell} + + set -euo pipefail + + service=$1 + before_invocation_id=$2 + + get_id() { + systemctl show -p InvocationID --value "$service" + } + + while [ "$(get_id)" = "$before_invocation_id" ]; do sleep 1; done + + invocation_id="$(get_id)" + cursor="$(mktemp)" + trap "rm -f $cursor" EXIT + + get_logs() { + journalctl --quiet --cursor-file=$cursor INVOCATION_ID=$invocation_id + _SYSTEMD_INVOCATION_ID=$invocation_id + } + + while [ -n "$(systemctl show -p Job --value "$service")" ]; do + get_logs + done + get_logs + ''; + }) + ]; ids.uids.buildbot = config.myEnv.buildbot.user.uid; ids.gids.buildbot = config.myEnv.buildbot.user.gid; @@ -34,7 +99,9 @@ in group = "buildbot"; description = "Buildbot user"; home = varDir; - extraGroups = [ "keys" ]; + extraGroups = [ "keys" "systemd-journal" ]; + useDefaultShell = true; + openssh.authorizedKeys.keys = [ config.myEnv.buildbot.ssh_key.public ]; }; services.websites.env.tools.watchPaths = lib.attrsets.mapAttrsToList @@ -96,12 +163,12 @@ in permissions = "0600"; user = "buildbot"; group = "buildbot"; + keyDependencies = [ (buildbot.buildbot_config project).src ] ++ project.secretsDeps; text = let project_env = with lib.attrsets; mapAttrs' (k: v: nameValuePair "BUILDBOT_${k}" v) project.environment // - mapAttrs' (k: v: nameValuePair "BUILDBOT_PATH_${k}" (v pkgs)) (attrByPath ["builderPaths"] {} project) // { - BUILDBOT_PROJECT_DIR = ./projects + "/${project.name}"; + BUILDBOT_PROJECT_DIR = (buildbot.buildbot_config project).src; BUILDBOT_WORKER_PORT = builtins.toString project.workerPort; BUILDBOT_HOST = config.hostEnv.fqdn; BUILDBOT_VIRT_URL = "qemu+ssh://libvirt@dilion.immae.eu/system"; @@ -131,6 +198,16 @@ in group = "buildbot"; text = config.myEnv.buildbot.ssh_key.private; }; + "buildbot/ssh_known_hosts" = { + permissions = "0644"; + user = "buildbot"; + group = "buildbot"; + text = '' + git.immae.eu ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF + eldiron ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF + phare.normalesup.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN2GomItXICXpCtCFRMT2xuerqx2nLMO/3mNUuWyzFr1 + ''; + }; }; services.filesWatcher = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" { @@ -152,9 +229,9 @@ in description = "Buildbot Continuous Integration Server ${project.name}."; after = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; - path = project.packages pkgs ++ (project.pythonPackages buildbot.pythonModule pkgs); + path = project.packages; preStart = let - master-cfg = "${buildbot_common}/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common/master.cfg"; + master-cfg = "${buildbot.buildbot_common}/${bb-python.pythonForBuild.sitePackages}/buildbot_common/master.cfg"; tac_file = pkgs.writeText "buildbot.tac" '' import os @@ -197,6 +274,7 @@ in ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_key"} ${varDir}/buildbot_key || true + install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_known_hosts"} ${varDir}/buildbot_hosts || true buildbot_secrets=${varDir}/${project.name}/secrets install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ldap"} $buildbot_secrets/ldap @@ -207,23 +285,11 @@ in ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name} ''; environment = let - buildbot_config = pkgs.python3Packages.buildPythonPackage (rec { - name = "buildbot_config-${project.name}"; - src = ./projects + "/${project.name}"; - format = "other"; - installPhase = '' - mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages} - cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_config - ''; - }); HOME = "${varDir}/${project.name}"; - PYTHONPATH = "${buildbot.pythonModule.withPackages (self: project.pythonPackages self pkgs ++ [ - pkgs.python3Packages.libvirt - pkgs.python3Packages.wokkel - pkgs.python3Packages.treq pkgs.python3Packages.ldap3 buildbot - pkgs.python3Packages.buildbot-worker - buildbot_common buildbot_config - ])}/${buildbot.pythonModule.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${pkgs.python3.pythonForBuild.sitePackages}" else ""}"; + PYTHONPATH = "${bb-python.withPackages (self: + buildbot.common_packages self ++ + [ (buildbot.buildbot_config project) ] + )}/${bb-python.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${bb-python.sitePackages}" else ""}"; in { inherit PYTHONPATH HOME; }; serviceConfig = { diff --git a/systems/eldiron/coturn.nix b/systems/eldiron/coturn.nix new file mode 100644 index 0000000..d8b02c5 --- /dev/null +++ b/systems/eldiron/coturn.nix @@ -0,0 +1,73 @@ +{ config, name, lib, pkgs, ... }: +{ + config = lib.mkIf (name == "eldiron") { + myServices.chatonsProperties.services.coturn = { + file.datetime = "2022-08-27T19:00:00"; + service = { + name = "Coturn"; + description = "coturn TURN server"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "FULL"; + install.type = "PACKAGE"; + }; + software = { + name = "coturn"; + website = "https://github.com/coturn/coturn"; + license.url = "https://github.com/coturn/coturn/blob/master/LICENSE"; + license.name = "3-Clause BSD License"; + version = pkgs.coturn.version; + source.url = "https://github.com/coturn/coturn"; + }; + }; + networking.firewall.allowedTCPPorts = [ + config.services.coturn.alt-listening-port + config.services.coturn.alt-tls-listening-port + config.services.coturn.listening-port + config.services.coturn.tls-listening-port + ]; + networking.firewall.allowedTCPPortRanges = [ + { from = config.services.coturn.min-port; to = config.services.coturn.max-port; } + ]; + networking.firewall.allowedUDPPortRanges = [ + { from = config.services.coturn.min-port; to = config.services.coturn.max-port; } + ]; + networking.firewall.allowedUDPPorts = [ + config.services.coturn.alt-listening-port + config.services.coturn.alt-tls-listening-port + config.services.coturn.listening-port + config.services.coturn.tls-listening-port + ]; + #users.users.turnserver.extraGroups = [ "keys" ]; + services.coturn = { + enable = true; + no-cli = true; + no-tls = true; + no-dtls = true; + use-auth-secret = true; + lt-cred-mech = true; + realm = "eldiron.immae.eu"; + extraConfig = '' + fingerprint + total-quota=0 + bps-capacity=0 + stale-nonce + no-multicast-peers + ''; + static-auth-secret = config.myEnv.coturn.auth_access_key; + #cert = "/var/lib/acme/eldiron/fullchain.pem"; + #pkey = "/var/lib/acme/eldiron/key.pem"; + listening-ips = [ + "127.0.0.1" + "::1" + ] ++ config.myEnv.servers.eldiron.ips.main.ip4 + ++ config.myEnv.servers.eldiron.ips.main.ip6; + relay-ips = [ + "127.0.0.1" + "::1" + ] ++ config.myEnv.servers.eldiron.ips.main.ip4 + ++ config.myEnv.servers.eldiron.ips.main.ip6; + }; + }; +} diff --git a/modules/private/databases/default.nix b/systems/eldiron/databases/default.nix similarity index 82% rename from modules/private/databases/default.nix rename to systems/eldiron/databases/default.nix index 1241658..d8d3048 100644 --- a/modules/private/databases/default.nix +++ b/systems/eldiron/databases/default.nix @@ -1,16 +1,15 @@ -{ lib, config, nodes, ... }: +{ lib, config, secrets, ... }: let cfg = config.myServices.databases; in { options.myServices = { databases.enable = lib.mkEnableOption "my databases service"; - databasesCerts = lib.mkOption { - description = "Default databases configurations for certificates as accepted by acme"; - }; }; + config.myServices.dns.zones."immae.eu".subdomains.db-1 = lib.mkIf cfg.enable (with config.myServices.dns.helpers; ips servers.eldiron.ips.main); config.myServices.databases = lib.mkIf cfg.enable { + mariadb = { enable = true; ldapConfig = { @@ -25,7 +24,7 @@ in }; openldap = { - accessFile = ../../../nixops/secrets/ldap.conf; + accessFile = secrets.ldap-conf; baseDn = config.myEnv.ldap.base; rootDn = config.myEnv.ldap.root_dn; rootPw = config.myEnv.ldap.root_pw; @@ -45,7 +44,7 @@ in }; replicationHosts = { backup-2 = { - ip4 = [config.myEnv.servers.backup-2.ips.main.ip4]; + ip4 = config.myEnv.servers.backup-2.ips.main.ip4; ip6 = config.myEnv.servers.backup-2.ips.main.ip6; }; }; diff --git a/modules/private/databases/mariadb.nix b/systems/eldiron/databases/mariadb.nix similarity index 92% rename from modules/private/databases/mariadb.nix rename to systems/eldiron/databases/mariadb.nix index 101eb3f..b4a6917 100644 --- a/modules/private/databases/mariadb.nix +++ b/systems/eldiron/databases/mariadb.nix @@ -74,7 +74,7 @@ in { }; config = lib.mkIf cfg.enable { - networking.firewall.allowedTCPPorts = [ 3306 ]; + networking.firewall.allowedTCPPorts = [ config.myEnv.databases.mysql.port ]; # for adminer, ssl is implemented with mysqli only, which is # currently disabled because it’s not compatible with pam. @@ -96,6 +96,7 @@ in { dataDir = cfg.dataDir; settings = { mysqld = { + port = config.myEnv.databases.mysql.port; ssl_ca = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; ssl_key = "${config.security.acme.certs.mysql.directory}/key.pem"; ssl_cert = "${config.security.acme.certs.mysql.directory}/fullchain.pem"; @@ -107,13 +108,18 @@ in { # this introduces a small delay before storing on disk, but # makes it order of magnitudes quicker innodb_flush_log_at_trx_commit = "0"; + + # This is necessary since the default ("dialog") is not + # supported by php's mysqlnd plugin (in mysqli). But with that + # change only regular login+password schemes can work (no + # "fancy" authentication methods like fprintd or keys) + pam_use_cleartext_plugin = true; }; }; }; users.users.mysql.extraGroups = [ "keys" ]; - security.acme.certs."mysql" = config.myServices.databasesCerts // { - user = "mysql"; + security.acme.certs."mysql" = { group = "mysql"; domain = "db-1.immae.eu"; postRun = '' diff --git a/systems/eldiron/databases/openldap/default.nix b/systems/eldiron/databases/openldap/default.nix new file mode 100644 index 0000000..7cd15da --- /dev/null +++ b/systems/eldiron/databases/openldap/default.nix @@ -0,0 +1,304 @@ +{ lib, pkgs, config, openldap, ... }: +let + cfg = config.myServices.databases.openldap; +in +{ + options.myServices.databases = { + openldap = { + enable = lib.mkOption { + default = false; + example = true; + description = "Whether to enable ldap"; + type = lib.types.bool; + }; + baseDn = lib.mkOption { + type = lib.types.str; + description = '' + Base DN for LDAP + ''; + }; + rootDn = lib.mkOption { + type = lib.types.str; + description = '' + Root DN + ''; + }; + rootPw = lib.mkOption { + type = lib.types.str; + description = '' + Root (Hashed) password + ''; + }; + accessFile = lib.mkOption { + type = lib.types.path; + description = '' + The file path that defines the access + ''; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/openldap/mdb"; + description = '' + The directory where Openldap stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/openldap"; + description = '' + The directory where Openldap puts sockets and pid files. + ''; + }; + # Output variables + pids = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + pid = "${cfg.socketsDir}/slapd.pid"; + args = "${cfg.socketsDir}/slapd.args"; + }; + readOnly = true; + description = '' + Slapd pid files + ''; + }; + }; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.ldap = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + nixpkgs.overlays = [ + (self: super: { + openldap_libressl_cyrus = (self.openldap.override { + openssl = self.libressl; + cyrus_sasl = self.cyrus_sasl.overrideAttrs (old: { + configureFlags = old.configureFlags ++ [ "--with-configdir=/etc/sasl2" ]; + }); + }).overrideAttrs (old: { + configureFlags = old.configureFlags ++ [ "--with-cyrus-sasl" "--enable-spasswd" ]; + }); + }) + ]; + + secrets.keys = { + "ldap/password" = { + permissions = "0400"; + user = "openldap"; + group = "openldap"; + text = "${cfg.rootPw}"; + }; + "ldap/access" = { + permissions = "0400"; + user = "openldap"; + group = "openldap"; + text = builtins.readFile cfg.accessFile; + }; + "ldap" = { + permissions = "0500"; + user = "openldap"; + group = "openldap"; + isDir = true; + }; + }; + users.users.openldap.extraGroups = [ "keys" ]; + networking.firewall.allowedTCPPorts = [ 636 389 ]; + + security.acme.certs."ldap" = { + group = "openldap"; + domain = "ldap.immae.eu"; + postRun = '' + systemctl restart openldap.service + ''; + }; + + services.filesWatcher.openldap = { + restart = true; + paths = [ config.secrets.fullPaths."ldap" ]; + }; + + services.openldap = { + enable = true; + urlList = [ "ldap://" "ldaps://" ]; + package = pkgs.openldap_libressl_cyrus; + settings = { + attrs = { + olcPidFile = cfg.pids.pid; + olcArgsFile = cfg.pids.args; + olcLogLevel = "none"; + olcTLSCertificateFile = "${config.security.acme.certs.ldap.directory}/cert.pem"; + olcTLSCertificateKeyFile = "${config.security.acme.certs.ldap.directory}/key.pem"; + olcTLSCACertificateFile = "${config.security.acme.certs.ldap.directory}/fullchain.pem"; + olcTLSCACertificatePath = "${pkgs.cacert.unbundled}/etc/ssl/certs/"; + # This makes openldap crash + # olcTLSCipherSuite = "DEFAULT"; + #olcSaslHost = "kerberos.immae.eu"; + # Map sasl "dn" to ldap dn + #olcAuthzRegexp = ''{0}"uid=([^,]*)(,cn=IMMAE.EU)?,cn=(gssapi|gss-spnego),cn=auth" "uid=$1,ou=users,dc=immae,dc=eu"''; + }; + children = { + "cn=module{0}" = { + attrs = { + cn = "module{0}"; + objectClass = [ "olcModuleList" ]; + olcModuleLoad = [ "{0}back_mdb" "{1}memberof" "{2}syncprov" ]; + }; + }; + "cn=schema".includes = map (schema: + "${config.services.openldap.package}/etc/schema/${schema}.ldif" + ) [ "core" "cosine" "inetorgperson" "nis" ] ++ [ + "${openldap.immae-ldif}" + ]; + "olcDatabase={0}config" = { + attrs = { + objectClass = "olcDatabaseConfig"; + olcDatabase = "{0}config"; + olcAccess = ["{0}to * by * none"]; + }; + }; + "olcDatabase={1}mdb" = { + attrs = { + objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ]; + olcDatabase = "{1}mdb"; + olcDbIndex = [ + "objectClass eq" + "uid pres,eq" + "mail pres,eq,sub" + "cn pres,eq,sub" + "sn pres,eq,sub" + "dc eq" + "member eq" + "memberOf eq" + ]; + olcAccess = let + join = builtins.replaceStrings ["\n"] [" "]; + in [ + # First matching "to" + "by" wins + #### Replication needs full access + (join ''{0}to * + by dn.base="uid=ldap_replication,cn=ldap,ou=services,dc=immae,dc=eu" read + by * break + '') + #### Prevent modification of SASL passwords + (join ''{1}to attrs=userPassword val.regex="^.SASL..+" + by self read + by anonymous auth + by * none + '') + #### Oneself needs access to users password + (join ''{2}to attrs=userPassword,shadowLastChange + by self write + by anonymous auth + by * none + '') + #### Should be write, but disabled during migration to psql + (join ''{3}to attrs=immaeSshKey + by self read + by * break + '') + + #### Anyone can auth, and I can see myself + (join ''{4}to * + by self read + by anonymous auth + by * break + '') + + #### Specific access for phpldapadmin + (join ''{5}to filter="(uid=*)" attrs=entry,uid + by dn.base="cn=phpldapadmin,ou=services,dc=immae,dc=eu" read + by * break + '') + + #### Hosts + # The attributes are available to every host + (join ''{6}to dn.one="ou=hosts,dc=immae,dc=eu" + by dn.subtree="ou=hosts,dc=immae,dc=eu" read + by dn.base="dc=immae,dc=eu" search + by * break + '') + #### /Hosts + + #### Local services + # this/-* & user : all your ancestors have access to you + # this/memberOf/-* & user : all those whom you belong to (in a group), + # and their ancestors, have access to you + # user/immaeAccessWriteDn*/member & this : you have write access to the + # members of your immaeAccessDn + # attributes + # user/immaeAccessDn*/member & this : you have access to the members + # of your immaeAccessDn attributes + # user/immaeAccessReadSubtree* & this/-* : you have access to the + # childrens of your immaeAccessReadSubtree + # attributes + # this/memberOf/-* & user/immaeAccessReadSubtree*: you have access to + # the members of the childrens of your + # immaeAccessReadSubtree attributes + # http://www.openldap.org/faq/data/cache/1133.html + (join ''{7}to dn.subtree="dc=immae,dc=eu" + by dn.subtree="ou=external_services,dc=immae,dc=eu" break + by set.exact="this/-* & user" read + by set.exact="this/memberOf/-* & user" read + by set.exact="user/immaeAccessWriteDn*/member & this" write + by set.exact="user/immaeAccessDn*/member & this" read + by set.exact="user/immaeAccessReadSubtree* & this/-*" read + by set.exact="this/memberOf/-* & user/immaeAccessReadSubtree*" read + by users search + by * break + '') + #### /Local services + + #### External services + # http://www.openldap.org/faq/data/cache/429.html + # FIXME: Find a way to whitelist? + (join ''{8}to attrs=immaeSshKey + by dn.subtree="ou=external_services,dc=immae,dc=eu" none + '') + (join ''{9}to dn.subtree="dc=immae,dc=eu" + by set.exact="this/-* & user" read + by set.exact="this/memberOf/-* & user" read + by set.exact="user/immaeAccessDn*/member & this/-*" read + by users search + by * none + '') + #### /External services + ]; + olcDbDirectory = cfg.dataDir; + olcRootDN = cfg.rootDn; + olcRootPW.path = config.secrets.fullPaths."ldap/password"; + olcSuffix = cfg.baseDn; + }; + children = { + "olcOverlay={0}memberof" = { + attrs = { + objectClass = [ "olcOverlayConfig" "olcMemberOf" ]; + olcOverlay = "{0}memberof"; + }; + }; + "olcOverlay={1}syncprov" = { + attrs = { + objectClass = [ "olcOverlayConfig" "olcSyncProvConfig" ]; + olcOverlay = "{1}syncprov"; + olcSpCheckpoint = "100 10"; + }; + }; + }; + }; + }; + }; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "tcp" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "ldap SSL is up to date"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = ["check_tcp_ssl" "636"]; + + servicegroups = "webstatus-ssl"; + _webstatus_name = "LDAP"; + _webstatus_url = "ldap.immae.eu"; + } + ]; + }; +} diff --git a/modules/private/databases/postgresql.nix b/systems/eldiron/databases/postgresql.nix similarity index 81% rename from modules/private/databases/postgresql.nix rename to systems/eldiron/databases/postgresql.nix index a6c4cc9..721059a 100644 --- a/modules/private/databases/postgresql.nix +++ b/systems/eldiron/databases/postgresql.nix @@ -97,8 +97,7 @@ in { config = lib.mkIf cfg.enable { networking.firewall.allowedTCPPorts = [ 5432 ]; - security.acme.certs."postgresql" = config.myServices.databasesCerts // { - user = "postgres"; + security.acme.certs."postgresql" = { group = "postgres"; domain = "db-1.immae.eu"; postRun = '' @@ -108,10 +107,17 @@ in { systemd.services.postgresql.serviceConfig = { SupplementaryGroups = "keys"; + ExecStartPre = [ ("+" + (pkgs.writeShellScript "postgresql-fix-cert" '' + # postgresql complains: + # private key file "${config.security.acme.certs.postgresql.directory}/key.pem" must be owned by the database user or root + cp -f "${config.security.acme.certs.postgresql.directory}/key.pem" "${config.services.postgresql.dataDir}/key.pem" + chown postgres:postgres "${config.services.postgresql.dataDir}/key.pem" + chmod go-r "${config.services.postgresql.dataDir}/key.pem" + '')) ]; }; systemd.services.postgresql.postStart = lib.mkAfter '' # This line is already defined in 19.09 - PSQL="${pkgs.sudo}/bin/sudo -u postgres psql --port=5432" + PSQL="psql --port=5432" ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: '' $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \ @@ -134,32 +140,34 @@ in { enable = true; package = cfg.package; enableTCPIP = true; - extraConfig = '' - max_connections = 100 - wal_level = logical - shared_buffers = 512MB - work_mem = 10MB - max_wal_size = 1GB - min_wal_size = 80MB - log_timezone = 'Europe/Paris' - datestyle = 'iso, mdy' - timezone = 'Europe/Paris' - lc_messages = 'en_US.UTF-8' - lc_monetary = 'en_US.UTF-8' - lc_numeric = 'en_US.UTF-8' - lc_time = 'en_US.UTF-8' - default_text_search_config = 'pg_catalog.english' + checkConfig = false; + logLinePrefix = "%h %q%u@%d "; # Default: '%m [%p] ', already stored independently by journald. %h needed for fail2ban + settings = { + max_connections = 300; + wal_level = "logical"; + shared_buffers = "512MB"; + work_mem = "10MB"; + max_wal_size = "1GB"; + min_wal_size = "80MB"; + log_timezone = "Europe/Paris"; + datestyle = "iso, mdy"; + timezone = "Europe/Paris"; + lc_messages = "en_US.UTF-8"; + lc_monetary = "en_US.UTF-8"; + lc_numeric = "en_US.UTF-8"; + lc_time = "en_US.UTF-8"; + default_text_search_config = "pg_catalog.english"; # this introduces a small delay before storing on disk, but # makes it order of magnitudes quicker - synchronous_commit = off - ssl = on - ssl_cert_file = '${config.security.acme.certs.postgresql.directory}/fullchain.pem' - ssl_key_file = '${config.security.acme.certs.postgresql.directory}/key.pem' - ''; + synchronous_commit = "off"; + ssl = "on"; + ssl_cert_file = "${config.security.acme.certs.postgresql.directory}/fullchain.pem"; + ssl_key_file = "${config.services.postgresql.dataDir}/key.pem"; + }; authentication = let hosts = builtins.concatStringsSep "\n" ( lib.lists.flatten (lib.mapAttrsToList (k: vs: map (v: - map (ip6: "hostssl ${v.database} ${v.username} ${ip6}/128 ${v.method}") v.ip6 + map (ip6: "hostssl ${v.database} ${v.username} ${ip6} ${v.method}") v.ip6 ++ map (ip4: "hostssl ${v.database} ${v.username} ${ip4}/32 ${v.method}") v.ip4 ) vs) cfg.authorizedHosts )); diff --git a/modules/private/databases/redis.nix b/systems/eldiron/databases/redis.nix similarity index 56% rename from modules/private/databases/redis.nix rename to systems/eldiron/databases/redis.nix index 685fa46..1f57aa9 100644 --- a/modules/private/databases/redis.nix +++ b/systems/eldiron/databases/redis.nix @@ -32,16 +32,21 @@ in { config = lib.mkIf cfg.enable { users.users.redis.uid = config.ids.uids.redis; users.groups.redis.gid = config.ids.gids.redis; - services.redis = rec { + services.redis.servers."" = { enable = true; bind = "127.0.0.1"; unixSocket = cfg.sockets.redis; - extraConfig = '' - unixsocketperm 777 - maxclients 1024 - ''; + unixSocketPerm = 777; + maxclients = 1024; }; systemd.services.redis.serviceConfig.Slice = "redis.slice"; + systemd.services.redis.serviceConfig.RuntimeDirectoryMode = lib.mkForce "0755"; + services.redis.servers."php-sessions" = { + enable = true; + maxclients = 1024; + unixSocketPerm = 777; + user = "wwwrun"; + }; services.spiped = { enable = true; @@ -68,38 +73,38 @@ in { script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`"; }; - services.filesWatcher.predixy = { - restart = true; - paths = [ config.secrets.fullPaths."redis/predixy.conf" ]; - }; + #services.filesWatcher.predixy = { + # restart = true; + # paths = [ config.secrets.fullPaths."redis/predixy.conf" ]; + #}; - networking.firewall.allowedTCPPorts = [ 7617 16379 ]; + networking.firewall.allowedTCPPorts = [ 16379 ]; secrets.keys = { - "redis/predixy.conf" = { - user = "redis"; - group = "redis"; - permissions = "0400"; - text = '' - Name Predixy - Bind 127.0.0.1:7617 - ClientTimeout 300 - WorkerThreads 1 + #"redis/predixy.conf" = { + # user = "redis"; + # group = "redis"; + # permissions = "0400"; + # text = '' + # Name Predixy + # Bind 127.0.0.1:7617 + # ClientTimeout 300 + # WorkerThreads 1 - Authority { - Auth "${config.myEnv.databases.redis.predixy.read}" { - Mode read - } - } + # Authority { + # Auth "${config.myEnv.databases.redis.predixy.read}" { + # Mode read + # } + # } - StandaloneServerPool { - Databases 16 - RefreshMethod fixed - Group shard001 { - + ${config.myEnv.databases.redis.socket} - } - } - ''; - }; + # StandaloneServerPool { + # Databases 16 + # RefreshMethod fixed + # Group shard001 { + # + ${config.myEnv.databases.redis.socket} + # } + # } + # ''; + #}; "redis/spiped_keyfile" = { user = "spiped"; group = "spiped"; @@ -112,22 +117,22 @@ in { description = "Redis slice"; }; - systemd.services.predixy = { - description = "Redis proxy"; - wantedBy = [ "multi-user.target" ]; - after = [ "redis.service" ]; + #systemd.services.predixy = { + # description = "Redis proxy"; + # wantedBy = [ "multi-user.target" ]; + # after = [ "redis.service" ]; - serviceConfig = { - Slice = "redis.slice"; - User = "redis"; - Group = "redis"; - SupplementaryGroups = "keys"; - Type = "simple"; + # serviceConfig = { + # Slice = "redis.slice"; + # User = "redis"; + # Group = "redis"; + # SupplementaryGroups = "keys"; + # Type = "simple"; - ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}"; - }; + # ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}"; + # }; - }; + #}; }; } diff --git a/systems/eldiron/dns.nix b/systems/eldiron/dns.nix new file mode 100644 index 0000000..486fcc1 --- /dev/null +++ b/systems/eldiron/dns.nix @@ -0,0 +1,290 @@ +{ lib, pkgs, config, dns-nix, ... }: +{ + options.myServices.dns = { + enable = lib.mkEnableOption "enable DNS resolver"; + helpers = lib.mkOption { + readOnly = true; + description = '' + Some useful constants or functions for zones definition + ''; + default = rec { + servers = config.myEnv.servers; + ips = i: { A = i.ip4; AAAA = i.ip6; }; + letsencrypt = [ { tag = "issue"; value = "letsencrypt.org"; issuerCritical = false; } ]; + toKV = a: builtins.concatStringsSep ";" (builtins.attrValues (builtins.mapAttrs (n: v: "${n}=${v}") a)); + mailMX = { + hasEmail = true; + subdomains = let + mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers; + in + lib.mapAttrs' (n: v: lib.nameValuePair v.mx.subdomain (ips v.ips.main)) mxes; + }; + zoneHeader = { + TTL = 3*60*60; + SOA = { + # yyyymmdd?? (increment ?? at each change) + serial = 2022121902; # Don't change this value, it is replaced automatically! + refresh = 10800; + retry = 3600; + expire = 604800; + minimum = 10800; # negative cache ttl + adminEmail = "hostmaster@immae.eu"; #email-address s/@/./ + nameServer = "ns1.immae.eu."; + }; + }; + mailSend = { + # DKIM + subdomains._domainkey.subdomains.eldiron.TXT = [ + (toKV config.myEnv.mail.dkim.eldiron.public) + ]; + # old key, may still be used by verifiers + subdomains._domainkey.subdomains.immae_eu.TXT = [ + (toKV config.myEnv.mail.dkim.immae_eu.public) + ]; + }; + mailCommon = name: { + MX = let + mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers; + in + lib.mapAttrsToList (n: v: { preference = v.mx.priority; exchange = "${v.mx.subdomain}.${name}."; }) mxes; + + # https://tools.ietf.org/html/rfc6186 + SRV = [ + { service = "submission"; proto = "tcp"; priority = 0; weight = 1; port = 587; target = "smtp.immae.eu."; } + { service = "submissions"; proto = "tcp"; priority = 0; weight = 1; port = 465; target = "smtp.immae.eu."; } + + { service = "imap"; proto = "tcp"; priority = 0; weight = 1; port = 143; target = "imap.immae.eu."; } + { service = "imaps"; proto = "tcp"; priority = 0; weight = 1; port = 993; target = "imap.immae.eu."; } + { service = "sieve"; proto = "tcp"; priority = 0; weight = 1; port = 4190; target = "imap.immae.eu."; } + + { service = "pop3"; proto = "tcp"; priority = 10; weight = 1; port = 110; target = "pop3.immae.eu."; } + { service = "pop3s"; proto = "tcp"; priority = 10; weight = 1; port = 995; target = "pop3.immae.eu."; } + ]; + + subdomains = { + # MTA-STS + # https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/ + # https://support.google.com/a/answer/9261504 + _mta-sts.TXT = [ (toKV { v = "STSv1"; id = "20200109150200Z"; }) ]; # Don't change this value, it is updated automatically! + _tls.subdomains._smtp.TXT = [ (toKV { v = "TLSRPTv1"; "rua" = "mailto:postmaster+mta-sts@immae.eu"; }) ]; + mta-sts = ips servers.eldiron.ips.main; + + # DMARC + _dmarc.TXT = [ (toKV { v = "DMARC1"; p = "none"; adkim = "r"; aspf = "r"; fo = "1"; rua = "mailto:postmaster+rua@immae.eu"; ruf = "mailto:postmaster+ruf@immae.eu"; }) ]; + }; + + # SPF + TXT = [ (toKV { v = "spf1 mx ~all"; }) ]; + }; + }; + }; + zones = lib.mkOption { + type = lib.types.attrsOf (dns-nix.lib.types.zone.substSubModules ( + dns-nix.lib.types.zone.getSubModules ++ [ + ({ name, ... }: { + options = { + hasEmail = lib.mkEnableOption "This domain has e-mails configuration"; + emailPolicies = lib.mkOption { + default = {}; + type = lib.types.attrsOf (lib.types.submodule { + options = { + receive = lib.mkEnableOption "Configure this domain to receive e-mail"; + }; + }); + apply = builtins.mapAttrs (n: v: v // { + domain = name; + fqdn = if n == "" then name else "${n}.${name}"; + }); + }; + extraConfig = lib.mkOption { + type = lib.types.lines; + description = "Extra zone configuration for bind"; + example = '' + notify yes; + ''; + default = ""; + }; + slaves = lib.mkOption { + type = lib.types.listOf lib.types.str; + description = "NS slave groups of this zone"; + default = []; + }; + ns = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + }; + }; + }) + ])); + apply = let + toNS = n: builtins.map (d: "${d}.") (builtins.concatMap (s: builtins.attrNames config.myEnv.dns.ns."${s}") n); + in + builtins.mapAttrs (n: v: v // { NS = v.NS or [] ++ toNS (v.ns); }); + default = {}; + description = '' + attrset of zones to configure + ''; + }; + }; + config = let + cfg = config.services.bind; + in lib.mkIf config.myServices.dns.enable { + myServices.chatonsProperties.hostings.dns-secondaire = { + file.datetime = "2022-08-22T02:00:00"; + hosting = { + name = "DNS secondaire"; + description = "DNS secondaire"; + website = "ns1.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "bind9"; + website = pkgs.bind.meta.homepage; + license.url = pkgs.bind.meta.license.url; + license.name = pkgs.bind.meta.license.fullName; + version = pkgs.bind.version; + source.url = "https://www.isc.org/download/"; + }; + }; + myServices.dns.zones = with config.myServices.dns.helpers; { + "imsite.eu" = lib.mkMerge [ + zoneHeader + (ips servers.eldiron.ips.main) + { + ns = [ "immae" ]; + CAA = letsencrypt; + } + ]; + "immae.dev" = lib.mkMerge [ + { + extraConfig = '' + notify yes; + ''; + slaves = [ "raito" ]; + } + zoneHeader + (ips servers.eldiron.ips.integration) + { + ns = [ "immae" "raito" ]; + CAA = letsencrypt; + } + ]; + "immae.eu" = lib.mkMerge [ + { + extraConfig = '' + notify yes; + ''; + slaves = [ "raito" ]; + } + zoneHeader + (ips servers.eldiron.ips.production) + { + ns = [ "immae" "raito" ]; + CAA = letsencrypt; + + # ns1 has glue records in gandi.net + subdomains.ns1 = ips servers.eldiron.ips.main; + # raito / kurisu.dual.lahfa.xyz ; replace with eldiron in case of problem + subdomains.ns2.A = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip4; + subdomains.ns2.AAAA = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip6; + } + { + # Machines local users + emailPolicies.localhost.receive = false; + subdomains.localhost = lib.mkMerge [ (mailCommon "immae.eu") mailSend ]; + emailPolicies.eldiron.receive = true; + subdomains.eldiron = lib.mkMerge [ (mailCommon "immae.eu") mailSend ]; + } + { + # For each server "server" and each server ip group "ipgroup", + # define ipgroup.server.immae.eu + # "main" is set as server.immae.eu instead + # if main has an "alias", it is duplicated with this alias. + # If the server is a vm, use the v.immae.eu namespace (only main is created) + subdomains = let + vms = lib.filterAttrs (n: v: v.isVm) servers; + bms = lib.filterAttrs (n: v: !v.isVm) servers; + toIps = type: builtins.mapAttrs (n: v: ips v.ips."${type}"); + in + lib.mkMerge [ + (toIps "main" bms) + + { v.subdomains = toIps "main" vms; } + + (lib.mapAttrs (_: v: { + subdomains = lib.mapAttrs' + (n': v': lib.nameValuePair "${if v'.alias == null then n' else v'.alias}" (ips v')) + (lib.filterAttrs (n': v': n' != "main" || v'.alias != null) v.ips); + }) bms) + ]; + } + { + # Outils + subdomains = { + status = ips servers.monitoring-1.ips.main; + }; + } + ]; + }; + networking.firewall.allowedUDPPorts = [ 53 ]; + networking.firewall.allowedTCPPorts = [ 53 ]; + users.users.named.extraGroups = [ "keys" ]; + services.bind = { + enable = true; + cacheNetworks = ["any"]; + extraOptions = '' + allow-recursion { 127.0.0.1; }; + allow-transfer { none; }; + + notify-source ${lib.head config.myEnv.servers.eldiron.ips.main.ip4}; + notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6}; + version none; + hostname none; + server-id none; + ''; + zones = + builtins.mapAttrs (name: v: { + master = true; + extraConfig = v.extraConfig; + masters = []; + slaves = + lib.flatten (map (n: builtins.attrValues config.myEnv.dns.ns.${n}) v.slaves); + file = pkgs.runCommand "${name}.zone" { + text = v; + passAsFile = [ "text" ]; + # Automatically change the increment when relevant change + # happened (both serial and mta-sts) + } '' + mv "$textPath" $out + increment=$(( 100*($(date -u +%-H) * 60 + $(date -u +%-M))/1440 )) + sed -i -e "s/2022121902/$(date -u +%Y%m%d)$increment/g" $out + sed -i -e "s/20200109150200Z/$(date -u +%Y%m%d%H%M%SZ)/g" $out + ''; + }) config.myServices.dns.zones; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "dns" ]; + myServices.monitoring.fromMasterObjects.service = lib.mkMerge (lib.mapAttrsToList (name: z: + lib.optional (builtins.elem "immae" z.ns) { + service_description = "eldiron dns is active and authoritative for ${name}"; + host_name = config.hostEnv.fqdn; + use = "dns-service"; + check_command = ["check_dns" name "-A"]; + + servicegroups = "webstatus-dns"; + _webstatus_name = name; + } ++ + lib.optional (builtins.elem "raito" z.ns) { + service_description = "raito dns is active and authoritative for ${name}"; + host_name = config.hostEnv.fqdn; + use = "dns-service"; + check_command = ["check_external_dns" "kurisu.dual.lahfa.xyz" name "-A"]; + + servicegroups = "webstatus-dns"; + _webstatus_name = "${name} (Secondary DNS Raito)"; + } + ) config.myServices.dns.zones); + }; +} diff --git a/modules/duply_backup/default.nix b/systems/eldiron/duply_backup.nix similarity index 83% rename from modules/duply_backup/default.nix rename to systems/eldiron/duply_backup.nix index 846b1d4..590d125 100644 --- a/modules/duply_backup/default.nix +++ b/systems/eldiron/duply_backup.nix @@ -120,5 +120,32 @@ in sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh"; }) ]; + + myServices.monitoring.fromMasterActivatedPlugins = [ "eriomem" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "eriomem backup is up and not full"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_backup_eriomem"; + + check_interval = 120; + notification_interval = "1440"; + + servicegroups = "webstatus-backup"; + } + + { + service_description = "ovh backup is up and not full"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_ok"; + + check_interval = 120; + notification_interval = "1440"; + + servicegroups = "webstatus-backup"; + } + ]; }; } diff --git a/modules/private/ejabberd/default.nix b/systems/eldiron/ejabberd/default.nix similarity index 54% rename from modules/private/ejabberd/default.nix rename to systems/eldiron/ejabberd/default.nix index 4d86a64..5268516 100644 --- a/modules/private/ejabberd/default.nix +++ b/systems/eldiron/ejabberd/default.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mypackages-lib, ... }: let cfg = config.myServices.ejabberd; in @@ -14,22 +14,44 @@ in }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.fr" = with config.myServices.dns.helpers; + lib.mkMerge [ + { + extraConfig = '' + notify yes; + ''; + slaves = [ "raito" ]; + emailPolicies."".receive = true; + } + zoneHeader + mailMX + (mailCommon "immae.fr") + (ips servers.eldiron.ips.main) + { + ns = [ "immae" "raito" ]; + CAA = letsencrypt; + subdomains.www = ips servers.eldiron.ips.production; + subdomains.im = ips servers.eldiron.ips.main; + subdomains.conference = ips servers.eldiron.ips.main; + subdomains.pubsub = ips servers.eldiron.ips.main; + subdomains.proxy = ips servers.eldiron.ips.main; + subdomains.upload = ips servers.eldiron.ips.main; + subdomains._xmppconnect.TXT = [ + "_xmpp-client-xbosh=https://im.immae.fr/bosh" + "_xmpp-client-websocket=wss://im.immae.fr/ws" + ]; + } + ]; + security.acme.certs = { - "ejabberd" = config.myServices.certificates.certConfig // { - user = "ejabberd"; + "ejabberd" = { group = "ejabberd"; domain = "eldiron.immae.eu"; keyType = "rsa4096"; postRun = '' systemctl restart ejabberd.service ''; - extraDomains = { - "immae.fr" = null; - "conference.immae.fr" = null; - "proxy.immae.fr" = null; - "pubsub.immae.fr" = null; - "upload.immae.fr" = null; - }; + extraDomainNames = [ "immae.fr" "conference.immae.fr" "proxy.immae.fr" "pubsub.immae.fr" "upload.immae.fr" ]; }; }; networking.firewall.allowedTCPPorts = [ 5222 5269 ]; @@ -88,5 +110,32 @@ in substituteAll ${./ejabberd.yml} $out ''; }; + secrets.keys."postfix/scripts/ejabberd-env" = { + user = "postfixscripts"; + group = "root"; + permissions = "0400"; + text = builtins.toJSON { + jid = "notify_bot@immae.fr"; + password = "{{ .xmpp.notify_bot }}"; + }; + }; + services.postfix.extraAliases = let + nixpkgs = builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz"; + sha256 = "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn"; + }; + pkgs' = import nixpkgs { inherit (pkgs) system; overlays = []; }; + warn_xmpp_email = scriptEnv: pkgs'.runCommand "warn_xmpp_email" { + inherit scriptEnv; + pythonEnv = pkgs'.python3.withPackages (ps: [ + ps.unidecode ps.slixmpp + ]); + } '' + substituteAll ${./warn_xmpp_email.py} $out + chmod a+x $out + ''; + in '' + ejabberd: "|${mypackages-lib.postfixScript pkgs "ejabberd" (warn_xmpp_email config.secrets.fullPaths."postfix/scripts/ejabberd-env")}" + ''; }; } diff --git a/modules/private/ejabberd/ejabberd.yml b/systems/eldiron/ejabberd/ejabberd.yml similarity index 100% rename from modules/private/ejabberd/ejabberd.yml rename to systems/eldiron/ejabberd/ejabberd.yml diff --git a/systems/eldiron/ejabberd/warn_xmpp_email.py b/systems/eldiron/ejabberd/warn_xmpp_email.py new file mode 100755 index 0000000..d482b43 --- /dev/null +++ b/systems/eldiron/ejabberd/warn_xmpp_email.py @@ -0,0 +1,112 @@ +#!@pythonEnv@/bin/python3 + +import sys +import json +import slixmpp +import asyncio +import logging +import io + +CONFIG = json.load(open("@scriptEnv@", "r")) + +def sanitize(string): + import re + from unidecode import unidecode + return re.compile(r"[^-.A-Za-z0-9_]").sub("_", unidecode(string)) + +def parse_email(): + import email + from email.header import decode_header + + mail = email.message_from_file(sys.stdin) + try: + d = decode_header(mail["subject"])[0] + if d[1] is not None: + subject = d[0].decode(d[1]) + else: + subject = d[0] + except Exception as e: + subject = mail["subject"] + sender = mail["from"] + recipient = mail["X-Original-To"] + + body = "" + html = None + files = {} + for part in mail.walk(): + if part.get_content_type() == "text/plain": + body += "\n-------------------\n" + try: + body += part.get_payload(decode=True).decode(encoding=part.get_content_charset() or "utf-8") + except Exception as e: + body += part.get_payload(decode=False) + elif part.get_content_type() == "text/html": + html = part.get_payload(decode=True) + elif part.get_content_type() != "text/html" and\ + part.get_content_maintype() != "multipart": + + filename = part.get_filename() or "{}.dat".format(part["Content-ID"]) + files[sanitize(filename)] = (part.get_content_type(), part.get_payload(decode=True)) + + return [body, html, subject, sender, recipient, files] + +[body, html, subject, sender, recipient, files] = parse_email() + +class Bot(slixmpp.ClientXMPP): + def __init__(self, jid, password, body, html, subject, sender, recipient, files): + super().__init__(jid, password) + + self.got_error = False + self.body = body + self.html = html + self.subject = subject + self.sender = sender + self.recipient = recipient + self.files = files + self.register_plugin('xep_0363') + self.add_event_handler("session_start", self.session_start) + self.add_event_handler("message", self.message) + + @asyncio.coroutine + def session_start(self, event): + files = [] + if self.html is not None: + url = yield from self['xep_0363'].upload_file( + "mail.html", + content_type="text/html", + input_file=io.BytesIO(self.html)) + files.append(("HTML version", url)) + for f in self.files: + url = yield from self['xep_0363'].upload_file( + f, + content_type=self.files[f][0], + input_file=io.BytesIO(self.files[f][1]) + ) + files.append((f, url)) + + text = """ +New e-mail message from {sender} +Subject: {subject} +{body} +""".format(sender=self.sender, subject=self.subject, body=self.body) + if len(files) > 0: + text += "\n\nAttachments:" + for f in files: + text += "\n{}: {}".format(f[0], f[1]) + self.send_message(mto=self.recipient, mbody=text, msubject=self.subject, mtype='message') + yield from asyncio.sleep(5) + self.disconnect() + + @asyncio.coroutine + def message(self, msg): + if msg["type"] == "error": + self.got_error = True + +logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s') +xmpp = Bot(CONFIG["jid"], CONFIG["password"], body, html, subject, sender, recipient, files) +xmpp.connect() +xmpp.process(forever=False) +if xmpp.got_error: + sys.exit(1) +else: + sys.exit(0) diff --git a/systems/eldiron/flake.lock b/systems/eldiron/flake.lock new file mode 100644 index 0000000..99a5c92 --- /dev/null +++ b/systems/eldiron/flake.lock @@ -0,0 +1,2758 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_12", + "nixpkgs": "nixpkgs_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_4" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_16", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_3", + "nixpkgs": "nixpkgs_19", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_4", + "nixpkgs": "nixpkgs_21", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_6", + "nixpkgs": "nixpkgs_29", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_22": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_23": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_24": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_25": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_31": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids", + "nixpkgs": "nixpkgs_7", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "flake-utils": "flake-utils_6", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_9", + "openarc": "openarc_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_4": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "flake-utils": "flake-utils_7", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_9", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_12", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_10", + "myuids": "myuids_6", + "nixpkgs": "nixpkgs_13", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_2", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_3", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib_2", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_3", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_2", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_14", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_5", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports", + "environment": "environment_6", + "mypackages": "mypackages", + "myuids": "myuids_7", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_13", + "nixpkgs": "nixpkgs_17" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_14", + "myuids": "myuids_8", + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_15", + "mypackages": "mypackages_2", + "nixpkgs": "nixpkgs_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_16", + "grocy": "grocy", + "mypackages": "mypackages_3", + "nixpkgs": "nixpkgs_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_17", + "mastodon": "mastodon", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_18", + "mediagoblin": "mediagoblin", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_4", + "myuids": "myuids_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_5", + "nixpkgs": "nixpkgs_25", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_19", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_26", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_20", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_21", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_28", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_22", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_30", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_23", + "nixpkgs": "nixpkgs_31", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib", + "nixpkgs": "nixpkgs_5", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/eldiron/flake.nix b/systems/eldiron/flake.nix new file mode 100644 index 0000000..790b638 --- /dev/null +++ b/systems/eldiron/flake.nix @@ -0,0 +1,90 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + dns-nix.url = "github:kirelagin/dns.nix"; + dns-nix.inputs.nixpkgs.follows = "nixpkgs"; + + my-lib.url = "path:../../flakes/lib"; + + public-etherpad-lite.url = "path:../../flakes/etherpad-lite"; + public-grocy.url = "path:../../flakes/grocy"; + public-openarc.url = "path:../../flakes/openarc"; + public-opendmarc.url = "path:../../flakes/opendmarc"; + public-peertube.url = "path:../../flakes/peertube"; + public-diaspora.url = "path:../../flakes/diaspora"; + public-mastodon.url = "path:../../flakes/mastodon"; + public-mediagoblin.url = "path:../../flakes/mediagoblin"; + public-surfer.url = "path:../../flakes/surfer"; + public-myuids.url = "path:../../flakes/myuids"; + public-copanier.url = "path:../../flakes/copanier"; + public-secrets.url = "path:../../flakes/secrets"; + public-files-watcher.url = "path:../../flakes/files-watcher"; + public-fiche.url = "path:../../flakes/fiche"; + public-mypackages.url = "path:../../flakes/mypackages"; + public-loginctl-linger.url = "path:../../flakes/loginctl-linger"; + public-multi-apache-container.url = "path:../../flakes/multi-apache-container"; + public-taskwarrior-web.url = "path:../../flakes/taskwarrior-web"; + + private-peertube.url = "path:../../flakes/private/peertube"; + private-buildbot.url = "path:../../flakes/private/buildbot"; + private-php.url = "path:../../flakes/private/php"; + private-environment.url = "path:../../flakes/private/environment"; + private-openarc.url = "path:../../flakes/private/openarc"; + private-openldap.url = "path:../../flakes/private/openldap"; + private-opendmarc.url = "path:../../flakes/private/opendmarc"; + private-milters.url = "path:../../flakes/private/milters"; + private-monitoring.url = "path:../../flakes/private/monitoring"; + private-paste.url = "path:../../flakes/private/paste"; + private-ssh.url = "path:../../flakes/private/ssh"; + private-chatons.url = "path:../../flakes/private/chatons"; + private-system.url = "path:../../flakes/private/system"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, dns-nix, ...}: + my-lib.lib.mkColmenaFlake { + name = "eldiron"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "176.9.151.89"; + targetUser = "root"; + nixosModules = with inputs; { + base = ./base.nix; + myuids = public-myuids.nixosModule; + secrets = public-secrets.nixosModule; + loginctl-linger = public-loginctl-linger.nixosModule; + files-watcher = public-files-watcher.nixosModule; + multi-apache-container = public-multi-apache-container.nixosModule; + etherpad-lite = public-etherpad-lite.nixosModule; + mastodon = public-mastodon.nixosModule; + mediagoblin = public-mediagoblin.nixosModule; + peertube = public-peertube.nixosModule; + diaspora = public-diaspora.nixosModule; + fiche = public-fiche.nixosModule; + + environment = private-environment.nixosModule; + openarc = private-openarc.nixosModule; + opendmarc = private-opendmarc.nixosModule; + ssh = private-ssh.nixosModule; + chatons = private-chatons.nixosModule; + system = private-system.nixosModule; + monitoring = private-monitoring.nixosModule; + paste = private-paste.nixosModule; + milters = private-milters.nixosModule; + }; + moduleArgs = with inputs; { + dns-nix = dns-nix; + nixpkgsRaw = nixpkgs.legacyPackages.x86_64-linux; + mypackages-lib = public-mypackages.lib.x86_64-linux; + etherpad-lite = public-etherpad-lite.defaultPackage.x86_64-linux; + taskwarrior-web = public-taskwarrior-web.defaultPackage.x86_64-linux; + copanier = public-copanier.defaultPackage.x86_64-linux; + grocy = public-grocy.defaultPackage.x86_64-linux; + surfer = public-surfer.defaultPackage.x86_64-linux; + mediagoblin = public-mediagoblin.defaultPackage.x86_64-linux; + buildbot = private-buildbot.packages.x86_64-linux.buildbot-full; + openldap = private-openldap; + monitoring = private-monitoring; + peertube = private-peertube.packages.x86_64-linux; + php = private-php; + }; + }; +} diff --git a/modules/private/ftp.nix b/systems/eldiron/ftp.nix similarity index 68% rename from modules/private/ftp.nix rename to systems/eldiron/ftp.nix index cae25c1..6aa1afc 100644 --- a/modules/private/ftp.nix +++ b/systems/eldiron/ftp.nix @@ -30,14 +30,88 @@ in }; config = lib.mkIf config.myServices.ftp.enable { - security.acme.certs."ftp" = config.myServices.certificates.certConfig // { + myServices.dns.zones."immae.eu".subdomains.ftp = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.espace-de-stockage = { + file.datetime = "2022-08-22T01:00:00"; + service = { + name = "Espace de stockage"; + description = "Compte FTP/SFTP"; + logo = if pure-ftpd-enabled + then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png" + else if proftpd-enabled + then "http://proftpd.org/proftpd.png" + else ""; + website = "ftp.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = if pure-ftpd-enabled then { + name = "Pure-ftpd"; + website = "https://www.pureftpd.org/project/pure-ftpd/"; + license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING"; + license.name = "MIT Licence"; + version = package.version; + source.url = "https://github.com/jedisct1/pure-ftpd/"; + modules = "openssh"; + } else if proftpd-enabled then { + name = "ProFTPD"; + website = "http://proftpd.org/"; + license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.proftpd.version; + source.url = "https://github.com/proftpd/proftpd/"; + modules = "openssh"; + } else {}; + }; + #myServices.chatonsProperties.services.ftp = { + # file.datetime = "2022-08-22T01:00:00"; + # service = { + # name = "Comptes FTP"; + # description = "Compte FTP/SFTP"; + # logo = if pure-ftpd-enabled + # then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png" + # else if proftpd-enabled + # then "http://proftpd.org/proftpd.png" + # else ""; + # website = "ftp.immae.eu"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = if pure-ftpd-enabled then { + # name = "Pure-ftpd"; + # website = "https://www.pureftpd.org/project/pure-ftpd/"; + # license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING"; + # license.name = "MIT Licence"; + # version = package.version; + # source.url = "https://github.com/jedisct1/pure-ftpd/"; + # } else if proftpd-enabled then { + # name = "ProFTPD"; + # website = "http://proftpd.org/"; + # license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING"; + # license.name = "GNU General Public License v2.0"; + # version = pkgs.proftpd.version; + # source.url = "https://github.com/proftpd/proftpd/"; + # } else {}; + #}; + security.acme.certs."ftp" = { domain = "eldiron.immae.eu"; + # FIXME: make it global + extraLegoRunFlags = ["--preferred-chain" "ISRG Root X1"]; + extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"]; postRun = (lib.optionalString pure-ftpd-enabled '' systemctl restart pure-ftpd.service '') + (lib.optionalString proftpd-enabled '' systemctl restart proftpd.service ''); - extraDomains = { "ftp.immae.eu" = null; }; + extraDomainNames = [ "ftp.immae.eu" ]; }; networking = { @@ -227,6 +301,7 @@ in SFTPAuthMethods password publickey SFTPOptions IgnoreSFTPSetOwners + AllowChrootSymlinks off ''; in lib.mkIf proftpd-enabled { @@ -243,6 +318,22 @@ in services.cron.systemCronJobs = lib.mkIf proftpd-enabled [ "*/2 * * * * nobody ${./ftp_sync.sh}" ]; + + myServices.monitoring.fromMasterActivatedPlugins = [ "ftp" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "ftp has access to database for authentication"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_ftp_database"; + + servicegroups = "webstatus-remote-services"; + _webstatus_name = "FTP"; + _webstatus_url = "ftp.immae.eu"; + } + + ]; + }; } diff --git a/modules/private/ftp_sync.sh b/systems/eldiron/ftp_sync.sh similarity index 91% rename from modules/private/ftp_sync.sh rename to systems/eldiron/ftp_sync.sh index 8b0d9c5..aff7178 100755 --- a/modules/private/ftp_sync.sh +++ b/systems/eldiron/ftp_sync.sh @@ -4,7 +4,7 @@ LDAPSEARCH=ldapsearch LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu" LDAP_PASS=$(cat /etc/ssh/ldap_password) -LDAP_HOST="ldap.immae.eu" +LDAP_HOST="ldap://ldap.immae.eu" LDAP_BASE="dc=immae,dc=eu" LDAP_FILTER="(memberOf=cn=users,cn=ftp,ou=services,dc=immae,dc=eu)" @@ -43,5 +43,5 @@ $key" $(echo "$key" | cut -d" " -f2-)" fi fi -done < <(ldapsearch -h "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey) +done < <(ldapsearch -H "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey) handle_keys "$uids" "$keys" diff --git a/systems/eldiron/gemini/default.nix b/systems/eldiron/gemini/default.nix new file mode 100644 index 0000000..600afbc --- /dev/null +++ b/systems/eldiron/gemini/default.nix @@ -0,0 +1,50 @@ +{ lib, config, pkgs, ... }: +let + configFile = pkgs.writeText "config.yaml" '' + listen: ":1965" + hosts: + immae.eu: + cert: /var/lib/acme/immae/full.pem + key: /var/lib/acme/immae/key.pem + paths: + - path: / + root: ${./public} + ''; +in +{ + options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule"; + config = lib.mkIf config.myServices.gemini.enable { + security.acme.certs.immae.postRun = '' + systemctl restart gemini.service + ''; + myServices.chatonsProperties.hostings.gemini = { + file.datetime = "2022-08-27T18:00:00"; + hosting = { + name = "Hébergement Gemini"; + description = "Hébergement de capsules Gemini"; + type = "INSTANCE"; + website = "gemini://immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "twins"; + website = "https://code.rocketnine.space/tslocum/twins"; + license.url = "https://code.rocketnine.space/tslocum/twins/src/branch/master/LICENSE"; + license.name = "MIT License"; + version = pkgs.twins.version; + source.url = "https://code.rocketnine.space/tslocum/twins"; + }; + }; + networking.firewall.allowedTCPPorts = [ 1965 ]; + systemd.services.gemini = { + description = "Gemini capsule server"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}"; + serviceConfig.Type = "simple"; + }; + }; +} diff --git a/modules/private/gemini/public/index.gmi b/systems/eldiron/gemini/public/index.gmi similarity index 100% rename from modules/private/gemini/public/index.gmi rename to systems/eldiron/gemini/public/index.gmi diff --git a/systems/eldiron/gitolite/default.nix b/systems/eldiron/gitolite/default.nix new file mode 100644 index 0000000..1885234 --- /dev/null +++ b/systems/eldiron/gitolite/default.nix @@ -0,0 +1,127 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.gitolite; +in { + options.myServices.gitolite = { + enable = lib.mkEnableOption "my gitolite service"; + gitoliteDir = lib.mkOption { + type = lib.types.str; + default = "/var/lib/gitolite"; + }; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.git = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.gitolite = { + file.datetime = "2022-08-21T10:01:00"; + service = { + name = "Gitolite"; + description = "Gitolite allows you to setup git hosting on a central server, with fine-grained access control and many more powerful features."; + website = "https://git.immae.eu"; + logo = "https://git.immae.eu/cgit-css/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/forge-logicielle.html"; + }; + software = { + name = "Gitolite"; + website = "https://gitolite.com/gitolite/"; + license.url = "https://github.com/sitaramc/gitolite/blob/master/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.gitolite.version; + source.url = "https://github.com/sitaramc/gitolite"; + }; + }; + myServices.ssh.modules.gitolite = { + snippet = builtins.readFile ./ldap_gitolite.sh; + dependencies = [ pkgs.gitolite ]; + vars.ldap_group = "cn=users,cn=gitolite,ou=services,dc=immae,dc=eu"; + vars.shell_path = "${pkgs.gitolite}/bin/gitolite-shell"; + vars.services = let + toLine = login: key: ''command="${pkgs.gitolite}/bin/gitolite-shell ${login}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${key}''; + in builtins.concatStringsSep "\n" [ + (toLine "naemon" config.myEnv.monitoring.ssh_public_key) + (toLine "buildbot" config.myEnv.buildbot.ssh_key.public) + ]; + }; + networking.firewall.allowedTCPPorts = [ 9418 ]; + + secrets.keys."gitolite/ldap_password" = { + user = "gitolite"; + group = "gitolite"; + permissions = "0400"; + text = config.myEnv.tools.gitolite.ldap.password; + }; + + services.gitDaemon = { + enable = true; + user = "gitolite"; + group = "gitolite"; + basePath = "${cfg.gitoliteDir}/repositories"; + }; + + system.activationScripts.gitolite = let + deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ]; + gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" { + buildInputs = [ pkgs.makeWrapper ]; + } '' + makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \ + --prefix PATH : ${lib.makeBinPath deps} \ + --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"} + ''; + in { + deps = [ "users" ]; + text = '' + if [ -d ${cfg.gitoliteDir} ]; then + ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh + chmod g+rx ${cfg.gitoliteDir} + fi + if [ -f ${cfg.gitoliteDir}/projects.list ]; then + chmod g+r ${cfg.gitoliteDir}/projects.list + fi + ''; + }; + + users.users.wwwrun.extraGroups = [ "gitolite" ]; + users.users.gitolite.extraGroups = [ "keys" ]; + + users.users.gitolite.packages = let + python-packages = python-packages: with python-packages; [ + simplejson + apprise + sleekxmpp + urllib3 + pyyaml + ]; + in + [ + # For some reason it absolutely wants to include "doc" output + ((pkgs.python39.withPackages python-packages) // { doc = ""; }) + pkgs.nettools + pkgs.findutils + ]; + # Installation: https://git.immae.eu/mantisbt/view.php?id=93 + services.gitolite = { + enable = true; + adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "git" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "gitolite is working"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = "check_git"; + + servicegroups = "webstatus-remote-services"; + _webstatus_name = "Git"; + _webstatus_url = "git.immae.eu"; + } + ]; + }; +} diff --git a/modules/private/gitolite/gitolite_ldap_groups.sh b/systems/eldiron/gitolite/gitolite_ldap_groups.sh similarity index 84% rename from modules/private/gitolite/gitolite_ldap_groups.sh rename to systems/eldiron/gitolite/gitolite_ldap_groups.sh index 3d7117e..ffa2dab 100755 --- a/modules/private/gitolite/gitolite_ldap_groups.sh +++ b/systems/eldiron/gitolite/gitolite_ldap_groups.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash uid_param="$1" -ldap_host="ldap.immae.eu" +ldap_host="ldap://ldap.immae.eu" ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu" ldap_bindpw="$(cat $LDAP_PASS_PATH)" ldap_searchbase="dc=immae,dc=eu" ldap_scope="subtree" -ldap_options="-h ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}" +ldap_options="-H ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}" ldap_filter="(&(memberOf=cn=groups,cn=gitolite,ou=services,dc=immae,dc=eu)(|(member=uid=${uid_param},ou=users,dc=immae,dc=eu)(member=uid=${uid_param},ou=group_users,dc=immae,dc=eu)))" ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2) diff --git a/systems/eldiron/gitolite/ldap_gitolite.sh b/systems/eldiron/gitolite/ldap_gitolite.sh new file mode 100644 index 0000000..75a39bf --- /dev/null +++ b/systems/eldiron/gitolite/ldap_gitolite.sh @@ -0,0 +1,28 @@ +### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh +LDAP_GITOLITE_MEMBER="@gitolite_ldap_group@" +GITOLITE_SHELL="@gitolite_shell_path@" + +if [[ $user == gitolite ]]; then + allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \ + ldap_search '(memberOf='$LDAP_GITOLITE_MEMBER')' '' \ + | grep ^dn \ + | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \ + | paste -sd,) + + psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'git' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do + if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then + # Capitalize first letter (backward compatibility) + user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user") + fi + if [ ! -z "$key" ]; then + if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then + echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ' + echo $key + fi + fi + done +cat <&1) - ret=$? - - if [ "$ret" != "0" ]; then - echo "$mail" \ - | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \ - | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu - - messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:") - repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:") - - ${pkgs.coreutils}/bin/cat <')" ''; - scripts = lib.attrsets.mapAttrs (n: v: - toScript n (pkgs.callPackage (builtins.fetchGit { url = v.src.url; ref = "master"; rev = v.src.rev; }) { scriptEnv = config.secrets.fullPaths."postfix/scripts/${n}-env"; }) - ) config.myEnv.mail.scripts // { - testmail = pkgs.writeScript "testmail" '' - #! ${pkgs.stdenv.shell} - ${pkgs.coreutils}/bin/touch \ - "/var/lib/naemon/checks/email/$(${pkgs.procmail}/bin/formail -x To: | ${pkgs.coreutils}/bin/tr -d ' <>')" - ''; - }; - in builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: ''${n}: "|${v}"'') scripts); + in + ''testmail: "|${testmail}"''; mapFiles = let - recipient_maps = let - name = n: i: "relay_${n}_${toString i}"; - pair = n: i: m: lib.attrsets.nameValuePair (name n i) ( - if m.type == "hash" - then pkgs.writeText (name n i) m.content - else null - ); - pairs = n: v: lib.imap1 (i: m: pair n i m) v.recipient_maps; - in lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.listToAttrs (lib.flatten ( - lib.attrsets.mapAttrsToList pairs config.myEnv.mail.postfix.backup_domains - )) - ); - relay_restrictions = lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.mapAttrs' (n: v: - lib.attrsets.nameValuePair "recipient_access_${n}" ( - if lib.attrsets.hasAttr "relay_restrictions" v - then pkgs.writeText "recipient_access_${n}" v.relay_restrictions - else null - ) - ) config.myEnv.mail.postfix.backup_domains - ); virtual_map = { virtual = let cfg = config.myEnv.monitoring.email_check.eldiron; address = "${cfg.mail_address}@${cfg.mail_domain}"; + aliases = config.myEnv.mail.postfix.common_aliases; + admins = builtins.concatStringsSep "," config.myEnv.mail.postfix.admins; in pkgs.writeText "postfix-virtual" ( builtins.concatStringsSep "\n" ( - ["${address} testmail@localhost"] ++ - lib.attrsets.mapAttrsToList ( - n: v: lib.optionalString v.external '' - script_${n}@mail.immae.eu ${n}@localhost, scripts@mail.immae.eu - '' - ) config.myEnv.mail.scripts - ) - ); + [ "${address} testmail@localhost" + ] ++ + map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases + ++ lib.lists.flatten ( + map (domain: + map (alias: "${alias}@${domain} ${admins}") aliases + ) receiving_domains + ) + )); }; sasl_access = { host_sender_login = with lib.attrsets; let addresses = zipAttrs (lib.flatten (mapAttrsToList (n: v: (map (e: { "${e}" = "${n}@immae.eu"; }) v.emails)) config.myEnv.servers)); + aliases = config.myEnv.mail.postfix.common_aliases; joined = builtins.concatStringsSep ","; + admins = joined config.myEnv.mail.postfix.admins; in pkgs.writeText "host-sender-login" - (builtins.concatStringsSep "\n" (mapAttrsToList (n: v: "${n} ${joined v}") addresses)); + (builtins.concatStringsSep "\n" ( + mapAttrsToList (n: v: "${n} ${joined v}") addresses + ++ lib.lists.flatten ( + map (domain: + map (alias: "${alias}@${domain} ${admins}") aliases + ) receiving_domains + ) + ++ map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases + )); }; in - recipient_maps // relay_restrictions // virtual_map // sasl_access; + virtual_map // sasl_access; config = { ### postfix module overrides readme_directory = "${pkgs.postfix}/share/postfix/doc"; @@ -286,17 +293,7 @@ "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}" "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}" ]; - virtual_mailbox_domains = config.myEnv.mail.postfix.additional_mailbox_domains - ++ lib.remove null (lib.flatten (map - (zone: map - (e: if e.receive - then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}" - else null - ) - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - )); + virtual_mailbox_domains = receiving_domains; virtual_mailbox_maps = [ "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}" ]; @@ -304,17 +301,9 @@ virtual_transport = "dovecot"; ### Relay domains - relay_domains = lib.flatten (lib.attrsets.mapAttrsToList (n: v: v.domains or []) config.myEnv.mail.postfix.backup_domains); - relay_recipient_maps = lib.flatten (lib.attrsets.mapAttrsToList (n: v: - lib.imap1 (i: m: "${m.type}:/etc/postfix/relay_${n}_${toString i}") v.recipient_maps - ) config.myEnv.mail.postfix.backup_domains); smtpd_relay_restrictions = [ "defer_unauth_destination" - ] ++ lib.flatten (lib.attrsets.mapAttrsToList (n: v: - if lib.attrsets.hasAttr "relay_restrictions" v - then [ "check_recipient_access hash:/etc/postfix/recipient_access_${n}" ] - else [] - ) config.myEnv.mail.postfix.backup_domains); + ]; ### Additional smtpd configuration smtpd_tls_received_header = "yes"; @@ -325,18 +314,23 @@ smtp_tls_loglevel = "1"; ### Force ip bind for smtp - smtp_bind_address = config.hostEnv.ips.main.ip4; + smtp_bind_address = builtins.head config.hostEnv.ips.main.ip4; smtp_bind_address6 = builtins.head config.hostEnv.ips.main.ip6; # Use some relays when authorized senders are not myself - smtp_sasl_mechanism_filter = "plain,login"; # GSSAPI Not correctly supported by postfix + smtp_sasl_mechanism_filter = [ + "plain" + "login" + ]; # GSSAPI Not correctly supported by postfix smtp_sasl_auth_enable = "yes"; - smtp_sasl_password_maps = - "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}"; + smtp_sasl_password_maps = [ + "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}" + ]; smtp_sasl_security_options = "noanonymous"; smtp_sender_dependent_authentication = "yes"; - sender_dependent_relayhost_maps = - "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}"; + sender_dependent_relayhost_maps = [ + "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}" + ]; ### opendkim, opendmarc, openarc milters non_smtpd_milters = [ @@ -350,7 +344,10 @@ smtp_use_tls = true; smtpd_use_tls = true; - smtpd_tls_chain_files = builtins.concatStringsSep "," [ "/var/lib/acme/mail/full.pem" "/var/lib/acme/mail-rsa/full.pem" ]; + smtpd_tls_chain_files = [ + "/var/lib/acme/mail/full.pem" + "/var/lib/acme/mail-rsa/full.pem" + ]; maximal_queue_lifetime = "6w"; bounce_queue_lifetime = "6w"; @@ -358,7 +355,8 @@ enable = true; enableSmtp = true; enableSubmission = true; - submissionOptions = { + submissionOptions = config.services.postfix.submissionOptions'; + submissionOptions' = { # Don’t use "long form", only commas (cf # http://www.postfix.org/master.5.html long form is not handled # well by the submission function) @@ -369,19 +367,31 @@ smtpd_sasl_type = "dovecot"; smtpd_sasl_path = "private/auth"; smtpd_reject_unlisted_recipient = "no"; - smtpd_client_restrictions = "permit_sasl_authenticated,reject"; - smtpd_relay_restrictions = "permit_sasl_authenticated,reject"; + smtpd_client_restrictions = [ + "permit_sasl_authenticated" + "reject" + ]; + smtpd_relay_restrictions = [ + "permit_sasl_authenticated" + "reject" + ]; # Refuse to send e-mails with a From that is not handled - smtpd_sender_restrictions = - "reject_sender_login_mismatch,reject_unlisted_sender,permit_sasl_authenticated,reject"; - smtpd_sender_login_maps = builtins.concatStringsSep "," [ + smtpd_sender_restrictions = [ + "reject_sender_login_mismatch" + "reject_unlisted_sender" + "permit_sasl_authenticated,reject" + ]; + smtpd_sender_login_maps = [ "hash:/etc/postfix/host_sender_login" "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_maps"}" "mysql:${config.secrets.fullPaths."postfix/mysql_sender_login_maps"}" ]; - smtpd_recipient_restrictions = "permit_sasl_authenticated,reject"; + smtpd_recipient_restrictions = [ + "permit_sasl_authenticated" + "reject" + ]; milter_macro_daemon_name = "ORIGINATING"; - smtpd_milters = builtins.concatStringsSep "," [ + smtpd_milters = [ # FIXME: put it back when opensmtpd is upgraded and able to # rewrite the from header #"unix:/run/milter_verify_from/verify_from.sock" @@ -415,13 +425,20 @@ # here. rspamc_dovecot = pkgs.writeScriptBin "rspamc_dovecot" '' #! ${pkgs.stdenv.shell} + set -o pipefail sender="$1" original_recipient="$2" user="$3" ${pkgs.coreutils}/bin/cat - | \ - (${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime || true) | \ + ${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime | \ ${pkgs.dovecot}/libexec/dovecot/dovecot-lda -f "$sender" -a "$original_recipient" -d "$user" + if echo ''${PIPESTATUS[@]} | ${pkgs.gnugrep}/bin/grep -qE '^[0 ]+$'; then + exit 0 + else + # src/global/sys_exits.h to retry + exit 75 + fi ''; in [ "flags=ODRhu" "user=vhost:vhost" @@ -434,17 +451,13 @@ postRun = '' systemctl restart postfix.service ''; - extraDomains = { - "smtp.immae.eu" = null; - }; + extraDomainNames = [ "smtp.immae.eu" ]; }; security.acme.certs."mail-rsa" = { postRun = '' systemctl restart postfix.service ''; - extraDomains = { - "smtp.immae.eu" = null; - }; + extraDomainNames = [ "smtp.immae.eu" ]; }; system.activationScripts.testmail = { deps = [ "users" ]; @@ -467,5 +480,18 @@ ''; }; systemd.services.postfix.serviceConfig.Slice = "mail.slice"; + + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "postfix SSL is up to date"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_smtp"; + + servicegroups = "webstatus-ssl"; + _webstatus_name = "SMTP"; + _webstatus_url = "smtp.immae.eu"; + } + ]; }; } diff --git a/modules/private/mail/rspamd.nix b/systems/eldiron/mail/rspamd.nix similarity index 97% rename from modules/private/mail/rspamd.nix rename to systems/eldiron/mail/rspamd.nix index 05f1300..a300cc5 100644 --- a/modules/private/mail/rspamd.nix +++ b/systems/eldiron/mail/rspamd.nix @@ -26,6 +26,7 @@ [ "*/20 * * * * vhost ${cron_script}/scan_reported_mails" ]; systemd.services.rspamd.serviceConfig.Slice = "mail.slice"; + systemd.services.rspamd.serviceConfig.SupplementaryGroups = [ "vhost" ]; services.rspamd = { enable = true; debug = false; diff --git a/modules/private/mail/scan_reported_mails b/systems/eldiron/mail/scan_reported_mails similarity index 100% rename from modules/private/mail/scan_reported_mails rename to systems/eldiron/mail/scan_reported_mails diff --git a/modules/private/mail/sieve_bin/imapsieve_copy b/systems/eldiron/mail/sieve_bin/imapsieve_copy similarity index 100% rename from modules/private/mail/sieve_bin/imapsieve_copy rename to systems/eldiron/mail/sieve_bin/imapsieve_copy diff --git a/modules/private/mail/sieve_scripts/backup.sieve b/systems/eldiron/mail/sieve_scripts/backup.sieve similarity index 100% rename from modules/private/mail/sieve_scripts/backup.sieve rename to systems/eldiron/mail/sieve_scripts/backup.sieve diff --git a/modules/private/mail/sieve_scripts/report_ham.sieve b/systems/eldiron/mail/sieve_scripts/report_ham.sieve similarity index 100% rename from modules/private/mail/sieve_scripts/report_ham.sieve rename to systems/eldiron/mail/sieve_scripts/report_ham.sieve diff --git a/modules/private/mail/sieve_scripts/report_spam.sieve b/systems/eldiron/mail/sieve_scripts/report_spam.sieve similarity index 100% rename from modules/private/mail/sieve_scripts/report_spam.sieve rename to systems/eldiron/mail/sieve_scripts/report_spam.sieve diff --git a/modules/private/mail/sympa.nix b/systems/eldiron/mail/sympa.nix similarity index 84% rename from modules/private/mail/sympa.nix rename to systems/eldiron/mail/sympa.nix index 0626ac0..8e801dd 100644 --- a/modules/private/mail/sympa.nix +++ b/systems/eldiron/mail/sympa.nix @@ -5,13 +5,43 @@ let in { config = lib.mkIf config.myServices.mail.enable { + myServices.dns.zones."immae.eu".emailPolicies."lists".receive = true; + myServices.dns.zones."immae.eu".subdomains.lists = + with config.myServices.dns.helpers; lib.mkMerge [ + (ips servers.eldiron.ips.main) + (mailCommon "immae.eu") + mailSend + ]; + + myServices.chatonsProperties.services.sympa = { + file.datetime = "2022-08-22T00:50:00"; + service = { + name = "Sympa"; + description = "Mailing lists service"; + website = "https://mail.immae.eu/sympa"; + logo = "https://mail.immae.eu/static-sympa/icons/favicon_sympa.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Sympa"; + website = "https://www.sympa.org/"; + license.url = "https://github.com/sympa-community/sympa/blob/sympa-6.2/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.sympa.version; + source.url = "https://github.com/sympa-community/sympa/"; + }; + }; myServices.databases.postgresql.authorizedHosts = { backup-2 = [ { username = "sympa"; database = "sympa"; - ip4 = [config.myEnv.servers.backup-2.ips.main.ip4]; - ip6 = config.myEnv.servers.backup-2.ips.main.ip6; + ip4 = config.myEnv.servers.backup-2.ips.main.ip4; + ip6 = map (v: "${v}/128") config.myEnv.servers.backup-2.ips.main.ip6; } ]; }; @@ -105,9 +135,6 @@ in sympa_virtual = pkgs.writeText "virtual.sympa" '' sympa-request@${domain} postmaster@immae.eu sympa-owner@${domain} postmaster@immae.eu - - sympa-request@cip-ca.fr postmaster@immae.eu - sympa-owner@cip-ca.fr postmaster@immae.eu ''; sympa_transport = pkgs.writeText "transport.sympa" '' ${domain} error:User unknown in recipient table @@ -115,11 +142,6 @@ in listmaster@${domain} sympa:listmaster@${domain} bounce@${domain} sympabounce:sympa@${domain} abuse-feedback-report@${domain} sympabounce:sympa@${domain} - - sympa@cip-ca.fr sympa:sympa@cip-ca.fr - listmaster@cip-ca.fr sympa:listmaster@cip-ca.fr - bounce@cip-ca.fr sympabounce:sympa@cip-ca.fr - abuse-feedback-report@cip-ca.fr sympabounce:sympa@cip-ca.fr ''; }; config = { @@ -172,10 +194,6 @@ in webHost = "mail.immae.eu"; webLocation = "/sympa"; }; - "cip-ca.fr" = { - webHost = "mail.cip-ca.fr"; - webLocation = "/sympa"; - }; }; database = { @@ -191,6 +209,7 @@ in log_smtp = "on"; sendmail_aliases = "/var/lib/sympa/sympa_transport"; aliases_program = "${pkgs.postfix}/bin/postmap"; + create_list = "listmaster"; }; settingsFile = { "virtual.sympa".enable = false; diff --git a/systems/eldiron/monitoring.nix b/systems/eldiron/monitoring.nix new file mode 100644 index 0000000..2aa7f8f --- /dev/null +++ b/systems/eldiron/monitoring.nix @@ -0,0 +1,51 @@ +{ config, pkgs, lib, name, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "mdadm" "postfix" "postgresql" "zfs" "notify-secondary"]; + config.myServices.monitoring.pluginsArgs.postgresql.package = config.myServices.databases.postgresql.package; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = false; + processWarn = "550"; processAlert = "650"; + loadWarn = "1.0"; loadAlert = "1.2"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + { + service_description = "No mdadm array is degraded"; + use = "local-service"; + check_command = ["check_mdadm"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "Postgresql replication for backup-2 is up to date"; + use = "local-service"; + check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "No ZFS pool is degraded"; + use = "local-service"; + check_command = ["check_zfs"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "mailq is empty"; + use = "local-service"; + check_command = ["check_mailq"]; + __passive_servicegroups = "webstatus-email"; + } + (emailCheck "eldiron" hostFQDN // { + __passive_servicegroups = "webstatus-email"; + }) + ]; + } + ]; +} diff --git a/modules/private/mpd.nix b/systems/eldiron/mpd.nix similarity index 100% rename from modules/private/mpd.nix rename to systems/eldiron/mpd.nix diff --git a/systems/eldiron/pub/default.nix b/systems/eldiron/pub/default.nix new file mode 100644 index 0000000..ca8122a --- /dev/null +++ b/systems/eldiron/pub/default.nix @@ -0,0 +1,100 @@ +{ lib, pkgs, config, ... }: +let + restrict = pkgs.runCommand "restrict" { + file = ./restrict; + buildInputs = [ pkgs.makeWrapper ]; + } '' + mkdir -p $out/bin + cp $file $out/bin/restrict + chmod a+x $out/bin/restrict + patchShebangs $out/bin/restrict + wrapProgram $out/bin/restrict \ + --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \ + --set TMUX_RESTRICT ${./tmux.restrict.conf} + ''; +in +{ + options = { + myServices.pub.enable = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to enable pub user. + ''; + }; + myServices.pub.usersProfiles = lib.mkOption { + type = lib.types.attrsOf (lib.types.listOf lib.types.package); + default = {}; + description = '' + specific user profile + ''; + }; + myServices.pub.restrictCommand = lib.mkOption { + type = lib.types.path; + readOnly = true; + default = "${restrict}/bin/restrict"; + description = '' + path to the restrict shell + ''; + }; + }; + + config = lib.mkIf config.myServices.pub.enable { + myServices.dns.zones."immae.eu".subdomains.pub = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.vm-like = { + file.datetime = "2022-08-22T01:00:00"; + service = { + name = "Comptes shell"; + description = "Compte shell cloisonné"; + logo = "https://www.openssh.com/favicon.ico"; + website = "pub.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Openssh"; + website = "https://www.openssh.com/"; + license.url = "https://github.com/openssh/openssh-portable/blob/master/LICENCE"; + license.name = "BSD Licence"; + version = pkgs.openssh.version; + source.url = "https://github.com/openssh/openssh-portable"; + }; + }; + myServices.ssh.modules.pub = { + snippet = builtins.readFile ./ldap_pub.sh; + dependencies = [ pkgs.coreutils ]; + vars.ldap_forward_group = "cn=forward,cn=pub,ou=services,dc=immae,dc=eu"; + vars.ldap_pub_group = "cn=restrict,cn=pub,ou=services,dc=immae,dc=eu"; + vars.echo_command = "${pkgs.coreutils}/bin/echo"; + vars.restrict_command = "${restrict}/bin/restrict"; + }; + + system.extraSystemBuilderCmds = let + toPath = u: paths: pkgs.buildEnv { + name = "${u}-profile"; + inherit paths; + }; + in '' + mkdir -p $out/pub + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (u: m: "ln -s ${toPath u m} $out/pub/${u}") config.myServices.pub.usersProfiles)} + ''; + users.users.pub = let + in { + createHome = true; + description = "Restricted shell user"; + home = "/var/lib/pub"; + uid = config.myEnv.users.pub.uid; + isNormalUser = true; + group = "nogroup"; + useDefaultShell = true; + packages = [ + pkgs.tmux + ]; + }; + }; +} diff --git a/systems/eldiron/pub/ldap_pub.sh b/systems/eldiron/pub/ldap_pub.sh new file mode 100644 index 0000000..9f03ffe --- /dev/null +++ b/systems/eldiron/pub/ldap_pub.sh @@ -0,0 +1,38 @@ +### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh +LDAP_PUB_RESTRICT_MEMBER="@pub_ldap_pub_group@" +LDAP_PUB_FORWARD_MEMBER="@pub_ldap_forward_group@" +ECHO="@pub_echo_command@" + +if [[ $user == pub ]]; then + allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \ + ldap_search '(memberOf='$LDAP_PUB_RESTRICT_MEMBER')' '' \ + | grep ^dn \ + | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \ + | paste -sd,) + + allowed_forwards=$(LDAP_BASE=$USER_LDAP_BASE \ + ldap_search '(memberOf='$LDAP_PUB_FORWARD_MEMBER')' '' \ + | grep ^dn \ + | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \ + | paste -sd,) + + psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'pub' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do + if [ ! -z "$key" ]; then + if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then + echo -n 'command="@pub_restrict_command@ '$user'" ' + echo $key + fi + fi + done + + psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'forward' = ANY(usage) AND login IN ($allowed_logins,$allowed_forwards);" | while IFS='|' read user key; do + if [ ! -z "$key" ]; then + if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then + echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" ' + echo $key + fi + fi + done + exit 0 +fi + diff --git a/modules/private/pub/restrict b/systems/eldiron/pub/restrict similarity index 82% rename from modules/private/pub/restrict rename to systems/eldiron/pub/restrict index b2f3be3..698e394 100644 --- a/modules/private/pub/restrict +++ b/systems/eldiron/pub/restrict @@ -24,6 +24,13 @@ rsync*) | while read i; do printf '%s--ro-bind\0'$i'\0'$i'\0' '' done + if [ -e "/run/current-system/pub/$user" ]; then + nix-store -q -R "/run/current-system/pub/$user" \ + | while read i; do + printf '%s--ro-bind\0'$i'\0'$i'\0' '' + done + printf '%s--ro-bind\0/run/current-system/pub/'$user'/bin\0/bin-pub-'$user'\0' '' + fi } set -euo pipefail @@ -52,12 +59,12 @@ rsync*) --setenv LOCALE_ARCHIVE "/etc/locale-archive" \ --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \ --setenv PS1 "$user@pub $ " \ - --setenv PATH "/bin:/bin-pub" \ + --setenv PATH "/bin-pub-$user:/bin:/bin-pub" \ --setenv HOME "/var/lib/pub" \ --file 11 /etc/passwd \ --file 12 /etc/group \ -- $orig) \ - 10< <(nix_store_paths) \ + 10< <(nix_store_paths | sort | uniq) \ 11< <(getent passwd $UID 65534) \ 12< <(getent group $(id -g) 65534) ;; diff --git a/modules/private/pub/tmux.restrict.conf b/systems/eldiron/pub/tmux.restrict.conf similarity index 100% rename from modules/private/pub/tmux.restrict.conf rename to systems/eldiron/pub/tmux.restrict.conf diff --git a/modules/private/tasks/default.nix b/systems/eldiron/tasks/default.nix similarity index 88% rename from modules/private/tasks/default.nix rename to systems/eldiron/tasks/default.nix index 6480255..0772a5f 100644 --- a/modules/private/tasks/default.nix +++ b/systems/eldiron/tasks/default.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, taskwarrior-web, ... }: let cfg = config.myServices.tasks; server_vardir = config.services.taskserver.dataDir; @@ -40,7 +40,6 @@ let chmod a+x $out/bin/taskserver-user-certs patchShebangs $out/bin/taskserver-user-certs ''; - taskwarrior-web = pkgs.webapps.taskwarrior-web; socketsDir = "/run/taskwarrior-web"; varDir = "/var/lib/taskwarrior-web"; taskwebPages = let @@ -86,6 +85,31 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.task = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.taskwarrior = { + file.datetime = "2022-08-22T00:00:00"; + service = { + name = "Taskwarrior"; + description = "Taskwarrior is Free and Open Source Software that manages your TODO list from the command line. Web interface and synchronization server"; + website = "https://task.immae.eu/"; + logo = "https://taskwarrior.org/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Taskwarrior"; + website = "https://taskwarrior.org/"; + license.url = "https://github.com/GothenburgBitFactory/taskwarrior/blob/develop/LICENSE"; + license.name = "MIT License"; + version = taskwarrior-web.version; + source.url = "https://taskwarrior.org/download/"; + }; + }; secrets.keys = { "webapps/tools-taskwarrior-web" = { user = "wwwrun"; @@ -101,19 +125,11 @@ in { SetEnv TASKD_LDAP_FILTER "${env.ldap.filter}" ''; }; - } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" { - inherit user group; - permissions = "0400"; - text = let + } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" ( + let credentials = "${userConfig.org}/${name}/${userConfig.key}"; dateFormat = userConfig.date; - in '' - data.location=${varDir}/${name} - taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem - taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem - # IdenTrust DST Root CA X3 - # obtained here: https://letsencrypt.org/fr/certificates/ - taskd.ca=${pkgs.writeText "ca.cert" '' + cacert = pkgs.writeText "ca.cert" '' -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh @@ -144,17 +160,28 @@ in { 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= - -----END CERTIFICATE-----''} + -----END CERTIFICATE-----''; + in { + inherit user group; + permissions = "0400"; + text = '' + data.location=${varDir}/${name} + taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem + taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem + # IdenTrust DST Root CA X3 + # obtained here: https://letsencrypt.org/fr/certificates/ + taskd.ca=${cacert} taskd.server=${fqdn}:${toString config.services.taskserver.listenPort} taskd.credentials=${credentials} dateformat=${dateFormat} ''; - }) env.taskwarrior-web); + keyDependencies = [ cacert ]; + })) env.taskwarrior-web); + security.acme.certs.eldiron.extraDomainNames = [ "task.immae.eu" ]; services.websites.env.tools.watchPaths = [ config.secrets.fullPaths."webapps/tools-taskwarrior-web" ]; services.websites.env.tools.modules = [ "proxy_fcgi" "sed" ]; services.websites.env.tools.vhostConfs.task = { certName = "eldiron"; - addToCerts = true; hosts = [ "task.immae.eu" ]; root = ./www; extraConfig = [ '' @@ -225,17 +252,19 @@ in { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "TaskPHPSESSID"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Task:'"; "php_admin_value[open_basedir]" = "${./www}:/tmp:${server_vardir}:/etc/profiles/per-user/${user}/bin/"; }; phpEnv = { PATH = "/etc/profiles/per-user/${user}/bin"; }; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); }; }; - security.acme.certs."task" = config.myServices.certificates.certConfig // { - inherit user group; + security.acme.certs."task" = { + inherit group; domain = fqdn; postRun = '' systemctl restart taskserver.service diff --git a/modules/private/tasks/www/index.php b/systems/eldiron/tasks/www/index.php similarity index 100% rename from modules/private/tasks/www/index.php rename to systems/eldiron/tasks/www/index.php index 49ccd24..bde773d 100644 --- a/modules/private/tasks/www/index.php +++ b/systems/eldiron/tasks/www/index.php @@ -142,6 +142,7 @@ configuration files, and add that to your Taskwarrior configuration: taskd.certificate=/path/to/.cert.pem taskd.key=/path/to/.key.pem taskd.server= +taskd.ca=/path/to/ca.cert.pem 1) { echo "# Chose one of them\n"; foreach($entries as $entry) { @@ -151,7 +152,6 @@ taskd.server= } else { ?> taskd.credentials=// -taskd.ca=/path/to/ca.cert.pem For Mirakel, download and import the file:
    diff --git a/modules/private/vpn/default.nix b/systems/eldiron/vpn/default.nix similarity index 61% rename from modules/private/vpn/default.nix rename to systems/eldiron/vpn/default.nix index d4b197d..df56249 100644 --- a/modules/private/vpn/default.nix +++ b/systems/eldiron/vpn/default.nix @@ -8,6 +8,33 @@ in }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.vpn = with config.myServices.dns.helpers; + ips servers.eldiron.ips.main // { + subdomains.gw.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}:0:ffff:1" ]; + # Fake address to designate the subnet + subdomains.sn.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}::" ]; + }; + myServices.chatonsProperties.hostings.vpn = { + file.datetime = "2022-08-27T18:00:00"; + hosting = { + name = "VPN"; + description = "VPN"; + website = "https://vpn.immae.eu"; + logo = "https://tinc-vpn.org/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration.load = "FULL"; + install.type = "PACKAGE"; + }; + software = { + name = "tinc"; + website = "https://tinc-vpn.org/"; + license.url = "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html"; + license.name = "GNU General Public License v2.0"; + version = pkgs.tinc.version; + source.url = "https://tinc-vpn.org/git/browse?p=tinc"; + }; + }; secrets.keys = { "tinc/key.priv" = { user = "root"; @@ -52,7 +79,7 @@ in description = "Tinc Daemon - Immae"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; - path = [ pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ]; + path = [ pkgs.getent pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ]; serviceConfig = { Slice = "tinc.slice"; Type = "simple"; diff --git a/modules/private/vpn/tinc/host-down b/systems/eldiron/vpn/tinc/host-down similarity index 100% rename from modules/private/vpn/tinc/host-down rename to systems/eldiron/vpn/tinc/host-down diff --git a/modules/private/vpn/tinc/host-up b/systems/eldiron/vpn/tinc/host-up similarity index 100% rename from modules/private/vpn/tinc/host-up rename to systems/eldiron/vpn/tinc/host-up diff --git a/modules/private/vpn/tinc/tinc-down b/systems/eldiron/vpn/tinc/tinc-down similarity index 100% rename from modules/private/vpn/tinc/tinc-down rename to systems/eldiron/vpn/tinc/tinc-down diff --git a/modules/private/vpn/tinc/tinc-up b/systems/eldiron/vpn/tinc/tinc-up similarity index 100% rename from modules/private/vpn/tinc/tinc-up rename to systems/eldiron/vpn/tinc/tinc-up diff --git a/modules/private/vpn/tinc/tinc.conf b/systems/eldiron/vpn/tinc/tinc.conf similarity index 100% rename from modules/private/vpn/tinc/tinc.conf rename to systems/eldiron/vpn/tinc/tinc.conf diff --git a/modules/private/websites/_www/googleb6d69446ff4ca3e5.html b/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html similarity index 100% rename from modules/private/websites/_www/googleb6d69446ff4ca3e5.html rename to systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html diff --git a/modules/private/websites/_www/index.htm b/systems/eldiron/websites/_www/index.htm similarity index 100% rename from modules/private/websites/_www/index.htm rename to systems/eldiron/websites/_www/index.htm diff --git a/modules/private/websites/_www/maintenance_immae.html b/systems/eldiron/websites/_www/maintenance_immae.html similarity index 100% rename from modules/private/websites/_www/maintenance_immae.html rename to systems/eldiron/websites/_www/maintenance_immae.html diff --git a/modules/private/websites/_www/nossl.html b/systems/eldiron/websites/_www/nossl.html similarity index 100% rename from modules/private/websites/_www/nossl.html rename to systems/eldiron/websites/_www/nossl.html diff --git a/systems/eldiron/websites/assets/default.nix b/systems/eldiron/websites/assets/default.nix new file mode 100644 index 0000000..02a4952 --- /dev/null +++ b/systems/eldiron/websites/assets/default.nix @@ -0,0 +1,98 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.websites.tools.assets; + fetchFont = v: pkgs.runCommand "fetch-font" { + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = v.sha256; + } '' + mkdir -p $out + ${pkgs.curl}/bin/curl -k --output $out/font.css -H "User-Agent: Firefox/100.0" "${v.url}" + cat $out/font.css | grep -o "https://[^ )]*" | while read url; do + filename=$(echo "$url" | sed -e "s@.*/@@g") + ${pkgs.curl}/bin/curl -k --output "$out/$filename" "$url" + sed -i -e "s@$url@./$filename@" "$out/font.css" + done + ''; + fetchTgz = v: pkgs.runCommand "fetch-tgz" { + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = v.sha256; + } '' + mkdir -p $out + cd $out + ${pkgs.curl}/bin/curl -L -k "${v.url}" | tar -xz --strip-components=${builtins.toString v.tgzRemoveComponents} + ''; + fetchAsset = v: + if v.assetType == "googleFont" + then fetchFont v + else if v.assetType == "tgz" + then fetchTgz v + else pkgs.fetchurl { url = v.url; sha256 = v.sha256; }; + assets_urls = lib.mapAttrs (k: fetchAsset) config.myEnv.tools.assets; + assets = pkgs.runCommand "assets" {} ('' + mkdir -p $out + cp -a ${./static}/* $out/ + '' + builtins.concatStringsSep "\n" + (lib.mapAttrsToList (k: v: '' + if [ -d "${v}" ]; then + mkdir -p "$out/$(dirname "${k}")" + cp -a "${v}" "$out/${k}" + chmod -R u+rwX "$out/${k}" + else + install -D -m644 -T "${v}" "$out/${k}" + fi + '') assets_urls)); +in +{ + options.myServices.websites.tools.assets = { + enable = lib.mkEnableOption "Enable assets website"; + }; + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.assets = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + services.websites.env.production.bindMounts."/run/imgproxy" = {}; + security.acme.certs.eldiron.extraDomainNames = [ "assets.immae.eu" ]; + services.websites.env.tools.vhostConfs.assets = { + certName = "eldiron"; + hosts = [ "assets.immae.eu" ]; + root = assets; + extraConfig = [ + '' + Use Apaxy "${assets}" "title" + + Options Indexes FollowSymlinks + AllowOverride None + Require all granted + Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT" + Header always set Cache-Control "public, max-age=31536000, immutable" + Header always set Access-Control-Allow-Origin "*" + Header always set Access-Control-Expose-Headers "*" + + + MergeSlashes OFF + + ProxyPass unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu + ProxyPassReverse unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu + + '' + ]; + }; + systemd.services.imgproxy = { + description = "IMG proxy"; + wantedBy = [ "multi-user.target" ]; + + environment = { + IMGPROXY_NETWORK = "unix"; + IMGPROXY_BIND = "%t/imgproxy/imgproxy.sock"; + }; + serviceConfig = { + User = "wwwrun"; + Group = "wwwrun"; + RuntimeDirectory = "imgproxy"; + ExecStart = "${pkgs.imgproxy}/bin/imgproxy"; + }; + }; + }; +} diff --git a/modules/private/websites/tools/assets/static/favicon.png b/systems/eldiron/websites/assets/static/favicon.png similarity index 100% rename from modules/private/websites/tools/assets/static/favicon.png rename to systems/eldiron/websites/assets/static/favicon.png diff --git a/modules/private/websites/tools/assets/static/logger.png b/systems/eldiron/websites/assets/static/logger.png similarity index 100% rename from modules/private/websites/tools/assets/static/logger.png rename to systems/eldiron/websites/assets/static/logger.png diff --git a/modules/private/websites/tools/assets/static/logger.txt b/systems/eldiron/websites/assets/static/logger.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logger.txt rename to systems/eldiron/websites/assets/static/logger.txt diff --git a/modules/private/websites/tools/assets/static/logo.jpg b/systems/eldiron/websites/assets/static/logo.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/logo.jpg rename to systems/eldiron/websites/assets/static/logo.jpg diff --git a/modules/private/websites/tools/assets/static/logo.txt b/systems/eldiron/websites/assets/static/logo.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logo.txt rename to systems/eldiron/websites/assets/static/logo.txt diff --git a/modules/private/websites/tools/assets/static/logo_big.jpg b/systems/eldiron/websites/assets/static/logo_big.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/logo_big.jpg rename to systems/eldiron/websites/assets/static/logo_big.jpg diff --git a/modules/private/websites/tools/assets/static/logo_big.txt b/systems/eldiron/websites/assets/static/logo_big.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logo_big.txt rename to systems/eldiron/websites/assets/static/logo_big.txt diff --git a/modules/private/websites/tools/assets/static/logo_center.jpg b/systems/eldiron/websites/assets/static/logo_center.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/logo_center.jpg rename to systems/eldiron/websites/assets/static/logo_center.jpg diff --git a/modules/private/websites/tools/assets/static/logo_center.txt b/systems/eldiron/websites/assets/static/logo_center.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logo_center.txt rename to systems/eldiron/websites/assets/static/logo_center.txt diff --git a/modules/private/websites/tools/assets/static/monitoring.png b/systems/eldiron/websites/assets/static/monitoring.png similarity index 100% rename from modules/private/websites/tools/assets/static/monitoring.png rename to systems/eldiron/websites/assets/static/monitoring.png diff --git a/modules/private/websites/tools/assets/static/monitoring.txt b/systems/eldiron/websites/assets/static/monitoring.txt similarity index 100% rename from modules/private/websites/tools/assets/static/monitoring.txt rename to systems/eldiron/websites/assets/static/monitoring.txt diff --git a/modules/private/websites/tools/assets/static/photos/ct.jpg b/systems/eldiron/websites/assets/static/photos/ct.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/photos/ct.jpg rename to systems/eldiron/websites/assets/static/photos/ct.jpg diff --git a/modules/private/websites/tools/assets/static/photos/fretlink.jpg b/systems/eldiron/websites/assets/static/photos/fretlink.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/photos/fretlink.jpg rename to systems/eldiron/websites/assets/static/photos/fretlink.jpg diff --git a/modules/private/websites/tools/assets/static/photos/raton.jpg b/systems/eldiron/websites/assets/static/photos/raton.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/photos/raton.jpg rename to systems/eldiron/websites/assets/static/photos/raton.jpg diff --git a/systems/eldiron/websites/cloud/add-htaccess.php b/systems/eldiron/websites/cloud/add-htaccess.php new file mode 100644 index 0000000..e11d943 --- /dev/null +++ b/systems/eldiron/websites/cloud/add-htaccess.php @@ -0,0 +1,70 @@ +a = $a; + } + public function getValue($val, $default) { + if(isset($this->a[$val])) { + return $this->a[$val]; + } else { + return $default; + } + } + } +} + +namespace { + class NServer { + private $argv; + public function __construct($argv) { + $this->argv = $argv; + } + public function getSystemConfig() { + return new OC\SystemConfig(Array( + 'htaccess.RewriteBase' => $this->argv[1], + )); + } + + public function get($c) { + return new $c(); + } + public function getL10N() { + return new \OCP\IL10N(); + } + public function query($c) { + return new $c(); + } + public function getSecureRandom() { + return new \OCP\Security\ISecureRandom(); + } + } + + class OC { + public static Bool $CLI = false; + public static $SERVERROOT = '.'; + public static $WEBROOT; + public static \NServer $server; + } + + \OC::$server = new NServer($argv); + \OC::$WEBROOT = $argv[1]; + + require "./lib/private/Setup.php"; + $result = \OC\Setup::updateHtaccess(); + if ($result) { + echo "done"; + }; +} diff --git a/systems/eldiron/websites/cloud/default.nix b/systems/eldiron/websites/cloud/default.nix new file mode 100644 index 0000000..e1df883 --- /dev/null +++ b/systems/eldiron/websites/cloud/default.nix @@ -0,0 +1,151 @@ +{ lib, pkgs, config, ... }: +let + ncfg = config.myServices.tools.cloud.farm.instances.immae; + env = config.myEnv.tools.nextcloud; + cfg = config.myServices.websites.tools.cloud; +in { + options.myServices.websites.tools.cloud = { + enable = lib.mkEnableOption "enable cloud website"; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.cloud = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.nextcloud = { + file.datetime = "2022-08-21T19:50:00"; + hosting = { + name = "Nextcloud"; + description = "The self-hosted productivity platform that keeps you in control"; + website = "https://cloud.immae.eu/"; + logo = "https://cloud.immae.eu/core/img/favicon.ico"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.nextcloud = { + file.datetime = "2022-08-21T19:50:00"; + service = { + name = "Nextcloud"; + description = "The self-hosted productivity platform that keeps you in control"; + website = "https://cloud.immae.eu/"; + logo = "https://cloud.immae.eu/core/img/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/nextcloud.html"; + }; + software = { + name = "Nextcloud"; + website = "https://nextcloud.com/"; + license.url = "https://github.com/nextcloud/server/blob/master/COPYING"; + license.name = "GNU Affero General Public License v3.0"; + version = ncfg.rootDir.version; + source.url = "https://github.com/nextcloud/server"; + modules = map (a: a.appName) ncfg.rootDir.apps; + }; + }; + + myServices.tools.cloud.farm.instances.immae = { + nextcloud = pkgs.webapps-nextcloud_27.override ({ + # Allow /index.php redirects + postInstall = '' + cd $out + ${pkgs.php81}/bin/php ${./add-htaccess.php} / + ''; + }); + apps = a: [ + a.side_menu a.audioplayer a.bookmarks a.calendar a.carnet a.contacts + a.cookbook a.deck a.extract a.files_markdown a.files_mindmap + a.gpxpod a.keeweb a.maps a.metadata a.music + a.notes a.passman a.polls a.spreed a.tasks + ]; + varDir = "/var/lib/nextcloud"; + secretsPath = "webapps/tools-nextcloud"; + phpPackage = pkgs.php81; + # Be careful when editing that: config from here takes + # precedence over the regular one, but if a key got removed, it my + # still exist in the default config file + config = let + env = config.myEnv.tools.nextcloud; + in { + "dbtype" = "pgsql"; + "dbname" = env.postgresql.database; + "dbhost" = env.postgresql.socket; + "dbport" = ""; + "dbtableprefix" = "oc_"; + "dbuser" = env.postgresql.user; + "dbpassword" = env.postgresql.password; + + "instanceid" = env.instance_id; + "passwordsalt" = env.password_salt; + "secret" = env.secret; + + "trusted_domains" = [ "cloud.immae.eu" ]; + "overwrite.cli.url" = "https://cloud.immae.eu"; + + "lost_password_link" = "disabled"; + + "remember_login_cookie_lifetime" = 60*60*24*30; + "session_keepalive" = true; + "session_lifefime" = 60*60*24*30; + + "maxZipInputSize" = 0; + "allowZipDownload" = true; + + # set by Carnet + "has_rebuilt_cache" = true; + + "memcache.distributed" = "\\OC\\Memcache\\Redis"; + "memcache.locking" = "\\OC\\Memcache\\Redis"; + "filelocking.enabled" = true; + "redis" = { + "host" = env.redis.socket; + "port" = 0; + "dbindex" = env.redis.db; + }; + + "ldapIgnoreNamingRules" = false; + "ldapProviderFactory" = "\\OCA\\User_LDAP\\LDAPProviderFactory"; + + "mail_smtpmode" = "sendmail"; + "mail_smtphost" = "127.0.0.1"; + "mail_smtpname" = ""; + "mail_smtppassword" = ""; + "mail_from_address" = "nextcloud"; + "mail_smtpauth" = false; + "mail_domain" = "tools.immae.eu"; + }; + }; + services.websites.env.tools.modules = [ "proxy_fcgi" ]; + + security.acme.certs.eldiron.extraDomainNames = [ "cloud.immae.eu" ]; + services.websites.env.tools.vhostConfs.cloud = { + certName = "eldiron"; + hosts = ["cloud.immae.eu" ]; + root = ncfg.rootDir; + extraConfig = [ + ncfg.vhost + ]; + }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "owncloud website is running on cloud.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Nextcloud"; + _webstatus_url = "https://cloud.immae.eu"; + } + ]; + }; +} diff --git a/systems/eldiron/websites/cloud/farm.nix b/systems/eldiron/websites/cloud/farm.nix new file mode 100644 index 0000000..df24cba --- /dev/null +++ b/systems/eldiron/websites/cloud/farm.nix @@ -0,0 +1,221 @@ +{ lib, pkgs, config, ... }: +let + scfg = config.secrets.fullPaths; + cfg = config.myServices.tools.cloud.farm; + apacheUser = config.services.websites.env.production.user; + apacheGroup = config.services.websites.env.production.group; + additionalConfs = icfg: lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) icfg.rootDir.otherConfig; + overrideConfig = icfg: pkgs.writeText "override.config.php" '' + + AcceptPathInfo On + DirectoryIndex index.php + Options FollowSymlinks + Require all granted + AllowOverride all + + + Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" + + + CGIPassAuth on + SetHandler "proxy:unix:${config.services.phpfpm.pools.${icfg.phpPoolName}.socket}|fcgi://localhost" + + + + ''; +in +{ + options.myServices.tools.cloud.farm = { + instances = lib.mkOption { + description = "Instances names for the nextcloud Farm"; + default = {}; + type = lib.types.attrsOf (lib.types.submodule ({ name, config, ... }: { + options = { + nextcloud = lib.mkOption { + description = "Nextcloud version to use"; + default = pkgs.webapps-nextcloud_27; + type = lib.types.package; + }; + apps = lib.mkOption { + description = "Applications to use"; + default = a: []; + #type = functionTo (listOf packages) + type = lib.types.unspecified; + }; + config = lib.mkOption { + description = "Config keys"; + default = {}; + type = lib.types.attrsOf lib.types.unspecified; + }; + secretsPath = lib.mkOption { + description = "Path in secrets to nextcloud config file"; + default = "websites/${name}/nextcloud"; + type = lib.types.str; + }; + configOverride = lib.mkOption { + description = "Path to config override"; + readOnly = true; + default = scfg."${config.secretsPath}"; + type = lib.types.path; + }; + phpPackage = lib.mkOption { + description = "PHP package to use"; + default = pkgs.php81; + type = lib.types.package; + apply = v: (v.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick all.sysvsem ])).override { extraConfig = '' + apc.enable_cli = 1 + apc.enabled = 1 + ''; + }; + }; + rootDir = lib.mkOption { + description = "Instance root dirs"; + readOnly = true; + type = lib.types.package; + default = config.nextcloud.withApps config.apps; + }; + phpPoolName = lib.mkOption { + description = "Php pool name for the instance"; + readOnly = true; + type = lib.types.str; + default = "nextcloud_farm_" + name; + }; + phpBaseDir = lib.mkOption { + description = "Php basedir for the instance"; + readOnly = true; + type = lib.types.str; + default = builtins.concatStringsSep ":" ( + [ config.rootDir config.varDir ] + ++ config.rootDir.apps + ++ [ config.configOverride (overrideConfig config) ] + ++ (builtins.attrValues (additionalConfs config)) + ); + }; + varDir = lib.mkOption { + description = "Instance var dir"; + type = lib.types.path; + default = "/var/lib/nextcloud_farm/${name}"; + }; + vhost = lib.mkOption { + description = "Instance vhost config"; + readOnly = true; + type = lib.types.str; + default = toVhost config; + }; + }; + })); + }; + }; + + config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) { + systemd.services = lib.mapAttrs' (k: v: lib.nameValuePair ("phpfpm-" + v.phpPoolName) { + after = lib.mkAfter [ "postgresql.service" ]; + wants = [ "postgresql.service" ]; + serviceConfig.ExecStartPre = + "+${pkgs.writeScript "phpfpm-nextcloud-${k}-pre-start" '' + #!${pkgs.stdenv.shell} + + install -m 0755 -o wwwrun -g wwwrun -d ${v.varDir} -d ${v.varDir}/config + ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: f: + "ln -sf ${f} ${v.varDir}/config/${n}.json" + ) (additionalConfs v))} + ln -sf ${overrideConfig v} ${v.varDir}/config/override.config.php + ''}"; + }) cfg.instances; + services.phpfpm.pools = lib.mapAttrs' (k: v: lib.nameValuePair v.phpPoolName { + user = apacheUser; + group = apacheGroup; + settings = { + "listen.owner" = apacheUser; + "listen.group" = apacheGroup; + "pm" = "dynamic"; + "pm.max_children" = "60"; + "pm.start_servers" = "3"; + "pm.min_spare_servers" = "3"; + "pm.max_spare_servers" = "3"; + "pm.process_idle_timeout" = "60"; + + "php_admin_value[output_buffering]" = "0"; + "php_admin_value[max_execution_time]" = "1800"; + "php_admin_value[zend_extension]" = "opcache"; + "php_value[apc.enable_cli]" = "1"; + "php_value[apc.enabled]" = "1"; + #already enabled by default? + #"php_value[opcache.enable]" = "1"; + "php_value[opcache.enable_cli]" = "1"; + "php_value[opcache.interned_strings_buffer]" = "32"; + "php_value[opcache.max_accelerated_files]" = "10000"; + "php_value[opcache.memory_consumption]" = "128"; + "php_value[opcache.save_comments]" = "1"; + "php_value[opcache.revalidate_freq]" = "1"; + "php_admin_value[memory_limit]" = "512M"; + + "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${v.phpBaseDir}:/proc/cpuinfo:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:NextcloudFarm:${k}:'"; + }; + phpPackage = v.phpPackage; + }) cfg.instances; + environment.systemPackages = let + toOcc = name: icfg: pkgs.writeScriptBin "nextcloud-occ-${name}" '' + #! ${pkgs.stdenv.shell} + cd ${icfg.rootDir} + NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config" \ + exec \ + sudo -E -u wwwrun ${icfg.phpPackage}/bin/php \ + -d memory_limit=512M \ + -c ${icfg.phpPackage}/etc/php.ini \ + occ $* + ''; + in lib.mapAttrsToList toOcc cfg.instances; + services.cron = { + enable = true; + systemCronJobs = let + toScript = name: icfg: pkgs.writeScriptBin "nextcloud-cron" '' + #! ${pkgs.stdenv.shell} + export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive + export PATH=/run/wrappers/bin:$PATH + export NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config" + ${icfg.phpPackage}/bin/php -c ${icfg.phpPackage}/etc/php.ini -d memory_limit=512M -f ${icfg.rootDir}/cron.php + ''; + toLine = name: icfg: '' + */5 * * * * wwwrun ${toScript name icfg}/bin/nextcloud-cron + ''; + in lib.mapAttrsToList toLine cfg.instances; + }; + + secrets.keys = lib.mapAttrs' (name: v: lib.nameValuePair "${v.secretsPath}" { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0600"; + # Be careful when editing that: config from this file takes + # precedence over the regular one, but if a key got removed, it my + # still exist in the default config file + text = builtins.toJSON ( { + "datadirectory" = if name == "immae" then v.varDir else "${v.varDir}/data"; + + "appstoreenabled" = false; + "integrity.check.disabled" = true; + "updater.release.channel" = "stable"; + "upgrade.disable-web" = true; + + "memcache.local" = "\\OC\\Memcache\\APCu"; + + "htaccess.RewriteBase" = "/"; + + "loglevel" = 2; + "logtimezone" = "Europe/Paris"; + + "default_phone_region" = "FR"; + "skeletondirectory" = ""; + "theme" = ""; + } // v.config); + }) cfg.instances; + }; +} diff --git a/modules/private/websites/tools/commento/default.nix b/systems/eldiron/websites/commento/default.nix similarity index 63% rename from modules/private/websites/tools/commento/default.nix rename to systems/eldiron/websites/commento/default.nix index c36255b..c5131b8 100644 --- a/modules/private/websites/tools/commento/default.nix +++ b/systems/eldiron/websites/commento/default.nix @@ -12,6 +12,31 @@ in enable = lib.mkEnableOption "Enable commento website"; }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.commento = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.commento = { + file.datetime = "2022-08-21T01:11:00"; + service = { + name = "Commento"; + description = "Commento is a fast, privacy-focused commenting platform"; + website = "https://commento.immae.eu"; + logo = "https://commento.immae.eu/images/logo.svg"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Commento"; + website = "https://www.commento.io/"; + license.url = "https://gitlab.com/commento/commento/-/blob/master/LICENSE"; + license.name = "MIT License"; + version = pkgs.commento.version; + source.url = "https://gitlab.com/commento/commento"; + }; + }; secrets.keys = { "commento/env" = { permissions = "0400"; @@ -31,9 +56,9 @@ in }; }; + security.acme.certs.eldiron.extraDomainNames = [ "commento.immae.eu" ]; services.websites.env.tools.vhostConfs.commento = { certName = "eldiron"; - addToCerts = true; hosts = [ "commento.immae.eu" ]; root = null; extraConfig = [ diff --git a/systems/eldiron/websites/cryptpad/default.nix b/systems/eldiron/websites/cryptpad/default.nix new file mode 100644 index 0000000..4635548 --- /dev/null +++ b/systems/eldiron/websites/cryptpad/default.nix @@ -0,0 +1,89 @@ +{ config, pkgs, lib, ... }: +let + cfg = config.myServices.websites.tools.cryptpad; + envCfg = config.myEnv.tools.cryptpad; + domain = "cryptpad.immae.eu"; + port = envCfg.port; + configFile = pkgs.writeText "config.js" '' + // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js + module.exports = { + httpUnsafeOrigin: 'https://${domain}', + httpPort: ${toString port}, + adminEmail: '${envCfg.email}', + filePath: './datastore/', + archivePath: './data/archive', + pinPath: './data/pins', + taskPath: './data/tasks', + blockPath: './block', + blobPath: './blob', + blobStagingPath: './data/blobstage', + decreePath: './data/decrees', + logPath: './data/logs', + logToStdout: false, + logLevel: 'info', + logFeedback: false, + verbose: false, + inactiveTime: false, + maxUploadSize: 100 * 1024 * 1024, + adminKeys: ${builtins.toJSON envCfg.admins}, + }; + ''; +in +{ + options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad"; + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.cryptpad = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.cryptpad = { + file.datetime = "2022-08-21T01:20:00"; + hosting = { + name = "Cryptpad"; + description = "Collaboration suite, encrypted and open-source"; + website = "https://cryptpad.immae.eu/"; + logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.cryptpad = { + file.datetime = "2022-08-21T01:20:00"; + service = { + name = "Cryptpad"; + description = "Collaboration suite, encrypted and open-source"; + website = "https://cryptpad.immae.eu/"; + logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "FREE" "MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Cryptpad"; + website = "https://cryptpad.org/"; + license.url = "https://github.com/xwiki-labs/cryptpad/blob/main/LICENSE"; + license.name = "GNU Affero General Public License v3.0"; + version = pkgs.cryptpad.version; + source.url = "https://github.com/xwiki-labs/cryptpad"; + }; + }; + myServices.tools.cryptpad.farm.hosts.immaeEu = { + inherit domain port; + config = configFile; + }; + services.websites.env.tools.modules = [ "proxy_wstunnel" ]; + security.acme.certs.eldiron.extraDomainNames = [ domain ]; + services.websites.env.tools.vhostConfs.cryptpad = { + certName = "eldiron"; + hosts = [domain]; + root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu; + extraConfig = [ + config.myServices.tools.cryptpad.farm.vhosts.immaeEu + ]; + }; + }; +} diff --git a/modules/private/websites/tools/cryptpad/farm.nix b/systems/eldiron/websites/cryptpad/farm.nix similarity index 96% rename from modules/private/websites/tools/cryptpad/farm.nix rename to systems/eldiron/websites/cryptpad/farm.nix index b35f348..58393ab 100644 --- a/modules/private/websites/tools/cryptpad/farm.nix +++ b/systems/eldiron/websites/cryptpad/farm.nix @@ -161,6 +161,12 @@ in type = lib.types.attrsOf lib.types.path; default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhostRoot; }; + vhostVarDirs = lib.mkOption { + description = "Instance vhosts var dirs"; + readOnly = true; + type = lib.types.attrsOf lib.types.path; + default = lib.genAttrs (builtins.attrNames cfg.hosts) (n: "/var/lib/cryptpad/${n}"); + }; }; config = { users.users = lib.optionalAttrs (cfg.hosts != {}) { diff --git a/modules/private/websites/tools/dav/davical.nix b/systems/eldiron/websites/dav/davical.nix similarity index 93% rename from modules/private/websites/tools/dav/davical.nix rename to systems/eldiron/websites/dav/davical.nix index bc5ecf6..b418cb8 100644 --- a/modules/private/websites/tools/dav/davical.nix +++ b/systems/eldiron/websites/dav/davical.nix @@ -1,11 +1,5 @@ { stdenv, fetchurl, gettext, writeText, env, awl, davical, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/davical - ''; - }; keys."webapps/dav-davical" = { user = apache.user; group = apache.group; @@ -120,9 +114,10 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "DavicalPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/davical"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; "php_admin_value[include_path]" = "${awl}/inc:${webapp}/inc"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/davical"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Davical:'"; "php_flag[magic_quotes_gpc]" = "Off"; "php_flag[register_globals]" = "Off"; "php_admin_value[error_reporting]" = "E_ALL & ~E_NOTICE"; diff --git a/systems/eldiron/websites/dav/default.nix b/systems/eldiron/websites/dav/default.nix new file mode 100644 index 0000000..109715d --- /dev/null +++ b/systems/eldiron/websites/dav/default.nix @@ -0,0 +1,140 @@ +{ lib, pkgs, config, ... }: +let + infcloud = rec { + root = pkgs.webapps-infcloud; + vhostConf = '' + Alias /carddavmate ${root} + Alias /caldavzap ${root} + Alias /infcloud ${root} + + AllowOverride All + Options FollowSymlinks + Require all granted + DirectoryIndex index.html + + ''; + }; + davical = pkgs.callPackage ./davical.nix { + env = config.myEnv.tools.davical; + davical = pkgs.webapps-davical; + awl = pkgs.webapps-awl; + inherit config; + }; + + cfg = config.myServices.websites.tools.dav; +in { + options.myServices.websites.tools.dav = { + enable = lib.mkEnableOption "enable dav website"; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.dav = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services = { + davical = { + file.datetime = "2022-08-21T01:33:00"; + service = { + name = "Davical"; + description = "DAViCal is a server for calendar sharing"; + website = "https://dav.immae.eu"; + logo = "https://www.davical.org/images/logo.gif"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Davical"; + website = "https://www.davical.org/"; + license.url = "https://gitlab.com/davical-project/davical/-/blob/master/COPYING"; + license.name = "GNU General Public License Version 2"; + version = pkgs.webapps-davical.version; + source.url = "https://gitlab.com/davical-project/davical/"; + modules = "infcloud"; + }; + }; + #calendar = { + # file.datetime = "2022-08-22T00:00:00"; + # service = { + # name = "Calendar"; + # description = "Opensource CalDAV web client"; + # website = "https://dav.immae.eu/caldavzap/"; + # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "InfCloud"; + # website = "https://inf-it.com/open-source/clients/infcloud/"; + # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html"; + # license.name = "GNU Affero General Public License (version 3.0)"; + # version = pkgs.webapps-infcloud.version; + # source.url = "https://inf-it.com/open-source/clients/infcloud/"; + # }; + #}; + #contacts = { + # file.datetime = "2022-08-22T00:00:00"; + # service = { + # name = "Contacts"; + # description = "Opensource Carddav web client"; + # website = "https://dav.immae.eu/carddavmate/"; + # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "InfCloud"; + # website = "https://inf-it.com/open-source/clients/infcloud/"; + # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html"; + # license.name = "GNU Affero General Public License (version 3.0)"; + # version = pkgs.webapps-infcloud.version; + # source.url = "https://inf-it.com/open-source/clients/infcloud/"; + # }; + #}; + }; + secrets.keys = davical.keys; + services.websites.env.tools.modules = davical.apache.modules; + + security.acme.certs.eldiron.extraDomainNames = [ "dav.immae.eu" ]; + services.websites.env.tools.vhostConfs.dav = { + certName = "eldiron"; + hosts = ["dav.immae.eu" ]; + root = ./www; + extraConfig = [ + infcloud.vhostConf + (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket) + ]; + }; + + services.phpfpm.pools = { + davical = { + user = config.services.websites.env.tools.user; + group = config.services.websites.env.tools.group; + settings = davical.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); + }; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "davical website is running on dav.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Davical"; + _webstatus_url = "https://dav.immae.eu/davical"; + } + ]; + }; +} + diff --git a/modules/private/websites/tools/dav/www/index.html b/systems/eldiron/websites/dav/www/index.html similarity index 100% rename from modules/private/websites/tools/dav/www/index.html rename to systems/eldiron/websites/dav/www/index.html diff --git a/systems/eldiron/websites/db/default.nix b/systems/eldiron/websites/db/default.nix new file mode 100644 index 0000000..339948f --- /dev/null +++ b/systems/eldiron/websites/db/default.nix @@ -0,0 +1,32 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.websites.tools.db; +in { + options.myServices.websites.tools.db = { + enable = lib.mkEnableOption "enable database's website"; + }; + + config = lib.mkIf cfg.enable { + services.websites.env.tools.modules = [ "proxy_fcgi" ]; + security.acme.certs.eldiron.extraDomainNames = [ "db-1.immae.eu" ]; + services.websites.env.tools.vhostConfs.db-1 = { + certName = "eldiron"; + hosts = ["db-1.immae.eu" ]; + root = null; + extraConfig = [ '' + Alias /adminer ${pkgs.webapps-adminer} + + DirectoryIndex index.php + + SetHandler "proxy:unix:${config.services.phpfpm.pools.adminer.socket}|fcgi://localhost" + + + Use LDAPConnect + Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu + Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu + + '' + ]; + }; + }; +} diff --git a/modules/private/websites/default.nix b/systems/eldiron/websites/default.nix similarity index 73% rename from modules/private/websites/default.nix rename to systems/eldiron/websites/default.nix index 4864034..68205de 100644 --- a/modules/private/websites/default.nix +++ b/systems/eldiron/websites/default.nix @@ -1,8 +1,14 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mypackages-lib, ... }: let www_root = ./_www; - theme_root = pkgs.webapps.apache-theme.theme; + theme_root = (mypackages-lib.apache-theme {}).theme; apacheConfig = { + shutdownconfig = { + # Only give 5 seconds to workers to finish their work + extraConfig = '' + GracefulShutdownTimeout 5 + ''; + }; cache = { # This setting permits to ignore time-based cache for files in the # nix store: @@ -73,7 +79,7 @@ let ''; }; apaxy = { - extraConfig = (pkgs.webapps.apache-theme.override { inherit theme_root; }).apacheConfig; + extraConfig = (mypackages-lib.apache-theme { inherit theme_root; }).apacheConfig; }; http2 = { modules = [ "http2" ]; @@ -99,9 +105,69 @@ let lib.imap0 (i: e: ''Header always set "X-Moomin-${pad 2 (builtins.toString i)}" "${e}"'') lines; in { + imports = [ + ./immae/production.nix + ./immae/release.nix + + # Tools + ./assets + ./cloud + ./cloud/farm.nix + ./cryptpad + ./cryptpad/farm.nix + ./commento + ./dav + ./vpn + ./db + ./diaspora + ./ether + ./git + ./im + ./mastodon + ./mgoblin + ./peertube + ./performance + ./tools + ./mail + ./stats + ./visio + ./kanboard/farm.nix + + # Games + ./games/codenames + ./games/terraforming-mars + ]; + options.myServices.websites.enable = lib.mkEnableOption "enable websites"; config = lib.mkIf config.myServices.websites.enable { + myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers; + { + games = ips servers.eldiron.ips.main; + nossl = ips servers.eldiron.ips.main; + }; + + myServices.chatonsProperties.hostings.web = { + file.datetime = "2022-08-22T01:30:00"; + hosting = { + name = "Hébergement Web"; + description = "Service d'hébergement web avec php/mysql/postgresql"; + website = "https://www.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Apache Httpd"; + website = "https://httpd.apache.org/"; + license.url = "https://www.apache.org/licenses/"; + license.name = "Apache License Version 2"; + version = pkgs.apacheHttpd.version; + source.url = "https://httpd.apache.org/download.cgi"; + modules = "openssh,pure-ftpd"; + }; + }; users.users.wwwrun.extraGroups = [ "keys" ]; networking.firewall.allowedTCPPorts = [ 80 443 ]; @@ -144,17 +210,19 @@ in }; }; - services.filesWatcher.httpdProd.paths = [ config.secrets.fullPaths."apache-ldap" ]; - services.filesWatcher.httpdInte.paths = [ config.secrets.fullPaths."apache-ldap" ]; - services.filesWatcher.httpdTools.paths = [ config.secrets.fullPaths."apache-ldap" ]; - services.websites.env.production = { enable = true; + moduleType = "container"; adminAddr = "httpd@immae.eu"; - httpdName = "Prod"; + bindMounts."/var/lib/ftp" = {}; + # FIXME: Bind directly the needed files + bindMounts."/var/secrets" = {}; + bindMounts."/var/lib/goaccess" = {}; + bindMounts."/var/lib/acme" = {}; + bindMounts."/run/phpfpm" = {}; ips = let ips = config.myEnv.servers.eldiron.ips.production; - in [ips.ip4] ++ (ips.ip6 or []); + in (ips.ip4 or []) ++ (ips.ip6 or []); modules = makeModules; extraConfig = makeExtraConfig; fallbackVhost = { @@ -167,28 +235,34 @@ in services.websites.env.integration = { enable = true; + moduleType = "container"; adminAddr = "httpd@immae.eu"; - httpdName = "Inte"; + bindMounts."/var/lib/ftp" = {}; + bindMounts."/var/secrets" = {}; + bindMounts."/var/lib/goaccess" = {}; + bindMounts."/var/lib/acme" = {}; + bindMounts."/run/phpfpm" = {}; ips = let ips = config.myEnv.servers.eldiron.ips.integration; - in [ips.ip4] ++ (ips.ip6 or []); + in (ips.ip4 or []) ++ (ips.ip6 or []); modules = makeModules; extraConfig = makeExtraConfig ++ moomin; fallbackVhost = { - certName = "eldiron"; + certName = "integration"; hosts = ["eldiron.immae.eu" ]; root = www_root; extraConfig = [ "DirectoryIndex index.htm" ]; }; + watchPaths = [ config.secrets.fullPaths."apache-ldap" ]; }; services.websites.env.tools = { enable = true; + moduleType = "main"; adminAddr = "httpd@immae.eu"; - httpdName = "Tools"; ips = let ips = config.myEnv.servers.eldiron.ips.main; - in [ips.ip4] ++ (ips.ip6 or []); + in (ips.ip4 or []) ++ (ips.ip6 or []); modules = makeModules; extraConfig = makeExtraConfig ++ [ '' @@ -203,6 +277,7 @@ in nosslVhost = { enable = true; host = "nossl.immae.eu"; + root = ./nossl; }; fallbackVhost = { certName = "eldiron"; @@ -210,96 +285,15 @@ in root = www_root; extraConfig = [ "DirectoryIndex index.htm" ]; }; + watchPaths = [ config.secrets.fullPaths."apache-ldap" ]; }; myServices.websites = { - bakeer.cloud.enable = true; - capitaines.landing_pages.enable = true; - - chloe = { - integration.enable = true; - production.enable = true; - }; - - cip-ca = { - sympa.enable = true; - }; - - connexionswing = { - integration.enable = true; - production.enable = true; - }; - - denise = { - evariste.enable = true; - denisejerome.enable = true; - oms.enable = true; - bingo.enable = true; - aventuriers.enable = true; - production.enable = true; - }; - - emilia = { - moodle.enable = false; - atelierfringant.enable = true; - }; - - florian = { - app.enable = true; - integration.enable = true; - production.enable = true; - }; - immae = { production.enable = true; release.enable = true; - temp.enable = true; - }; - - isabelle = { - aten_integration.enable = true; - aten_production.enable = true; - iridologie.enable = true; - }; - - jerome.naturaloutil.enable = true; - - leila.production.enable = true; - - ludivine = { - integration.enable = true; - production.enable = true; - }; - - nassime.production.enable = true; - - nath.villon.enable = true; - - papa = { - surveillance.enable = true; - maison_bbc.enable = true; - }; - - patrick_fodella = { - ecolyeu.enable = true; - altermondia.enable = true; - }; - - piedsjaloux = { - integration.enable = true; - production.enable = true; }; - ressourcerie_banon.production.enable = true; - ressourcerie_banon.cryptpad.enable = true; - ressourcerie_banon.cloud.enable = true; - - richie.production.enable = true; - - syden.peertube.enable = true; - - telio_tortay.production.enable = true; - tools.assets.enable = true; tools.cloud.enable = true; tools.commento.enable = true; @@ -316,6 +310,7 @@ in tools.tools.enable = true; tools.email.enable = true; tools.stats.enable = false; + tools.visio.enable = true; games.codenames.enable = true; games.terraforming-mars.enable = true; diff --git a/modules/private/websites/tools/diaspora/default.nix b/systems/eldiron/websites/diaspora/default.nix similarity index 73% rename from modules/private/websites/tools/diaspora/default.nix rename to systems/eldiron/websites/diaspora/default.nix index 3a115ed..c536446 100644 --- a/modules/private/websites/tools/diaspora/default.nix +++ b/systems/eldiron/websites/diaspora/default.nix @@ -10,6 +10,31 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.diaspora = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.diaspora = { + file.datetime = "2022-08-21T01:39:00"; + service = { + name = "Diaspora"; + description = "The online social world where you are in control"; + website = "https://diaspora.immae.eu"; + logo = "https://diaspora.immae.eu/assets/apple-touch-icon-9f7c9cc3923b4817fbb25bfeb0dd5fd34638827fd9c82b5a03f7b68e6e90806f.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Diaspora*"; + website = "https://diasporafoundation.org/"; + license.url = "https://github.com/diaspora/diaspora/blob/develop/LICENSE"; + license.name = "GNU Affero General Public License v3.0"; + version = dcfg.package.version; + source.url = "https://github.com/diaspora/diaspora"; + }; + }; users.users.diaspora.extraGroups = [ "keys" ]; secrets.keys = { @@ -23,6 +48,7 @@ in { user = "diaspora"; group = "diaspora"; permissions = "0400"; + keyDependencies = [ pkgs.cacert ]; text = '' configuration: environment: @@ -142,7 +168,7 @@ in { services.diaspora = { enable = true; - package = pkgs.webapps.diaspora.override { ldap = true; }; + withLdap = true; dataDir = "/var/lib/diaspora_immae"; adminEmail = "diaspora@tools.immae.eu"; configDir = config.secrets.fullPaths."webapps/diaspora"; @@ -156,9 +182,9 @@ in { services.websites.env.tools.modules = [ "headers" "proxy" "proxy_http" ]; + security.acme.certs.eldiron.extraDomainNames = [ "diaspora.immae.eu" ]; services.websites.env.tools.vhostConfs.diaspora = { certName = "eldiron"; - addToCerts = true; hosts = [ "diaspora.immae.eu" ]; root = root; extraConfig = [ '' @@ -181,5 +207,18 @@ in { '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "diaspora website is running on diaspora.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Diaspora"; + _webstatus_url = "https://diaspora.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/ether/default.nix b/systems/eldiron/websites/ether/default.nix similarity index 79% rename from modules/private/websites/tools/ether/default.nix rename to systems/eldiron/websites/ether/default.nix index 0539095..3993553 100644 --- a/modules/private/websites/tools/ether/default.nix +++ b/systems/eldiron/websites/ether/default.nix @@ -1,10 +1,10 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, nixpkgsRaw, etherpad-lite, ... }: let env = config.myEnv.tools.etherpad-lite; cfg = config.myServices.websites.tools.etherpad-lite; # Make sure we’re not rebuilding whole libreoffice just because of a # dependency - libreoffice = (import { overlays = []; }).libreoffice-fresh; + libreoffice = nixpkgsRaw.libreoffice-fresh; ecfg = config.services.etherpad-lite; in { options.myServices.websites.tools.etherpad-lite = { @@ -12,6 +12,32 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.ether = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.etherpad = { + file.datetime = "2021-01-04T00:01:00"; + service = { + name = "Etherpad"; + description = "Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément."; + website = "https://ether.immae.eu"; + logo = "https://ether.immae.eu/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Etherpad"; + website = "https://etherpad.org/"; + license.url = "https://github.com/ether/etherpad-lite/blob/develop/LICENSE"; + license.name = "Apache License Version 2.0"; + version = ecfg.package.version; + source.url = "https://github.com/ether/etherpad-lite"; + modules = ecfg.package.moduleNames; + }; + }; secrets.keys = { "webapps/tools-etherpad-apikey" = { permissions = "0400"; @@ -23,6 +49,7 @@ in { }; "webapps/tools-etherpad" = { permissions = "0400"; + keyDependencies = [ libreoffice ]; text = '' { "title": "Etherpad", @@ -61,7 +88,7 @@ in { "requireSession" : false, "editOnly" : false, "sessionNoPassword" : false, - "minify" : true, + "minify" : false, "maxAge" : 21600, "abiword" : null, "soffice" : "${libreoffice}/bin/soffice", @@ -69,7 +96,7 @@ in { "allowUnknownFileEnds" : true, "requireAuthentication" : false, "requireAuthorization" : false, - "trustProxy" : false, + "trustProxy" : true, "disableIPlogging" : false, "automaticReconnectionTimeout" : 0, "scrollWhenFocusLineIsOutOfViewport": { @@ -150,7 +177,7 @@ in { }; services.etherpad-lite = { enable = true; - package = pkgs.webapps.etherpad-lite.withModules (p: [ + package = etherpad-lite.withModules (p: [ p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth @@ -166,6 +193,7 @@ in { }; systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys"; + systemd.services.etherpad-lite-cleanup.serviceConfig.SupplementaryGroups = "keys"; # Needed so that they get in the closure systemd.services.etherpad-lite.path = [ libreoffice pkgs.html-tidy ]; @@ -177,9 +205,9 @@ in { services.websites.env.tools.modules = [ "headers" "proxy" "proxy_http" "proxy_wstunnel" ]; + security.acme.certs.eldiron.extraDomainNames = [ "ether.immae.eu" ]; services.websites.env.tools.vhostConfs.etherpad-lite = { certName = "eldiron"; - addToCerts = true; hosts = [ "ether.immae.eu" ]; root = null; extraConfig = [ '' @@ -188,12 +216,6 @@ in { RewriteEngine On - RewriteMap redirects "txt:${pkgs.writeText "redirects.txt" config.myEnv.tools.etherpad-lite.redirects}" - RewriteCond %{QUERY_STRING} "!noredirect" - RewriteCond %{REQUEST_URI} "^(.*)$" - RewriteCond ''${redirects:$1|Unknown} "!Unknown" - RewriteRule "^(.*)$" ''${redirects:$1} [L,NE,R=301,QSD] - RewriteCond %{REQUEST_URI} ^/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L] @@ -212,5 +234,18 @@ in { '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "etherpad website is running on ether.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "ether.immae.eu" "/" "Etherpad"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Etherpad"; + _webstatus_url = "https://ether.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/games/codenames/codenames.patch b/systems/eldiron/websites/games/codenames/codenames.patch similarity index 100% rename from modules/private/websites/tools/games/codenames/codenames.patch rename to systems/eldiron/websites/games/codenames/codenames.patch diff --git a/modules/private/websites/tools/games/codenames/default.nix b/systems/eldiron/websites/games/codenames/default.nix similarity index 58% rename from modules/private/websites/tools/games/codenames/default.nix rename to systems/eldiron/websites/games/codenames/default.nix index 25eb62d..7f09cc3 100644 --- a/modules/private/websites/tools/games/codenames/default.nix +++ b/systems/eldiron/websites/games/codenames/default.nix @@ -11,6 +11,31 @@ in { options.myServices.websites.games.codenames.enable = lib.mkEnableOption "Enable Codenames game"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.games.subdomains.codenames = with config.myServices.dns.helpers; + ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.codenames = { + file.datetime = "2022-08-27T14:08:00"; + service = { + name = "Codenames Green"; + description = "Co-op codenames app"; + website = "https://codenames.games.immae.eu/"; + logo = "https://codenames.games.immae.eu/images/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Codenames Green"; + website = "https://www.codenamesgreen.com/"; + license.url = "https://github.com/jbowens/codenamesgreen/blob/master/package.json"; + license.name = "MIT"; + version = greenapid.version; + source.url = "https://github.com/jbowens/codenamesgreen"; + }; + }; systemd.services.codenames_api = { description = "Api for codenames game"; wantedBy = [ "multi-user.target" ]; @@ -30,9 +55,10 @@ in }; }; + security.acme.certs.games.domain = "games.immae.eu"; + security.acme.certs.games.extraDomainNames = [ "codenames.games.immae.eu" ]; services.websites.env.tools.vhostConfs.games_codenames = { certName = "games"; - certMainHost = "games.immae.eu"; hosts = [ "codenames.games.immae.eu" ]; root = frontend; extraConfig = [ diff --git a/modules/private/websites/tools/games/codenames/deps.nix b/systems/eldiron/websites/games/codenames/deps.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/deps.nix rename to systems/eldiron/websites/games/codenames/deps.nix diff --git a/modules/private/websites/tools/games/codenames/elm-srcs.nix b/systems/eldiron/websites/games/codenames/elm-srcs.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/elm-srcs.nix rename to systems/eldiron/websites/games/codenames/elm-srcs.nix diff --git a/modules/private/websites/tools/games/codenames/frontend.nix b/systems/eldiron/websites/games/codenames/frontend.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/frontend.nix rename to systems/eldiron/websites/games/codenames/frontend.nix diff --git a/modules/private/websites/tools/games/codenames/greenapid.nix b/systems/eldiron/websites/games/codenames/greenapid.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/greenapid.nix rename to systems/eldiron/websites/games/codenames/greenapid.nix diff --git a/modules/private/websites/tools/games/codenames/greenapid.patch b/systems/eldiron/websites/games/codenames/greenapid.patch similarity index 100% rename from modules/private/websites/tools/games/codenames/greenapid.patch rename to systems/eldiron/websites/games/codenames/greenapid.patch diff --git a/systems/eldiron/websites/games/codenames/immae-assets.patch b/systems/eldiron/websites/games/codenames/immae-assets.patch new file mode 100644 index 0000000..c53ab97 --- /dev/null +++ b/systems/eldiron/websites/games/codenames/immae-assets.patch @@ -0,0 +1,15 @@ +diff --git a/src/index.html b/src/index.html +index 2559a37..84a0d64 100644 +--- a/src/index.html ++++ b/src/index.html +@@ -6,8 +6,8 @@ + <meta name="description" content="Online cooperative codenames game. Play with two or more players."> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> + <meta name="theme-color" content="#ffffff"> +- <link href="https://fonts.googleapis.com/css?family=Exo+2&display=swap" rel="stylesheet"> +- <link href="https://unpkg.com/ionicons@4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet"> ++ <link href="https://assets.immae.eu/fonts/Exo2_swap/font.css" rel="stylesheet"> ++ <link href="https://assets.immae.eu/ionicons/4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet"> + <link rel="manifest" href="/codenames.manifest"> + <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png"> + <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png"> diff --git a/modules/private/websites/tools/games/codenames/node-packages.nix b/systems/eldiron/websites/games/codenames/node-packages.nix similarity index 99% rename from modules/private/websites/tools/games/codenames/node-packages.nix rename to systems/eldiron/websites/games/codenames/node-packages.nix index 02595c5..1fb2db3 100644 --- a/modules/private/websites/tools/games/codenames/node-packages.nix +++ b/systems/eldiron/websites/games/codenames/node-packages.nix @@ -6448,6 +6448,7 @@ let chmod -R u+w $out cd $out patch -p1 < ${./codenames.patch} + patch -p1 < ${./immae-assets.patch} ''; dependencies = [ sources."@babel/code-frame-7.0.0" diff --git a/modules/private/websites/tools/games/codenames/registry.dat b/systems/eldiron/websites/games/codenames/registry.dat similarity index 100% rename from modules/private/websites/tools/games/codenames/registry.dat rename to systems/eldiron/websites/games/codenames/registry.dat diff --git a/modules/private/websites/tools/games/codenames/shell.nix b/systems/eldiron/websites/games/codenames/shell.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/shell.nix rename to systems/eldiron/websites/games/codenames/shell.nix diff --git a/modules/private/websites/tools/games/codenames/wordlists/french.txt b/systems/eldiron/websites/games/codenames/wordlists/french.txt similarity index 100% rename from modules/private/websites/tools/games/codenames/wordlists/french.txt rename to systems/eldiron/websites/games/codenames/wordlists/french.txt diff --git a/modules/private/websites/tools/games/terraforming-mars/default.nix b/systems/eldiron/websites/games/terraforming-mars/default.nix similarity index 51% rename from modules/private/websites/tools/games/terraforming-mars/default.nix rename to systems/eldiron/websites/games/terraforming-mars/default.nix index 0df5363..e90e72f 100644 --- a/modules/private/websites/tools/games/terraforming-mars/default.nix +++ b/systems/eldiron/websites/games/terraforming-mars/default.nix @@ -6,8 +6,32 @@ in { options.myServices.websites.games.terraforming-mars.enable = lib.mkEnableOption "Enable Terraforming mars game"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.games.subdomains.terraforming-mars = with config.myServices.dns.helpers; + ips servers.eldiron.ips.main; + myServices.chatonsProperties.services.terraforming-mars = { + file.datetime = "2022-08-27T14:20:00"; + service = { + name = "Terraforming Mars"; + description = "Terraforming Mars Boardgame"; + website = "https://terraforming-mars.games.immae.eu/"; + logo = "https://terraforming-mars.games.immae.eu/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Terraforming Mars"; + website = "https://github.com/terraforming-mars/terraforming-mars"; + license.url = "https://github.com/terraforming-mars/terraforming-mars/blob/main/LICENSE"; + license.name = "GNU General Public License v3.0"; + version = "unversionned"; + source.url = "https://github.com/terraforming-mars/terraforming-mars"; + }; + }; systemd.services.terraforming-mars = { - path = [ pkgs.nodejs pkgs.bashInteractive ]; + path = [ pkgs.nodejs_16 pkgs.bashInteractive ]; description = "Terraforming mars game"; wantedBy = [ "multi-user.target" ]; script = '' @@ -21,6 +45,8 @@ in chown :wwwrun /run/terraforming-mars/socket.sock chmod g+w /run/terraforming-mars/socket.sock ''; + environment.NPM_CONFIG_LOGS_DIR = "%S/terraforming-mars/npm_logs"; + environment.NPM_CONFIG_CACHE = "%S/terraforming-mars/npm_cache"; serviceConfig = { User = "terraformingmars"; DynamicUser = true; @@ -32,9 +58,10 @@ in }; }; + security.acme.certs.games.extraDomainNames = [ "terraforming-mars.games.immae.eu" ]; + security.acme.certs.games.domain = "games.immae.eu"; services.websites.env.tools.vhostConfs.games_terraforming-mars = { certName = "games"; - certMainHost = "games.immae.eu"; hosts = [ "terraforming-mars.games.immae.eu" ]; root = null; extraConfig = [ diff --git a/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch new file mode 100644 index 0000000..684a7df --- /dev/null +++ b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch @@ -0,0 +1,13 @@ +diff --git a/assets/index.html b/assets/index.html +index 220192834..d77a0fc80 100644 +--- a/assets/index.html ++++ b/assets/index.html +@@ -2,7 +2,7 @@ + <html> + <head> + <link +- href="https://fonts.googleapis.com/css?family=Ubuntu&display=swap" ++ href="https://assets.immae.eu/fonts/Ubuntu_swap/font.css" + rel="stylesheet" + /> + <link rel="stylesheet" type="text/css" media="all" href="/styles.css" /> diff --git a/modules/private/websites/tools/games/terraforming-mars/node-packages.nix b/systems/eldiron/websites/games/terraforming-mars/node-packages.nix similarity index 100% rename from modules/private/websites/tools/games/terraforming-mars/node-packages.nix rename to systems/eldiron/websites/games/terraforming-mars/node-packages.nix diff --git a/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix similarity index 73% rename from modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix rename to systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix index 502a553..f190221 100644 --- a/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix +++ b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix @@ -1,4 +1,4 @@ -{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs, git }: +{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs_16, git }: let source = fetchgit { url = "https://github.com/bafolts/terraforming-mars"; @@ -14,16 +14,19 @@ let ''; packages = callPackage ./node-packages.nix { src = patchedSource; - nodeEnv = callPackage mylibs.nodeEnv {}; - globalBuildInputs = [ nodePackages.node-pre-gyp ]; + nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs_16; }; + globalBuildInputs = [ nodejs_16.pkgs.node-pre-gyp ]; }; terraforming-mars = runCommand "terraforming-mars" { - buildInputs = [ nodejs git ]; + buildInputs = [ nodejs_16 git ]; } '' cp -r ${source} ./source chmod -R u+w source cd source + patch -p1 < ${./immae-assets.patch} ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules . + # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no + export NODE_OPTIONS=--openssl-legacy-provider npm run build mkdir $out cp -a build $out/ diff --git a/systems/eldiron/websites/git/cgit_js.html b/systems/eldiron/websites/git/cgit_js.html new file mode 100644 index 0000000..4101071 --- /dev/null +++ b/systems/eldiron/websites/git/cgit_js.html @@ -0,0 +1,16 @@ +<script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js"></script> +<script type="application/javascript"> + $(document).ready(function() { + const linksObject = { + "/github/fretlink": "Fretlink Open-source Github forks", + "/github": "Github forks", + "/perso/Denise": "Denise", + "/perso/Immae": "Immae", + } + function toRow(href, name) { + return `<a href='/cgit${href}'>${name}</a>`; + } + const links = Object.keys(linksObject).map(function(k) { return toRow(k, linksObject[k]); }).join(""); + $("table.tabs a.active[href='/cgit/']").after(links); + }); +</script> diff --git a/systems/eldiron/websites/git/default.nix b/systems/eldiron/websites/git/default.nix new file mode 100644 index 0000000..46ba34d --- /dev/null +++ b/systems/eldiron/websites/git/default.nix @@ -0,0 +1,98 @@ +{ lib, pkgs, config, ... }: +let + mantisbt = pkgs.callPackage ./mantisbt.nix { + mantisbt_2 = pkgs.webapps-mantisbt_2; + mantisbt_2-plugins = pkgs.webapps-mantisbt_2-plugins; + env = config.myEnv.tools.mantisbt; + inherit config; + }; + gitweb = pkgs.callPackage ./gitweb.nix { + gitoliteDir = config.myServices.gitolite.gitoliteDir; + }; + + cfg = config.myServices.websites.tools.git; +in { + options.myServices.websites.tools.git = { + enable = lib.mkEnableOption "enable git's website"; + }; + + config = lib.mkIf cfg.enable { + myServices.chatonsProperties.services.mantisbt = { + file.datetime = "2022-08-21T10:08:00"; + service = { + name = "MantisBT"; + description = "Mantis Bug Tracker"; + website = "https://git.immae.eu/mantisbt"; + logo = "https://git.immae.eu/mantisbt/images/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/forge-logicielle.html"; + }; + software = { + name = "MantisBT"; + website = "https://mantisbt.org/"; + license.url = "https://opensource.org/licenses/gpl-license"; + license.name = "GNU General Public License"; + version = mantisbt.webRoot.version; + source.url = "https://github.com/mantisbt/mantisbt"; + modules = mantisbt.webRoot.pluginNames; + }; + }; + secrets.keys = mantisbt.keys; + services.websites.env.tools.modules = + gitweb.apache.modules ++ + mantisbt.apache.modules; + + security.acme.certs.eldiron.extraDomainNames = [ "git.immae.eu" ]; + services.websites.env.tools.vhostConfs.git = { + certName = "eldiron"; + hosts = ["git.immae.eu" ]; + root = gitweb.apache.root; + extraConfig = [ + gitweb.apache.vhostConf + (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket) + '' + RewriteEngine on + RewriteCond %{REQUEST_URI} ^/releases + RewriteRule /releases(.*) https://release.immae.eu$1 [P,L] + '' + ]; + }; + services.phpfpm.pools = { + mantisbt = { + user = config.services.websites.env.tools.user; + group = config.services.websites.env.tools.group; + settings = mantisbt.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); + }; + }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "gitweb website is running on git.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Git"; + _webstatus_url = "https://git.immae.eu/"; + } + + { + service_description = "mantisbt website is running on git.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Mantisbt"; + _webstatus_url = "https://git.immae.eu/mantisbt"; + } + ]; + }; +} diff --git a/modules/private/websites/tools/git/gitweb.nix b/systems/eldiron/websites/git/gitweb.nix similarity index 95% rename from modules/private/websites/tools/git/gitweb.nix rename to systems/eldiron/websites/git/gitweb.nix index ff34da5..40f99e0 100644 --- a/modules/private/websites/tools/git/gitweb.nix +++ b/systems/eldiron/websites/git/gitweb.nix @@ -41,6 +41,7 @@ rec { css=/cgit-css/cgit.css logo=/cgit-css/cgit.png favicon=/cgit-css/favicon.ico + head-include=${./cgit_js.html} root-title=Immae’s git root-desc=To go back to the old interface: https://git.immae.eu/?old @@ -114,6 +115,10 @@ rec { RewriteEngine On RewriteCond %{QUERY_STRING} ^$ RewriteRule ^/?$ /cgit [L,R=302] + + RewriteCond %{REQUEST_URI} ^(.*)(\.git)?/?$ + RewriteCond ${varDir}/repositories/%1.git/HEAD -f + RewriteRule ^(.+)$ /cgit$1 [L,R=302] ''; }; } diff --git a/modules/private/websites/tools/git/mantisbt.nix b/systems/eldiron/websites/git/mantisbt.nix similarity index 89% rename from modules/private/websites/tools/git/mantisbt.nix rename to systems/eldiron/websites/git/mantisbt.nix index 2ef76af..3bd78e1 100644 --- a/modules/private/websites/tools/git/mantisbt.nix +++ b/systems/eldiron/websites/git/mantisbt.nix @@ -1,11 +1,5 @@ { env, mantisbt_2, mantisbt_2-plugins, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/mantisbt - ''; - }; keys."webapps/tools-mantisbt" = { user = apache.user; group = apache.group; @@ -84,8 +78,9 @@ rec { "php_admin_value[upload_max_filesize]" = "5000000"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/mantisbt"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/mantisbt"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:MantisBT:'"; }; }; } diff --git a/systems/eldiron/websites/im/default.nix b/systems/eldiron/websites/im/default.nix new file mode 100644 index 0000000..7755a5c --- /dev/null +++ b/systems/eldiron/websites/im/default.nix @@ -0,0 +1,118 @@ +{ config, lib, pkgs, ... }: +let + cfg = config.myServices.websites.tools.im; + converseVersion = "9.1.1"; + www = pkgs.runCommand "www" {} '' + cp -a ${./www} $out + substituteInPlace $out/converse.html --replace {{converseVersion}} ${converseVersion} + ''; +in +{ + options.myServices.websites.tools.im = { + enable = lib.mkEnableOption "enable im website"; + }; + + config = lib.mkIf cfg.enable { + myServices.chatonsProperties.services.converse = { + file.datetime = "2022-08-21T19:20:00"; + service = { + name = "Converse"; + description = "A free and open-source XMPP chat client in your browser"; + website = "https://im.immae.fr/converse"; + logo = "https://conversejs.org/docs/html/_static/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "FREE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Converse"; + website = "https://conversejs.org/"; + license.name = "Mozilla Public License 2.0"; + license.url = "https://github.com/conversejs/converse.js/blob/master/LICENSE"; + version = "9.1.1"; + source.url = "https://github.com/conversejs/converse.js"; + }; + }; + myServices.chatonsProperties.services.weechat-bridge = { + file.datetime = "2022-08-21T19:20:00"; + service = { + name = "Weechat bridge"; + description = "WeeChat web frontend"; + website = "https://im.immae.fr/glowing-bear"; + logo = "https://im.immae.fr/glowing-bear/assets/img/glowing_bear_128x128.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "FREE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Glowing bear"; + website = "https://www.ejabberd.im/"; + license.name = "GNU General Public License v3.0"; + license.url = "https://github.com/processone/ejabberd"; + version = pkgs.glowing-bear.version; + source.url = "https://github.com/glowing-bear/glowing-bear"; + }; + }; + myServices.chatonsProperties.services.xmpp = { + file.datetime = "2022-08-21T19:20:00"; + service = { + name = "XMPP"; + description = "Universal messaging standard"; + website = "https://im.immae.fr/"; + logo = "https://xmpp.org/favicon-32x32.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "ejabberd"; + website = "https://www.ejabberd.im/"; + license.url = "https://github.com/processone/ejabberd/blob/master/COPYING"; + license.name = "GNU GENERAL PUBLIC LICENSE Version 2"; + version = pkgs.ejabberd.version; + source.url = "https://github.com/processone/ejabberd"; + modules = "converse"; + }; + }; + security.acme.certs.eldiron.extraDomainNames = [ "im.immae.fr" ]; + services.websites.env.tools.vhostConfs.im = { + certName = "eldiron"; + hosts = ["im.immae.fr"]; + root = www; + extraConfig = [ + '' + Alias /glowing-bear ${pkgs.glowing-bear} + Alias /converse ${www}/converse.html + ProxyPreserveHost On + <Location "/bosh"> + ProxyPass http://localhost:5280/bosh + ProxyPassReverse http://localhost:5280/bosh + </Location> + <Location "/ws"> + ProxyPass ws://localhost:5280/ws + </Location> + ProxyPass /upload http://localhost:5280/upload + ProxyPassReverse /upload http://localhost:5280/upload + ProxyPass /admin http://localhost:5280/admin + ProxyPassReverse /admin http://localhost:5280/admin + ProxyPass /api http://localhost:5280/api + ProxyPassReverse /api http://localhost:5280/api + <Directory ${pkgs.glowing-bear}> + AllowOverride none + Require all granted + </Directory> + <Directory ${www}> + Require all granted + AllowOverride none + </Directory> + '' + ]; + }; + }; +} diff --git a/modules/private/websites/tools/im/www/converse.html b/systems/eldiron/websites/im/www/converse.html similarity index 90% rename from modules/private/websites/tools/im/www/converse.html rename to systems/eldiron/websites/im/www/converse.html index 936dde4..4ca451d 100644 --- a/modules/private/websites/tools/im/www/converse.html +++ b/systems/eldiron/websites/im/www/converse.html @@ -8,17 +8,19 @@ <meta name="description" content="Converse: An XMPP chat client which can be integrated into any website" /> <meta name="keywords" content="xmpp chat webchat converse.js Converse" /> - <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/5.0.4/converse.min.css" /> + <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.css" /> <style type="text/css"> #conversejs div.chat-msg__text pre { background-color: #eee; padding: 10px; } </style> - <script src="https://assets.immae.eu/converse/5.0.4/libsignal-protocol.min.js"></script> - <script src="https://assets.immae.eu/converse/5.0.4/converse.min.js"></script> + <script src="https://assets.immae.eu/converse/{{converseVersion}}/3rdparty/libsignal-protocol.min.js"></script> + <script src="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.js"></script> <script src="https://assets.immae.eu/marked/1.2.6/marked.min.js"></script> <script src="https://assets.immae.eu/markdown-it/10.0.0/markdown-it.min.js"></script> + </head> + <body> <script> var md = window.markdownit({ html: true, @@ -50,8 +52,6 @@ whitelisted_plugins: ['markdown'], }); </script> - </head> - <body> </body> </html> diff --git a/modules/private/websites/tools/im/www/index.html b/systems/eldiron/websites/im/www/index.html similarity index 100% rename from modules/private/websites/tools/im/www/index.html rename to systems/eldiron/websites/im/www/index.html diff --git a/modules/private/websites/immae/matrix/client b/systems/eldiron/websites/immae/matrix/client similarity index 65% rename from modules/private/websites/immae/matrix/client rename to systems/eldiron/websites/immae/matrix/client index 2769de5..89136a0 100644 --- a/modules/private/websites/immae/matrix/client +++ b/systems/eldiron/websites/immae/matrix/client @@ -4,5 +4,8 @@ }, "m.identity_server": { "base_url": "https://vector.im" + }, + "org.matrix.msc3575.proxy": { + "url": "https://immae.ems.host" } } diff --git a/modules/private/websites/immae/matrix/server b/systems/eldiron/websites/immae/matrix/server similarity index 100% rename from modules/private/websites/immae/matrix/server rename to systems/eldiron/websites/immae/matrix/server diff --git a/modules/private/websites/immae/production.nix b/systems/eldiron/websites/immae/production.nix similarity index 56% rename from modules/private/websites/immae/production.nix rename to systems/eldiron/websites/immae/production.nix index 8b4998f..e4060ba 100644 --- a/modules/private/websites/immae/production.nix +++ b/systems/eldiron/websites/immae/production.nix @@ -2,22 +2,26 @@ let cfg = config.myServices.websites.immae.production; varDir = "/var/lib/buildbot/outputs/immae/blog"; - coursDir = "/var/lib/buildbot/outputs/immae/cours"; - rechercheDir = "/var/lib/buildbot/outputs/immae/recherche"; - recettesDir = "/var/lib/buildbot/outputs/immae/recettes"; historyDir = "/var/lib/buildbot/outputs/immae/history"; docsDir = "/var/lib/buildbot/outputs/immae/docs/"; - env = config.myEnv.websites.immae; in { options.myServices.websites.immae.production.enable = lib.mkEnableOption "enable Immae's website"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers; + { + www = ips servers.eldiron.ips.production; + matrix.CNAME = [ "immae.element.io." ]; + }; services.webstats.sites = [ { name = "www.immae.eu"; } ]; + security.acme.certs.immae.domain = "www.immae.eu"; + security.acme.certs.immae.extraDomainNames = [ "immae.eu" ]; + services.websites.env.production.bindMounts."${varDir}" = {}; + services.websites.env.production.bindMounts."${docsDir}" = {}; + services.websites.env.production.bindMounts."${historyDir}" = {}; services.websites.env.production.vhostConfs.immae_production = { certName = "immae"; - addToCerts = true; - certMainHost = "www.immae.eu"; hosts = [ "www.immae.eu" "immae.eu" ]; root = varDir; extraConfig = [ @@ -44,13 +48,6 @@ in { Require all granted </Directory> - Alias /.well-known/chatonsinfos ${./chatons} - <Directory ${./chatons}> - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - </Directory> - Alias /.well-known/matrix ${./matrix} <Directory ${./matrix}> Options Indexes FollowSymLinks MultiViews Includes @@ -59,14 +56,6 @@ in { Header always set Access-Control-Allow-Origin "*" </Directory> - Alias /cours ${coursDir} - <Directory ${coursDir}> - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - </Directory> - Alias /docs ${docsDir} <Directory ${docsDir}> DirectoryIndex index.htm index.html @@ -75,63 +64,44 @@ in { Require all granted </Directory> - Alias /eurl ${./eurl} - <Directory ${./eurl}> + Alias /eurl ${./sarl} + Alias /eurl ${./sarl} + <Directory ${./sarl}> DirectoryIndex index.htm index.html Options Indexes FollowSymLinks MultiViews Includes AllowOverride None Require all granted </Directory> - Alias /recherche ${rechercheDir} - <Directory ${rechercheDir}> - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - </Directory> - - Alias /recettes ${recettesDir} - <Directory ${recettesDir}> - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - </Directory> - Alias /history ${historyDir} <Directory ${historyDir}> DirectoryIndex index.html AllowOverride None Require all granted </Directory> - '' - ]; - }; - services.websites.env.production.vhostConfs.immae_fr = { - certName = "immae"; - addToCerts = true; - hosts = [ "www.immae.fr" "immae.fr" ]; - root = null; - extraConfig = [ '' - RedirectMatch 301 ^/((?!\.well-known.*$).*)$ https://www.immae.eu/chapeaux/ - '' ]; - }; - - services.websites.env.production.vhostConfs.immae_bouya = { - certName = "immae"; - addToCerts = true; - hosts = [ "bouya.org" "www.bouya.org" ]; - root = rechercheDir; - extraConfig = [ '' - <Directory ${rechercheDir}> - DirectoryIndex index.htm index.html + Alias /.well-known/chatonsinfos ${config.myServices.chatonsProperties.propertiesPath} + <Directory ${config.myServices.chatonsProperties.propertiesPath}> Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All + AllowOverride None Require all granted </Directory> - '' ]; + '' + ]; }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "blog website is running on immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"]; + + servicegroups = "webstatus-websites"; + _webstatus_name = "Immae’s Blog"; + _webstatus_url = "https://www.immae.eu/blog"; + } + ]; }; } diff --git a/modules/private/websites/immae/release.nix b/systems/eldiron/websites/immae/release.nix similarity index 82% rename from modules/private/websites/immae/release.nix rename to systems/eldiron/websites/immae/release.nix index d06af87..4882bac 100644 --- a/modules/private/websites/immae/release.nix +++ b/systems/eldiron/websites/immae/release.nix @@ -2,16 +2,17 @@ let cfg = config.myServices.websites.immae.release; varDir = "/var/lib/ftp/release.immae.eu"; - env = config.myEnv.websites.release; in { options.myServices.websites.immae.release.enable = lib.mkEnableOption "enable Release' website"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.release = with config.myServices.dns.helpers; + ips servers.eldiron.ips.production; services.webstats.sites = [ { name = "release.immae.eu"; } ]; + security.acme.certs.immae.extraDomainNames = [ "release.immae.eu" ]; services.websites.env.production.vhostConfs.immae_release = { certName = "immae"; - addToCerts = true; hosts = [ "release.immae.eu" ]; root = varDir; extraConfig = [ diff --git a/modules/private/websites/immae/eurl/certificates/2021-certificate.crt b/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt similarity index 100% rename from modules/private/websites/immae/eurl/certificates/2021-certificate.crt rename to systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt diff --git a/systems/eldiron/websites/kanboard/farm.nix b/systems/eldiron/websites/kanboard/farm.nix new file mode 100644 index 0000000..a70d0d6 --- /dev/null +++ b/systems/eldiron/websites/kanboard/farm.nix @@ -0,0 +1,183 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.tools.kanboard.farm; + apacheUser = config.services.websites.env.tools.user; + apacheGroup = config.services.websites.env.tools.group; + toVardir = name: "/var/lib/kanboard_farm/${name}"; + varDirs = lib.mapAttrsToList (name: v: toVardir name) cfg.instances; + toPhpBaseDir = name: [ rootDir (toVardir name) ]; + phpBaseDir = builtins.concatStringsSep ":" (lib.unique (lib.flatten (lib.mapAttrsToList (name: v: toPhpBaseDir name) cfg.instances))); + rootDir = pkgs.kanboard; + + toVhost = name: '' + Alias /${name} "${rootDir}" + <Location /${name}> + SetEnv DATA_DIR "${toVardir name}" + SetEnv MAIL_FROM "kanboard@tools.immae.eu" + </Location> + ''; + toCustomVhost = name: lib.optionalAttrs (cfg.instances."${name}".customHost != null) { + "kanboard_farm_${name}" = { + certName = "eldiron"; + hosts = [cfg.instances."${name}".customHost]; + root = null; + extraConfig = [ + '' + Alias / "${rootDir}" + <Location /> + SetEnv DATA_DIR "${toVardir name}" + SetEnv MAIL_FROM "kanboard@tools.immae.eu" + </Location> + <Directory "${rootDir}"> + DirectoryIndex index.php + AllowOverride All + Options FollowSymlinks + Require all granted + + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost" + </FilesMatch> + </Directory> + <DirectoryMatch "${rootDir}/data"> + Require all denied + </DirectoryMatch> + '' + ]; + }; + }; + customHosts = lib.filter (n: n != null) (map (n: cfg.instances."${n}".customHost) (builtins.attrNames cfg.instances)); + customVhosts = lib.foldl (o: n: o // n) {} (map toCustomVhost (builtins.attrNames cfg.instances)); + phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [all.redis]); +in +{ + options.myServices.tools.kanboard.farm = { + instances = lib.mkOption { + description = "Instances names for the kanboard Farm"; + default = {}; + type = lib.types.attrsOf (lib.types.submodule { + options = { + customHost = lib.mkOption { + description = "Custom host to use for the kanboard instance"; + default = null; + type = lib.types.nullOr lib.types.str; + }; + }; + }); + }; + vhosts = lib.mkOption { + description = "Instance vhosts configs"; + readOnly = true; + type = lib.types.attrsOf lib.types.str; + default = lib.mapAttrs (name: v: toVhost name) cfg.instances; + }; + }; + + config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) { + myServices.dns.zones."immae.eu".subdomains.kanboard = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.kanboard = { + file.datetime = "2022-08-21T19:40:00"; + hosting = { + name = "Kanboard"; + description = "Kanban project management software"; + website = "https://tools.immae.eu/kanboard"; + logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.kanboard = { + file.datetime = "2022-08-21T19:40:00"; + service = { + name = "Kanboard"; + description = "Kanban project management software"; + website = "https://tools.immae.eu/kanboard"; + logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Kanboard"; + website = "https://kanboard.org/"; + license.url = "https://github.com/kanboard/kanboard/blob/main/LICENSE"; + license.name = "MIT License"; + version = pkgs.kanboard.version; + source.url = "https://github.com/kanboard/kanboard"; + }; + }; + system.activationScripts.kanboard_farm_vardirs = { + deps = [ "httpd" ]; + text = '' + install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs} + ''; + }; + services.phpfpm.pools.kanboard_farm = { + user = apacheUser; + group = apacheGroup; + settings = let + instanceNb = builtins.length (builtins.attrNames cfg.instances); + in { + "listen.owner" = apacheUser; + "listen.group" = apacheGroup; + "pm" = "dynamic"; + "pm.max_children" = builtins.toString (60 * instanceNb); + "pm.start_servers" = builtins.toString (2 * instanceNb); + "pm.min_spare_servers" = builtins.toString (2 * instanceNb); + "pm.max_spare_servers" = builtins.toString (3 * instanceNb); + "pm.process_idle_timeout" = "60"; + + "php_admin_value[output_buffering]" = "0"; + "php_admin_value[max_execution_time]" = "1800"; + "php_admin_value[zend_extension]" = "opcache"; + "php_value[apcu.enable_cli]" = "1"; + "php_value[apcu.enabled]" = "1"; + #already enabled by default? + #"php_value[opcache.enable]" = "1"; + "php_value[opcache.enable_cli]" = "1"; + "php_value[opcache.interned_strings_buffer]" = "8"; + "php_value[opcache.max_accelerated_files]" = "10000"; + "php_value[opcache.memory_consumption]" = "128"; + "php_value[opcache.save_comments]" = "1"; + "php_value[opcache.revalidate_freq]" = "1"; + "php_admin_value[memory_limit]" = "512M"; + + "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:KanboardFarm:'"; + }; + inherit phpPackage; + }; + security.acme.certs.eldiron.extraDomainNames = customHosts ++ [ "kanboard.immae.eu" ]; + services.websites.env.tools.vhostConfs = { + kanboard = { + certName = "eldiron"; + hosts = ["kanboard.immae.eu"]; + root = null; + extraConfig = [ + '' + <Directory "${rootDir}"> + DirectoryIndex index.php + AllowOverride All + Options FollowSymlinks + Require all granted + + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost" + </FilesMatch> + </Directory> + <DirectoryMatch "${rootDir}/data"> + Require all denied + </DirectoryMatch> + '' + ] ++ builtins.attrValues cfg.vhosts; + }; + } // customVhosts; + }; +} diff --git a/systems/eldiron/websites/mail/default.nix b/systems/eldiron/websites/mail/default.nix new file mode 100644 index 0000000..0a0342b --- /dev/null +++ b/systems/eldiron/websites/mail/default.nix @@ -0,0 +1,141 @@ +{ lib, pkgs, config, ... }: +let + roundcubemail = pkgs.callPackage ./roundcubemail.nix { + roundcubemail = pkgs.webapps-roundcubemail; + env = config.myEnv.tools.roundcubemail; + inherit config; + }; + rainloop = pkgs.callPackage ./rainloop.nix { + rainloop = pkgs.rainloop-community; + }; + cfg = config.myServices.websites.tools.email; + pcfg = config.services.phpfpm.pools; +in +{ + options.myServices.websites.tools.email = { + enable = lib.mkEnableOption "enable email website"; + }; + + imports = [ + ./mta-sts.nix + ]; + + config = lib.mkIf cfg.enable { + #myServices.chatonsProperties.services.mail-rainloop = { + # file.datetime = "2022-08-22T00:30:00"; + # service = { + # name = "Rainloop"; + # description = "Simple, modern & fast web-based email client"; + # website = "https://mail.immae.eu/rainloop"; + # logo = "https://www.rainloop.net/static/img/logo-16x16.png"; + # status.level = "ERROR"; + # status.description = "Stopped due to CVE-2022-29360"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "Rainloop"; + # website = "https://www.rainloop.net/"; + # license.url = "https://www.rainloop.net/licensing/"; + # license.name = "GNU Affero General Public License v3.0"; + # version = rainloop.webRoot.version; + # source.url = "https://github.com/RainLoop/rainloop-webmail"; + # }; + #}; + #myServices.chatonsProperties.services.mail-roundcube = { + # file.datetime = "2022-08-22T00:30:00"; + # service = { + # name = "Roundcube"; + # description = "The Roundcube Webmail suite"; + # website = "https://mail.immae.eu/roundcube"; + # logo = "https://mail.immae.eu/roundcube/skins/elastic/images/favicon.ico"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "Roundcube"; + # website = "https://roundcube.net/"; + # license.url = "https://github.com/roundcube/roundcubemail/blob/master/LICENSE"; + # license.name = "GNU General Public License v3.0"; + # version = roundcubemail.webRoot.version; + # source.url = "https://github.com/roundcube/roundcubemail"; + # modules = map (a: a.pluginName) roundcubemail.webRoot.plugins ++ map (a: a.skinName) roundcubemail.webRoot.skins; + # }; + #}; + + myServices.dns.zones."immae.eu".subdomains.mail = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + secrets.keys = roundcubemail.keys; + + services.websites.env.tools.modules = + [ "proxy_fcgi" ] + ++ rainloop.apache.modules + ++ roundcubemail.apache.modules; + + security.acme.certs.mail.extraDomainNames = [ "mail.immae.eu" ]; + services.websites.env.tools.vhostConfs.mail = { + certName = "mail"; + hosts = ["mail.immae.eu"]; + root = ./www; + extraConfig = [ + (rainloop.apache.vhostConf pcfg.rainloop.socket) + (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket) + '' + <Directory ${./www}> + Require all granted + Options -Indexes + </Directory> + '' + ]; + }; + systemd.services = { + phpfpm-rainloop = { + after = lib.mkAfter rainloop.phpFpm.serviceDeps; + wants = rainloop.phpFpm.serviceDeps; + }; + phpfpm-roundcubemail = { + after = lib.mkAfter roundcubemail.phpFpm.serviceDeps; + wants = roundcubemail.phpFpm.serviceDeps; + }; + }; + + services.phpfpm.pools.roundcubemail = { + user = "wwwrun"; + group = "wwwrun"; + settings = roundcubemail.phpFpm.pool; + phpOptions = config.services.phpfpm.phpOptions + '' + date.timezone = 'CET' + ''; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick all.redis ]); + }; + services.phpfpm.pools.rainloop = { + user = "wwwrun"; + group = "wwwrun"; + settings = rainloop.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); + }; + system.activationScripts = { + roundcubemail = roundcubemail.activationScript; + rainloop = rainloop.activationScript; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "roundcube website is running on mail.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"]; + + servicegroups = "webstatus-webapps,webstatus-email"; + _webstatus_name = "Roundcube"; + _webstatus_url = "https://mail.immae.eu/roundcube/"; + } + ]; + }; + +} diff --git a/modules/private/websites/tools/mail/mta-sts.nix b/systems/eldiron/websites/mail/mta-sts.nix similarity index 61% rename from modules/private/websites/tools/mail/mta-sts.nix rename to systems/eldiron/websites/mail/mta-sts.nix index 77ba2d4..2438702 100644 --- a/modules/private/websites/tools/mail/mta-sts.nix +++ b/systems/eldiron/websites/mail/mta-sts.nix @@ -1,42 +1,30 @@ { lib, pkgs, config, ... }: let - domains = (lib.remove null (lib.flatten (map - (zone: map - (e: if e.receive - then { - domain = "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"; - mail = zone.name; - } - else null - ) - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - ))); + getDomains = p: lib.mapAttrsToList (n: v: v) (lib.filterAttrs (n: v: v.receive) p.emailPolicies); + bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones; + domains = lib.flatten (builtins.attrValues bydomain); mxes = lib.mapAttrsToList (n: v: v.mx.subdomain) (lib.attrsets.filterAttrs (n: v: v.mx.enable) config.myEnv.servers); - # FIXME: increase the id number in modules/private/dns.nix when this - # file change (date -u +'%Y%m%d%H%M%S'Z) - file = domain: pkgs.writeText "mta-sts-${domain.domain}.txt" ( + file = d: pkgs.writeText "mta-sts-${d.fqdn}.txt" ( builtins.concatStringsSep "\r\n" ([ "version: STSv1" "mode: testing" ] - ++ (map (v: "mx: ${v}.${domain.mail}") mxes) + ++ (map (v: "mx: ${v}.${d.domain}") mxes) ++ [ "max_age: 604800" ] )); root = pkgs.runCommand "mta-sts_root" {} '' mkdir -p $out ${builtins.concatStringsSep "\n" (map (d: - "cp ${file d} $out/${d.domain}.txt" + "cp ${file d} $out/${d.fqdn}.txt" ) domains)} ''; cfg = config.myServices.websites.tools.email; in { config = lib.mkIf cfg.enable { + security.acme.certs.mail.extraDomainNames = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains; services.websites.env.tools.vhostConfs.mta_sts = { certName = "mail"; - addToCerts = true; - hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.domain}") domains; + hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains; root = root; extraConfig = [ '' diff --git a/modules/private/websites/tools/mail/rainloop.nix b/systems/eldiron/websites/mail/rainloop.nix similarity index 87% rename from modules/private/websites/tools/mail/rainloop.nix rename to systems/eldiron/websites/mail/rainloop.nix index 20e43a1..f821005 100644 --- a/modules/private/websites/tools/mail/rainloop.nix +++ b/systems/eldiron/websites/mail/rainloop.nix @@ -5,7 +5,6 @@ rec { deps = [ "wrappers" ]; text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data ''; }; @@ -21,7 +20,7 @@ rec { DirectoryIndex index.php AllowOverride All Options -FollowSymlinks - Require all granted + Require all denied <FilesMatch "\.php$"> SetHandler "proxy:unix:${socket}|fcgi://localhost" @@ -48,7 +47,8 @@ rec { "php_admin_value[upload_max_filesize]" = "200M"; "php_admin_value[post_max_size]" = "200M"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rainloop:'"; }; }; } diff --git a/modules/private/websites/tools/mail/roundcubemail.nix b/systems/eldiron/websites/mail/roundcubemail.nix similarity index 94% rename from modules/private/websites/tools/mail/roundcubemail.nix rename to systems/eldiron/websites/mail/roundcubemail.nix index 2661b55..21a10fe 100644 --- a/modules/private/websites/tools/mail/roundcubemail.nix +++ b/systems/eldiron/websites/mail/roundcubemail.nix @@ -6,7 +6,6 @@ rec { text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ ${varDir}/cache ${varDir}/logs - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; keys."webapps/tools-roundcube" = { @@ -73,6 +72,7 @@ rec { $config['temp_dir'] = '${varDir}/cache'; $config['mime_types'] = '${apacheHttpd}/conf/mime.types'; ''; + keyDependencies = [ apacheHttpd ]; }; webRoot = (roundcubemail.override { roundcube_config = config.secrets.fullPaths."webapps/tools-roundcube"; }).withPlugins (p: [ p.automatic_addressbook p.carddav p.contextmenu p.contextmenu_folder p.html5_notifier p.ident_switch p.message_highlight p.thunderbird_labels ]); apache = rec { @@ -112,7 +112,8 @@ rec { "php_admin_value[upload_max_filesize]" = "200M"; "php_admin_value[post_max_size]" = "200M"; "php_admin_value[open_basedir]" = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Roundcubemail:'"; }; }; } diff --git a/modules/private/websites/tools/mail/www/index.html b/systems/eldiron/websites/mail/www/index.html similarity index 100% rename from modules/private/websites/tools/mail/www/index.html rename to systems/eldiron/websites/mail/www/index.html diff --git a/modules/private/websites/tools/mastodon/default.nix b/systems/eldiron/websites/mastodon/default.nix similarity index 60% rename from modules/private/websites/tools/mastodon/default.nix rename to systems/eldiron/websites/mastodon/default.nix index 173a4b8..603fc9e 100644 --- a/modules/private/websites/tools/mastodon/default.nix +++ b/systems/eldiron/websites/mastodon/default.nix @@ -3,13 +3,38 @@ let env = config.myEnv.tools.mastodon; root = "${mcfg.workdir}/public/"; cfg = config.myServices.websites.tools.mastodon; - mcfg = config.services.mastodon; + mcfg = config.immaeServices.mastodon; in { options.myServices.websites.tools.mastodon = { enable = lib.mkEnableOption "enable mastodon's website"; }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.mastodon = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.mastodon = { + file.datetime = "2022-08-21T19:50:00"; + service = { + name = "Mastodon"; + description = "Your self-hosted, globally interconnected microblogging community"; + website = "https://mastodon.immae.eu/"; + logo = "https://mastodon.immae.eu/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Mastodon"; + website = "https://joinmastodon.org/"; + license.url = "https://github.com/tootsuite/mastodon/blob/master/LICENSE"; + license.name = "GNU General Public License v3.0"; + version = mcfg.package.version; + source.url = "https://github.com/tootsuite/mastodon"; + }; + }; secrets.keys."webapps/tools-mastodon" = { user = "mastodon"; group = "mastodon"; @@ -56,7 +81,7 @@ in { LDAP_SEARCH_FILTER="${env.ldap.filter}" ''; }; - services.mastodon = { + immaeServices.mastodon = { enable = true; configFile = config.secrets.fullPaths."webapps/tools-mastodon"; socketsPrefix = "live_immae"; @@ -79,9 +104,9 @@ in { services.websites.env.tools.modules = [ "headers" "proxy" "proxy_wstunnel" "proxy_http" ]; + security.acme.certs.eldiron.extraDomainNames = [ "mastodon.immae.eu" ]; services.websites.env.tools.vhostConfs.mastodon = { certName = "eldiron"; - addToCerts = true; hosts = ["mastodon.immae.eu" ]; root = root; extraConfig = [ '' @@ -98,19 +123,19 @@ in { RewriteEngine On - ProxyPass /500.html ! - ProxyPass /sw.js ! - ProxyPass /embed.js ! - ProxyPass /robots.txt ! - ProxyPass /manifest.json ! - ProxyPass /browserconfig.xml ! - ProxyPass /mask-icon.svg ! - ProxyPassMatch ^(/.*\.(png|ico|gif)$) ! - ProxyPassMatch ^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge) ! - RewriteRule ^/api/v1/streaming/(.+)$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/$1 [P,NE,QSA,L] + RewriteRule ^/api/v1/streaming/public$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/public [P,NE,QSA,L] RewriteRule ^/api/v1/streaming/$ unix://${mcfg.sockets.node}|ws://mastodon.immae.eu/ [P,NE,QSA,L] - ProxyPass / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/ + RewriteCond %{REQUEST_URI} !/500.html + RewriteCond %{REQUEST_URI} !/sw.js + RewriteCond %{REQUEST_URI} !/embed.js + RewriteCond %{REQUEST_URI} !/robots.txt + RewriteCond %{REQUEST_URI} !/manifest.json + RewriteCond %{REQUEST_URI} !/browserconfig.xml + RewriteCond %{REQUEST_URI} !/mask-icon.svg + RewriteCond %{REQUEST_URI} !^(/.*\.(png|ico|gif)$) + RewriteCond %{REQUEST_URI} !^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge) + RewriteRule ^/(.*)$ unix:///run/mastodon/live_immae_puma.sock|http://mastodon.immae.eu/$1 [P,NE,QSA,L] ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/ Alias /system ${mcfg.dataDir} @@ -132,5 +157,18 @@ in { ErrorDocument 504 /500.html '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "mastodon website is running on mastodon.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Mastodon"; + _webstatus_url = "https://mastodon.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/mgoblin/default.nix b/systems/eldiron/websites/mgoblin/default.nix similarity index 70% rename from modules/private/websites/tools/mgoblin/default.nix rename to systems/eldiron/websites/mgoblin/default.nix index 1e5f5a0..f276c62 100644 --- a/modules/private/websites/tools/mgoblin/default.nix +++ b/systems/eldiron/websites/mgoblin/default.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mediagoblin, ... }: let env = config.myEnv.tools.mediagoblin; cfg = config.myServices.websites.tools.mediagoblin; @@ -9,6 +9,32 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.mgoblin = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.mediagoblin = { + file.datetime = "2022-08-21T20:00:00"; + service = { + name = "Mediagoblin"; + description = "MediaGoblin is a free software media publishing platform that anyone can run"; + website = "https://mgoblin.immae.eu/"; + logo = "https://mgoblin.immae.eu/mgoblin_static/images/goblin.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Mediagoblin"; + website = "https://mediagoblin.org/"; + license.url = "http://www.gnu.org/licenses/agpl.html"; + license.name = "GNU Affero General Public License"; + version = mcfg.package.version; + source.url = "https://git.savannah.gnu.org/git/mediagoblin.git"; + modules = map (a: a.pluginName) mcfg.package.plugins; + }; + }; secrets.keys."webapps/tools-mediagoblin" = { user = "mediagoblin"; group = "mediagoblin"; @@ -79,7 +105,7 @@ in { services.mediagoblin = { enable = true; - package = pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]); + package = mediagoblin.withPlugins (p: [p.basicsearch]); configFile = config.secrets.fullPaths."webapps/tools-mediagoblin"; }; services.filesWatcher.mediagoblin-web = { @@ -95,9 +121,9 @@ in { "proxy" "proxy_http" ]; users.users.wwwrun.extraGroups = [ "mediagoblin" ]; + security.acme.certs.eldiron.extraDomainNames = [ "mgoblin.immae.eu" ]; services.websites.env.tools.vhostConfs.mgoblin = { certName = "eldiron"; - addToCerts = true; hosts = ["mgoblin.immae.eu" ]; root = null; extraConfig = [ '' @@ -130,5 +156,18 @@ in { ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/ '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "mediagoblin website is running on mgoblin.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "mgoblin.immae.eu" "/" "GNU MediaGoblin"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Mediagoblin"; + _webstatus_url = "https://mgoblin.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/moomin.txt b/systems/eldiron/websites/moomin.txt similarity index 100% rename from modules/private/websites/moomin.txt rename to systems/eldiron/websites/moomin.txt diff --git a/modules/websites/nosslVhost/index.html b/systems/eldiron/websites/nossl/index.html similarity index 100% rename from modules/websites/nosslVhost/index.html rename to systems/eldiron/websites/nossl/index.html diff --git a/modules/private/websites/tools/peertube/default.nix b/systems/eldiron/websites/peertube/default.nix similarity index 57% rename from modules/private/websites/tools/peertube/default.nix rename to systems/eldiron/websites/peertube/default.nix index 68c992f..0ebe4e7 100644 --- a/modules/private/websites/tools/peertube/default.nix +++ b/systems/eldiron/websites/peertube/default.nix @@ -2,14 +2,53 @@ let env = config.myEnv.tools.peertube; cfg = config.myServices.websites.tools.peertube; - pcfg = config.services.peertube; + pcfg = config.immaeServices.peertube; in { options.myServices.websites.tools.peertube = { enable = lib.mkEnableOption "enable Peertube's website"; }; config = lib.mkIf cfg.enable { - services.peertube = { + myServices.dns.zones."immae.eu".subdomains.peertube = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.peertube = { + file.datetime = "2022-08-21T20:00:00"; + hosting = { + name = "Peertube"; + description = "Free software to take back control of your videos"; + website = "https://peertube.immae.eu/"; + logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.peertube = { + file.datetime = "2022-08-21T20:00:00"; + service = { + name = "Peertube"; + description = "Free software to take back control of your videos"; + website = "https://peertube.immae.eu/"; + logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Peertube"; + website = "https://joinpeertube.org/"; + license.url = "https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE"; + license.name = "GNU Affero General Public License"; + version = pcfg.package.version; + source.url = "https://github.com/Chocobozzz/PeerTube"; + }; + }; + immaeServices.peertube = { enable = true; configFile = config.secrets.fullPaths."webapps/tools-peertube"; }; @@ -68,9 +107,9 @@ in { paths = [ pcfg.configFile ]; }; + security.acme.certs.eldiron.extraDomainNames = [ "peertube.immae.eu" ]; services.websites.env.tools.vhostConfs.peertube = { certName = "eldiron"; - addToCerts = true; hosts = [ "peertube.immae.eu" ]; root = null; extraConfig = [ '' @@ -90,5 +129,19 @@ in { RequestHeader set X-Real-IP %{REMOTE_ADDR}s '' ]; }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "peertube website is running on peertube.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Peertube"; + _webstatus_url = "https://peertube.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/performance/default.nix b/systems/eldiron/websites/performance/default.nix similarity index 79% rename from modules/private/websites/tools/performance/default.nix rename to systems/eldiron/websites/performance/default.nix index 5715ff0..23f754a 100644 --- a/modules/private/websites/tools/performance/default.nix +++ b/systems/eldiron/websites/performance/default.nix @@ -1,7 +1,7 @@ { pkgs, lib, config, ... }: let env = config.myEnv.tools.status_engine; - package = pkgs.status_engine.interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; }); + package = pkgs.status-engine-interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; }); apacheRoot = "${package}/public"; cfg = config.myServices.websites.tools.performance; in @@ -11,6 +11,9 @@ in }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.performance = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + secrets.keys = { status_engine_ui = { permissions = "0400"; @@ -36,7 +39,7 @@ in use_mysql: 1 mysql: host: 127.0.0.1 - port: ${env.mysql.port} + port: ${builtins.toString env.mysql.port} username: ${env.mysql.user} password: ${env.mysql.password} database: ${env.mysql.database} @@ -48,9 +51,9 @@ in services.websites.env.tools.modules = [ "proxy_fcgi" ]; + security.acme.certs.eldiron.extraDomainNames = [ "performance.immae.eu" ]; services.websites.env.tools.vhostConfs.performance = { certName = "eldiron"; - addToCerts = true; hosts = [ "performance.immae.eu" ]; root = apacheRoot; extraConfig = [ @@ -79,9 +82,11 @@ in "pm.min_spare_servers" = "1"; "pm.max_spare_servers" = "10"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:StatusEngine:'"; "php_admin_value[open_basedir]" = "${package}:/tmp:${config.secrets.fullPaths."status_engine_ui"}"; }; - phpPackage = pkgs.php74; + phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); }; }; diff --git a/modules/private/websites/tools/stats/default.nix b/systems/eldiron/websites/stats/default.nix similarity index 95% rename from modules/private/websites/tools/stats/default.nix rename to systems/eldiron/websites/stats/default.nix index 71e31a3..665010b 100644 --- a/modules/private/websites/tools/stats/default.nix +++ b/systems/eldiron/websites/stats/default.nix @@ -18,9 +18,9 @@ in }; }; + security.acme.certs.eldiron.extraDomainNames = [ "stats.immae.eu" ]; services.websites.env.tools.vhostConfs.stats = { certName = "eldiron"; - addToCerts = true; hosts = [ "stats.immae.eu" ]; root = null; extraConfig = [ diff --git a/systems/eldiron/websites/tools/adminer.nix b/systems/eldiron/websites/tools/adminer.nix new file mode 100644 index 0000000..5e865b1 --- /dev/null +++ b/systems/eldiron/websites/tools/adminer.nix @@ -0,0 +1,83 @@ +{ config, webapps-adminer, php82, lib, forcePhpSocket ? null }: +rec { + webRoot = webapps-adminer; + phpFpm = rec { + user = apache.user; + group = apache.group; + phpPackage = let + #mysqli_pam = php81.extensions.mysqli.overrideAttrs(old: { + # configureFlags = [ "--with-mysqli=${libmysqlclient_pam.dev}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; + #}); + in + php82.withExtensions ({ enabled, all }: [all.mysqli all.redis all.pgsql]); + settings = { + "listen.owner" = apache.user; + "listen.group" = apache.group; + "pm" = "ondemand"; + "pm.max_children" = "5"; + "pm.process_idle_timeout" = "60"; + #"php_admin_flag[log_errors]" = "on"; + # Needed to avoid clashes in browser cookies (same domain) + "php_value[session.name]" = "AdminerPHPSESSID"; + "php_admin_value[open_basedir]" = "${webRoot}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Adminer:'"; + }; + }; + apache = rec { + user = "wwwrun"; + group = "wwwrun"; + modules = [ "proxy_fcgi" ]; + root = webRoot; + vhostConf = socket: '' + Alias /adminer ${webRoot} + <Directory ${webRoot}> + DirectoryIndex index.php + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost" + </FilesMatch> + + Use LDAPConnect + Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu + Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu + </Directory> + ''; + }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "adminer website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminerevo.org"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Adminer"; + _webstatus_url = "https://tools.immae.eu/adminer/"; + } + ]; + + chatonsProperties = { + published = false; + file.datetime = "2023-08-21T15:20:00"; + service = { + name = "Adminer"; + description = "Database management in a single PHP file"; + website = "https://tools.immae.eu/adminer/"; + logo = "https://tools.immae.eu/adminer/?file=favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Adminer"; + website = "https://docs.adminerevo.org/"; + license.url = "https://github.com/adminerevo/adminerevo/blob/main/readme.md"; + license.name = "Apache License 2.0 or GPL 2"; + version = webRoot.version; + source.url = "https://github.com/adminerevo/adminerevo/"; + }; + }; +} diff --git a/modules/private/websites/tools/tools/default.nix b/systems/eldiron/websites/tools/default.nix similarity index 62% rename from modules/private/websites/tools/tools/default.nix rename to systems/eldiron/websites/tools/default.nix index 90fcbe1..4d9e3c1 100644 --- a/modules/private/websites/tools/tools/default.nix +++ b/systems/eldiron/websites/tools/default.nix @@ -1,13 +1,14 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mypackages-lib, grocy, ... }: let - flakeCompat = import ../../../../../lib/flake-compat.nix; - - adminer = pkgs.callPackage ./adminer.nix {}; + composerEnv = mypackages-lib.composerEnv; + adminer = pkgs.callPackage ./adminer.nix { inherit config; }; ympd = pkgs.callPackage ./ympd.nix { env = config.myEnv.tools.ympd; + inherit config; }; ttrss = pkgs.callPackage ./ttrss.nix { - inherit (pkgs.webapps) ttrss ttrss-plugins; + ttrss = pkgs.webapps-ttrss; + ttrss-plugins = pkgs.webapps-ttrss-plugins; env = config.myEnv.tools.ttrss; php = pkgs.php72; inherit config; @@ -17,8 +18,8 @@ let env = config.myEnv.tools.kanboard; }; wallabag = pkgs.callPackage ./wallabag.nix { - wallabag = pkgs.webapps.wallabag.override { - composerEnv = pkgs.composerEnv.override { + wallabag = pkgs.webapps-wallabag.override { + composerEnv = composerEnv.override { php = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]); }; }; @@ -26,59 +27,110 @@ let inherit config; }; yourls = pkgs.callPackage ./yourls.nix { - inherit (pkgs.webapps) yourls yourls-plugins; + yourls = pkgs.webapps-yourls; + yourls-plugins = pkgs.webapps-yourls-plugins; env = config.myEnv.tools.yourls; inherit config; }; rompr = pkgs.callPackage ./rompr.nix { - inherit (pkgs.webapps) rompr; + rompr = pkgs.webapps-rompr; env = config.myEnv.tools.rompr; + inherit config; }; shaarli = pkgs.callPackage ./shaarli.nix { env = config.myEnv.tools.shaarli; inherit config; }; dokuwiki = pkgs.callPackage ./dokuwiki.nix { - inherit (pkgs.webapps) dokuwiki dokuwiki-plugins; + dokuwiki = pkgs.webapps-dokuwiki; + dokuwiki-plugins = pkgs.webapps-dokuwiki-plugins; + inherit config; }; ldap = pkgs.callPackage ./ldap.nix { - inherit (pkgs.webapps) phpldapadmin; + phpldapadmin = pkgs.webapps-phpldapadmin; env = config.myEnv.tools.phpldapadmin; inherit config; }; - grocy = pkgs.callPackage ./grocy.nix { - grocy = pkgs.webapps.grocy.override { composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; }; + grocy' = pkgs.callPackage ./grocy.nix { + grocy = grocy.override { composerEnv = composerEnv.override { php = pkgs.php72; }; }; }; phpbb = pkgs.callPackage ./phpbb.nix { - phpbb = (pkgs.webapps.phpbb.withLangs (l: [ l.fr ])).withExts (e: [ + phpbb = (pkgs.webapps-phpbb.withLangs (l: [ l.fr ])).withExts (e: [ e.alfredoramos.markdown e.davidiq.mailinglist e.dmzx.mchat e.empteintesduweb.monitoranswers e.lr94.autosubscribe e.phpbbmodders.adduser ]); }; + webhooks-bin-env = pkgs.buildEnv { + name = "webhook-env"; + paths = [ pkgs.apprise ]; + pathsToLink = [ "/bin" ]; + }; webhooks = pkgs.callPackage ./webhooks.nix { env = config.myEnv.tools.webhooks; + binEnv = webhooks-bin-env; }; dmarc-reports = pkgs.callPackage ./dmarc_reports.nix { env = config.myEnv.tools.dmarc_reports; inherit config; }; - csp-reports = pkgs.callPackage ./csp_reports.nix { - env = config.myEnv.tools.csp_reports; - }; - landing = pkgs.callPackage ./landing.nix {}; + landing = pkgs.callPackage ./landing.nix { }; cfg = config.myServices.websites.tools.tools; pcfg = config.services.phpfpm.pools; in { - imports = - builtins.attrValues (flakeCompat ../../../../../flakes/private/paste).nixosModules; - options.myServices.websites.tools.tools = { enable = lib.mkEnableOption "enable tools website"; }; config = lib.mkIf cfg.enable { + # Services needing to send e-mails + myServices.dns.zones."immae.eu".emailPolicies."tools".receive = true; + myServices.dns.zones."immae.eu".subdomains = + with config.myServices.dns.helpers; + { + outils = ips servers.eldiron.ips.main; + tools = lib.mkMerge [ + (mailCommon "immae.eu") + mailSend + (ips servers.eldiron.ips.main) + ]; + }; + + myServices.chatonsProperties.services = { + adminer = adminer.chatonsProperties; + dokuwiki = dokuwiki.chatonsProperties; + shaarli = shaarli.chatonsProperties; + ttrss = ttrss.chatonsProperties; + wallabag = wallabag.chatonsProperties; + paste = { + file.datetime = "2022-08-22T00:15:00"; + service = { + name = "Paste"; + description = "A simple paster script with syntax highlight"; + website = "https://tools.immae.eu/paste/"; + logo = "https://assets.immae.eu/logo.jpg"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://tools.immae.eu/paste/"; + }; + software = { + name = "Paste"; + website = "https://tools.immae.eu/paste/"; + license.url = "https://tools.immae.eu/paste/license"; + license.name = "MIT License"; + version = "Unversioned"; + source.url = "https://tools.immae.eu/paste/abcd123/py"; + }; + }; + }; + myServices.chatonsProperties.hostings = { + dokuwiki = dokuwiki.chatonsHostingProperties; + phpbb = phpbb.chatonsHostingProperties; + }; secrets.keys = kanboard.keys // ldap.keys @@ -87,9 +139,20 @@ in { // wallabag.keys // yourls.keys // dmarc-reports.keys - // csp-reports.keys - // webhooks.keys; - + // webhooks.keys + // ({ "webapps/tools-landing-sql-rw" = { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0400"; + text = let + env = config.myEnv.tools.landing; + in '' + SetEnv PGUSER "${env.postgresql.user}" + SetEnv PGPASSWORD "${env.postgresql.password}" + SetEnv PGDATABASE "${env.postgresql.database}" + SetEnv PGHOST "${env.postgresql.socket}" + ''; + }; }); services.websites.env.tools.modules = [ "proxy_fcgi" ] ++ adminer.apache.modules @@ -105,10 +168,12 @@ in { ++ ldap.apache.modules ++ kanboard.apache.modules; + myServices.dns.zones."immae.dev" = with config.myServices.dns.helpers; { + subdomains.tools = ips servers.eldiron.ips.integration; + }; + security.acme.certs.integration.domain = "tools.immae.dev"; services.websites.env.integration.vhostConfs.devtools = { certName = "integration"; - certMainHost = "tools.immae.dev"; - addToCerts = true; hosts = [ "tools.immae.dev" ]; root = "/var/lib/ftp/immae/devtools"; extraConfig = [ @@ -129,9 +194,10 @@ in { ]; }; + + security.acme.certs.eldiron.extraDomainNames = [ "outils.immae.eu" "tools.immae.eu" ]; services.websites.env.tools.vhostConfs.tools = { certName = "eldiron"; - addToCerts = true; hosts = ["tools.immae.eu" ]; root = landing; extraConfig = [ @@ -141,6 +207,7 @@ in { RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse <Directory "${landing}"> + Include ${config.secrets.fullPaths."webapps/tools-landing-sql-rw"} DirectoryIndex index.html AllowOverride None Require all granted @@ -160,7 +227,7 @@ in { (dokuwiki.apache.vhostConf pcfg.dokuwiki.socket) (ldap.apache.vhostConf pcfg.ldap.socket) (kanboard.apache.vhostConf pcfg.kanboard.socket) - (grocy.apache.vhostConf pcfg.grocy.socket) + (grocy'.apache.vhostConf pcfg.grocy.socket) (phpbb.apache.vhostConf pcfg.phpbb.socket) (dmarc-reports.apache.vhostConf pcfg.dmarc-reports.socket) '' @@ -175,6 +242,20 @@ in { ProxyPreserveHost on </Location> + <Location "/ntfy/"> + SetEnv proxy-nokeepalive 1 + SetEnv proxy-sendchunked 1 + LimitRequestBody 102400 + + RewriteEngine On + + # FIXME: why is landing prefixed in the url? + RewriteCond %{HTTP:Upgrade} websocket [NC] + RewriteCond %{HTTP:Connection} upgrade [NC] + RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|ws://tools.immae.eu/$2 [P,NE,QSA,L] + + RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|http://tools.immae.eu/$2 [P,NE,QSA,L] + </Location> Alias /BIP39 /var/lib/buildbot/outputs/immae/bip39 <Directory "/var/lib/buildbot/outputs/immae/bip39"> DirectoryIndex index.html @@ -185,6 +266,7 @@ in { Alias /webhooks ${config.secrets.fullPaths."webapps/webhooks"} <Directory "${config.secrets.fullPaths."webapps/webhooks"}"> Options -Indexes + DirectoryIndex index.php Require all granted AllowOverride None <FilesMatch "\.php$"> @@ -197,7 +279,6 @@ in { services.websites.env.tools.vhostConfs.outils = { certName = "eldiron"; - addToCerts = true; hosts = [ "outils.immae.eu" ]; root = null; extraConfig = [ @@ -261,6 +342,18 @@ in { after = lib.mkAfter yourls.phpFpm.serviceDeps; wants = yourls.phpFpm.serviceDeps; }; + ntfy = { + description = "send push notifications to your phone or desktop via scripts from any computer"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + ExecStart = "${pkgs.ntfy-sh}/bin/ntfy serve --listen-http '' --listen-unix %t/ntfy/ntfy.sock --cache-file %S/ntfy/cache.db --cache-duration 120h --behind-proxy --attachment-cache-dir %S/ntfy/attachments --base-url https://tools.immae.eu/ntfy"; + Type = "simple"; + WorkingDirectory = "%S/ntfy"; + RuntimeDirectory = "ntfy"; + StateDirectory = "ntfy"; + User = "wwwrun"; + }; + }; ympd = { description = "Standalone MPD Web GUI written in C"; wantedBy = [ "multi-user.target" ]; @@ -303,18 +396,21 @@ in { "pm.min_spare_servers" = "1"; "pm.max_spare_servers" = "10"; + "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Tools:'"; # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "ToolsPHPSESSID"; "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [ "/run/wrappers/bin/sendmail" landing "/tmp" config.secrets.fullPaths."webapps/webhooks" + "${webhooks-bin-env}/bin" ]; - "include" = config.secrets.fullPaths."webapps/tools-csp-reports.conf"; }; phpEnv = { CONTACT_EMAIL = config.myEnv.tools.contact; }; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); }; devtools = { user = "wwwrun"; @@ -328,92 +424,92 @@ in { "pm.min_spare_servers" = "1"; "pm.max_spare_servers" = "10"; + "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Devtools:'"; "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:/var/lib/ftp/immae/devtools:/tmp"; }; - phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.redis all.apcu all.opcache ]); + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.sqlite3 all.redis all.apcu all.opcache ]); }; adminer = adminer.phpFpm; ttrss = { user = "wwwrun"; group = "wwwrun"; settings = ttrss.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; wallabag = { user = "wwwrun"; group = "wwwrun"; settings = wallabag.phpFpm.pool; - phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]); + phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy all.redis]); }; yourls = { user = "wwwrun"; group = "wwwrun"; settings = yourls.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; rompr = { user = "wwwrun"; group = "wwwrun"; settings = rompr.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; shaarli = { user = "wwwrun"; group = "wwwrun"; settings = shaarli.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; dmarc-reports = { user = "wwwrun"; group = "wwwrun"; settings = dmarc-reports.phpFpm.pool; phpEnv = dmarc-reports.phpFpm.phpEnv; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; dokuwiki = { user = "wwwrun"; group = "wwwrun"; settings = dokuwiki.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; phpbb = { user = "wwwrun"; group = "wwwrun"; settings = phpbb.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; ldap = { user = "wwwrun"; group = "wwwrun"; settings = ldap.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; kanboard = { user = "wwwrun"; group = "wwwrun"; settings = kanboard.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; grocy = { user = "wwwrun"; group = "wwwrun"; - settings = grocy.phpFpm.pool; - phpPackage = pkgs.php72; + settings = grocy'.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; }; system.activationScripts = { - adminer = adminer.activationScript; - grocy = grocy.activationScript; + grocy = grocy'.activationScript; ttrss = ttrss.activationScript; wallabag = wallabag.activationScript; - yourls = yourls.activationScript; rompr = rompr.activationScript; shaarli = shaarli.activationScript; dokuwiki = dokuwiki.activationScript; phpbb = phpbb.activationScript; kanboard = kanboard.activationScript; - ldap = ldap.activationScript; }; services.websites.env.tools.watchPaths = [ @@ -424,6 +520,28 @@ in { paths = [ config.secrets.fullPaths."webapps/tools-wallabag" ]; }; + myServices.monitoring.fromMasterActivatedPlugins = lib.mkMerge [ + ttrss.monitoringPlugins + rompr.monitoringPlugins + wallabag.monitoringPlugins + yourls.monitoringPlugins + ympd.monitoringPlugins + dokuwiki.monitoringPlugins + shaarli.monitoringPlugins + ldap.monitoringPlugins + adminer.monitoringPlugins + ]; + myServices.monitoring.fromMasterObjects = lib.mkMerge [ + ttrss.monitoringObjects + rompr.monitoringObjects + wallabag.monitoringObjects + yourls.monitoringObjects + ympd.monitoringObjects + dokuwiki.monitoringObjects + shaarli.monitoringObjects + ldap.monitoringObjects + adminer.monitoringObjects + ]; }; } diff --git a/modules/private/websites/tools/tools/dmarc_reports.nix b/systems/eldiron/websites/tools/dmarc_reports.nix similarity index 86% rename from modules/private/websites/tools/tools/dmarc_reports.nix rename to systems/eldiron/websites/tools/dmarc_reports.nix index 8a77b13..8b3aa99 100644 --- a/modules/private/websites/tools/tools/dmarc_reports.nix +++ b/systems/eldiron/websites/tools/dmarc_reports.nix @@ -10,7 +10,7 @@ rec { $dbname = "${env.mysql.database}"; $dbuser = "${env.mysql.user}"; $dbpass = "${env.mysql.password}"; - $dbport = "${env.mysql.port}"; + $dbport = "${builtins.toString env.mysql.port}"; $anonymous_key = "${env.anonymous_key}"; ?> ''; @@ -49,6 +49,8 @@ rec { "pm.max_children" = "60"; "pm.process_idle_timeout" = "60"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:DmarcReports:'"; # Needed to avoid clashes in browser cookies (same domain) "php_admin_value[open_basedir]" = "${basedir}:/tmp"; }; diff --git a/modules/private/websites/tools/tools/dmarc_reports/api.php b/systems/eldiron/websites/tools/dmarc_reports/api.php similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/api.php rename to systems/eldiron/websites/tools/dmarc_reports/api.php diff --git a/modules/private/websites/tools/tools/dmarc_reports/app.js b/systems/eldiron/websites/tools/dmarc_reports/app.js similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/app.js rename to systems/eldiron/websites/tools/dmarc_reports/app.js diff --git a/modules/private/websites/tools/tools/dmarc_reports/default.css b/systems/eldiron/websites/tools/dmarc_reports/default.css similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/default.css rename to systems/eldiron/websites/tools/dmarc_reports/default.css diff --git a/modules/private/websites/tools/tools/dmarc_reports/index.html b/systems/eldiron/websites/tools/dmarc_reports/index.html similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/index.html rename to systems/eldiron/websites/tools/dmarc_reports/index.html diff --git a/systems/eldiron/websites/tools/dokuwiki.nix b/systems/eldiron/websites/tools/dokuwiki.nix new file mode 100644 index 0000000..813c426 --- /dev/null +++ b/systems/eldiron/websites/tools/dokuwiki.nix @@ -0,0 +1,106 @@ +{ lib, stdenv, dokuwiki, dokuwiki-plugins, config }: +rec { + varDir = "/var/lib/dokuwiki"; + activationScript = { + deps = [ "wrappers" ]; + text = '' + if [ ! -d ${varDir} ]; then + install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ + ${varDir}/animals + cp -a ${webRoot}/conf.dist ${varDir}/conf + cp -a ${webRoot}/data.dist ${varDir}/data + cp -a ${webRoot}/ + chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data + chmod -R 755 ${varDir}/config ${varDir}/data + fi + ''; + }; + chatonsHostingProperties = { + file.datetime = "2022-08-21T22:50:00"; + hosting = { + name = "Dokuwiki"; + description = "DokuWiki is a simple to use and highly versatile Open Source wiki software"; + website = "https://tools.immae.eu/dokuwiki/"; + logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "Dokuwiki"; + description = "DokuWiki is a simple to use and highly versatile Open Source wiki software"; + website = "https://tools.immae.eu/dokuwiki/"; + logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Dokuwiki"; + website = "https://www.dokuwiki.org/dokuwiki"; + license.url = "http://www.gnu.org/licenses/gpl-2.0.html"; + license.name = "GNU General Public License Version 2"; + version = webRoot.version; + source.url = "https://download.dokuwiki.org/"; + modules = map (a: a.pluginName) webRoot.plugins; + }; + }; + webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]); + apache = rec { + user = "wwwrun"; + group = "wwwrun"; + modules = [ "proxy_fcgi" ]; + root = webRoot; + vhostConf = socket: '' + Alias /dokuwiki "${root}" + <Directory "${root}"> + DirectoryIndex index.php + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${socket}|fcgi://localhost" + </FilesMatch> + + AllowOverride All + Options +FollowSymlinks + Require all granted + </Directory> + ''; + }; + phpFpm = rec { + serviceDeps = [ "openldap.service" ]; + basedir = builtins.concatStringsSep ":" ( + [ webRoot varDir ] ++ webRoot.plugins); + pool = { + "listen.owner" = apache.user; + "listen.group" = apache.group; + "pm" = "ondemand"; + "pm.max_children" = "60"; + "pm.process_idle_timeout" = "60"; + + # Needed to avoid clashes in browser cookies (same domain) + "php_value[session.name]" = "DokuwikiPHPSESSID"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Dokuwiki:'"; + }; + }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "dokuwiki website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Dokuwiki"; + _webstatus_url = "https://tools.immae.eu/dokuwiki/"; + } + ]; +} diff --git a/modules/private/websites/tools/tools/grocy.nix b/systems/eldiron/websites/tools/grocy.nix similarity index 86% rename from modules/private/websites/tools/tools/grocy.nix rename to systems/eldiron/websites/tools/grocy.nix index 3c45261..96e18a3 100644 --- a/modules/private/websites/tools/tools/grocy.nix +++ b/systems/eldiron/websites/tools/grocy.nix @@ -5,7 +5,6 @@ rec { deps = [ "wrappers" ]; text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; webRoot = grocy.webRoot; @@ -41,7 +40,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "grocyPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Grocy:'"; }; }; } diff --git a/modules/private/websites/tools/tools/kanboard.nix b/systems/eldiron/websites/tools/kanboard.nix similarity index 56% rename from modules/private/websites/tools/tools/kanboard.nix rename to systems/eldiron/websites/tools/kanboard.nix index 4809a42..db39ecd 100644 --- a/modules/private/websites/tools/tools/kanboard.nix +++ b/systems/eldiron/websites/tools/kanboard.nix @@ -5,7 +5,6 @@ rec { deps = [ "wrappers" ]; text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config ''; @@ -15,30 +14,28 @@ rec { group = apache.group; permissions = "0400"; text = '' - <?php - define('MAIL_FROM', 'kanboard@tools.immae.eu'); + SetEnv MAIL_FROM "kanboard@tools.immae.eu" - define('DB_DRIVER', 'postgres'); - define('DB_USERNAME', '${env.postgresql.user}'); - define('DB_PASSWORD', '${env.postgresql.password}'); - define('DB_HOSTNAME', '${env.postgresql.socket}'); - define('DB_NAME', '${env.postgresql.database}'); + SetEnv DB_DRIVER "postgres" + SetEnv DB_USERNAME "${env.postgresql.user}" + SetEnv DB_PASSWORD "${env.postgresql.password}" + SetEnv DB_HOSTNAME "${env.postgresql.socket}" + SetEnv DB_NAME "${env.postgresql.database}" - define('DATA_DIR', '${varDir}'); - define('LDAP_AUTH', true); - define('LDAP_SERVER', '${env.ldap.host}'); - define('LDAP_START_TLS', true); + SetEnv DATA_DIR "${varDir}" + SetEnv LDAP_AUTH "true" + SetEnv LDAP_SERVER "${env.ldap.host}" + SetEnv LDAP_START_TLS "true" - define('LDAP_BIND_TYPE', 'proxy'); - define('LDAP_USERNAME', '${env.ldap.dn}'); - define('LDAP_PASSWORD', '${env.ldap.password}'); - define('LDAP_USER_BASE_DN', '${env.ldap.base}'); - define('LDAP_USER_FILTER', '${env.ldap.filter}'); - define('LDAP_GROUP_ADMIN_DN', '${env.ldap.admin_dn}'); - ?> + SetEnv LDAP_BIND_TYPE "proxy" + SetEnv LDAP_USERNAME "${env.ldap.dn}" + SetEnv LDAP_PASSWORD "${env.ldap.password}" + SetEnv LDAP_USER_BASE_DN "${env.ldap.base}" + SetEnv LDAP_USER_FILTER "${env.ldap.filter}" + SetEnv LDAP_GROUP_ADMIN_DN "${env.ldap.admin_dn}" ''; }; - webRoot = kanboard { kanboard_config = config.secrets.fullPaths."webapps/tools-kanboard"; }; + webRoot = kanboard; apache = rec { user = "wwwrun"; group = "wwwrun"; @@ -46,6 +43,9 @@ rec { root = webRoot; vhostConf = socket: '' Alias /kanboard "${root}" + <Location /kanboard> + Include ${config.secrets.fullPaths."webapps/tools-kanboard"} + </Location> <Directory "${root}"> DirectoryIndex index.php AllowOverride All @@ -63,7 +63,7 @@ rec { }; phpFpm = rec { serviceDeps = [ "postgresql.service" "openldap.service" ]; - basedir = builtins.concatStringsSep ":" [ webRoot varDir config.secrets.fullPaths."webapps/tools-kanboard" ]; + basedir = builtins.concatStringsSep ":" [ webRoot varDir ]; pool = { "listen.owner" = apache.user; "listen.group" = apache.group; @@ -74,7 +74,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "KanboardPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Kanboard:'"; }; }; } diff --git a/systems/eldiron/websites/tools/landing.nix b/systems/eldiron/websites/tools/landing.nix new file mode 100644 index 0000000..f5d851e --- /dev/null +++ b/systems/eldiron/websites/tools/landing.nix @@ -0,0 +1,38 @@ +{ stdenv, yarn2nix-moretea, nodejs_16 }: +let + source = builtins.fetchGit { + url = "https://git.immae.eu/github/bastienwirtz/homer.git"; + ref = "gitolite_local/local_changes"; + rev = "bb60c5b869931f305f15c5bfa9cdb3f68702f01f"; + narHash = "sha256-xBIBUJhQ7KPY0d92pW9ErA9OvGafWcxyuGkbHShF4Bs="; + }; + yarnModules = yarn2nix-moretea.mkYarnModules rec { + nodejs = nodejs_16; + name = "landing"; + pname = name; + version = "v1.0.0"; + packageJSON = "${source}/package.json"; + yarnLock = "${source}/yarn.lock"; + yarnNix = ./landing/yarn-packages.nix; + }; +in + stdenv.mkDerivation rec { + pname = "landing"; + version = "v1.0.0"; + src = source; + + buildInputs = [ yarnModules yarn2nix-moretea.yarn ]; + configurePhase = '' + ln -s ${yarnModules}/node_modules . + ''; + buildPhase = '' + # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no + export NODE_OPTIONS=--openssl-legacy-provider + yarn build + ''; + installPhase = '' + cp -a dist $out + cp ${./landing}/*.php $out/ + ln -s service-worker.js $out/worker.js + ''; + } diff --git a/modules/private/websites/tools/tools/landing/ldap_password.php b/systems/eldiron/websites/tools/landing/ldap_password.php similarity index 80% rename from modules/private/websites/tools/tools/landing/ldap_password.php rename to systems/eldiron/websites/tools/landing/ldap_password.php index b6079e5..efb4f57 100644 --- a/modules/private/websites/tools/tools/landing/ldap_password.php +++ b/systems/eldiron/websites/tools/landing/ldap_password.php @@ -18,6 +18,42 @@ $message = array(); $message_css = ""; +function changePasswordLDAP($con, $user_dn, $newPassword){ + global $message; + $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4); + $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt); + + $entry = array(); + $entry["userPassword"] = "$encoded_newPassword"; + + if (ldap_modify($con,$user_dn,$entry) === false){ + $error = ldap_error($con); + $errno = ldap_errno($con); + $message[] = "$errno - $error"; + return false; + } else { + return true; + } +} + +function changePasswordSQL($user_realm, $newPassword) { + global $message; + + foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) { + if (isset($_SERVER[$k]) && !isset($_ENV[$k])) { + putenv("${k}=" . $_SERVER[$k]); + } + } + $con = pg_connect(""); + $result = pg_query_params($con, "WITH newsalt as (SELECT gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( $1 || (SELECT * FROM newsalt), 'sha1'), 'hex'), mechanism = 'SSHA', salt = (SELECT * FROM newsalt) where login || '@' || realm = $2", array($newPassword, $user_realm)); + if (!$result) { + $message[] = "Error when accessing database"; + return false; + } else { + return true; + } +} + function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){ global $message; global $message_css; @@ -46,26 +82,20 @@ function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){ return false; } - $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4); - $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt); - $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)"); $auth_entry = ldap_first_entry($con, $user_search); - $mail_addresses = ldap_get_values($con, $auth_entry, "mail"); - $given_names = ldap_get_values($con, $auth_entry, "givenName"); - $mail_address = $mail_addresses[0]; - $first_name = $given_names[0]; - - /* And Finally, Change the password */ - $entry = array(); - $entry["userPassword"] = "$encoded_newPassword"; + $mail_address = ldap_get_values($con, $auth_entry, "mail")[0]; + $first_name = ldap_get_values($con, $auth_entry, "givenName")[0]; + $existing_password = ldap_get_values($con, $auth_entry, "userPassword")[0]; + if (substr($existing_password, 0, 6) == "{SASL}") { + $result = changePasswordSQL(substr($existing_password, 6), $newPassword); + } else { + $result = changePasswordLDAP($con, $user_dn, $newPassword); + } - if (ldap_modify($con,$user_dn,$entry) === false){ - $error = ldap_error($con); - $errno = ldap_errno($con); + if (!$result) { $message[] = "E201 - Your password cannot be changed, please contact the administrator."; - $message[] = "$errno - $error"; } else { $message_css = "yes"; mail($mail_address,"Password change notice","Dear $first_name, diff --git a/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php similarity index 75% rename from modules/private/websites/tools/tools/landing/ldap_ssh_keys.php rename to systems/eldiron/websites/tools/landing/ldap_ssh_keys.php index 259e28d..85ed973 100644 --- a/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php +++ b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php @@ -78,33 +78,14 @@ function checkSshKey($sshKey) function isUserLogged() { - return (isset($_SESSION["login"]) && doConnect() !== NULL); -} - -function doConnect() -{ - global $connection; - $server = "ldaps://ldap.immae.eu"; - - if ($connection === NULL) { - $connection = ldap_connect($server); - ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3); - if (isset($_SESSION["user_dn"]) && isset($_SESSION["password"])) { - if (ldap_bind($connection, $_SESSION["user_dn"], $_SESSION["password"]) === false) { - $connection = NULL; - unset($_SESSION["user_dn"]); - unset($_SESSION["password"]); - unset($_SESSION["login"]); - } - } - } - - return $connection; + return (isset($_SESSION["login"])); } function checkLogin($user, $password) { - $con = doConnect(); + $server = "ldaps://ldap.immae.eu"; + $con = ldap_connect($server); + ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3); $user_dn = "uid=$user,ou=users,dc=immae,dc=eu"; @@ -112,7 +93,6 @@ function checkLogin($user, $password) return false; } $_SESSION["user_dn"] = $user_dn; - $_SESSION["password"] = $password; $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)"); $auth_entry = ldap_first_entry($con, $user_search); @@ -120,48 +100,61 @@ function checkLogin($user, $password) return true; } -function getLdapInfo() -{ - $con = doConnect(); - if (!isset($_SESSION["user_dn"])) { - $sortieLdap = []; - } else { - $user_read = ldap_read($con, $_SESSION["user_dn"], "(objectclass=*)", array("uid","immaeSshKey")); - $user_entry = ldap_first_entry($con, $user_read); - $sortieLdap = ldap_get_values($con, $user_entry, "immaeSshKey"); - unset($sortieLdap["count"]); - } - - $keys = []; - foreach ($sortieLdap as $line) { - $exploded = explode(' ', $line); - - $apps = explode('|', $exploded[0]); - $publicKey = $exploded[1] . ' ' . $exploded[2]; - - unset($exploded[0]); - unset($exploded[1]); - unset($exploded[2]); - - $comment = implode(' ', $exploded); - - $keys[] = [ - 'apps' => $apps, - 'public_key' => $publicKey, - 'comment' => $comment, - ]; +function connectPg() { + foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) { + if (isset($_SERVER[$k]) && !isset($_ENV[$k])) { + putenv("${k}=" . $_SERVER[$k]); } + } + $con = pg_connect(""); + if (!$con) { + die("database access error"); + } + return $con; +} +function getKeys() +{ + $keys = []; + if (!isset($_SESSION["login"])) return $keys; + $pg = connectPg(); + $result = pg_query_params($pg, "SELECT id,key,array_to_json(usage) as usage,comment FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1 ORDER BY id", array($_SESSION["login"])); + if (!$result) { + die("database access error"); + } + $keys = []; + while ($row = pg_fetch_assoc($result)) { + $keys[] = array( + 'id' => $row["id"], + 'apps' => json_decode($row["usage"]), + 'public_key' => $row["key"], + 'comment' => $row["comment"], + ); + } + + pg_close($pg); + return $keys; } -function pushLdapInfos($keys) +function saveKeys($keys) { - $con = doConnect(); - if (!isset($_SESSION["user_dn"])) - return false; - - return ldap_mod_replace($con, $_SESSION["user_dn"], array("immaeSshKey" => $keys)); + if (!isset($_SESSION["login"])) { + return false; + } + $pg = connectPg(); + $existingIds = pg_fetch_all_columns(pg_query_params($pg, "SELECT id FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1", array($_SESSION["login"]))); + foreach ($keys as $key) { + if (isset($key["id"])) { + unset($existingIds[array_search($key["id"],$existingIds)]); + pg_query_params($pg, "UPDATE ldap_users_ssh_keys SET key = $2, usage = ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[], comment = $4 WHERE id = $5 AND login = $1 AND realm = 'immae'", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"], $key["id"])); + } else { + pg_query_params($pg, "INSERT INTO ldap_users_ssh_keys (login,realm,key,usage,comment) values ($1,'immae',$2,ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[],$4)", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"])); + } + } + foreach ($existingIds as $removedKeyId) { + pg_query_params($pg, "DELETE FROM ldap_users_ssh_keys WHERE login = $1 AND realm = 'immae' AND id = $2", array($_SESSION["login"], $removedKeyId)); + } } @@ -192,12 +185,12 @@ if (isset($_POST['sauvegarder'])) { } if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) { - $keysToSave[] = implode('|', $key['apps']) . ' ' . $key['public_key'] . ' ' . $key['comment']; + $keysToSave[] = $key; } } if (!$errors) { - $successSave = pushLdapInfos($keysToSave); + $successSave = saveKeys($keysToSave); } } @@ -213,7 +206,7 @@ if (isset($_POST['login'])) { } if (isUserLogged()) : - $keys = isset($editedKeys) ? $editedKeys : getLdapInfo(); + $keys = isset($editedKeys) ? $editedKeys : getKeys(); ?> <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p> @@ -246,7 +239,7 @@ if (isUserLogged()) : ?> <td><input type="checkbox" name="keys[<?= $id ?>][apps][]" value="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td> <?php endforeach; ?> - <td class="delete-button" rowspan="2"><button class="delete">Suppr.</button></td> + <td class="delete-button" rowspan="2"><input type="hidden" name="keys[<?= $id ?>][id]" value="<?= $sshKey["id"] ?>"><button class="delete">Suppr.</button></td> </tr> <tr class="sshkeyrow"> <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[<?= $id ?>][public_key]" <?php if (isset($sshKey['error']) && $sshKey['error'] === true) :?>style="color: red"<?php endif; ?>><?= $sshKey['public_key'] ?></textarea></td> @@ -267,6 +260,8 @@ if (isUserLogged()) : function deleteLine(element) { element.addEventListener('click', function(e) { e.preventDefault(); + e.target.closest('tr').nextElementSibling.remove(); + e.target.closest('tr').previousElementSibling.remove(); e.target.closest('tr').remove(); }, false); } @@ -306,7 +301,7 @@ if (isUserLogged()) : </tr>`; newLine += `<tr class="sshkeyrow"> - <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[$[i}][public_key]"></textarea></td> + <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[${i}][public_key]"></textarea></td> </tr>`; diff --git a/modules/private/websites/tools/tools/landing/myip.php b/systems/eldiron/websites/tools/landing/myip.php similarity index 100% rename from modules/private/websites/tools/tools/landing/myip.php rename to systems/eldiron/websites/tools/landing/myip.php diff --git a/modules/private/websites/tools/tools/landing/node-packages.nix b/systems/eldiron/websites/tools/landing/node-packages.nix similarity index 100% rename from modules/private/websites/tools/tools/landing/node-packages.nix rename to systems/eldiron/websites/tools/landing/node-packages.nix diff --git a/modules/private/websites/tools/tools/landing/yarn-packages.nix b/systems/eldiron/websites/tools/landing/yarn-packages.nix similarity index 100% rename from modules/private/websites/tools/tools/landing/yarn-packages.nix rename to systems/eldiron/websites/tools/landing/yarn-packages.nix diff --git a/modules/private/websites/tools/tools/ldap.nix b/systems/eldiron/websites/tools/ldap.nix similarity index 74% rename from modules/private/websites/tools/tools/ldap.nix rename to systems/eldiron/websites/tools/ldap.nix index 2ca59f7..9509169 100644 --- a/modules/private/websites/tools/tools/ldap.nix +++ b/systems/eldiron/websites/tools/ldap.nix @@ -1,11 +1,5 @@ { lib, php, env, writeText, phpldapadmin, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/phpldapadmin - ''; - }; keys."webapps/tools-ldap" = { user = apache.user; group = apache.group; @@ -62,8 +56,22 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "LdapPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpLDAPAdmin:'"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "ldap website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "LDAP"; + _webstatus_url = "https://tools.immae.eu/ldap/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/phpbb.nix b/systems/eldiron/websites/tools/phpbb.nix similarity index 71% rename from modules/private/websites/tools/tools/phpbb.nix rename to systems/eldiron/websites/tools/phpbb.nix index 77845c3..c1cbd6f 100644 --- a/modules/private/websites/tools/tools/phpbb.nix +++ b/systems/eldiron/websites/tools/phpbb.nix @@ -9,9 +9,22 @@ rec { cp -a ${phpbb}/vars/* ${varDir} chown -R ${apache.user}:${apache.user} ${varDir} fi - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; + chatonsHostingProperties = { + file.datetime = "2022-08-21T22:50:00"; + hosting = { + name = "phpBB"; + description = "Forum software"; + website = "https://tools.immae.eu/forum"; + logo = "https://www.phpbb.com/favicon.ico"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; webRoot = phpbb; apache = rec { user = "wwwrun"; @@ -49,7 +62,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "PhpBBPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpBB:'"; }; }; } diff --git a/modules/private/websites/tools/tools/rompr.nix b/systems/eldiron/websites/tools/rompr.nix similarity index 75% rename from modules/private/websites/tools/tools/rompr.nix rename to systems/eldiron/websites/tools/rompr.nix index e80d6b2..a7308ce 100644 --- a/modules/private/websites/tools/tools/rompr.nix +++ b/systems/eldiron/websites/tools/rompr.nix @@ -1,9 +1,9 @@ -{ lib, env, rompr }: +{ lib, env, rompr, config }: rec { varDir = "/var/lib/rompr"; activationScript = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ - ${varDir}/prefs ${varDir}/albumart ${varDir}/phpSessions + ${varDir}/prefs ${varDir}/albumart ''; webRoot = rompr; apache = rec { @@ -57,7 +57,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "RomprPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rompr:'"; "php_flag[magic_quotes_gpc]" = "Off"; "php_flag[track_vars]" = "On"; "php_flag[register_globals]" = "Off"; @@ -69,4 +70,17 @@ rec { "php_admin_value[memory_limit]" = "256M"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "rompr mpd website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "MPD (ROMPR)"; + _webstatus_url = "https://tools.immae.eu/rompr/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/shaarli.nix b/systems/eldiron/websites/tools/shaarli.nix similarity index 57% rename from modules/private/websites/tools/tools/shaarli.nix rename to systems/eldiron/websites/tools/shaarli.nix index d128465..35f1edb 100644 --- a/modules/private/websites/tools/tools/shaarli.nix +++ b/systems/eldiron/websites/tools/shaarli.nix @@ -4,10 +4,9 @@ let in rec { activationScript = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ - ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data \ - ${varDir}/phpSessions + ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data ''; - webRoot = shaarli varDir; + webRoot = shaarli.override { inherit varDir; }; apache = rec { user = "wwwrun"; group = "wwwrun"; @@ -33,6 +32,29 @@ in rec { </Directory> ''; }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "Shaarli"; + description = "The personal, minimalist, super-fast, database free, bookmarking service - community repo"; + website = "https://tools.immae.eu/Shaarli/"; + logo = "https://tools.immae.eu/Shaarli/tpl/default/img/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Shaarli"; + website = "https://shaarli.readthedocs.io/"; + license.url = "https://github.com/shaarli/Shaarli/blob/master/COPYING"; + license.name = "GNU General Public License Version 3"; + version = webRoot.version; + source.url = "https://github.com/shaarli/Shaarli"; + modules = "ldap-connection-patch"; + }; + }; keys."webapps/tools-shaarli" = { user = apache.user; group = apache.group; @@ -58,9 +80,23 @@ in rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "ShaarliPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Shaarli:'"; "php_admin_value[upload_max_filesize]" = "200M"; "php_admin_value[post_max_size]" = "200M"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "shaarli website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Shaarli"; + _webstatus_url = "https://tools.immae.eu/Shaarli/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/ttrss.nix b/systems/eldiron/websites/tools/ttrss.nix similarity index 72% rename from modules/private/websites/tools/tools/ttrss.nix rename to systems/eldiron/websites/tools/ttrss.nix index 1dc99ed..6393256 100644 --- a/modules/private/websites/tools/tools/ttrss.nix +++ b/systems/eldiron/websites/tools/ttrss.nix @@ -13,13 +13,36 @@ rec { ${varDir}/cache/simplepie/ \ ${varDir}/cache/upload/ touch ${varDir}/feed-icons/index.html - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "RSS"; + description = "Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator"; + website = "https://tools.immae.eu/ttrss/"; + logo = "https://tools.immae.eu/ttrss/images/favicon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Tiny Tiny RSS"; + website = "https://tt-rss.org/"; + license.url = "https://www.gnu.org/copyleft/gpl.html"; + license.name = "GNU General Public License Version 3"; + version = webRoot.version; + source.url = "https://git.tt-rss.org/fox/tt-rss.git/"; + modules = map (p: p.pluginName) webRoot.plugins; + }; + }; keys."webapps/tools-ttrss" = { user = apache.user; group = apache.group; permissions = "0400"; + keyDependencies = [ php ]; text = '' <?php @@ -57,6 +80,7 @@ rec { define('LOG_DESTINATION', '''); define('CONFIG_VERSION', 26); + define('DAEMON_UPDATE_LOGIN_LIMIT', 0); define('SPHINX_SERVER', 'localhost:9312'); define('SPHINX_INDEX', 'ttrss, delta'); @@ -123,7 +147,21 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "TtrssPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:TTRSS:'"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "ttrss website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "TT-RSS"; + _webstatus_url = "https://tools.immae.eu/ttrss/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/wallabag.nix b/systems/eldiron/websites/tools/wallabag.nix similarity index 76% rename from modules/private/websites/tools/tools/wallabag.nix rename to systems/eldiron/websites/tools/wallabag.nix index 0ebdb0b..0a5750d 100644 --- a/modules/private/websites/tools/tools/wallabag.nix +++ b/systems/eldiron/websites/tools/wallabag.nix @@ -64,6 +64,29 @@ rec { arguments: ['/run/wrappers/bin/sendmail -bs'] ''; }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "Wallabag"; + description = "wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely."; + website = "https://tools.immae.eu/wallabag/"; + logo = "https://tools.immae.eu/wallabag/wallassets/themes/_global/img/appicon/apple-touch-icon-120.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Wallabag"; + website = "https://wallabag.org/en"; + license.url = "https://github.com/wallabag/wallabag/blob/master/COPYING.md"; + license.name = "MIT License"; + version = webappDir.version; + source.url = "https://github.com/wallabag/wallabag"; + modules = "ldap-patch"; + }; + }; webappDir = wallabag.override { ldap = true; wallabag_config = config.secrets.fullPaths."webapps/tools-wallabag"; }; activationScript = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ @@ -135,8 +158,23 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "WallabagPHPSESSID"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Wallabag:'"; "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/tmp"; "php_value[max_execution_time]" = "300"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "wallabag website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Wallabag"; + _webstatus_url = "https://tools.immae.eu/wallabag/"; + } + ]; } diff --git a/systems/eldiron/websites/tools/webhooks.nix b/systems/eldiron/websites/tools/webhooks.nix new file mode 100644 index 0000000..337c8f8 --- /dev/null +++ b/systems/eldiron/websites/tools/webhooks.nix @@ -0,0 +1,25 @@ +{ lib, env, binEnv }: +{ + keys = lib.attrsets.mapAttrs' (k: v: + lib.nameValuePair "webapps/webhooks/${k}.php" { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0400"; + text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v; + keyDependencies = [ binEnv ]; + }) env // lib.attrsets.mapAttrs' (k: v: + lib.nameValuePair "webapps/webhooks/${k}/index.php" { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0400"; + text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v; + keyDependencies = [ binEnv ]; + }) env // { + "webapps/webhooks" = { + isDir = true; + user = "wwwrun"; + group = "wwwrun"; + permissions = "0500"; + }; + }; +} diff --git a/modules/private/websites/tools/tools/ympd.nix b/systems/eldiron/websites/tools/ympd.nix similarity index 70% rename from modules/private/websites/tools/tools/ympd.nix rename to systems/eldiron/websites/tools/ympd.nix index 531b1a9..0d8d41d 100644 --- a/modules/private/websites/tools/tools/ympd.nix +++ b/systems/eldiron/websites/tools/ympd.nix @@ -1,4 +1,4 @@ -{ env }: +{ env, config }: let ympd = rec { config = { @@ -37,4 +37,18 @@ let }; }; in - ympd + ympd // { + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "mpd website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "MPD (YMPD)"; + _webstatus_url = "https://tools.immae.eu/mpd/"; + } + ]; + } diff --git a/modules/private/websites/tools/tools/yourls.nix b/systems/eldiron/websites/tools/yourls.nix similarity index 64% rename from modules/private/websites/tools/tools/yourls.nix rename to systems/eldiron/websites/tools/yourls.nix index 3717520..9e54b0d 100644 --- a/modules/private/websites/tools/tools/yourls.nix +++ b/systems/eldiron/websites/tools/yourls.nix @@ -1,11 +1,5 @@ { env, yourls, yourls-plugins, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/yourls - ''; - }; keys."webapps/tools-yourls" = { user = apache.user; group = apache.group; @@ -39,6 +33,29 @@ rec { define( 'LDAPAUTH_USERCACHE_TYPE', 0); ''; }; + chatonsProperties = { + file.datetime = "2022-08-27T18:00:00"; + service = { + name = "Yourls"; + description = "Your own URL shortener"; + website = "https://tools.immae.eu/url/admin/"; + logo = "https://tools.immae.eu/url/images/favicon.gif"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "FULL"; + install.type = "PACKAGE"; + }; + software = { + name = "YOURLS"; + website = "http://yourls.org/"; + license.url = "https://github.com/YOURLS/YOURLS/blob/master/LICENSE"; + license.name = "MIT License"; + version = webRoot.version; + source.url = "https://github.com/YOURLS/YOURLS"; + modules = map (a: a.pluginName) webRoot.plugins; + }; + }; webRoot = (yourls.override { yourls_config = config.secrets.fullPaths."webapps/tools-yourls"; }).withPlugins (p: [p.ldap]); apache = rec { user = "wwwrun"; @@ -79,8 +96,23 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "YourlsPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/yourls"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/yourls"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Yourls:'"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "yourl website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "YOURLS"; + _webstatus_url = "https://tools.immae.eu/url/admin/"; + } + + ]; } diff --git a/systems/eldiron/websites/visio/default.nix b/systems/eldiron/websites/visio/default.nix new file mode 100644 index 0000000..76d1960 --- /dev/null +++ b/systems/eldiron/websites/visio/default.nix @@ -0,0 +1,63 @@ +{ lib, pkgs, config, ... }: +let + port = config.myEnv.ports.galene_port; + cfg = config.myServices.websites.tools.visio; +in { + options.myServices.websites.tools.visio = { + enable = lib.mkEnableOption "enable visio website"; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.visio = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.galene = { + file.datetime = "2022-08-21T22:45:00"; + service = { + name = "Galene"; + description = "The Galène videoconference server"; + website = "https://visio.immae.eu/"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Galene"; + website = "https://galene.org/"; + license.url = "https://github.com/jech/galene/blob/master/LICENCE"; + license.name = "MIT License"; + version = pkgs.galene.version; + source.url = "https://github.com/jech/galene"; + }; + }; + services.galene = { + enable = true; + httpPort = port; + insecure = true; + # hack to bypass module's limitations + dataDir = "/var/lib/galene/data -http localhost:${builtins.toString port}"; + }; + systemd.services.galene.serviceConfig.RestrictAddressFamilies = lib.mkForce [ "AF_INET" "AF_INET6" "AF_NETLINK" ]; + security.acme.certs.eldiron.extraDomainNames = [ "visio.immae.eu" ]; + services.websites.env.tools.vhostConfs.visio = { + certName = "eldiron"; + hosts = ["visio.immae.eu" ]; + root = null; + extraConfig = [ + '' + ProxyPass /ws ws://localhost:${builtins.toString port}/ws + ProxyPassReverse /ws ws://localhost:${builtins.toString port}/ws + + ProxyPass / http://localhost:${builtins.toString port}/ + ProxyPassReverse / http://localhost:${builtins.toString port}/ + + ProxyPreserveHost On + '' + ]; + }; + + }; +} + diff --git a/modules/private/websites/tools/vpn/default.nix b/systems/eldiron/websites/vpn/default.nix similarity index 78% rename from modules/private/websites/tools/vpn/default.nix rename to systems/eldiron/websites/vpn/default.nix index 9cd499b..ea54691 100644 --- a/modules/private/websites/tools/vpn/default.nix +++ b/systems/eldiron/websites/vpn/default.nix @@ -3,9 +3,9 @@ let cfg = config.myServices.vpn; in { config = lib.mkIf cfg.enable { + security.acme.certs.eldiron.extraDomainNames = [ "vpn.immae.eu" ]; services.websites.env.tools.vhostConfs.vpn = { certName = "eldiron"; - addToCerts = true; hosts = [ "vpn.immae.eu" ]; root = ./www; }; diff --git a/modules/private/websites/tools/vpn/www/index.html b/systems/eldiron/websites/vpn/www/index.html similarity index 100% rename from modules/private/websites/tools/vpn/www/index.html rename to systems/eldiron/websites/vpn/www/index.html diff --git a/modules/private/websites/tools/vpn/www/style.css b/systems/eldiron/websites/vpn/www/style.css similarity index 100% rename from modules/private/websites/tools/vpn/www/style.css rename to systems/eldiron/websites/vpn/www/style.css diff --git a/modules/webapps/webstats/default.nix b/systems/eldiron/webstats/default.nix similarity index 90% rename from modules/webapps/webstats/default.nix rename to systems/eldiron/webstats/default.nix index e873af2..0057f64 100644 --- a/modules/webapps/webstats/default.nix +++ b/systems/eldiron/webstats/default.nix @@ -37,7 +37,7 @@ in { }; config = lib.mkIf (builtins.length cfg.sites > 0) { - users.users.root.packages = [ + environment.systemPackages = [ pkgs.goaccess ]; @@ -58,10 +58,10 @@ in { trap "rm -f $TMPFILE" EXIT mkdir -p ${cfg.dataDir}/${domain} - for i in /var/log/httpd/access-${domain}*.gz; do + for i in /var/log/httpd/access-${domain}*.gz /var/log/httpd/*/access-${domain}*.gz; do zcat "$i" >> $TMPFILE done - cat /var/log/httpd/access-${domain}.log > $TMPFILE + cat /var/log/httpd/*access-${domain}.log /var/log/httpd/*/access-${domain}.log > $TMPFILE ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config} ''; in "${d}/bin/stats-${domain}"; diff --git a/modules/webapps/webstats/goaccess.conf b/systems/eldiron/webstats/goaccess.conf similarity index 100% rename from modules/webapps/webstats/goaccess.conf rename to systems/eldiron/webstats/goaccess.conf diff --git a/modules/private/system/monitoring-1.nix b/systems/monitoring-1/base.nix similarity index 75% rename from modules/private/system/monitoring-1.nix rename to systems/monitoring-1/base.nix index dea5f45..8bfacc1 100644 --- a/modules/private/system/monitoring-1.nix +++ b/systems/monitoring-1/base.nix @@ -1,25 +1,31 @@ -{ config, pkgs, resources, ... }: +{ config, pkgs, lib, nixpkgs, php, secrets, ... }: { - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; # ssh-keyscan monitoring-1 | nix-shell -p ssh-to-age --run ssh-to-age secrets.ageKeys = [ "age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k" ]; boot.kernelPackages = pkgs.linuxPackages_latest; - myEnv = import ../../../nixops/secrets/environment.nix; - imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ] ++ builtins.attrValues (import ../..); + imports = [ + secrets.nixosModules.users-config-monitoring-1 + (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") + ./monitoring-master.nix + ./monitoring.nix + ./status.nix + ./status_engine.nix + ]; + + nixpkgs.overlays = builtins.attrValues php.overlays; + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + ]; myServices.monitoring.enable = true; myServices.monitoring.master = true; myServices.status.enable = true; networking = { firewall.enable = true; - interfaces."ens3".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips); + interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)); interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) config.hostEnv.ips); @@ -37,13 +43,13 @@ ]; services.netdata.enable = true; + services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf"; services.netdata.config.web."allow dashboard from" = "localhost"; services.netdata.config.web."allow badges from" = "*"; services.netdata.config.web."allow streaming from" = "*"; services.netdata.config.web."allow netdata.conf from" = "fd*"; services.netdata.config.web."allow management from" = "fd*"; networking.firewall.allowedTCPPorts = [ 19999 ]; - environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf"; secrets.keys = { "netdata-stream.conf" = { @@ -65,5 +71,5 @@ # database servers. You should change this only after NixOS release # notes say you should. # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? + system.stateVersion = "23.05"; # Did you read the comment? } diff --git a/systems/monitoring-1/flake.lock b/systems/monitoring-1/flake.lock new file mode 100644 index 0000000..d4a2c8d --- /dev/null +++ b/systems/monitoring-1/flake.lock @@ -0,0 +1,790 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_4", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_8", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "root": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "files-watcher": "files-watcher", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids", + "nixpkgs": "nixpkgs_5", + "php": "php", + "secrets": "secrets_3", + "system": "system" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_5", + "mypackages": "mypackages", + "myuids": "myuids_2", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/monitoring-1/flake.nix b/systems/monitoring-1/flake.nix new file mode 100644 index 0000000..e97cb05 --- /dev/null +++ b/systems/monitoring-1/flake.nix @@ -0,0 +1,45 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + monitoring.url = "path:../../flakes/private/monitoring"; + mail-relay.url = "path:../../flakes/private/mail-relay"; + chatons.url = "path:../../flakes/private/chatons"; + environment.url = "path:../../flakes/private/environment"; + system.url = "path:../../flakes/private/system"; + php.url = "path:../../flakes/private/php"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + files-watcher.url = "path:../../flakes/files-watcher"; + loginctl-linger.url = "path:../../flakes/loginctl-linger"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "monitoring-1"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "95.216.164.150"; + targetUser = "root"; + nixosModules = { + base = ./base.nix; + system = inputs.system.nixosModule; + mail-relay = inputs.mail-relay.nixosModule; + chatons = inputs.chatons.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + files-watcher = inputs.files-watcher.nixosModule; + loginctl-linger = inputs.loginctl-linger.nixosModule; + }; + moduleArgs = { + nixpkgs = inputs.nixpkgs; + monitoring = inputs.monitoring; + php = inputs.php; + }; + }; +} diff --git a/systems/monitoring-1/monitoring-master.nix b/systems/monitoring-1/monitoring-master.nix new file mode 100644 index 0000000..09319b8 --- /dev/null +++ b/systems/monitoring-1/monitoring-master.nix @@ -0,0 +1,87 @@ +{ config, pkgs, lib, nodes, name, monitoring, ... }: +let + mlib = monitoring.lib; + nodesWithMonitoring = lib.filterAttrs (n: v: (v.config.myServices or {}) ? "monitoring") nodes; +in +{ + imports = [ + ./monitoring/master.nix + ./monitoring/phare.nix + ./monitoring/ulminfo-fr.nix + ]; + myServices.monitoring.activatedPlugins = lib.flatten (lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterActivatedPlugins) nodesWithMonitoring); + myServices.monitoring.objects = lib.mkMerge ( + lib.mapAttrsToList (_: n: + mlib.toMasterPassiveObject "external-passive-service" 1.5 n.config.myServices.monitoring.objects + ) (lib.filterAttrs (n: v: n != name) nodesWithMonitoring) + ++ + lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterObjects) nodesWithMonitoring + ); + myServices.chatonsProperties.hostings.monitoring = { + file.datetime = "2022-08-27T16:00:00"; + hosting = { + name = "Monitoring"; + description = "Website and server health monitoring"; + website = "https://status.immae.eu"; + logo = "https://www.naemon.io/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "naemon"; + website = "https://www.naemon.io/"; + license.url = "https://github.com/naemon/naemon-core/blob/master/COPYING"; + license.name = "GNU General Public License v2.0"; + version = config.services.naemon.package.version; + source.url = "https://github.com/naemon/naemon-core"; + modules = "livestatus,status-engine"; + }; + }; + + services.nginx = { + virtualHosts."status.immae.eu".locations = { + "=/common/immae.cfg" = { + alias = pkgs.writeText "immae.cfg" '' + # put me for instance in /etc/naemon/module-conf.d/immae.cfg + # Make sure that you have include_dir=module-conf.d in + # naemon.cfg + log_initial_states=1 + date_format=iso8601 + admin_email=${config.myEnv.monitoring.email} + obsess_over_services=1 + ocsp_command=notify-master + ''; + }; + "=/common/resource.cfg" = { + alias = pkgs.writeText "resource.cfg" '' + # Resource.cfg file + # Replace this with path to monitoring plugins + $USER1$=@@COMMON_PLUGINS@@ + # Replace this with a path to scripts from + # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins + $USER2$=@@IMMAE_PLUGINS@@ + $USER200$=https://status.immae.eu/ + $USER201$=@@TOKEN@@ + ''; + }; + }; + }; + + secrets.keys = lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" { + user = "naemon"; + group = "naemon"; + permissions = "0400"; + text = '' + export AWS_ACCESS_KEY_ID="${v.accessKeyId}" + export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}" + export BASE_URL="${v.remote "immae-eldiron"}" + ''; + }) config.myEnv.backup.remotes; + + services.naemon.extraConfig = '' + broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live + broker_module=${pkgs.status-engine-module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0 + ''; +} diff --git a/systems/monitoring-1/monitoring.nix b/systems/monitoring-1/monitoring.nix new file mode 100644 index 0000000..421c71f --- /dev/null +++ b/systems/monitoring-1/monitoring.nix @@ -0,0 +1,61 @@ +{ config, pkgs, lib, name, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "ovh" "notify-primary" ]; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = true; + processWarn = "70"; processAlert = "80"; + loadWarn = "4.0"; loadAlert = "5.0"; + load15Warn = "1.0"; load15Alert = "2.0"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + (emailCheck "monitoring-1" hostFQDN) + + { + service_description = "OVH account has enough sms"; + host_name = hostFQDN; + use = "external-service"; + check_command = "check_ovh_sms"; + + check_interval = 120; + notification_interval = "1440"; + } + + # Dummy service for testing + # { + # service_description = "Dummy failing test"; + # host_name = "dummy-host"; + # use = "local-service"; + # check_interval = 0.3; + # max_check_attempts = "1"; + # flap_detection_enabled = "0"; + # notification_interval = "0.1"; + # check_command = "check_critical"; + # } + ]; + + host = { + # Dummy host for testing + # "dummy-host" = { + # alias = "dummy.host"; + # check_interval = 0.3; + # max_check_attempts = "1"; + # flap_detection_enabled = "0"; + # notification_interval = "0.1"; + # address = "dummy.host"; + # use = "linux-server"; + # check_command = "check_ok"; + # }; + }; + } + ]; +} diff --git a/systems/monitoring-1/monitoring/master.nix b/systems/monitoring-1/monitoring/master.nix new file mode 100644 index 0000000..c8f52ea --- /dev/null +++ b/systems/monitoring-1/monitoring/master.nix @@ -0,0 +1,43 @@ +{ config, ... }: +{ + myServices.monitoring.objects = { + contact = { + immae = { + alias = "Immae"; + email = config.myEnv.monitoring.immae_contact; + use = "generic-contact"; + contactgroups = "admins"; + host_notification_commands = "notify-host-by-email,notify-host-by-apprise!$USER210$"; + service_notification_commands = "notify-service-by-email,notify-service-by-apprise!$USER210$"; + }; + }; + command = { + check_passive = "$USER1$/check_dummy 3 \"Service result are stale\""; + }; + templates = { + service = { + external-passive-service = { + active_checks_enabled = "0"; + check_freshness = "1"; + check_period = "24x7"; + contact_groups = "admins"; + event_handler_enabled = "1"; + flap_detection_enabled = "1"; + is_volatile = "0"; + max_check_attempts = "3"; + notification_interval = "60"; + notification_options = "w,u,c,r,f,s"; + notification_period = "24x7"; + notifications_enabled = "1"; + passive_checks_enabled = "1"; + process_perf_data = "1"; + retain_nonstatus_information = "1"; + retain_status_information = "1"; + retry_interval = "2"; + check_command = "check_passive"; + _webstatus_namespace = "immae"; + }; + }; + }; + }; +} diff --git a/modules/private/monitoring/objects_phare.nix b/systems/monitoring-1/monitoring/phare.nix similarity index 53% rename from modules/private/monitoring/objects_phare.nix rename to systems/monitoring-1/monitoring/phare.nix index 082e7e3..0ce9ffe 100644 --- a/modules/private/monitoring/objects_phare.nix +++ b/systems/monitoring-1/monitoring/phare.nix @@ -1,7 +1,10 @@ -{ emailCheck, ... }: +{ monitoring, config, ... }: +let + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in { - activatedPlugins = [ "emails" ]; - host = { + config.myServices.monitoring.activatedPlugins = [ "emails" ]; + config.myServices.monitoring.objects.host = { "phare.normalesup.org" = { alias = "phare.normalesup.org"; address = "phare.normalesup.org"; @@ -11,7 +14,7 @@ _webstatus_vhost = "status.immae.eu"; }; }; - service = [ + config.myServices.monitoring.objects.service = [ (emailCheck "phare" "phare.normalesup.org") ]; } diff --git a/modules/private/monitoring/objects_ulminfo-fr.nix b/systems/monitoring-1/monitoring/ulminfo-fr.nix similarity index 50% rename from modules/private/monitoring/objects_ulminfo-fr.nix rename to systems/monitoring-1/monitoring/ulminfo-fr.nix index bd2804b..b0c6657 100644 --- a/modules/private/monitoring/objects_ulminfo-fr.nix +++ b/systems/monitoring-1/monitoring/ulminfo-fr.nix @@ -1,7 +1,10 @@ -{ emailCheck, ... }: +{ monitoring, config, ... }: +let + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in { - activatedPlugins = [ "emails" ]; - host = { + config.myServices.monitoring.activatedPlugins = [ "emails" ]; + config.myServices.monitoring.objects.host = { "ulminfo.fr" = { alias = "ulminfo.fr"; address = "ulminfo.fr"; @@ -11,7 +14,7 @@ _webstatus_vhost = "status.immae.eu"; }; }; - service = [ + config.myServices.monitoring.objects.service = [ (emailCheck "ulminfo" "ulminfo.fr") ]; } diff --git a/modules/private/monitoring/status.nix b/systems/monitoring-1/status.nix similarity index 84% rename from modules/private/monitoring/status.nix rename to systems/monitoring-1/status.nix index ab0290c..8b6615f 100644 --- a/modules/private/monitoring/status.nix +++ b/systems/monitoring-1/status.nix @@ -29,14 +29,8 @@ upstreams."netdata".extraConfig = '' keepalive 64; ''; - virtualHosts."status.eban.bzh" = { - acmeRoot = config.myServices.certificates.webroot; - useACMEHost = name; - forceSSL = true; - locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/"; - }; virtualHosts."status.immae.eu" = { - acmeRoot = config.myServices.certificates.webroot; + acmeRoot = config.security.acme.defaults.webroot; useACMEHost = name; forceSSL = true; locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/"; @@ -62,13 +56,10 @@ }; }; security.acme.certs."${name}" = { - extraDomains."status.immae.eu" = null; - extraDomains."status.eban.bzh" = null; - user = config.services.nginx.user; + extraDomainNames = [ "status.immae.eu" ]; group = config.services.nginx.group; }; - myServices.certificates.enable = true; networking.firewall.allowedTCPPorts = [ 80 443 ]; systemd.services.naemon-status = { description = "Naemon status"; diff --git a/modules/private/monitoring/status/app.py b/systems/monitoring-1/status/app.py similarity index 100% rename from modules/private/monitoring/status/app.py rename to systems/monitoring-1/status/app.py diff --git a/modules/private/monitoring/status_engine.nix b/systems/monitoring-1/status_engine.nix similarity index 89% rename from modules/private/monitoring/status_engine.nix rename to systems/monitoring-1/status_engine.nix index 39a753a..fc6afc0 100644 --- a/modules/private/monitoring/status_engine.nix +++ b/systems/monitoring-1/status_engine.nix @@ -1,6 +1,6 @@ { config, pkgs, lib, name, ... }: let - package = pkgs.status_engine.worker.override { config_file = config.secrets.fullPaths."status_engine"; }; + package = pkgs.status-engine-worker.override { config_file = config.secrets.fullPaths."status_engine"; }; env = config.myEnv.tools.status_engine; in { @@ -40,7 +40,7 @@ in use_mysql: 1 mysql: host: ${env.mysql.remoteHost} - port: ${env.mysql.port} + port: ${builtins.toString env.mysql.port} username: ${env.mysql.user} password: ${env.mysql.password} database: ${env.mysql.database} @@ -88,7 +88,7 @@ in ''; }; - services.redis = rec { + services.redis.servers."" = rec { enable = true; bind = "127.0.0.1"; }; @@ -100,6 +100,14 @@ in ]; }; + environment.systemPackages = [ + pkgs.gearmand + (pkgs.writeScriptBin "status-engine-worker" '' + #! ${pkgs.stdenv.shell} + cd ${package} + exec sudo -E -u naemon ./bin/Console.php "$@" + '') + ]; systemd.services.status_engine_worker = { description = "Status engine worker"; after = [ "network.target" ]; diff --git a/systems/quatresaisons/flake.lock b/systems/quatresaisons/flake.lock new file mode 100644 index 0000000..6f2ccca --- /dev/null +++ b/systems/quatresaisons/flake.lock @@ -0,0 +1,767 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_2", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_2", + "myuids": "myuids" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_8", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "files-watcher": "files-watcher", + "landing-page": "landing-page", + "monitoring": "monitoring", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_5", + "php": "php", + "secrets": "secrets_2", + "system": "system" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_3", + "mypackages": "mypackages", + "myuids": "myuids_3", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/quatresaisons/flake.nix b/systems/quatresaisons/flake.nix new file mode 100644 index 0000000..8b269f6 --- /dev/null +++ b/systems/quatresaisons/flake.nix @@ -0,0 +1,49 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + monitoring.url = "path:../../flakes/private/monitoring"; + environment.url = "path:../../flakes/private/environment"; + php.url = "path:../../flakes/private/php"; + system.url = "path:../../flakes/private/system"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + files-watcher.url = "path:../../flakes/files-watcher"; + multi-apache-container.url = "path:../../flakes/multi-apache-container"; + + landing-page = { + url = "https://github.com/bastienwirtz/homer.git"; + ref = "main"; + type = "git"; + flake = false; + }; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "quatresaisons"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "144.76.76.162"; + targetUser = "root"; + nixosModules = { + base = { secrets, ... }: { imports = [ secrets.nixosModules.users-config-quatresaisons ]; }; + system = inputs.system.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + files-watcher = inputs.files-watcher.nixosModule; + multi-apache-container = inputs.multi-apache-container.nixosModule; + }; + moduleArgs = { + monitoring = inputs.monitoring; + php = inputs.php; + landing-page = inputs.landing-page; + pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux; + }; + }; +} diff --git a/systems/zoldene/Immae.pub b/systems/zoldene/Immae.pub new file mode 100644 index 0000000..dd42b04 --- /dev/null +++ b/systems/zoldene/Immae.pub @@ -0,0 +1,322 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +DRuKdymWEii1jA9KlmheLTFr +=r9L+ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/systems/zoldene/base.nix b/systems/zoldene/base.nix new file mode 100644 index 0000000..8ca5d52 --- /dev/null +++ b/systems/zoldene/base.nix @@ -0,0 +1,122 @@ +{ name, config, lib, pkgs, secrets, ... }: +let + # udev rules to be able to boot from qemu in a rescue + udev-qemu-rules = + let disks = config.disko.devices.disk; + in builtins.concatStringsSep "\n" (lib.imap1 (i: d: '' + SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}" + SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}-part%E{PARTN}" + '') (builtins.attrNames disks)); +in +{ + services.openssh = { + settings.KbdInteractiveAuthentication = false; + hostKeys = [ + { + path = "/persist/zpool/etc/ssh/ssh_host_ed25519_key"; + type = "ed25519"; + } + { + path = "/persist/zpool/etc/ssh/ssh_host_rsa_key"; + type = "rsa"; + bits = 4096; + } + ]; + }; + + system.stateVersion = "23.05"; + + # Useful when booting from qemu in rescue + console = { + earlySetup = true; + keyMap = "fr"; + }; + + services.udev.extraRules = udev-qemu-rules; + fileSystems."/persist/zfast".neededForBoot = true; + boot = { + zfs.forceImportAll = true; # needed for the first boot after + # install, because nixos-anywhere + # doesn't export filesystems properly + # after install (only affects fs not + # needed for boot, see fsNeededForBoot + # in nixos/lib/utils.nix + kernelParams = [ "boot.shell_on_fail" ]; + loader.grub.devices = [ + config.disko.devices.disk.sda.device + config.disko.devices.disk.sdb.device + ]; + extraModulePackages = [ ]; + kernelModules = [ "kvm-intel" ]; + supportedFilesystems = [ "zfs" ]; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; + initrd = { + postDeviceCommands = lib.mkAfter '' + zfs rollback -r zfast/root@blank + ''; + services.udev.rules = udev-qemu-rules; + availableKernelModules = [ "e1000e" "ahci" "sd_mod" ]; + network = { + enable = true; + postCommands = "echo 'cryptsetup-askpass' >> /root/.profile"; + flushBeforeStage2 = true; + ssh = { + enable = true; + port = 2222; + authorizedKeys = config.users.extraUsers.root.openssh.authorizedKeys.keys; + hostKeys = [ + "/boot/initrdSecrets/ssh_host_rsa_key" + "/boot/initrdSecrets/ssh_host_ed25519_key" + ]; + }; + }; + }; + }; + networking = { + hostId = "6251d3d5"; + firewall.enable = false; + firewall.allowedUDPPorts = [ 43484 ]; + # needed for initrd proper network setup too + useDHCP = lib.mkDefault true; + + wireguard.interfaces.wg0 = { + generatePrivateKeyFile = true; + privateKeyFile = "/persist/zpool/etc/wireguard/wg0"; + #presharedKeyFile = config.secrets.fullPaths."wireguard/preshared_key"; + listenPort = 43484; + + ips = [ + "192.168.1.25/24" + ]; + peers = [ + ]; + }; + }; + + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + hardware.enableRedistributableFirmware = lib.mkDefault true; + system.activationScripts.createDatasets = { + deps = [ ]; + text = '' + PATH=${pkgs.zfs}/bin:$PATH + '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList (name: c: '' + if ! zfs list "${c._parent.name}/${name}" 2>/dev/null >/dev/null; then + ${c._create { zpool = c._parent.name; }} + fi + '') (config.disko.devices.zpool.zfast.datasets // config.disko.devices.zpool.zpool.datasets)); + }; + + secrets.keys."wireguard/preshared_key/eldiron" = { + permissions = "0400"; + user = "root"; + group = "root"; + text = let + key = builtins.concatStringsSep "_" (builtins.sort builtins.lessThan [ name "eldiron" ]); + in + "{{ .wireguard.preshared_keys.${key} }}"; + }; + secrets.decryptKey = "/persist/zpool/etc/ssh/ssh_host_ed25519_key"; + # ssh-keyscan zoldene | nix-shell -p ssh-to-age --run ssh-to-age + secrets.ageKeys = [ "age1rqr7qdpjm8fy9nf3x07fa824v87n40g0ljrgdysuayuklnvhcynq4c8en8" ]; +} diff --git a/systems/zoldene/disko.nix b/systems/zoldene/disko.nix new file mode 100644 index 0000000..7df5697 --- /dev/null +++ b/systems/zoldene/disko.nix @@ -0,0 +1,87 @@ +{ cryptKeyFile, ... }: { + disko.devices = let + zpoolDatasets = { + "root" = { type = "zfs_fs"; options.mountpoint = "none"; }; + "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zpool"; options.mountpoint = "legacy"; }; + }; + zfastDatasets = { + "root" = { type = "zfs_fs"; mountpoint = "/"; options.mountpoint = "legacy"; postCreateHook = "zfs snapshot zfast/root@blank"; }; + "root/nix" = { type = "zfs_fs"; mountpoint = "/nix"; options.mountpoint = "legacy"; }; + "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zfast"; options.mountpoint = "legacy"; }; + "root/persist/var" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var"; options.mountpoint = "legacy"; }; + "root/persist/var/lib" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib"; options.mountpoint = "legacy"; }; + }; + in { + disk = { + sda = { + type = "disk"; + device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700613"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2GiB"; end = "-8GiB"; name = "ssdLuksA"; content = { type = "luks"; name = "ssdA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; } + { start = "-8GiB"; end = "-2MiB"; name = "swapA"; flags = [ "swap" ]; content = { type = "swap"; }; } + { start = "2048s"; end = "4095s"; name = "ssdGrubA"; flags = [ "bios_grub" ]; } + { start = "4096s"; end = "2GiB"; name = "ssdBootA"; content = { type = "filesystem"; format = "ext4"; mountpoint = "/boot"; }; } + ]; + }; + }; + sdb = { + type = "disk"; + device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700682"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2GiB"; end = "-8GiB"; name = "ssdLuksB"; content = { type = "luks"; name = "ssdB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; } + { start = "-8GiB"; end = "-2MiB"; name = "swapB"; flags = [ "swap" ]; content = { type = "swap"; }; } + { start = "2048s"; end = "4095s"; name = "ssdGrubB"; flags = [ "bios_grub" ]; } + #{ start = "4096s"; end = "2GiB"; name = "ssdBootB"; content = { type = "filesystem"; format = "ext4"; }; } # non monté + ]; + }; + }; + sdc = { + type = "disk"; + device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110SY1"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2048s"; end = "-34s"; name = "hddLuksA"; content = { type = "luks"; name = "bigA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; } + ]; + }; + }; + sdd = { + type = "disk"; + device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110YXX"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2048s"; end = "-34s"; name = "hddLuksB"; content = { type = "luks"; name = "bigB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; } + ]; + }; + }; + }; + + zpool = { + zpool = { + type = "zpool"; + mode = "mirror"; + mountRoot = "/"; + rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; }; + options = { ashift = "12"; }; + datasets = zpoolDatasets; + }; + zfast = { + type = "zpool"; + mode = "mirror"; + mountRoot = "/"; + rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; }; + options = { ashift = "12"; }; + datasets = zfastDatasets; + }; + }; + }; +} diff --git a/systems/zoldene/flake.lock b/systems/zoldene/flake.lock new file mode 100644 index 0000000..0a9ba64 --- /dev/null +++ b/systems/zoldene/flake.lock @@ -0,0 +1,560 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_7", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports", + "environment": "environment", + "mypackages": "mypackages", + "myuids": "myuids", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "root": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib", + "nixpkgs": "nixpkgs_5", + "private-environment": "private-environment", + "private-system": "private-system", + "public-secrets": "public-secrets" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/zoldene/flake.nix b/systems/zoldene/flake.nix new file mode 100644 index 0000000..42466e8 --- /dev/null +++ b/systems/zoldene/flake.nix @@ -0,0 +1,29 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + impermanence.url = "github:nix-community/impermanence/master"; + my-lib.url = "path:../../flakes/lib"; + public-secrets.url = "path:../../flakes/secrets"; + private-environment.url = "path:../../flakes/private/environment"; + private-system.url = "path:../../flakes/private/system"; + }; + outputs = inputs@{ self, nixpkgs, my-lib, ... }: + my-lib.lib.mkColmenaFlake { + name = "zoldene"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "88.198.39.152"; + targetUser = "root"; + nixosModules = with inputs; { + impermanence = impermanence.nixosModule; + base = ./base.nix; + disko = ./disko.nix; + logging = ./logging.nix; + + secrets = public-secrets.nixosModule; + + environment = private-environment.nixosModule; + system = private-system.nixosModule; + }; + }; +} diff --git a/systems/zoldene/logging.nix b/systems/zoldene/logging.nix new file mode 100644 index 0000000..09ee104 --- /dev/null +++ b/systems/zoldene/logging.nix @@ -0,0 +1,138 @@ +{ config, pkgs, name, ... }: +# Initialization +# CREATE INDEX ON LOGS (tag); +# CREATE INDEX ON LOGS (time); +# CREATE INDEX ON LOGS (((data->>'PRIORITY')::int)); +# CREATE INDEX ON LOGS ((data->>'_SYSTEMD_UNIT')); +# CREATE INDEX ON LOGS ((data->>'SYSLOG_IDENTIFIER')); +let + fluent-bit-config = { + pipeline = { + inputs = [ + { + name = "systemd"; + tag = "${name}.systemd"; + DB = "/var/lib/fluentbit/fluent-bit.db"; + } + ]; + outputs = [ + { + name = "loki"; + match = "${name}.systemd"; + line_format = "json"; + labels = "job=fluentbit, server=${name}, priority=$PRIORITY, syslog_identifier=$SYSLOG_IDENTIFIER, systemd_unit=$_SYSTEMD_UNIT"; + } + { + name = "pgsql"; + match = "*"; + host = "/run/postgresql"; + user = "fluentbit"; + table = "logs"; + database = "fluentbit"; + timestamp_key = "event_timestamp"; + } + ]; + }; + }; + yamlFormat = pkgs.formats.yaml {}; + psqlVersion = pkgs.postgresql_13.psqlSchema; +in +{ + disko.devices.zpool.zfast.datasets."root/persist/var/lib/loki" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/loki"; options.mountpoint = "legacy"; }; + disko.devices.zpool.zfast.datasets."root/persist/var/lib/fluentbit" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/fluentbit"; options.mountpoint = "legacy"; }; + disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql"; options.mountpoint = "legacy"; }; + disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql/${psqlVersion}" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql/${psqlVersion}"; options.mountpoint = "legacy"; }; + environment.persistence."/persist/zfast".directories = [ + { + directory = "/var/lib/postgresql"; + user = config.users.users.postgres.name; + group = config.users.users.postgres.group; + mode = "0755"; + } + { + directory = "/var/lib/fluentbit"; + user = config.users.users.fluentbit.name; + group = config.users.users.fluentbit.group; + mode = "0755"; + } + { + directory = "/var/lib/loki"; + user = config.users.users.loki.name; + group = config.users.users.loki.group; + mode = "0755"; + } + ]; + + ids.uids.fluentbit = 500; + ids.gids.fluentbit = 500; + users.users.fluentbit = { + name = "fluentbit"; + home = "/var/lib/fluentbit"; + uid = config.ids.uids.fluentbit; + group = "fluentbit"; + isSystemUser = true; + extraGroups = [ "systemd-journal" ]; + }; + users.groups.fluentbit.gid = config.ids.gids.fluentbit; + + services.loki = { + enable = true; + configuration = { + auth_enabled = false; + common = { + ring.kvstore.store = "inmemory"; + ring.instance_addr = "127.0.0.1"; + replication_factor = 1; + path_prefix = "/var/lib/loki"; + }; + server.log_level = "warn"; + limits_config = { + reject_old_samples = false; + ingestion_rate_mb = 100; + ingestion_burst_size_mb = 200; + per_stream_rate_limit = "100MB"; + per_stream_rate_limit_burst = "200MB"; + }; + + schema_config.configs = [ + { + from = "2020-10-24"; + store = "boltdb-shipper"; + object_store = "filesystem"; + schema = "v11"; + index.prefix = "index_"; + index.period = "24h"; + } + ]; + }; + }; + services.postgresql = { + enable = true; + package = pkgs.postgresql_13; + ensureDatabases = [ "fluentbit" ]; + ensureUsers = [ + { + name = "fluentbit"; + ensurePermissions."DATABASE \"fluentbit\"" = "ALL PRIVILEGES"; + } + ]; + }; + + environment.systemPackages = [ + pkgs.fluent-bit + ]; + systemd.services.fluent-bit = { + description = "Fluent-bit daemon"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + ExecStart = "${pkgs.fluent-bit}/bin/fluent-bit -c ${yamlFormat.generate "fluent.yaml" fluent-bit-config}"; + User = "fluentbit"; + Group = "fluentbit"; + SupplementaryGroups = [ "systemd-journal" ]; + }; + }; +} -- 2.41.0