]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Fix warning for loki master
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Fri, 2 Aug 2024 22:35:08 +0000 (00:35 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Fri, 2 Aug 2024 22:37:50 +0000 (00:37 +0200)
85 files changed:
deploy/flake.lock
flake.lock
flakes/etherpad-lite/flake.lock
flakes/flake.lock
flakes/grocy/flake.lock
flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch
flakes/mypackages/pkgs/webapps/default.nix
flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix
flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/mantis-kanban/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/taskodrome/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/tasks/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix
flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix
flakes/mypackages/pkgs/webapps/nextcloud/default.nix
flakes/private/chatons/flake.lock
flakes/private/environment/flake.nix
flakes/private/mail-relay/flake.lock
flakes/private/milters/flake.lock
flakes/private/monitoring/flake.lock
flakes/private/monitoring/flake.nix
flakes/private/monitoring/myplugins.nix
flakes/private/opendmarc/flake.lock
flakes/private/ssh/flake.lock
flakes/private/system/flake.lock
flakes/private/system/flake.nix
flakes/surfer/flake.lock
systems/backup-2/databases/mariadb_replication.nix
systems/backup-2/flake.lock
systems/dilion/base.nix
systems/dilion/flake.lock
systems/dilion/monitoring.nix
systems/eldiron/base.nix
systems/eldiron/borg_backup.nix [new file with mode: 0644]
systems/eldiron/databases/openldap/default.nix
systems/eldiron/duply_backup.nix
systems/eldiron/flake.lock
systems/eldiron/ftp.nix
systems/eldiron/gitolite/default.nix
systems/eldiron/monitoring.nix
systems/eldiron/pub/default.nix
systems/eldiron/websites/cloud/default.nix
systems/eldiron/websites/commento/default.nix
systems/eldiron/websites/cryptpad/default.nix
systems/eldiron/websites/git/mantisbt.nix
systems/eldiron/websites/tools/default.nix
systems/eldiron/websites/tools/landing.nix
systems/eldiron/websites/tools/landing/ldap_password.php
systems/monitoring-1/flake.lock
systems/monitoring-1/monitoring-master.nix
systems/quatresaisons/flake.lock
systems/zoldene/base.nix
systems/zoldene/flake.lock
systems/zoldene/logging.nix
systems/zoldene/synapse.nix [new file with mode: 0644]

index c766b089eb7511cf6851f8beb5693ad5dd830aed..26317011524fa17a7a7a8beda20a33e8a76fc46c 100644 (file)
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_10": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_11": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_12": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_13": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_14": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_15": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_16": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_17": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_18": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_19": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_20": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_21": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_22": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_23": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_24": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_25": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_26": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_27": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_28": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_29": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_30": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_31": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_32": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_4": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_5": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_6": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_7": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_8": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_9": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-N8FlN9eUGGmz7MevjaGC7Y07AEebJGRzcESmOW87/0Q=",
+        "narHash": "sha256-R3FAjRFGXXrYqICZrB0jFWVe7Ahqu1s8HSGYucmCfiU=",
         "path": "../flakes",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-B2JdIp5q/8/LurN4lXB17C1+mpEKeqPzObmNOObO5rQ=",
+        "narHash": "sha256-60yr/wCF+U3z+wYR+UEgM+68nc4/CWkoIAjJsMpUG8c=",
         "path": "../systems/backup-2",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-dWAbGxB91utxwTlxsJZdp2OSaIAo8y5LXjdTCFMRn+4=",
+        "narHash": "sha256-9geQj091r2/Sxi8/ghsp5mO8MIT/kT+nEL3PKgwuApc=",
         "path": "../systems/dilion",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-OvT4dJGxdFBUgwjTu6FzejI/euWYXWsX1vD952B8934=",
+        "narHash": "sha256-MB/c+BVgQQ3qjAchd1Oe8qvg9UbFcY0xhxpj9RkEOnI=",
         "path": "../systems/eldiron",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-6hqQjoy1lyIJziqe0AJ62aq62soi5D14NKOzNEY3SsQ=",
+        "narHash": "sha256-nV8j6HW6B93HEbeiy43tKCGV9J6xR7jIkAUZVbkKDt4=",
         "path": "../systems/monitoring-1",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-yBuAfW59X0e840QBFtQrefG3T/IQIQSXiZ4WU2/+gBI=",
+        "narHash": "sha256-4vXBjKeelh3z1l7ZYO0ucB2cZPuVJsYX7yZV3MDGqdk=",
         "path": "../systems/quatresaisons",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-Q+U6JxtY67jVPjuzfwrjSGmIM73kIRrjKm0ihbUxPGQ=",
+        "narHash": "sha256-wAhvhb/zq5upukz/cfyN1nRfYTcFby8OJi2yFaZBGIM=",
         "path": "../systems/zoldene",
         "type": "path"
       },
     },
     "nixpkgs_71": {
       "locked": {
-        "lastModified": 1708475490,
-        "narHash": "sha256-g1v0TsWBQPX97ziznfJdWhgMyMGtoBFs102xSYO4syU=",
+        "lastModified": 1720031269,
+        "narHash": "sha256-rwz8NJZV+387rnWpTYcXaRNvzUSnnF9aHONoJIYmiUQ=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "0e74ca98a74bc7270d28838369593635a5db3260",
+        "rev": "9f4128e00b0ae8ec65918efeba59db998750ead6",
         "type": "github"
       },
       "original": {
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "private-environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "../../flakes/private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "../../flakes/etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "../../flakes/grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../flakes/mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "../../flakes/surfer",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "./etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "./grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "./mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "./private/chatons",
         "type": "path"
       },
     "s-private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "./private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "./private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "./private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "./private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "./private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "./private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "./private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "./surfer",
         "type": "path"
       },
         "nixpkgs": "nixpkgs_106"
       },
       "locked": {
-        "lastModified": 1713004475,
-        "narHash": "sha256-zXj5DiaeAiLGIFcgMyQTtICXg4kgIiiYcTbnDIocY38=",
+        "lastModified": 1722637825,
+        "narHash": "sha256-nVRtZ9lu7ILJPA+wNn5D+5R7nJBKtfY0Rx335xVUYFw=",
         "ref": "master",
-        "rev": "8fd3e35df106a494e3195708e8cba076f2c94acb",
-        "revCount": 728,
+        "rev": "c0221952994e304539e9cccd5db8e818df4e6e51",
+        "revCount": 747,
         "type": "git",
         "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index f22d39372d88caecb2919f42d92d8ee915abd7cb..e8a7a3bedcd8147094e9b18fdd74c63c1cb74d3e 100644 (file)
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_10": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_11": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_12": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_13": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_14": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_15": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_16": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_17": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_18": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_19": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_20": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_21": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_22": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_23": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_24": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_25": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_26": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_27": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_28": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_29": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_30": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_31": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_32": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_4": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_5": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_6": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_7": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_8": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_9": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-N8FlN9eUGGmz7MevjaGC7Y07AEebJGRzcESmOW87/0Q=",
+        "narHash": "sha256-R3FAjRFGXXrYqICZrB0jFWVe7Ahqu1s8HSGYucmCfiU=",
         "path": "./flakes",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-B2JdIp5q/8/LurN4lXB17C1+mpEKeqPzObmNOObO5rQ=",
+        "narHash": "sha256-60yr/wCF+U3z+wYR+UEgM+68nc4/CWkoIAjJsMpUG8c=",
         "path": "../systems/backup-2",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-dWAbGxB91utxwTlxsJZdp2OSaIAo8y5LXjdTCFMRn+4=",
+        "narHash": "sha256-9geQj091r2/Sxi8/ghsp5mO8MIT/kT+nEL3PKgwuApc=",
         "path": "../systems/dilion",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-OvT4dJGxdFBUgwjTu6FzejI/euWYXWsX1vD952B8934=",
+        "narHash": "sha256-MB/c+BVgQQ3qjAchd1Oe8qvg9UbFcY0xhxpj9RkEOnI=",
         "path": "../systems/eldiron",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-6hqQjoy1lyIJziqe0AJ62aq62soi5D14NKOzNEY3SsQ=",
+        "narHash": "sha256-nV8j6HW6B93HEbeiy43tKCGV9J6xR7jIkAUZVbkKDt4=",
         "path": "../systems/monitoring-1",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-yBuAfW59X0e840QBFtQrefG3T/IQIQSXiZ4WU2/+gBI=",
+        "narHash": "sha256-4vXBjKeelh3z1l7ZYO0ucB2cZPuVJsYX7yZV3MDGqdk=",
         "path": "../systems/quatresaisons",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-Q+U6JxtY67jVPjuzfwrjSGmIM73kIRrjKm0ihbUxPGQ=",
+        "narHash": "sha256-wAhvhb/zq5upukz/cfyN1nRfYTcFby8OJi2yFaZBGIM=",
         "path": "../systems/zoldene",
         "type": "path"
       },
     },
     "nixpkgs_71": {
       "locked": {
-        "lastModified": 1708475490,
-        "narHash": "sha256-g1v0TsWBQPX97ziznfJdWhgMyMGtoBFs102xSYO4syU=",
+        "lastModified": 1720031269,
+        "narHash": "sha256-rwz8NJZV+387rnWpTYcXaRNvzUSnnF9aHONoJIYmiUQ=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "0e74ca98a74bc7270d28838369593635a5db3260",
+        "rev": "9f4128e00b0ae8ec65918efeba59db998750ead6",
         "type": "github"
       },
       "original": {
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "private-environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "../../flakes/private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "../../flakes/etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "../../flakes/grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../flakes/mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "../../flakes/surfer",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "./etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "./grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "./mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "./private/chatons",
         "type": "path"
       },
     "s-private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "./private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "./private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "./private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "./private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "./private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "./private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "./private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "./surfer",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index 3295c2821b244990a4baa1408cfeb41dac77a372..4b29cffedfc9902f485a137d48aefd0374dbea69 100644 (file)
@@ -58,7 +58,7 @@
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
index 17264a4857347e45a551c4423a3977344cf3a70e..802849b96769295baf47ad62ca6a7608e4d8745b 100644 (file)
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_10": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_11": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_12": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_13": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_14": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_15": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_16": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_17": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_18": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_19": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_20": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_21": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_22": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_23": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_24": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_25": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_26": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_27": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_28": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_29": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_30": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_31": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_32": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_4": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_5": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_6": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_7": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_8": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "environment_9": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-B2JdIp5q/8/LurN4lXB17C1+mpEKeqPzObmNOObO5rQ=",
+        "narHash": "sha256-60yr/wCF+U3z+wYR+UEgM+68nc4/CWkoIAjJsMpUG8c=",
         "path": "../systems/backup-2",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-dWAbGxB91utxwTlxsJZdp2OSaIAo8y5LXjdTCFMRn+4=",
+        "narHash": "sha256-9geQj091r2/Sxi8/ghsp5mO8MIT/kT+nEL3PKgwuApc=",
         "path": "../systems/dilion",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-OvT4dJGxdFBUgwjTu6FzejI/euWYXWsX1vD952B8934=",
+        "narHash": "sha256-MB/c+BVgQQ3qjAchd1Oe8qvg9UbFcY0xhxpj9RkEOnI=",
         "path": "../systems/eldiron",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-6hqQjoy1lyIJziqe0AJ62aq62soi5D14NKOzNEY3SsQ=",
+        "narHash": "sha256-nV8j6HW6B93HEbeiy43tKCGV9J6xR7jIkAUZVbkKDt4=",
         "path": "../systems/monitoring-1",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-yBuAfW59X0e840QBFtQrefG3T/IQIQSXiZ4WU2/+gBI=",
+        "narHash": "sha256-4vXBjKeelh3z1l7ZYO0ucB2cZPuVJsYX7yZV3MDGqdk=",
         "path": "../systems/quatresaisons",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-Q+U6JxtY67jVPjuzfwrjSGmIM73kIRrjKm0ihbUxPGQ=",
+        "narHash": "sha256-wAhvhb/zq5upukz/cfyN1nRfYTcFby8OJi2yFaZBGIM=",
         "path": "../systems/zoldene",
         "type": "path"
       },
     },
     "nixpkgs_70": {
       "locked": {
-        "lastModified": 1708475490,
-        "narHash": "sha256-g1v0TsWBQPX97ziznfJdWhgMyMGtoBFs102xSYO4syU=",
+        "lastModified": 1720031269,
+        "narHash": "sha256-rwz8NJZV+387rnWpTYcXaRNvzUSnnF9aHONoJIYmiUQ=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "0e74ca98a74bc7270d28838369593635a5db3260",
+        "rev": "9f4128e00b0ae8ec65918efeba59db998750ead6",
         "type": "github"
       },
       "original": {
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
     "private-environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "../../flakes/private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "../../flakes/etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "../../flakes/grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../flakes/mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "../../flakes/surfer",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "./etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "./grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "./mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "./private/chatons",
         "type": "path"
       },
     "s-private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "./private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "./private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "./private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "./private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "./private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "./private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "./private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "./surfer",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index 0be1119970c5cade9ba52584ebbbd71828ec477a..3e8cb41b9ddf903c478869b0824e302bcf07ae32 100644 (file)
@@ -58,7 +58,7 @@
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
index e66a54f5e22663f22c66e2fd53bd83ca5f586d68..2f6c19ebd4845a1ad19ab2c7a4d6935feb9efcfc 100644 (file)
@@ -132,12 +132,12 @@ index 32aaea4..99efc15 100644
 -        $this->setEmpty('resource.history', 'data/history.php');
 +        if ($this->userSpace === null) {
 +          $data = 'data';
-+          $tmp  = 'tmp';
++          $tmp  = 'tmp/';
 +          $cache = 'cache';
 +          $pagecache = 'pagecache';
 +        } else {
 +          $data = 'data/' . ($this->userSpace);
-+          $tmp  = 'tmp/' . ($this->userSpace);
++          $tmp  = 'tmp/' . ($this->userSpace) . '/';
 +          $cache = 'cache/' . ($this->userSpace);
 +          $pagecache = 'pagecache/' . ($this->userSpace);
 +        }
index 18a724d30edbad3fd0625d2762ecfdd12faaa773..110e99311c4ebaa70dbeec93cc65b0da63f6847e 100644 (file)
@@ -10,9 +10,17 @@ rec {
   nextcloud_25 = callPackage ./nextcloud { nextcloudVersion = 25; };
   nextcloud_26 = callPackage ./nextcloud { nextcloudVersion = 26; };
   nextcloud_27 = callPackage ./nextcloud { nextcloudVersion = 27; };
+  nextcloud_27_2 = callPackage ./nextcloud { nextcloudVersion = "27_2"; };
+  # required postgresql and php upgrade!
+  #nextcloud_28 = callPackage ./nextcloud { nextcloudVersion = 28; };
+  #nextcloud_29 = callPackage ./nextcloud { nextcloudVersion = 29; };
   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);
+  nextcloud_27_2-all = nextcloud_27_2.withApps (a: builtins.attrValues nextcloud_27_2.allSupportedApps);
+  # required postgresql and php upgrade!
+  #nextcloud_28-all = nextcloud_28.withApps (a: builtins.attrValues nextcloud_28.allSupportedApps);
+  #nextcloud_29-all = nextcloud_29.withApps (a: builtins.attrValues nextcloud_29.allSupportedApps);
   phpbb = callPackage ./phpbb {};
   phpldapadmin = callPackage ./phpldapadmin {};
   rompr = callPackage ./rompr {};
index 466595d04095c06ae69ca57b5283b2f51b4b4492..f3d5be8d32fad85587e082d33a7db6885415d98a 100644 (file)
@@ -1,6 +1,6 @@
-{ mantis_config ? "/etc/mantisbt/config_inc.php", stdenv, fetchurl, lib, callPackage}:
+{ mantis_config ? {}, stdenv, fetchurl, lib, callPackage}:
 let
-  pluginNames = [ "slack" "source-integration" ];
+  pluginNames = [ "slack" "source-integration" "taskodrome" "mantis-kanban" "tasks" ];
   allPlugins = lib.attrsets.genAttrs pluginNames
     (name: callPackage (./plugins + "/${name}") {});
   toPassthru = pkg: plugins: {
@@ -23,21 +23,21 @@ let
     in newMantisbt;
   package = stdenv.mkDerivation rec {
     name = "mantisbt-${version}";
-    version = "2.21.0";
+    version = "2.26.1";
     src = fetchurl {
       url = "https://downloads.sourceforge.net/project/mantisbt/mantis-stable/${version}/${name}.tar.gz";
-      sha256 = "13lx569dp1gibq5daqp7dj6gsqic85rrix1s7xkp60gwpzk8wiw5";
+      sha256 = "sha256-poJCEjq+yB2RbA0k5go899mBGBXewjLZHGFmabrCYW4=";
     };
-    patches = [
-      ./bug_report.php.diff
-      ./bug_report_page.php.diff
-      ./bugnote_add.php.diff
-      ./bugnote_add_inc.php.diff
-    ];
+    # FIXME: captcha for anonymous
+    #patches = [
+    #  ./bug_report.php.diff
+    #  ./bug_report_page.php.diff
+    #  ./bugnote_add.php.diff
+    #  ./bugnote_add_inc.php.diff
+    #];
     installPhase = ''
     cp -a . $out
-    ln -s ${mantis_config} $out/config/config_inc.php
-    '';
+    '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "ln -s ${v} $out/config/${k}.php") mantis_config);
 
     passthru = toPassthru package [];
   };
diff --git a/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/mantis-kanban/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/mantis-kanban/default.nix
new file mode 100644 (file)
index 0000000..1d51705
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  version = "v2.1.0";
+  name = "mantisbt-plugin-kanban-${version}";
+  src = fetchFromGitHub {
+    owner = "mantisbt-plugins";
+    repo = "MantisKanban";
+    rev = "62c3815578cab8a7766580049c3a4f5968331231";
+    sha256 = "sha256-wvinh7+QjsCEk05LHCL1KfTy/3+PvnVYwduHq2hlQP0=";
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a * $out/
+    '';
+  passthru = {
+    pluginName = "MantisKanban";
+  };
+}
+
diff --git a/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/taskodrome/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/taskodrome/default.nix
new file mode 100644 (file)
index 0000000..dcf0d93
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  version = "v2.1.8";
+  name = "mantisbt-plugin-taskodrome-${version}";
+  src = fetchFromGitHub {
+    owner = "mantisbt-plugins";
+    repo = "Taskodrome";
+    rev = "d8e24a0991f58a902c6c5cf9e88132a17ad533ac";
+    sha256 = "sha256-Jp2ROIjcSFTtGC58sDUg4FaB3mOKbY3GGpnIQqSpUaY=";
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a Taskodrome $out/
+    '';
+  passthru = {
+    pluginName = "Taskodrome";
+    selector = "Taskodrome";
+  };
+}
diff --git a/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/tasks/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/tasks/default.nix
new file mode 100644 (file)
index 0000000..fe842f4
--- /dev/null
@@ -0,0 +1,18 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  version = "v3.30";
+  name = "mantisbt-plugin-tasks-${version}";
+  src = fetchFromGitHub {
+    owner = "mantisbt-plugins";
+    repo = "Tasks";
+    rev = "38d8255aa989b914ec0730e58ca73708d07f35c3";
+    sha256 = "sha256-QDMa8ar/FEpJCSH1D9LEaXSDR+WRkDx3stXm2+LKO0Q=";
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a * $out/
+    '';
+  passthru = {
+    pluginName = "Tasks";
+  };
+}
index 6e7380cfe70a584a72048662d93edd876ae227a3..8080b4edbe9f5095d26c21bed4045bec901be97f 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/audioplayer
   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=";
   };
+  audioplayer_3_4_1 = buildApp rec {
+    appName = "audioplayer";
+    version = "3.4.1";
+    url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-ZPIvn5devG6puTyxgXlBpA60kJsYWXbQLNiL5f2jLrA=";
+  };
   versions = {
     "25" = audioplayer_3_4_0;
     "26" = audioplayer_3_4_0;
     "27" = audioplayer_3_4_0;
+    "27_2" = audioplayer_3_4_1;
+    "28" = audioplayer_3_4_1;
+    "29" = audioplayer_3_4_1;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app audioplayer")
index 0503e5b7f6f4d32689c7265ebc97b6b611cc147c..0722392322e9993107b313213995fc3ceb06e182 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/bookmarks
   bookmarks_12_1_0 = buildApp rec {
     appName = "bookmarks";
     version = "12.1.0";
@@ -12,10 +13,25 @@ let
     url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
     sha256 = "sha256-7Gx8e8C2dDkB/39eAGKOLrP3YkVbGkfPKpQBeCaV/cE=";
   };
+  bookmarks_13_1_3 = buildApp rec {
+    appName = "bookmarks";
+    version = "13.1.3";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-9jSUtLT89UkxZhvyp+cDNV2OAc0+BzFoXAd5YfJTgXo=";
+  };
+  bookmarks_14_2_2 = buildApp rec {
+    appName = "bookmarks";
+    version = "14.2.2";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-hqmX64arwllviwG7ySvdwA8IYzWoLjP2MyhT389UZXw=";
+  };
   versions = {
     "25" = bookmarks_12_1_0;
     "26" = bookmarks_13_0_1;
     "27" = bookmarks_13_0_1;
+    "27_2" = bookmarks_13_1_3;
+    "28" = bookmarks_14_2_2;
+    "29" = bookmarks_14_2_2;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app bookmarks")
index 497d4baccf4cc32da84233eec829e63a5de45ed6..8ce18e374914765b726b92ce2181df188d4186b7 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/calendar
   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=";
   };
+  calendar_4_7_6 = buildApp rec {
+    appName = "calendar";
+    version = "4.7.6";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-WSz30rta3PdNaxisxUNE1Zcp5MPfw9jB9ervMjgjZss=";
+  };
   versions = {
     "25" = calendar_4_4_4;
     "26" = calendar_4_4_4;
     "27" = calendar_4_4_4;
+    "27_2" = calendar_4_7_6;
+    "28" = calendar_4_7_6;
+    "29" = calendar_4_7_6;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app calendar")
index 05f09283e3f0a76d772645f567012500b4e2e83c..3df6c583857badef4d5fe4627cd92b89089d9318 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/carnet
   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=";
   };
+  carnet_0_25_4 = buildApp rec {
+    appName = "carnet";
+    version = "0.25.4";
+    url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz";
+    sha256 = "sha256-xKG0MRzWdBYJERXZ6HU4sZIqhL9lVZHnWIkaVdZnYUg=";
+  };
   versions = {
     "25" = carnet_0_25_2;
     "26" = carnet_0_25_2;
     "27" = carnet_0_25_2;
+    "27_2" = carnet_0_25_4;
+    "28" = carnet_0_25_4;
+    "29" = carnet_0_25_4;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app carnet")
index f8931b75edc0bdc6c8ff2cade8e8f378b8498ace..dc5f2bd770e928dc7ba10abe2bfee0d3a6c5e5ab 100644 (file)
@@ -1,15 +1,31 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/contacts
   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=";
   };
+  contacts_5_5_3 = buildApp rec {
+    appName = "contacts";
+    version = "5.5.3";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-zxmgMiizzXGfReRS9XJ+fb6tJRLH/Z5NvuLpspYARFI=";
+  };
+  contacts_6_0_0 = buildApp rec {
+    appName = "contacts";
+    version = "6.0.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-48ERJ9DQ9w71encT2XVvcVaV+EbthgExQliKO1sQ+1A=";
+  };
   versions = {
     "25" = contacts_5_3_2;
     "26" = contacts_5_3_2;
     "27" = contacts_5_3_2;
+    "27_2" = contacts_5_5_3;
+    "28" = contacts_5_5_3;
+    "29" = contacts_6_0_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app contacts")
index 32fdcc03d07e5960d0759c83d1d4852739754fc7..480178644bbe7897fcad742022d4397ced647550 100644 (file)
@@ -1,15 +1,30 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/cookbook
   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=";
   };
+  cookbook_0_10_5 = buildApp rec {
+    appName = "cookbook";
+    version = "0.10.5";
+    url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v${version}/cookbook-${version}.tar.gz";
+    sha256 = "sha256-EHc+AMKsjAVVcNQ00Yf0Z4AFeUWdtf1uYGA5BHlTcTM=";
+  };
+  cookbook_0_11_0 = buildApp rec {
+    appName = "cookbook";
+    version = "0.11.0";
+    url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v${version}/cookbook-${version}.tar.gz";
+    sha256 = "sha256-8oIhtI1Bkb3zC/znDLYWmLaVqkiBLLMqbqEAW5HycS4=";
+  };
   versions = {
     "25" = cookbook_0_10_2;
     "26" = cookbook_0_10_2;
     "27" = cookbook_0_10_2;
+    "27_2" = cookbook_0_10_5;
+    "28" = cookbook_0_11_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app cookbook")
index c5dd2d3ae0d64e854a2ee0efa7d03068689c4f6d..b670fa79e4f26f30e8c9f3d43f4b9d4d070cb198 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/deck
   deck_1_8_5 = buildApp rec {
     appName = "deck";
     version = "1.8.5";
@@ -18,10 +19,31 @@ let
     url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
     sha256 = "sha256-W0XVvhTQoCjoK7S2tEd7bvU0MTWtqYt7QiB9H1p1UP8=";
   };
+  deck_1_11_4 = buildApp rec {
+    appName = "deck";
+    version = "1.11.4";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-LIQgzM7C21ON+DMAjwREmgVACPtCMOBYuYbdGYHGnLI=";
+  };
+  deck_1_12_2 = buildApp rec {
+    appName = "deck";
+    version = "1.12.2";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-K9ZG3Pc9dfrF3hFi3FCKoZWywXUaueQuwGpZksumToA=";
+  };
+  deck_1_13_0 = buildApp rec {
+    appName = "deck";
+    version = "1.13.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-Gyfyq4rJv4alLhdIW8S8wCUAOdxp6UG7UgUWH0CkVR4=";
+  };
   versions = {
     "25" = deck_1_8_5;
     "26" = deck_1_9_2;
     "27" = deck_1_10_0;
+    "27_2" = deck_1_11_4;
+    "28" = deck_1_12_2;
+    "29" = deck_1_13_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app deck")
index c03c47953f92326a1bcaa6ba56f799047418c097..28a742a86c6a675805b8fb6a2c24c3da2a5df8f5 100644 (file)
@@ -8,6 +8,7 @@ let
       "drawio" = ["application/x-drawio"];
     };
   };
+  # https://apps.nextcloud.com/apps/drawio
   drawio_2_1_2 = buildApp rec {
     appName = "drawio";
     version = "2.1.2";
@@ -15,10 +16,27 @@ let
     sha256 = "sha256-5BrEnS2cMk/vwkAr1lXKtfocqReZAj1+pbDqmi/uG0A=";
     inherit otherConfig;
   };
+  drawio_2_1_4 = buildApp rec {
+    appName = "drawio";
+    version = "2.1.4";
+    url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-QD7b6+UjWNeS4Z2QLcgBfetIXwqNngFRX9Fryx90mQA=";
+    inherit otherConfig;
+  };
+  drawio_3_0_2 = buildApp rec {
+    appName = "drawio";
+    version = "3.0.2";
+    url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-7ulo+7rHIOCCFt4LhXDFQc+ighMiwfHDwcJuCfCb4CE=";
+    inherit otherConfig;
+  };
   versions = {
     "25" = drawio_2_1_2;
     "26" = drawio_2_1_2;
     "27" = drawio_2_1_2;
+    "27_2" = drawio_2_1_4;
+    "28" = drawio_3_0_2;
+    "29" = drawio_3_0_2;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app drawio")
index 941304af52e020250a1fcbce9f3cb0154642f619..7a74b6c54a0828656382f27d1e765033416b6dba 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/external
   external_5_0_2 = buildApp rec {
     appName = "external";
     version = "5.0.2";
@@ -18,10 +19,31 @@ let
     url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
     sha256 = "sha256-XqeJCWS8mncS7CfrnXdhtzdgkFTib/RnursJ/AqyvD8=";
   };
+  external_5_2_1 = buildApp rec {
+    appName = "external";
+    version = "5.2.1";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-kyeqd/KRbDuqfnYUb0sb7QF1LKmtQvlI/NPCH8oFutQ=";
+  };
+  external_5_3_1 = buildApp rec {
+    appName = "external";
+    version = "5.3.1";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-WJBu2KFLsT/p+iiwy0p5UdKdrSMrfD3dSQjwuAw6DwY=";
+  };
+  external_5_4_0 = buildApp rec {
+    appName = "external";
+    version = "5.4.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-7DxvOwy+AI/+t559ffqCIDBnyozxQTe1EhvbUhX64UY=";
+  };
   versions = {
     "25" = external_5_0_2;
     "26" = external_5_1_0;
     "27" = external_5_2_0;
+    "27_2" = external_5_2_1;
+    "28" = external_5_3_1;
+    "29" = external_5_4_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app external")
index 589115e1277b3359f4d9cc6a8c7ba295d09a780e..23fa92a6dcc6cfef7c7a8748a493e203e8b53a1d 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/extract
   extract_1_3_6 = buildApp rec {
     appName = "extract";
     version = "1.3.6";
@@ -10,6 +11,7 @@ let
     "25" = extract_1_3_6;
     "26" = extract_1_3_6;
     "27" = extract_1_3_6;
+    "27_2" = extract_1_3_6;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app extract")
index cf8e1792fc24c1a3a4e76b1bb16bfc88a12b33dc..dd7cdad5524387598d9306bf30557745d8ca7d22 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/files_markdown
   files_markdown_2_4_1 = buildApp rec {
     appName = "files_markdown";
     version = "2.4.1";
@@ -10,6 +11,7 @@ let
     "25" = files_markdown_2_4_1;
     "26" = files_markdown_2_4_1;
     "27" = files_markdown_2_4_1;
+    "27_2" = files_markdown_2_4_1;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_markdown")
index fff85d789c7cab3785850c8237312bd1ded3f2d7..22f3715e20dc8512153dddc6f4cddcdf545d221b 100644 (file)
@@ -1,15 +1,24 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/files_mindmap
   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=";
   };
+  files_mindmap_0_0_30 = buildApp rec {
+    appName = "files_mindmap";
+    version = "0.0.30";
+    url = "https://github.com/ACTom/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-VsaJT3lsPqnCmgLYkkdLhyIRmi/CumEdezsvhra2NQk=";
+  };
   versions = {
     "25" = files_mindmap_0_0_28;
     "26" = files_mindmap_0_0_28;
     "27" = files_mindmap_0_0_28;
+    "27_2" = files_mindmap_0_0_30;
+    "28" = files_mindmap_0_0_30;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_mindmap")
index 97aeaf79e0adc998edd75c70dbdb90cad9f1a3db..6a27942d32187a5895f391ea279106241cdb737f 100644 (file)
@@ -1,14 +1,22 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/files_readmemd
   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=";
   };
+  files_readmemd_2_0_1 = buildApp rec {
+    appName = "files_readmemd";
+    version = "2.0.1";
+    url = "https://github.com/mamatt/files_readmemd/releases/download/V${version}/${appName}.tar.gz";
+    sha256 = "sha256-tilluHmSXiuiW07rtbBGckUxrL92BPhIcBt5aPLkhq8=";
+  };
   versions = {
     "25" = files_readmemd_2_0_0;
     "26" = files_readmemd_2_0_0;
+    "27_2" = files_readmemd_2_0_1;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_readmemd")
index 55f4ba79eca66c303fddaeec441d214fc7c553cc..05223f3432ee82faa3400769b593ec30178954bf 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/flowupload
   flowupload_1_1_3 = buildApp rec {
     appName = "flowupload";
     version = "1.1.3";
index be230fd3924d27dee800ec988deae43f25a0582d..b8f6dbe093498c897d4e4425fc2f7e9b952f68b8 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/gpxedit
   gpxedit_0_0_14 = buildApp rec {
     appName = "gpxedit";
     version = "0.0.14";
index 5a3b7e7e98669c74454a51feee129d5436532b65..27591641b41c9d106ef919e83e94885a004d28c0 100644 (file)
@@ -8,6 +8,7 @@ let
       "gpx" = ["application/gpx+xml"];
     };
   };
+  # https://apps.nextcloud.com/apps/gpxpod
   gpxpod_5_0_10 = buildApp rec {
     appName = "gpxpod";
     version = "5.0.10";
@@ -22,10 +23,27 @@ let
     sha256 = "sha256-uhz6AC8opDQkFQDpG4u8H4vkFtzbFAZvb8r32QHj/8I=";
     inherit otherConfig;
   };
+  gpxpod_5_0_13 = buildApp rec {
+    appName = "gpxpod";
+    version = "5.0.13";
+    url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-NdP95TtTd9Vo6f+PQ/JpcpJNvqRZQ/3NWxNaQRu67vs=";
+    inherit otherConfig;
+  };
+  gpxpod_5_0_18 = buildApp rec {
+    appName = "gpxpod";
+    version = "5.0.18";
+    url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-OaU903sxoSzfVv1igwSLdgepgXKBkEuoin/crSg+RyA=";
+    inherit otherConfig;
+  };
   versions = {
     "25" = gpxpod_5_0_10;
     "26" = gpxpod_5_0_12;
     "27" = gpxpod_5_0_12;
+    "27_2" = gpxpod_5_0_13;
+    "28" = gpxpod_5_0_18;
+    "29" = gpxpod_5_0_18;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxpod")
index b966d3dca5104a5fb01758deec72d303c6e99c0e..1256ce8421c5c7dd15e3ef82657106e9898a38f9 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/groupfolders
   groupfolders_13_1_5 = buildApp rec {
     appName = "groupfolders";
     version = "13.1.5";
@@ -18,10 +19,31 @@ let
     url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
     sha256 = "sha256-NsTZhmY1XBKHn/1IcIp2Al7BwJzE2xoBzgyBXnmuWls=";
   };
+  groupfolders_15_3_8 = buildApp rec {
+    appName = "groupfolders";
+    version = "15.3.8";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-0R2FN7ba5FI95GWTUeE2JUoYIvSLIsQH/Y+VTqZQn1M=";
+  };
+  groupfolders_16_0_7 = buildApp rec {
+    appName = "groupfolders";
+    version = "16.0.7";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-a22KP20fE+cpOuv2erl3qUu4glWArx5oISFlI8vxAQc=";
+  };
+  groupfolders_17_0_1 = buildApp rec {
+    appName = "groupfolders";
+    version = "17.0.1";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-x9T/JoNJl6LxaPzF9IpKaGrz321nbMSAN3gfZbSapGE=";
+  };
   versions = {
     "25" = groupfolders_13_1_5;
     "26" = groupfolders_14_0_4;
     "27" = groupfolders_15_0_2;
+    "27_2" = groupfolders_15_3_8;
+    "28" = groupfolders_16_0_7;
+    "29" = groupfolders_17_0_1;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app groupfolders")
index afae917e009c250c6a42a174a40559a28da1d5df..96ad7864d79e6c56c141332140e82c14f651eb2e 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/impersonate
   impersonate_1_12_1 = buildApp rec {
     appName = "impersonate";
     version = "1.12.1";
@@ -18,10 +19,25 @@ let
     url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
     sha256 = "sha256-A1rGJJLaWhiNf9l0YUh6WOB+fKRBRDckE890hq5OB4k=";
   };
+  impersonate_1_15_0 = buildApp rec {
+    appName = "impersonate";
+    version = "1.15.0";
+    url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-fJ96PmkRvgmoIYmF7r/zOQ88/tjb6d0+sQ1YbKq8sY8=";
+  };
+  impersonate_1_16_0 = buildApp rec {
+    appName = "impersonate";
+    version = "1.16.0";
+    url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-7NCfm2c861E1ZOZhpqjbsw2LC9I7ypp2J1LamqmWvtU=";
+  };
   versions = {
     "25" = impersonate_1_12_1;
     "26" = impersonate_1_13_1;
     "27" = impersonate_1_14_0;
+    "27_2" = impersonate_1_14_0;
+    "28" = impersonate_1_15_0;
+    "29" = impersonate_1_16_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app impersonate")
index d3834ad67d5262dc6fad2acdf0e0e94b4d7dbb2c..2b3b738a739abd1c63b62f9304503fdb83c5eb04 100644 (file)
@@ -1,13 +1,23 @@
 { buildApp, nextcloudVersion }:
 let
-   integration_dropbox_2_0_1 = buildApp rec {
+  # https://apps.nextcloud.com/apps/integration_dropbox
+  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=";
   };
+  integration_dropbox_2_2_0 = buildApp rec {
+    appName = "integration_dropbox";
+    version = "2.2.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-GSdiE/WYyJlBv6SuViLzidJvbzImnfWUEKwjqye6qyw=";
+  };
   versions = {
     "27" = integration_dropbox_2_0_1;
+    "27_2" = integration_dropbox_2_2_0;
+    "28" = integration_dropbox_2_2_0;
+    "29" = integration_dropbox_2_2_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app integration_dropbox")
index 7be8c6bcc153bb581e837c061e2383e267fceb61..63c201821c7522c40640100b18478cc4ca8926ab 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/keeweb
   keeweb_0_6_13 = buildApp rec {
     appName = "keeweb";
     version = "0.6.13";
@@ -15,10 +16,27 @@ let
       };
     };
   };
+  keeweb_0_6_18 = buildApp rec {
+    appName = "keeweb";
+    version = "0.6.18";
+    url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-DsWjS7U8FPbryfH3TjQ0sLqVYZX4wlzy6AZl2cHXR6M=";
+    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;
+    "27_2" = keeweb_0_6_13;
+    "28" = keeweb_0_6_18;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app keeweb")
index 1b29173b2405f08e5b3b05837513b684e466c871..8d09887dcbec4edd5e8d852da323a5ee0c9f6108 100644 (file)
@@ -1,15 +1,31 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/maps
   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=";
   };
+  maps_1_2_0 = buildApp rec {
+    appName = "maps";
+    version = "1.2.0";
+    url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-3XCjm1rsPpLnOEVoHPasKDZEJzweY7AbqASXoimHGVg=";
+  };
+  maps_1_4_0 = buildApp rec {
+    appName = "maps";
+    version = "1.4.0";
+    url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-BmXs6Oepwnm+Cviy4awm3S8P9AiJTt1BnAQNb4TxVYE=";
+  };
   versions = {
     "25" = maps_1_1_0;
     "26" = maps_1_1_0;
     "27" = maps_1_1_0;
+    "27_2" = maps_1_2_0;
+    "28" = maps_1_4_0;
+    "29" = maps_1_4_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app maps")
index 0fe74091c8b081155239fd9182395a7e4bdfeb1d..4c4ec802bed62760839f2b1d336b66125accfd9e 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/metadata
   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=";
   };
+  metadata_0_20_0 = buildApp rec {
+    appName = "metadata";
+    version = "0.20.0";
+    url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-FsdkKnF+hXhrw3KVYWLu7FN34PMF0mOM4+tvB8IzmXw=";
+  };
   versions = {
     "25" = metadata_0_19_0;
     "26" = metadata_0_19_0;
     "27" = metadata_0_19_0;
+    "27_2" = metadata_0_20_0;
+    "28" = metadata_0_20_0;
+    "29" = metadata_0_20_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app metadata")
index fc96224dda7870db4accc63d487e7de274aaa6c6..522d321804de9e5e666cf50e3c7ed31b318962b3 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/music
   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=";
   };
+  music_1_11_0 = buildApp rec {
+    appName = "music";
+    version = "1.11.0";
+    url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}_${version}_for_nextcloud.tar.gz";
+    sha256 = "sha256-IcxgSo5kIDzMideKlrh3gdG71s0+KqTCNCpmH+N1lGQ=";
+  };
   versions = {
     "25" = music_1_8_4;
     "26" = music_1_8_4;
     "27" = music_1_8_4;
+    "27_2" = music_1_11_0;
+    "28" = music_1_11_0;
+    "29" = music_1_11_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app music")
index 7677c6ceb6e74384c4e615fb5d31f74749b3fd8e..8539a43d8816e3f526d3b787ce7533d5e776fd4a 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/notes
   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=";
   };
+  notes_4_10_0 = buildApp rec {
+    appName = "notes";
+    version = "4.10.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-av6y5GViTzlHtnUb/OIDw+0wdA/ZRwPYQMU3yDEbMTQ=";
+  };
   versions = {
     "25" = notes_4_8_1;
     "26" = notes_4_8_1;
     "27" = notes_4_8_1;
+    "27_2" = notes_4_10_0;
+    "28" = notes_4_10_0;
+    "29" = notes_4_10_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app notes")
index dcdaad26837b776be26ed200cf37ede0a1975f6e..5e2dbc0fed4b8476ede6b35bde87dee33a28d3f4 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/ocsms
   ocsms_2_2_0 = buildApp rec {
     appName = "ocsms";
     version = "2.2.0";
index e93df0009ec60068f7da4fc24c368a1ace216ffa..276efe12ab9e471dc5ee6759cb2ad216f8750048 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/onlyoffice
   onlyoffice_7_9_0 = buildApp rec {
     appName = "onlyoffice";
     version = "7.9.0";
@@ -12,10 +13,19 @@ let
     url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz";
     sha256 = "sha256-DfZKgpkpcogy9I3A3ru0V/WR5wYWBr+wrHe+mQJBPYk=";
   };
+  onlyoffice_9_2_2 = buildApp rec {
+    appName = "onlyoffice";
+    version = "9.2.2";
+    url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-tvecrmbsxfzth+9y5WUYz8Mpwh7rf4NAYOc021vTjS0=";
+  };
   versions = {
     "25" = onlyoffice_7_9_0;
     "26" = onlyoffice_7_9_0;
     "27" = onlyoffice_8_2_0;
+    "27_2" = onlyoffice_9_2_2;
+    "28" = onlyoffice_9_2_2;
+    "29" = onlyoffice_9_2_2;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app onlyoffice")
index 5559b22f611a4c8770176183744977451520c464..63f7c2efe393f4ef9f7e9a6ca1db46c76953daca 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/passman
   passman_2_4_5 = buildApp rec {
     appName = "passman";
     version = "2.4.5";
@@ -12,10 +13,19 @@ let
     url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
     sha256 = "sha256-CeNaN0cioVjcW6ILB//BIvmjQWcbvfK3m8jVQ8LGtyM=";
   };
+  passman_2_4_9 = buildApp rec {
+    appName = "passman";
+    version = "2.4.9";
+    url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
+    sha256 = "sha256-jLcKuY8wJohZ/oRon05yBq+755W9ytgOZsad9jhjUJY=";
+  };
   versions = {
     "25" = passman_2_4_5;
     "26" = passman_2_4_7;
     "27" = passman_2_4_7;
+    "27_2" = passman_2_4_9;
+    "28" = passman_2_4_9;
+    "29" = passman_2_4_9;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app passman")
index a50ac434a49e7682b806a7581188c6bdbd25340c..24eb7b08969e7b6d91e4593627892a69f8db52ad 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/polls
   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=";
   };
+  polls_7_1_1 = buildApp rec {
+    appName = "polls";
+    version = "7.1.1";
+    url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-C9za++xDhiKQD97M39RijteP0PhTtlDTs94H3Z/pd+I=";
+  };
   versions = {
     "25" = polls_5_2_0;
     "26" = polls_5_2_0;
     "27" = polls_5_2_0;
+    "27_2" = polls_7_1_1;
+    "28" = polls_7_1_1;
+    "29" = polls_7_1_1;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app polls")
index da48f91b1af50cbfd9b7dc9ba689dfd7f315e1f9..0cfe8a3444e25b576518c33d2e1e4c25d5e93227 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/side_menu
   side_menu_3_10_3 = buildApp rec {
     appName = "side_menu";
     version = "3.10.3";
@@ -7,10 +8,20 @@ let
     filename = "${appName}-${version}.tar.gz";
     sha256 = "sha256-WKbc6Ln6v3LYyRzwy0xAOmXilbqrWGS8XGWIT+TajdM=";
   };
+  side_menu_3_12_0 = buildApp rec {
+    appName = "side_menu";
+    version = "3.12.0";
+    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;
+    "27_2" = side_menu_3_12_0;
+    "28" = side_menu_3_12_0;
+    "29" = side_menu_3_12_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app side_menu")
index 912b5bffdbe1fc092b617b95411542407fa27d20..2b566fb643ae581aa2c604adb5c33b05e7ba9ab8 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/social
   social_0_6_1 = buildApp rec {
     appName = "social";
     version = "0.6.1";
@@ -9,6 +10,8 @@ let
   versions = {
     "26" = social_0_6_1;
     "27" = social_0_6_1;
+    "27_2" = social_0_6_1;
+    "28" = social_0_6_1;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app social")
index d8a20b9072d85710c19d25f35ef66b7357b30072..f4ad60278da4736024b0884f2bf41ecef4ceb40a 100644 (file)
@@ -1,5 +1,6 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/spreed
   spreed_15_0_7 = buildApp rec {
     appName = "spreed";
     version = "15.0.7";
@@ -18,10 +19,31 @@ let
     url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
     sha256 = "sha256-vb08DI+q+5f87zz2UguE1y6b0NV2EoICYpaKUGmyF5w=";
   };
+  spreed_17_1_9 = buildApp rec {
+    appName = "spreed";
+    version = "17.1.9";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-YP/EDlxw3BVRVwWNyopt54Gcw5kG54gBHm2sDkSWLk0=";
+  };
+  spreed_18_0_8 = buildApp rec {
+    appName = "spreed";
+    version = "18.0.8";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-oUbZxLf1maXXB4FYWJ4zsnbkIcaXBcHZdlR3m4wTPio=";
+  };
+  spreed_19_0_2 = buildApp rec {
+    appName = "spreed";
+    version = "19.0.2";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-FmikkGguGlMdEyae3vT6Esx1mMUc1ri5eQX280woPls=";
+  };
   versions = {
     "25" = spreed_15_0_7;
     "26" = spreed_16_0_5;
     "27" = spreed_17_0_3;
+    "27_2" = spreed_17_1_9;
+    "28" = spreed_18_0_8;
+    "29" = spreed_19_0_2;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app spreed")
index 906719d8c5e83566b27eb70815dd2ff835abea92..dc880fc343ddc622d3b84b650f0711fefc4c3ec3 100644 (file)
@@ -1,14 +1,23 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/talk_matterbridge
   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=";
   };
+  talk_matterbridge_1_28_0 = buildApp rec {
+    appName = "talk_matterbridge";
+    version = "1.28.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}-0/${appName}.tar.gz";
+    sha256 = "sha256-uZNc+mJb+frlnXYAZJnn84aopsHvakQ4e7ZKFG6Gwyo=";
+  };
   versions = {
     "25" = talk_matterbridge_1_26_0;
     "26" = talk_matterbridge_1_26_0;
+    "27_2" = talk_matterbridge_1_28_0;
+    "28" = talk_matterbridge_1_28_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app talk_matterbridge")
index aee76508cd097c2905b19ef38bc2c13e6f8c284b..a81383a96f37431ee0e2227ce566e53260101eea 100644 (file)
@@ -1,15 +1,25 @@
 { buildApp, nextcloudVersion }:
 let
+  # https://apps.nextcloud.com/apps/tasks
   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=";
   };
+  tasks_0_16_0 = buildApp rec {
+    appName = "tasks";
+    version = "0.16.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-HitYQcdURUHujRNMF0jKQzvSO93bItisI0emq0yw8p4=";
+  };
   versions = {
     "25" = tasks_0_15_0;
     "26" = tasks_0_15_0;
     "27" = tasks_0_15_0;
+    "27_2" = tasks_0_15_0;
+    "28" = tasks_0_16_0;
+    "29" = tasks_0_16_0;
   };
 in
   versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app tasks")
index 8821cfa51c8154c49f11844c1d908c5327d5b20c..ec12872c5541258ca4259659a9f8bd24e8ad35c4 100644 (file)
@@ -4,6 +4,12 @@ let
     "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-O1NMmOdrf+2Mo5NMrUGbEK9YViWfMTvsIs06e/pu+WE="; fullVersion = "27.1.5"; }; # php 8.0 - 8.2
+    "27_2" = { sum = "sha256-lD4ScNdxp8gNqisy5ylM6MO3e56u9yrYs4SH1YyFB1Y="; fullVersion = "27.1.10"; }; # php 8.0 - 8.2
+                                                                                                       # postgresql 12/13/14
+    "28" = { sum = "sha256-3w0zhLRHy6HhKPIggPZ4BSH4aBab6r7o6g0VW/nGa48="; fullVersion = "28.0.6"; }; # php 8.0 - 8.2
+                                                                                                     # postgresql 12/13/14/15
+    "29" = { sum = "sha256-LUnSl9w0AJICEFeCPo54oxK8APVt59hneseQWQkYqxc="; fullVersion = "29.0.2"; }; # php 8.0 - 8.3
+                                                                                                     # postgresql 12/13/14/15/16
   };
   appNames = [
     "audioplayer" "bookmarks" "calendar" "carnet"
index 5e84cc2181773bb2983c2032e5215c82e9efd566..1e163a2d1eda6e00562032a93336230f63977339 100644 (file)
@@ -3,7 +3,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
index 24cbb7a0202e5ec97ad21e912754da52d03e3e67..389a601ee0f4efde86a443044cc8064e45cfbee0 100644 (file)
               };
             };
           };
+          borg_backup = mkOption {
+            description = ''
+              Remote backup with borg/borgmatic
+            '';
+            type = submodule {
+              options = {
+                password = mkOption { type = str; description = "Password for encrypting files"; };
+                remotes = mkOption {
+                  type = attrsOf (submodule {
+                    options = {
+                      remote = mkOption {
+                        type = functionTo (functionTo str);
+                        example = literalExample ''
+                          bucket: "ssh://some_host/${bucket}";
+                          '';
+                        description = ''
+                          Function.
+                          Takes a bucket name as argument and returns a url
+                          '';
+                      };
+                      sshRsyncPort = mkOption { type = str; default = "22"; description = "SSH port"; };
+                      sshRsyncHost = mkOption { type = nullOr str; default = null; description = "SSH host"; };
+
+                      sshKnownHosts = mkOption { type = nullOr str; default = null; description = "Ssh known hosts"; };
+                    };
+                  });
+                };
+              };
+            };
+          };
           backup = mkOption {
             description = ''
               Remote backup with duplicity
                 remotes = mkOption {
                   type = attrsOf (submodule {
                     options = {
+                      remote_type = mkOption {
+                        type = enum [ "s3" "rsync" ];
+                      };
                       remote = mkOption {
                         type = functionTo str;
                         example = literalExample ''
                           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"; };
+                      sshRsyncPort = mkOption { type = str; default = "22"; description = "SSH port for rsync"; };
+                      sshRsyncHost = mkOption { type = nullOr str; default = null; description = "SSH host for rsync"; };
+
+                      sshKnownHosts = mkOption { type = nullOr str; default = null; description = "Ssh known hosts"; };
+                      s3AccessKeyId = mkOption { type = nullOr str; default = null; description = "Remote access-key"; };
+                      s3SecretAccessKey = mkOption { type = nullOr str; default = null; description = "Remote access secret"; };
                     };
                   });
                 };
                     };
                   };
                 };
+                matrix = mkOption {
+                  description = "Matrix configuration";
+                  type = submodule {
+                    options = {
+                      ldap = mkLdapOptions "Mediagoblin" {};
+                    };
+                  };
+                };
                 mediagoblin = mkOption {
                   description = "Mediagoblin configuration";
                   type = submodule {
index d1447b7ecbb360b21ced25cc24fb62a43f88a87d..4d620ad087a381a47dc6e93c0665654d9e12b639 100644 (file)
@@ -3,7 +3,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
index e2366fa761bf7bf0b30c17dbfe120935c1836ef9..6891e49c0334511674d5748335e5fcaef7ad9e4e 100644 (file)
@@ -3,7 +3,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
index e76ca08d310bba9566c97309dd1d9101c3c85cdf..cdba7c2311d88a06af83abfabd035bd6cdb76164 100644 (file)
@@ -3,7 +3,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
index b7c3997dd9b10467fbc8f1d6249e43d2897ca32a..5610d6789145104eb21219053f4812987f3cf629 100644 (file)
                 Whether to enable monitoring.
               '';
             };
+            smartdDisks = lib.mkOption {
+              type = lib.types.listOf lib.types.str;
+              default = [];
+              description = ''
+                List of smartd disks ids (symlinks in /dev/disk/by-id/) to monitor
+              '';
+            };
             master = lib.mkOption {
               type = lib.types.bool;
               default = false;
             objectDefs =
               self.lib.toObjects cfg.objects;
           };
+
+          myServices.monitoring.objects.service = builtins.map (d: {
+            service_description = "Disk /dev/disk/by-id/${d} is sane";
+            use = "local-service";
+            check_command = [ "check_smartctl" "/dev/disk/by-id/${d}" ];
+            __passive_servicegroups = "webstatus-resources";
+
+            check_interval = 60;
+          }) cfg.smartdDisks;
+
+          systemd = let
+            checkShortTimer = {
+              timerConfig = {
+                OnCalendar = "monthly";
+                RandomizedDelaySec = "3 weeks";
+                FixedRandomDelay = true;
+              };
+              wantedBy = [ "timers.target" ];
+            };
+            checkLongTimer = {
+              timerConfig = {
+                OnCalendar = "monthly";
+                RandomizedDelaySec = "3 weeks";
+                FixedRandomDelay = true;
+              };
+              wantedBy = [ "timers.target" ];
+            };
+            toSDTimers = id: {
+              "check-smartd-long-${id}" = checkLongTimer;
+              "check-smartd-short-${id}" = checkShortTimer;
+            };
+            toCheckService = id: type: {
+              description = "Run ${type} smartctl test for /dev/disk/by-id/${id}";
+              after = [ "multi-user.target" ];
+              serviceConfig = {
+                Type = "oneshot";
+                ExecStart = "${pkgs.smartmontools}/bin/smartctl -t ${type} /dev/disk/by-id/${id}";
+              };
+            };
+            toSDServices = id: {
+              "check-smartd-long-${id}" = toCheckService id "long";
+              "check-smartd-short-${id}" = toCheckService id "short";
+            };
+
+          in {
+            services = lib.attrsets.mergeAttrsList (builtins.map toSDServices cfg.smartdDisks);
+            timers = lib.attrsets.mergeAttrsList (builtins.map toSDTimers cfg.smartdDisks);
+          };
         };
       };
   };
index f76f2c1a4dfe93dbe79a5978d09d2331758a3280..bb3a383c05ff8fd812c8f9e277a68ce0366994ec 100644 (file)
@@ -284,6 +284,30 @@ in
       ]}
     '';
   };
+  smartctl = {
+    commands = {
+      check_smartctl = "$USER2$/check_smartctl -i auto -d $ARG1$";
+    };
+    chunk = let
+      smartPlugin = pkgs.fetchurl {
+        url = "https://www.claudiokuenzler.com/monitoring-plugins/check_smart.pl";
+        sha256 = "sha256-gxGkzyycUl+I3WziKhOnZSoQjpqbPqjbunfUQxmeb7w=";
+      };
+    in ''
+      cp ${smartPlugin} $out/check_smartctl
+      chmod +x $out/check_smartctl
+      patchShebangs $out
+      substituteInPlace $out/check_smartctl --replace "/usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/local/sbin" "${pkgs.smartmontools}/bin"
+      substituteInPlace $out/check_smartctl --replace "sudo" "${sudo}"
+    '';
+
+    sudo = _: {
+      commands = [
+        { command = "${pkgs.smartmontools}/bin/smartctl *"; options = [ "NOPASSWD" ]; }
+      ];
+      runAs = "root";
+    };
+  };
   mysql = {
     commands = {
       check_mysql_replication = "${sudo} -u mysql $USER2$/check_mysql_replication \"$ARG1$\" \"$ARG2$\"";
index a2eea1ae086b6edd4583df76a887dc75efaec980..15fea3955d24b64ee5b847b13f94cba2e6a62e8b 100644 (file)
@@ -3,7 +3,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
index d1447b7ecbb360b21ced25cc24fb62a43f88a87d..4d620ad087a381a47dc6e93c0665654d9e12b639 100644 (file)
@@ -3,7 +3,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
index 49fb3b550df8245dcb6f686be3903468de18bede..c6362c5b37a81353ab97411e847c050ba32336ef 100644 (file)
@@ -19,7 +19,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
@@ -69,7 +69,7 @@
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
index ad6c58cd38ad1fcf5245197a372e009e16d34fd5..6045fd4d7aa1ee67a4671ad3f0efe06f6a182d15 100644 (file)
           secrets.deleteSecretsVars = true;
           secrets.secretsVars = "/run/keys/vars.yml";
 
+          programs.ssh.package = lib.mkDefault (
+            pkgs.openssh.overrideAttrs(old: rec {
+              patches = old.patches ++ [
+                # Mitigation for CVE https://www.qualys.com/2024/07/01/cve-2024-6387/regresshion.txt
+                (pkgs.fetchpatch {
+                  url = "https://raw.githubusercontent.com/NixOS/nixpkgs/342bfe5c431fd7828fee8fa7e07a4d8fbfd18618/pkgs/tools/networking/openssh/openssh-9.6_p1-CVE-2024-6387.patch";
+                  sha256 = "sha256-B3Wz/eWSdOnrOcVzDv+QqzLGdFlb3jivQ8qZMC3d0Qw=";
+                })
+              ];
+            })
+          );
           services.openssh.enable = true;
 
           nixpkgs.overlays =
index 2c947a2ac2fbf201820e4e4de75036191bd5ad4e..8ebbf92dd459e608d9fdb96bfce30e8e791d4a56 100644 (file)
@@ -41,7 +41,7 @@
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
index 6616de07f14ec721806c63610d027130fc110b7a..f11321975893eed6a6941f567f56d2aea4fd09b2 100644 (file)
@@ -161,7 +161,6 @@ in
                 --gtid \
                 --master-data \
                 --flush-privileges \
-                --ignore-database=netdata \
                 --all-databases > $filename
               ${pkgs.gzip}/bin/gzip $filename
             '';
index a8d55bf50b0271d9b2a81d93871edd210b7502e8..dedbfb42c78fe9bfc31ef9d5b8139f3f4fae0005 100644 (file)
@@ -22,7 +22,7 @@
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
@@ -74,7 +74,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
@@ -86,7 +86,7 @@
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
@@ -98,7 +98,7 @@
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_4": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_5": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_6": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_7": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index 8c0b3ada3978b0d86bfd608db628354b4c672cc2..b47d92823322c64fc7de718dacff66f1ad2bf893 100644 (file)
@@ -21,7 +21,7 @@
     # available in nixos-20.09
     #zfs.requestEncryptionCredentials = [ "zpool/root" ];
   };
-  powerManagement.cpuFreqGovernor = "powersave";
+  powerManagement.cpuFreqGovernor = "ondemand";
   hardware.enableRedistributableFirmware = true;
 
   swapDevices = [ { label = "swap"; } ];
index 30963845f2ba36eb099b4339cb530042dd496a8b..436b4bc60fbc8f03fff90ee6184a73c171de0ac1 100644 (file)
@@ -59,7 +59,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
@@ -71,7 +71,7 @@
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
@@ -83,7 +83,7 @@
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index af7f22434854dba5f93c045810cace92d48b4c9c..e45aa25acee4771a27ac4d5147b896151ee7d04f 100644 (file)
@@ -9,7 +9,13 @@ let
   };
 in
 {
-  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary"];
+  config.myServices.monitoring.smartdDisks = [
+    "ata-Micron_1100_MTFDDAK512TBN_171216BD2A4B"
+    "ata-Micron_1100_MTFDDAK512TBN_171216BD2A70"
+    "ata-TOSHIBA_MG04ACA400N_96K1K87YFVLC"
+    "ata-WDC_WD3000FYYZ-01UL1B2_WD-WMC1F0E4X6WP"
+  ];
+  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary" "smartctl" ];
   config.myServices.monitoring.objects = lib.mkMerge [
     (monitoring.lib.objectsCommon {
       inherit hostFQDN;
index a77a438e455d9bbe7c207067e4915f861ef6db2b..4535dcf500f800d6ac415a07c5d36a60aa7ed7ff 100644 (file)
@@ -29,7 +29,7 @@
   ];
 
   nixpkgs.overlays = builtins.attrValues ports.overlays;
-  powerManagement.cpuFreqGovernor = "powersave";
+  powerManagement.cpuFreqGovernor = "ondemand";
 
   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")
     ./buildbot
     ./coturn.nix
     ./dns.nix
+    ./borg_backup.nix
     ./duply_backup.nix
     ./gemini
     ./gitolite
     ./vpn
   ];
 
+  services.borgBackup.enable = true;
+  services.borgBackup.profiles.global = {
+    bucket = "global";
+    hash = false;
+    remotes = [ "attilax" ];
+    ignoredPaths = [
+      "udev"
+      "portables"
+      "machines"
+      "nixos"
+      "nixos-containers"
+    ];
+  };
   myServices.buildbot.enable = true;
   myServices.databases.enable = true;
   myServices.gitolite.enable = true;
         table = ldap_users
         user_column = login
         pw_type = function
-        auth_query = SELECT ((mechanism = 'SSHA' AND password = encode(digest( %p || salt, 'sha1'), 'hex')) OR (mechanism = 'PLAIN' AND password = %p)) FROM ldap_users WHERE login = %u OR login || '@' || realm = %u
+        auth_query = SELECT ((mechanism = 'SSHA' AND password = encode(digest( convert_to(%p, 'UTF8') || salt, 'sha1'), 'hex')) OR (mechanism = 'PLAIN' AND password = %p)) 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
       '';
     };
diff --git a/systems/eldiron/borg_backup.nix b/systems/eldiron/borg_backup.nix
new file mode 100644 (file)
index 0000000..f83594a
--- /dev/null
@@ -0,0 +1,242 @@
+{ lib, pkgs, config, name, ... }:
+
+let
+  cfg = config.myEnv.borg_backup;
+  varDir = "/var/lib/borgbackup";
+  borg_args = "--encryption repokey --make-parent-dirs init create prune compact check";
+  borg_backup_full_with_ignored = pkgs.writeScriptBin "borg_full_with_ignored" ''
+    #!${pkgs.stdenv.shell}
+
+    if [ -z "$1" -o "$1" = "-h" -o "$1" = "--help" ]; then
+      echo "borg_full_with_ignored /path/to/borgmatic.yaml"
+      echo "Does a full backup including directories with .duplicity-ignore"
+      exit 1
+    fi
+    ${pkgs.borgmatic}/bin/borgmatic -c "$1" --override 'storage.archive_name_format="{hostname}-with-ignored-{now:%Y-%m-%dT%H:%M:%S.%f}"' --override 'location.exclude_if_present=[]' ${borg_args}
+  '';
+  borg_backup = pkgs.writeScriptBin "borg_backup" ''
+    #!${pkgs.stdenv.shell}
+
+    declare -a profiles
+    profiles=()
+    ${builtins.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList (k: v: map (remote: [
+      ''profiles+=("${remote}_${k}")''
+    ]) v.remotes) config.services.borgBackup.profiles))}
+
+    if [ -f "${varDir}/last_backup_profile" ]; then
+      last_backup=$(cat ${varDir}/last_backup_profile)
+      for i in "''${!profiles[@]}"; do
+        if [[ "''${profiles[$i]}" = "$last_backup" ]]; then
+          break
+        fi
+      done
+      ((i+=1))
+      profiles=("''${profiles[@]:$i}" "''${profiles[@]:0:$i}")
+    fi
+
+    # timeout in minutes
+    timeout="''${1:-180}"
+    timeout_timestamp=$(date +%s -d "$timeout minutes")
+    for profile in "''${profiles[@]}"; do
+      if [ $(date +%s -d "now") -ge "$timeout_timestamp" ]; then
+        break
+      fi
+
+      touch "${varDir}/$profile.log"
+      ${pkgs.borgmatic}/bin/borgmatic -c "${config.secrets.location}/borg_backup/$profile/borgmatic.yaml" ${borg_args} >> ${varDir}/$profile.log
+      [[ $? = 0 ]] || echo -e "Error when doing backup for $profile, see above or logs in ${varDir}/$profile.log\n---------------------------------------" >&2
+      echo "$profile" > ${varDir}/last_backup_profile
+    done
+  '';
+
+  check_backups = pkgs.writeScriptBin "borg_list_not_backuped" ''
+    #!${pkgs.stdenv.shell}
+
+    do_check() {
+      local dir="$1" path ignored_path
+      find "$dir" -mindepth 1 -maxdepth 1 | while IFS= read -r path; do
+        if ${pkgs.gnugrep}/bin/grep -qFx "$path" ${config.secrets.fullPaths."borg_backup/backuped_list"}; then
+          continue
+        elif ${pkgs.gnugrep}/bin/grep -q "^$path/" ${config.secrets.fullPaths."borg_backup/backuped_list"}; then
+          do_check "$path"
+        else
+          while IFS= read -r ignored_path; do
+            if [[ "$path" =~ ^$ignored_path$ ]]; then
+              continue 2
+            fi
+          done < ${config.secrets.fullPaths."borg_backup/ignored_list"}
+          printf '%s\n' "$path"
+        fi
+      done
+    }
+
+    do_check /var/lib
+  '';
+  borgProfile = profile: remote: bucket: builtins.toJSON {
+    location = {
+      source_directories = map (p: "${profile.rootDir}/${p}") profile.includedPaths;
+      repositories = [
+        { path = cfg.remotes.${remote}.remote name bucket; label = "backupserver"; }
+      ];
+      one_file_system = false;
+      exclude_if_present = [".duplicity-ignore"];
+      source_directories_must_exist = profile.directoriesMustExist;
+      borgmatic_source_directory = "${varDir}/${profile.bucket}/.borgmatic";
+    };
+    storage = {
+      encryption_passphrase = profile.password;
+      ssh_command = "ssh -i ${config.secrets.fullPaths."borg_backup/identity"}";
+      compression = "zlib";
+      borg_base_directory = "${varDir}/${profile.bucket}";
+      relocated_repo_access_is_ok = true;
+    };
+    retention = {
+      keep_within = "10d";
+      keep_daily = 30;
+    };
+  };
+in
+{
+  options = {
+    services.borgBackup.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      description = ''
+        Whether to enable remote backups.
+      '';
+    };
+    services.borgBackup.profiles = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.submodule {
+        options = {
+          hash = lib.mkOption {
+            type = lib.types.bool;
+            default = true;
+            description = ''
+              Hash bucket and directory names
+            '';
+          };
+          rootDir = lib.mkOption {
+            type = lib.types.path;
+            default = "/var/lib";
+            description = ''
+              Path to backup
+              '';
+          };
+          password = lib.mkOption {
+            type = lib.types.str;
+            default = cfg.password;
+            description = ''
+              password to use to encrypt data
+            '';
+          };
+          directoriesMustExist = lib.mkOption {
+            type = lib.types.bool;
+            default = true;
+            description = ''
+              Raise error if backuped directory doesn't exist
+            '';
+          };
+          bucket = lib.mkOption {
+            type = lib.types.str;
+            description = ''
+              Bucket to use
+              '';
+          };
+          remotes = lib.mkOption {
+            type = lib.types.listOf lib.types.str;
+            description = ''
+              Remotes to use for backup
+              '';
+          };
+          includedPaths = lib.mkOption {
+            type = lib.types.listOf lib.types.str;
+            default = [];
+            description = ''
+              Included paths (subdirs of rootDir)
+            '';
+          };
+          excludeFile = lib.mkOption {
+            type = lib.types.lines;
+            default = "";
+            description = ''
+              Content to put in exclude file
+              '';
+          };
+          ignoredPaths = lib.mkOption {
+            type = lib.types.listOf lib.types.str;
+            default = [];
+            description = ''
+              List of paths to ignore when checking non-backed-up directories
+              Can use (POSIX extended) regex
+            '';
+          };
+        };
+      });
+    };
+  };
+
+  config = lib.mkIf config.services.borgBackup.enable {
+    system.activationScripts.borg_backup = ''
+      install -m 0700 -o root -g root -d ${varDir}
+      '';
+    secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (k: v:
+      let
+        bucket = if v.hash or true then builtins.hashString "sha256" v.bucket else v.bucket;
+      in map (remote: [
+        (lib.nameValuePair "borg_backup/${remote}_${k}/borgmatic.yaml" {
+          permissions = "0400";
+          text = borgProfile v remote bucket;
+        })
+        (lib.nameValuePair "borg_backup/${remote}_${k}" {
+          permissions = "0700";
+          isDir = true;
+        })
+    ]) v.remotes) config.services.borgBackup.profiles)) // {
+      "borg_backup/identity" = {
+        permissions = "0400";
+        text = "{{ .ssl_keys.borg_backup }}";
+      };
+      "borg_backup/ignored_list" = {
+        permissions = "0400";
+        text = let
+            ignored = map
+              (v: map (p: "${v.rootDir}/${p}") v.ignoredPaths)
+              (builtins.attrValues config.services.borgBackup.profiles);
+          in builtins.concatStringsSep "\n" (lib.flatten ignored);
+      };
+      "borg_backup/backuped_list" = {
+        permissions = "0400";
+        text = let
+            included = map
+              (v: map (p: "${v.rootDir}/${p}") v.includedPaths)
+              (builtins.attrValues config.services.borgBackup.profiles);
+          in builtins.concatStringsSep "\n" (lib.flatten included);
+      };
+    };
+
+    programs.ssh.knownHostsFiles = [
+      (pkgs.writeText
+        "borg_backup_known_hosts"
+        (builtins.concatStringsSep
+          "\n"
+          (builtins.filter
+            (v: v != null)
+            (builtins.map
+              (v: v.sshKnownHosts)
+              (builtins.attrValues cfg.remotes)
+            )
+          )
+        )
+      )
+    ];
+    environment.systemPackages = [ pkgs.borgbackup pkgs.borgmatic borg_backup_full_with_ignored borg_backup check_backups ];
+    services.cron = {
+      enable = true;
+      systemCronJobs = [
+        "0 0 * * * root ${borg_backup}/bin/borg_backup 300"
+      ];
+
+    };
+
+  };
+}
index 7cd15da41a5d97faa084c5408f36f056bf5f06c2..fcab337c82057ee2f4bd61729b245505601658bb 100644 (file)
@@ -103,6 +103,9 @@ in
     };
     users.users.openldap.extraGroups = [ "keys" ];
     networking.firewall.allowedTCPPorts = [ 636 389 ];
+    services.borgBackup.profiles.global.includedPaths = [
+      "openldap"
+    ];
 
     security.acme.certs."ldap" = {
       group = "openldap";
index 590d12502b0f587e731612c41dccda9d782ec1bb..51433029feaab0e97668e218570890bda7868ebe 100644 (file)
 let
   cfg = config.myEnv.backup;
   varDir = "/var/lib/duply";
-  duplyProfile = profile: remote: prefix: ''
-    GPG_PW="${cfg.password}"
-    TARGET="${cfg.remotes.${remote}.remote profile.bucket}${prefix}"
-    export AWS_ACCESS_KEY_ID="${cfg.remotes.${remote}.accessKeyId}"
-    export AWS_SECRET_ACCESS_KEY="${cfg.remotes.${remote}.secretAccessKey}"
+  default_action = "pre_bkp_purge_purgeFull_purgeIncr";
+  duply_backup_full_with_ignored = pkgs.writeScriptBin "duply_full_with_ignored" ''
+    #!${pkgs.stdenv.shell}
+
+    export DUPLY_FULL_BACKUP_WITH_IGNORED=yes
+    if [ -z "$1" -o "$1" = "-h" -o "$1" = "--help" ]; then
+      echo "duply_full_with_ignored /path/to/profile"
+      echo "Does a full backup including directories with .duplicity-ignore"
+      exit 1
+    fi
+    ${pkgs.duply}/bin/duply "$1" pre_full --force
+  '';
+  duply_backup = pkgs.writeScriptBin "duply_backup" ''
+    #!${pkgs.stdenv.shell}
+
+    declare -a profiles
+    profiles=()
+    ${builtins.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList (k: v: map (remote: [
+      ''profiles+=("${remote}_${k}")''
+    ]) v.remotes) config.services.duplyBackup.profiles))}
+
+    if [ -f "${varDir}/last_backup_profile" ]; then
+      last_backup=$(cat ${varDir}/last_backup_profile)
+      for i in "''${!profiles[@]}"; do
+        if [[ "''${profiles[$i]}" = "$last_backup" ]]; then
+          break
+        fi
+      done
+      ((i+=1))
+      profiles=("''${profiles[@]:$i}" "''${profiles[@]:0:$i}")
+    fi
+
+    # timeout in minutes
+    timeout="''${1:-180}"
+    timeout_timestamp=$(date +%s -d "$timeout minutes")
+    for profile in "''${profiles[@]}"; do
+      if [ $(date +%s -d "now") -ge "$timeout_timestamp" ]; then
+        break
+      fi
+
+      touch "${varDir}/$profile.log"
+      ${pkgs.duply}/bin/duply ${config.secrets.location}/backup/$profile/ ${default_action} --force >> ${varDir}/$profile.log
+      [[ $? = 0 ]] || echo -e "Error when doing backup for $profile, see above or logs in ${varDir}/$profile.log\n---------------------------------------" >&2
+      echo "$profile" > ${varDir}/last_backup_profile
+    done
+  '';
+
+  check_backups = pkgs.writeScriptBin "duply_list_not_backuped" ''
+    #!${pkgs.stdenv.shell}
+
+    do_check() {
+      local dir="$1" path ignored_path
+      find "$dir" -mindepth 1 -maxdepth 1 | while IFS= read -r path; do
+        if ${pkgs.gnugrep}/bin/grep -qFx "$path" ${config.secrets.fullPaths."backup/backuped_list"}; then
+          continue
+        elif ${pkgs.gnugrep}/bin/grep -q "^$path/" ${config.secrets.fullPaths."backup/backuped_list"}; then
+          do_check "$path"
+        else
+          while IFS= read -r ignored_path; do
+            if [[ "$path" =~ ^$ignored_path$ ]]; then
+              continue 2
+            fi
+          done < ${config.secrets.fullPaths."backup/ignored_list"}
+          printf '%s\n' "$path"
+        fi
+      done
+    }
+
+    do_check /var/lib
+  '';
+  duplyProfile = profile: remote: bucket: let
+    remote' = cfg.remotes.${remote};
+  in ''
+    if [ -z "$DUPLY_FULL_BACKUP_WITH_IGNORED" ]; then
+      GPG_PW="${cfg.password}"
+    fi
+    TARGET="${remote'.remote bucket}"
+    ${lib.optionalString (remote'.remote_type == "s3") ''
+    export AWS_ACCESS_KEY_ID="${remote'.s3AccessKeyId}"
+    export AWS_SECRET_ACCESS_KEY="${remote'.s3SecretAccessKey}"
+    ''}
+    ${lib.optionalString (remote'.remote_type == "rsync") ''
+    DUPL_PARAMS="$DUPL_PARAMS --ssh-options=-oIdentityFile='${config.secrets.fullPaths."backup/identity"}' "
+    ''}
     SOURCE="${profile.rootDir}"
-    FILENAME=".duplicity-ignore"
-    DUPL_PARAMS="$DUPL_PARAMS --exclude-if-present '$FILENAME'"
+    if [ -z "$DUPLY_FULL_BACKUP_WITH_IGNORED" ]; then
+      FILENAME=".duplicity-ignore"
+      DUPL_PARAMS="$DUPL_PARAMS --exclude-if-present '$FILENAME'"
+    fi
     VERBOSITY=4
     ARCH_DIR="${varDir}/caches"
+    DUPL_PYTHON_BIN=""
 
-    # Do a full backup after 1 month
-    MAX_FULLBKP_AGE=1M
-    DUPL_PARAMS="$DUPL_PARAMS --allow-source-mismatch --exclude-other-filesystems --full-if-older-than $MAX_FULLBKP_AGE "
-    # Backups older than 2months are deleted
-    MAX_AGE=2M
-    # Keep 2 full backups
-    MAX_FULL_BACKUPS=2
-    MAX_FULLS_WITH_INCRS=2
+    # Do a full backup after 6 month
+    MAX_FULLBKP_AGE=6M
+    DUPL_PARAMS="$DUPL_PARAMS --allow-source-mismatch --full-if-older-than $MAX_FULLBKP_AGE "
+    # Backups older than 1months are deleted
+    MAX_AGE=1M
+    # Keep 1 full backup
+    MAX_FULL_BACKUPS=1
+    MAX_FULLS_WITH_INCRS=1
   '';
-  action = "bkp_purge_purgeFull_purgeIncr";
-  varName = k: remoteName:
-    if remoteName == "eriomem" then k else remoteName + "_" + k;
 in
 {
   options = {
@@ -39,26 +118,46 @@ in
     services.duplyBackup.profiles = lib.mkOption {
       type = lib.types.attrsOf (lib.types.submodule {
         options = {
+          hash = lib.mkOption {
+            type = lib.types.bool;
+            default = true;
+            description = ''
+              Hash bucket and directory names
+            '';
+          };
+          excludeRootDir = lib.mkOption {
+            type = lib.types.bool;
+            default = true;
+            description = ''
+              Exclude root dir in exclusion file
+            '';
+          };
           rootDir = lib.mkOption {
             type = lib.types.path;
+            default = "/var/lib";
             description = ''
               Path to backup
               '';
           };
           bucket = lib.mkOption {
             type = lib.types.str;
-            default = "immae-${name}";
             description = ''
               Bucket to use
               '';
           };
           remotes = lib.mkOption {
             type = lib.types.listOf lib.types.str;
-            default = ["eriomem"];
             description = ''
               Remotes to use for backup
               '';
           };
+          includedPaths = lib.mkOption {
+            type = lib.types.listOf lib.types.str;
+            default = [];
+            description = ''
+              Included paths (subdirs of rootDir)
+            '';
+          };
           excludeFile = lib.mkOption {
             type = lib.types.lines;
             default = "";
@@ -66,6 +165,14 @@ in
               Content to put in exclude file
               '';
           };
+          ignoredPaths = lib.mkOption {
+            type = lib.types.listOf lib.types.str;
+            default = [];
+            description = ''
+              List of paths to ignore when checking non-backed-up directories
+              Can use (POSIX extended) regex
+            '';
+          };
         };
       });
     };
@@ -76,76 +183,91 @@ in
       install -m 0700 -o root -g root -d ${varDir} ${varDir}/caches
       '';
     secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (k: v:
-      map (remote: [
-        (lib.nameValuePair "backup/${varName k remote}/conf" {
+      let
+        bucket = if v.hash or true then builtins.hashString "sha256" v.bucket else v.bucket;
+      in map (remote: [
+        (lib.nameValuePair "backup/${remote}_${k}/conf" {
           permissions = "0400";
-          text = duplyProfile v remote "${k}/";
+          text = duplyProfile v remote bucket;
         })
-        (lib.nameValuePair "backup/${varName k remote}/exclude" {
+        (lib.nameValuePair "backup/${remote}_${k}/exclude" {
           permissions = "0400";
-          text = v.excludeFile;
+          text = v.excludeFile + (builtins.concatStringsSep "\n" (map (p: "+ ${v.rootDir}/${p}") v.includedPaths)) + (lib.optionalString v.excludeRootDir ''
+
+            - **
+          '');
         })
-        (lib.nameValuePair "backup/${varName k remote}" {
+        (lib.nameValuePair "backup/${remote}_${k}/pre" {
+          keyDependencies = [
+            pkgs.bash
+            pkgs.rsync
+          ];
           permissions = "0500";
+          text = let
+            remote' = cfg.remotes.${remote};
+          in ''
+            #!${pkgs.stdenv.shell}
+
+            ${lib.optionalString (remote'.remote_type == "rsync") ''
+              # Recreate directory structure before synchronizing
+              mkdir -p ${varDir}/rsync_remotes/${remote}/${bucket}
+              ${pkgs.rsync}/bin/rsync -av -e \
+                "ssh -p ${remote'.sshRsyncPort} -oIdentityFile=${config.secrets.fullPaths."backup/identity"}" \
+                "${varDir}/rsync_remotes/${remote}/" \
+                ${remote'.sshRsyncHost}:
+            ''}
+          '';
+        })
+        (lib.nameValuePair "backup/${remote}_${k}" {
+          permissions = "0700";
           isDir = true;
         })
-    ]) v.remotes) config.services.duplyBackup.profiles));
+    ]) v.remotes) config.services.duplyBackup.profiles)) // {
+      "backup/identity" = {
+        permissions = "0400";
+        text = "{{ .ssl_keys.duply_backup }}";
+      };
+      "backup/ignored_list" = {
+        permissions = "0400";
+        text = let
+            ignored = map
+              (v: map (p: "${v.rootDir}/${p}") v.ignoredPaths)
+              (builtins.attrValues config.services.duplyBackup.profiles);
+          in builtins.concatStringsSep "\n" (lib.flatten ignored);
+      };
+      "backup/backuped_list" = {
+        permissions = "0400";
+        text = let
+            included = map
+              (v: map (p: "${v.rootDir}/${p}") v.includedPaths)
+              (builtins.attrValues config.services.duplyBackup.profiles);
+          in builtins.concatStringsSep "\n" (lib.flatten included);
+      };
+    };
 
+    programs.ssh.knownHostsFiles = [
+      (pkgs.writeText
+        "duply_backup_known_hosts"
+        (builtins.concatStringsSep
+          "\n"
+          (builtins.filter
+            (v: v != null)
+            (builtins.map
+              (v: v.sshKnownHosts)
+              (builtins.attrValues cfg.remotes)
+            )
+          )
+        )
+      )
+    ];
+    environment.systemPackages = [ pkgs.duply check_backups duply_backup_full_with_ignored duply_backup ];
     services.cron = {
       enable = true;
-      systemCronJobs = let
-        backups = pkgs.writeScript "backups" ''
-          #!${pkgs.stdenv.shell}
-
-          ${builtins.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList (k: v:
-            map (remote: [
-            ''
-              touch ${varDir}/${varName k remote}.log
-              ${pkgs.duply}/bin/duply ${config.secrets.fullPaths."backup/${varName k remote}"}/ ${action} --force >> ${varDir}/${varName k remote}.log
-              [[ $? = 0 ]] || echo -e "Error when doing backup for ${varName k remote}, see above\n---------------------------------------" >&2
-            ''
-            ]) v.remotes
-          ) config.services.duplyBackup.profiles))}
-        '';
-      in
-        [
-          "0 2 * * * root ${backups}"
-        ];
+      systemCronJobs = [
+        "0 0 * * * root ${duply_backup}/bin/duply_backup 90"
+      ];
 
     };
 
-    security.pki.certificateFiles = [
-      (pkgs.fetchurl {
-        url = "http://downloads.e.eriomem.net/eriomemca.pem";
-        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";
-      }
-    ];
   };
 }
index f5b9184fc563f76d7343825100c9369ccc80e1e1..9d6c296bd8f62bac8131be5ecf55e2d2bda50441 100644 (file)
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_4": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_5": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_6": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
     "private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VhRXb3AAlSKwkq4BfVmoKzkLxEaAFGjYLAFETTZuhjE=",
+        "narHash": "sha256-Aqubcd5AOuP6XUdvjeCXIP6Yksn8uBXbS62kWXBop1w=",
         "path": "../../flakes/private/milters",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-/vQ6FGFc53r79yiQrzF0NWTbRd4RKf8QiPSDhmiCciU=",
+        "narHash": "sha256-LDicilQIpNXKg/UD6uyf66h/iL/rhDOkkVjTMdKRzX4=",
         "path": "../../flakes/private/opendmarc",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-gjapO6CZFeLMHUlhqBVZu5P+IJzJaPu4pnuTep4ZSuM=",
+        "narHash": "sha256-mhoBv1NxQoAMlfFGkgGC28cjMTgUxgb2oqNS+k6kWH4=",
         "path": "../../flakes/private/ssh",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0RN3EjVLumRs4/CYgYA1+UQecq+LyzrUJI6SpGHN/50=",
+        "narHash": "sha256-2fWHwmMMILe0enrbMMgFoVH+3PysvSx1Oair4W2hgIw=",
         "path": "../../flakes/etherpad-lite",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-0j7YmFwrbLg3FKeAcZApJ240cpt6uhiEEZt5v52QN5Q=",
+        "narHash": "sha256-emS5jDCcLaK3/Hqk/2p6jQDxZfO1hPicMTblyVBD7EI=",
         "path": "../../flakes/grocy",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../flakes/mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-SaZuUdU7estQQxxOhZ0mRyaQHK3AnlCUo/lTP8MFBao=",
+        "narHash": "sha256-cR14yn0IbWNe98PAlV+MHO6ClQqeT5HztMeLawldtWs=",
         "path": "../../flakes/surfer",
         "type": "path"
       },
index 6aa1afc731cd95c0c8128ca099126ee7ead3aa60..e5bc0f5c1aeedfca7e67c32eabe3a5290ccf3cee 100644 (file)
@@ -30,6 +30,10 @@ in
   };
 
   config = lib.mkIf config.myServices.ftp.enable {
+    services.borgBackup.profiles.global.ignoredPaths = [
+      "ftp/test_ftp"
+      "proftpd/authorized_keys"
+    ];
     myServices.dns.zones."immae.eu".subdomains.ftp =
       with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
 
index 1885234be2c59dfe3e214fb13bd8d3bf70ce25f2..0882c18768b0bd3e96bc6cd1082869b353deb3ca 100644 (file)
@@ -11,6 +11,22 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
+    services.borgBackup.profiles.global.ignoredPaths = [
+      "gitolite/.nix-.*"
+      "gitolite/.ssh"
+      "gitolite/.vim.*"
+      "gitolite/.bash_history"
+    ];
+    services.borgBackup.profiles.global.includedPaths = [
+      "gitolite/gitolite_ldap_groups.sh"
+      "gitolite/projects.list"
+      "gitolite/.gitolite.rc"
+      "gitolite/.gitolite"
+      "gitolite/repositories/github"
+      "gitolite/repositories/testing.git"
+      "gitolite/repositories/gitolite-admin.git"
+
+    ];
     myServices.dns.zones."immae.eu".subdomains.git =
       with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
 
index 2aa7f8f1370a4e7bc9c54e6fef221c5580e5dc55..f3b9aeb11f40c751b15cf3b61592d46f82b6b4f2 100644 (file)
@@ -4,7 +4,13 @@ let
   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.smartdDisks = [
+    "ata-ST33000650NS_Z29540DM"
+    "ata-ST33000650NS_Z296JGJ4"
+    "ata-Micron_5200_MTFDDAK480TDC_18011BEE03B3"
+  ];
+
+  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "mdadm" "postfix" "postgresql" "zfs" "notify-secondary" "smartctl" ];
   config.myServices.monitoring.pluginsArgs.postgresql.package = config.myServices.databases.postgresql.package;
   config.myServices.monitoring.objects = lib.mkMerge [
     (monitoring.lib.objectsCommon {
index ca8122a7b13657da7a3747bceabdcffac5fae528..847e9d0224d603c442ecd8d72dea81a44f2ef9d1 100644 (file)
@@ -40,6 +40,9 @@ in
   };
 
   config = lib.mkIf config.myServices.pub.enable {
+    services.borgBackup.profiles.global.ignoredPaths = [
+      "pub/.nix-.*"
+    ];
     myServices.dns.zones."immae.eu".subdomains.pub =
       with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
 
index e1df8831a709a2385d1cf6245eddffe4169fa560..3f41efe63bc2aba8a212eaa9a030e5c5582f8c93 100644 (file)
@@ -9,6 +9,15 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
+    services.borgBackup.profiles.global.includedPaths = [
+      "nextcloud/appdata_occ80acffb591"
+      "nextcloud/files_external"
+      "nextcloud/config"
+      #"nextcloud/gpxpod"
+      "nextcloud/.ocdata"
+      "nextcloud/.htaccess"
+      "nextcloud/index.html"
+    ];
     myServices.dns.zones."immae.eu".subdomains.cloud =
       with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
 
@@ -52,7 +61,7 @@ in {
     };
 
     myServices.tools.cloud.farm.instances.immae = {
-      nextcloud = pkgs.webapps-nextcloud_27.override ({
+      nextcloud = pkgs.webapps-nextcloud_27_2.override ({
         # Allow /index.php redirects
         postInstall = ''
           cd $out
index c5131b81587df433d08c21a12bba79d8b7187393..9abc180ed401a0c0e828dc2608e4ff93e8c31f2b 100644 (file)
@@ -12,6 +12,9 @@ in
     enable = lib.mkEnableOption "Enable commento website";
   };
   config = lib.mkIf cfg.enable {
+    services.borgBackup.profiles.global.includedPaths = [
+      "vhost/tools.immae.eu/commento"
+    ];
     myServices.dns.zones."immae.eu".subdomains.commento =
       with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
 
index 4635548675ac2c6c03935ba7643469e66f236066..34a51cdeaf4ae059d715866e3b5c4a85a1e6664f 100644 (file)
@@ -75,6 +75,9 @@ in
       inherit domain port;
       config = configFile;
     };
+    services.borgBackup.profiles.global.includedPaths = [
+      "cryptpad/immaeEu"
+    ];
     services.websites.env.tools.modules = [ "proxy_wstunnel" ];
     security.acme.certs.eldiron.extraDomainNames = [ domain ];
     services.websites.env.tools.vhostConfs.cryptpad = {
index 3bd78e13980f31212655c5ca1e9953bca82025c2..824e2e17e16cdc96bc07b2335ecb3b156b9e3543 100644 (file)
@@ -1,4 +1,38 @@
-{ env, mantisbt_2, mantisbt_2-plugins, config }:
+{ env, mantisbt_2, mantisbt_2-plugins, config, writeText }:
+let
+  mantis_config = {
+    config_inc = config.secrets.fullPaths."webapps/tools-mantisbt";
+    custom_constants_inc = writeText "custom_constants_inc.php" ''
+      <?php
+      define('TESTING', 60);
+      ?>
+    '';
+    custom_strings_inc = writeText "custom_strings_inc.php" ''
+      <?php
+      switch( $g_active_language ) {
+        case 'french':
+          $s_status_enum_string = '10:nouveau,20:retour d’informations,30:reçu,40:confirmé,50:affecté,60:à tester,80:traité,90:fermé';
+          $s_acknowledged_bug_title = 'Recevoir l’anomalie';
+          $s_acknowledged_bug_button = 'Recevoir l’anomalie';
+          $s_email_notification_title_for_status_bug_acknowledged = 'L’anomalie suivante a été REÇUE.';
+
+          $s_testing_bug_title = "Mettre l’anomalie en test";
+          $s_testing_bug_button = 'À tester';
+          $s_email_notification_title_for_status_bug_testing = "L’anomalie suivante est prête à être TESTÉE.";
+          break;
+        default: # english
+          $s_status_enum_string = '10:new,20:feedback,30:acknowledged,40:confirmed,50:assigned,60:testing,80:resolved,90:closed';
+
+          $s_testing_bug_title = 'Mark issue Ready for Testing';
+          $s_testing_bug_button = 'Ready for Testing';
+
+          $s_email_notification_title_for_status_bug_testing = 'The following issue is ready for TESTING.';
+          break;
+      }
+      ?>
+    '';
+  };
+in
 rec {
   keys."webapps/tools-mantisbt" = {
     user = apache.user;
@@ -6,6 +40,10 @@ rec {
     permissions = "0400";
     text = ''
       <?php
+      $g_admin_checks          = OFF;
+      $g_reauthentication      = OFF;
+      $g_reauthentication_expiry = 604800;
+      $g_path                  = 'https://git.immae.eu/mantisbt/';
       $g_hostname              = '${env.postgresql.socket}';
       $g_db_username           = '${env.postgresql.user}';
       $g_db_password           = '${env.postgresql.password}';
@@ -16,7 +54,8 @@ rec {
       $g_allow_anonymous_login = ON;
       $g_anonymous_account     = 'anonymous';
 
-      $g_phpMailer_method      = PHPMAILER_METHOD_SENDMAIL;
+      $g_log_level = LOG_EMAIL_VERBOSE;
+      $g_phpMailer_method      = PHPMAILER_METHOD_MAIL;
       $g_smtp_host             = 'localhost';
       $g_smtp_username         = ''';
       $g_smtp_password         = ''';
@@ -29,6 +68,7 @@ rec {
       $g_login_method = LDAP;
       $g_ldap_protocol_version = 3;
       $g_ldap_server = 'ldaps://${env.ldap.host}:636';
+      $g_ldap_use_starttls = OFF;
       $g_ldap_root_dn = 'ou=users,${env.ldap.base}';
       $g_ldap_bind_dn = '${env.ldap.dn}';
       $g_ldap_bind_passwd = '${env.ldap.password}';
@@ -37,9 +77,12 @@ rec {
       $g_ldap_uid_field = 'uid';
       $g_ldap_realname_field = 'cn';
       $g_ldap_organization = '${env.ldap.filter}';
+
+      $g_status_enum_string = '10:new,20:feedback,30:acknowledged,40:confirmed,50:assigned,60:testing,80:resolved,90:closed';
+      $g_status_colors['testing'] = '#ace7ae';
     '';
   };
-  webRoot = (mantisbt_2.override { mantis_config = config.secrets.fullPaths."webapps/tools-mantisbt"; }).withPlugins (p: [p.slack p.source-integration]);
+  webRoot = (mantisbt_2.override { inherit mantis_config; }).withPlugins (p: [p.slack p.source-integration ]);
   apache = rec {
     user = "wwwrun";
     group = "wwwrun";
@@ -66,9 +109,8 @@ rec {
   };
   phpFpm = rec {
     serviceDeps = [ "postgresql.service" "openldap.service" ];
-    basedir = builtins.concatStringsSep ":" (
-      [ webRoot config.secrets.fullPaths."webapps/tools-mantisbt" ]
-      ++ webRoot.plugins);
+    basedir = builtins.concatStringsSep ":" ([ webRoot ] ++
+      webRoot.plugins ++ builtins.attrValues mantis_config);
     pool = {
       "listen.owner" = apache.user;
       "listen.group" = apache.group;
@@ -78,7 +120,8 @@ rec {
 
       "php_admin_value[upload_max_filesize]" = "5000000";
 
-      "php_admin_value[open_basedir]" = "${basedir}:/tmp";
+      "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i";
+      "php_admin_value[open_basedir]" = "${basedir}:/tmp:/run/wrappers/bin/sendmail";
       "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:'";
     };
index b5911905d1a6e5a2a2a456f985a12fc0d494a41a..7d8bf5e04d47f9e07936574728f1563f104c5a28 100644 (file)
@@ -108,8 +108,24 @@ in {
           mailSend
           (ips servers.eldiron.ips.main)
         ];
+        synapse = ips servers.zoldene.ips.main;
       };
 
+    services.borgBackup.profiles.global.ignoredPaths = [
+      "duply"
+      "kanboard"
+      "ntfy"
+    ];
+    services.borgBackup.profiles.global.includedPaths = [
+      "paste"
+      "dokuwiki/conf"
+      "dokuwiki/data"
+      "phpbb"
+      "shaarli/cache"
+      "shaarli/pagecache"
+      "shaarli/tmp"
+    ];
+
     myServices.chatonsProperties.services = {
       adminer = adminer.chatonsProperties;
       dokuwiki = dokuwiki.chatonsProperties;
index 692eaaeaa9f5b12f7644b3d93c507660b53a850a..da7335a7815b3f4cd1967864ea2ae3e7a634b45e 100644 (file)
@@ -3,8 +3,8 @@ let
   source = builtins.fetchGit {
     url = "https://git.immae.eu/github/bastienwirtz/homer.git";
     ref = "gitolite_local/local_changes";
-    rev = "af6db21ee92824ddd9c4b9574018789619326ffc";
-    narHash = "sha256-TAf2oIPu5ZfRbxahAjOxwQ/z/g82pXmLPU8LhwxRgXs";
+    rev = "f2f414a2e9b02d645acb49f62fdfcceb8eca7d19";
+    narHash = "sha256-WrAx4gLKOVpwHtLh57ZLoWaUnfohwYlIX/LrwORIbFU=";
   };
   yarnModules = yarn2nix-moretea.mkYarnModules rec {
     nodejs = nodejs_16;
index efb4f578f8b5dfdfc9124f51974f2d575237f900..b3b2f15aa7e490960b5ad2579bd917de1b5b07a9 100644 (file)
@@ -45,7 +45,7 @@ function changePasswordSQL($user_realm, $newPassword) {
     }
   }
   $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));
+  $result = pg_query_params($con, "WITH newsalt as (SELECT gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( convert_to($1, 'UTF8') || (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;
index ed711f4d03bfc0e7f7626716c2fb7086a41c6d9b..5330b72756bec671187e2b49678f3fcd90984e18 100644 (file)
@@ -22,7 +22,7 @@
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-ptLDqa3BTCX2orio9YgGsOwYa5bsz2DWn6TrtR2B45w=",
+        "narHash": "sha256-S6sETV9+RccMB5LcH4vOZJiTdhLS3SRIjFRvEfjd9Ag=",
         "path": "../../flakes/private/chatons",
         "type": "path"
       },
@@ -74,7 +74,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
@@ -86,7 +86,7 @@
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
@@ -98,7 +98,7 @@
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_4": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
     "environment_5": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-1sEwMNWSytfyn4Rh5gUJACwCNgaTLdMDkO9hEr5OB7M=",
+        "narHash": "sha256-tY5qk98NpdM4osbPYFeo6/pHiQQU4a4iKw2jCJP99q8=",
         "path": "../../flakes/private/mail-relay",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index 09319b8fe7ebb061f9417f9c9226b660f7b84b9a..e9362d9ae9b7b5c78dea191cce0d3f3641411756 100644 (file)
@@ -74,11 +74,11 @@ in
     group = "naemon";
     permissions = "0400";
     text = ''
-      export AWS_ACCESS_KEY_ID="${v.accessKeyId}"
-      export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}"
+      export AWS_ACCESS_KEY_ID="${v.s3AccessKeyId}"
+      export AWS_SECRET_ACCESS_KEY="${v.s3SecretAccessKey}"
       export BASE_URL="${v.remote "immae-eldiron"}"
     '';
-  }) config.myEnv.backup.remotes;
+  }) (lib.filterAttrs (k: v: v.remote_type == "s3") config.myEnv.backup.remotes);
 
   services.naemon.extraConfig = ''
     broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live
index a76103c5af037fc9299580bb1b2eed22275e5ad2..e96c9fa807b07b94b191eb975121e5b0ad735d5e 100644 (file)
@@ -59,7 +59,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
@@ -71,7 +71,7 @@
     "environment_2": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
@@ -83,7 +83,7 @@
     "environment_3": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-PicwNqwQaCKtN5zPpTfpSDRXbyn9xh8aHqoPnm9cFz8=",
+        "narHash": "sha256-F7GennKqLc6Cx3DuU6qSPUHmjvpfrrfOshor41vaCz4=",
         "path": "../../flakes/private/monitoring",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index fc0d68a2d7a7fe9d7511321be25cdba21e2c9374..947859a972d35dad4f732a64ce652e101b5ae398 100644 (file)
@@ -13,8 +13,10 @@ in
     secrets.nixosModules.users-config-zoldene
     ./virtualisation.nix
     ./certificates.nix
+    ./synapse.nix
   ];
 
+  programs.ssh.package = pkgs.openssh;
   services.openssh = {
     settings.KbdInteractiveAuthentication = false;
     hostKeys = [
@@ -112,7 +114,7 @@ in
     };
   };
 
-  powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
+  powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
   hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
   hardware.enableRedistributableFirmware = lib.mkDefault true;
   system.activationScripts.createDatasets = {
index 86e91e648e63cf08fadf680a3c32d81b1e75dbd3..638d3a0de3be86c87ddbcbb0b268dc1a6e0908ea 100644 (file)
@@ -59,7 +59,7 @@
     "environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-etK0kcWYmiCmdex+9CjWWqn4q8EonDutUP0yFH+odrE=",
+        "narHash": "sha256-yHJid6Rpxa5pfKI81FfI0VZir9seZMHtLzjdvmt0FVw=",
         "path": "../../mypackages",
         "type": "path"
       },
     },
     "nixpkgs_5": {
       "locked": {
-        "lastModified": 1708475490,
-        "narHash": "sha256-g1v0TsWBQPX97ziznfJdWhgMyMGtoBFs102xSYO4syU=",
+        "lastModified": 1720031269,
+        "narHash": "sha256-rwz8NJZV+387rnWpTYcXaRNvzUSnnF9aHONoJIYmiUQ=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "0e74ca98a74bc7270d28838369593635a5db3260",
+        "rev": "9f4128e00b0ae8ec65918efeba59db998750ead6",
         "type": "github"
       },
       "original": {
     "private-environment": {
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-VO82m/95IcX3xxJ63wcLh3hXzXDRFKUohYil/18pBSY=",
+        "narHash": "sha256-xrpwkilnPpT6TklQVoLrID8tWUZAH4PJ5XqhRHXGbvo=",
         "path": "../../flakes/private/environment",
         "type": "path"
       },
       },
       "locked": {
         "lastModified": 1,
-        "narHash": "sha256-+s9C1mPCXRA44AC0Fg+B2uD6UiK0JfUA0F8fhceH0lQ=",
+        "narHash": "sha256-5cM87LAHjrWoZRc2QbM6Xu9klzMNBpREjz6sWqp+hFA=",
         "path": "../../flakes/private/system",
         "type": "path"
       },
index 2b6e331126a09d3b2507c6b46391e79a2be5d8c3..943d5f114d2dafaf67c0232fe89d43e0be84a32e 100644 (file)
@@ -102,6 +102,8 @@ in
         ingestion_burst_size_mb = 200;
         per_stream_rate_limit = "100MB";
         per_stream_rate_limit_burst = "200MB";
+        # Remove after 2024-07-08 see below
+        allow_structured_metadata = false;
       };
 
       schema_config.configs = [
@@ -113,6 +115,14 @@ in
           index.prefix = "index_";
           index.period = "24h";
         }
+        {
+          from = "2024-07-08";
+          store = "tsdb";
+          object_store = "filesystem";
+          schema = "v13";
+          index.prefix = "index_";
+          index.period = "24h";
+        }
       ];
     };
   };
diff --git a/systems/zoldene/synapse.nix b/systems/zoldene/synapse.nix
new file mode 100644 (file)
index 0000000..06a1645
--- /dev/null
@@ -0,0 +1,211 @@
+{ lib, config, pkgs, name, ... }:
+{
+  config = {
+    security.acme.certs."${name}".extraDomainNames = ["synapse.immae.eu"];
+    services.nginx = {
+      virtualHosts = {
+        "synapse.immae.eu" = {
+          acmeRoot = config.security.acme.defaults.webroot;
+          useACMEHost = name;
+          forceSSL = true;
+
+          locations."~ ^/admin(?:/(.*))?$" = {
+            alias = let
+              synapse-admin = pkgs.fetchzip {
+                url = "https://github.com/Awesome-Technologies/synapse-admin/releases/download/0.10.1/synapse-admin-0.10.1.tar.gz";
+                sha256 = "sha256-M2AYNrnpNoDm20ZTH1OZBHVcjOrHAlqyq5iTQ/At/Xk=";
+                postFetch = ''
+                  sed -i -e 's@"/assets@"./assets@g' $out/index.html
+                '';
+              };
+            in
+              "${synapse-admin}/$1";
+          };
+          locations."/sliding-sync-client/" = {
+            # some svg urls are hardcoded to /client :shrug:
+            alias = "${pkgs.matrix-sliding-sync.src}/client/";
+            tryFiles = "$uri $uri/ /sliding-sync-client/index.html";
+          };
+          locations."~ ^/_matrix/client/unstable/org.matrix.msc3575/sync" = {
+            proxyPass = "http://unix:/run/matrix-synapse/sliding_sync.sock:";
+          };
+          locations."~ ^(/_matrix|/_synapse/client|/_synapse/admin)" = {
+            proxyPass = "http://unix:/run/matrix-synapse/main_client_federation.sock:";
+            extraConfig = ''
+              client_max_body_size 50M;
+            '';
+          };
+        };
+      };
+    };
+
+    systemd.services.postgresql.postStart = lib.mkAfter ''
+      $PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = 'matrix-synapse'" | grep -q 1 || $PSQL -tAc "CREATE DATABASE \"matrix-synapse\" LC_COLLATE='C' LC_CTYPE='C' TEMPLATE template0"
+      $PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = 'matrix-sliding-sync'" | grep -q 1 || $PSQL -tAc "CREATE DATABASE \"matrix-sliding-sync\" LC_COLLATE='C' LC_CTYPE='C' TEMPLATE template0"
+      $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='matrix-synapse'" | grep -q 1 || $PSQL -tAc 'CREATE USER "matrix-synapse"'
+      $PSQL -tAc 'ALTER DATABASE "matrix-synapse" OWNER TO "matrix-synapse";'
+      $PSQL -tAc 'ALTER DATABASE "matrix-sliding-sync" OWNER TO "matrix-synapse";'
+    '';
+
+    disko.devices.zpool.zfast.datasets."root/persist/var/lib/matrix-sliding-sync" =
+      { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/matrix-sliding-sync"; options.mountpoint = "legacy"; };
+    disko.devices.zpool.zfast.datasets."root/persist/var/lib/matrix-synapse" =
+      { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/matrix-synapse"; options.mountpoint = "legacy"; };
+
+    environment.persistence."/persist/zfast".directories = [
+      {
+        directory = "/var/lib/matrix-synapse";
+        user = "matrix-synapse";
+        group = "matrix-synapse";
+        mode = "0700";
+      }
+      {
+        directory = "/var/lib/matrix-sliding-sync";
+        user = "matrix-synapse";
+        group = "matrix-synapse";
+        mode = "0700";
+      }
+    ];
+
+    users.users.matrix-synapse.extraGroups = [ "keys" ];
+    users.users.nginx.extraGroups = [ "matrix-synapse" ];
+
+    services.matrix-synapse = {
+      enable = true;
+      log.root.level = "WARNING";
+      plugins = [
+        config.services.matrix-synapse.package.plugins.matrix-synapse-ldap3
+      ];
+      extraConfigFiles = [
+        config.secrets.fullPaths."matrix/homeserver_secrets.yaml"
+      ];
+      settings.modules = [
+        {
+          module = "ldap_auth_provider.LdapAuthProviderModule";
+          config = {
+            enabled = true;
+            uri = "ldaps://${config.myEnv.tools.matrix.ldap.host}:636";
+            start_tls = false;
+            base = config.myEnv.tools.matrix.ldap.base;
+            attributes = {
+              uid = "uid";
+              mail = "mail";
+              name = "cn";
+            };
+            bind_dn = config.myEnv.tools.matrix.ldap.dn;
+            bind_password_file = config.secrets.fullPaths."matrix/ldap_password";
+            filter = config.myEnv.tools.matrix.ldap.filter;
+          };
+        }
+      ];
+      settings.server_name = "immae.eu";
+      settings.signing_key_path = config.secrets.fullPaths."matrix/signing.key";
+      settings.listeners = [
+        {
+          port = 8008;
+          bind_addresses = [ "127.0.0.1" ];
+          type = "http";
+          tls = false;
+          x_forwarded = true;
+          resources = [
+            {
+              names = [ "client" ];
+              compress = true;
+            }
+          ];
+        }
+        {
+          path = "/run/matrix-synapse/main_client_federation.sock";
+          resources = [
+            {
+              compress = true;
+              names = [ "client" ];
+            }
+            {
+              compress = false;
+              names = [ "federation" ];
+            }
+          ];
+          type = "http";
+          x_forwarded = true;
+        }
+      ];
+    };
+    services.matrix-sliding-sync = {
+      enable = true;
+      createDatabase = false;
+      settings.SYNCV3_SERVER = "/run/matrix-synapse/main_client_federation.sock";
+      settings.SYNCV3_BINDADDR = "/run/matrix-synapse/sliding_sync.sock";
+      environmentFile = config.secrets.fullPaths."matrix/sliding-sync";
+    };
+
+    systemd.services.matrix-synapse = {
+      after = [
+        "postgresql.service"
+        "persist-zfast-var-lib-matrix\\x2dsynapse.mount"
+        "var-lib-matrix\\x2dsynapse.mount"
+      ];
+      unitConfig = {
+        BindsTo = [
+          "var-lib-matrix\\x2dsynapse.mount"
+          "persist-zfast-var-lib-matrix\\x2dsynapse.mount"
+        ];
+      };
+      serviceConfig.SupplementaryGroups = [ "keys" ];
+    };
+
+    systemd.services.matrix-sliding-sync = {
+      serviceConfig = {
+        DynamicUser = lib.mkForce false;
+        User = "matrix-synapse";
+        Group = "matrix-synapse";
+        RuntimeDirectory = lib.mkForce "matrix-synapse";
+        SupplementaryGroups = [ "keys" ];
+      };
+      unitConfig = {
+        BindsTo = [
+          "persist-zfast-var-lib-matrix\\x2dsliding\\x2dsync.mount"
+          "var-lib-matrix\\x2dsliding\\x2dsync.mount"
+        ];
+        After = lib.mkForce [
+          "matrix-synapse.service"
+          "postgresql.service"
+          "var-lib-matrix\\x2dsliding\\x2dsync.mount"
+          "persist-zfast-var-lib-matrix\\x2dsliding\\x2dsync.mount"
+        ];
+      };
+    };
+    secrets.keys."matrix/ldap_password" = {
+      permissions = "0400";
+      user = "matrix-synapse";
+      group = "matrix-synapse";
+      text = config.myEnv.tools.matrix.ldap.password;
+    };
+    secrets.keys."matrix/signing.key" = {
+      permissions = "0400";
+      user = "matrix-synapse";
+      group = "matrix-synapse";
+      text = "{{ .matrix.signing_key }}";
+    };
+    secrets.keys."matrix/homeserver_secrets.yaml" = {
+      permissions = "0400";
+      user = "matrix-synapse";
+      group = "matrix-synapse";
+      # Beware, yaml keys are merged at top level, not deep
+      text = ''
+        password_config:
+            enabled: true
+            pepper: "{{ .matrix.password_pepper }}"
+        macaroon_secret_key: "{{ .matrix.macaroon_secret_key }}"
+      '';
+    };
+    secrets.keys."matrix/sliding-sync" = {
+      permissions = "0400";
+      user = "matrix-synapse";
+      group = "matrix-synapse";
+      text = ''
+        SYNCV3_SECRET={{ .matrix.sliding_sync_secret }}
+      '';
+    };
+  };
+}