Compare commits

..

2 commits

Author SHA1 Message Date
e2510b5342
test(vault01/APs): advertise low MTU on DHCP
All checks were successful
Run pre-commit on all files / pre-commit (push) Successful in 33s
2025-01-28 18:47:29 +01:00
9d390cac07
fix(vault01/mtu): missing MTU precision on admin-vlans 2025-01-28 18:46:04 +01:00
140 changed files with 2261 additions and 3105 deletions

View file

@ -100,28 +100,6 @@ jobs:
STORE_USER: admin STORE_USER: admin
name: Build and cache hypervisor03 name: Build and cache hypervisor03
run: nix-shell -A eval-nodes --run cache-node run: nix-shell -A eval-nodes --run cache-node
netaccess01:
runs-on: nix
steps:
- uses: actions/checkout@v3
- env:
BUILD_NODE: netaccess01
STORE_ENDPOINT: https://tvix-store.dgnum.eu/infra-signing/
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
STORE_USER: admin
name: Build and cache netaccess01
run: nix-shell -A eval-nodes --run cache-node
netcore01:
runs-on: nix
steps:
- uses: actions/checkout@v3
- env:
BUILD_NODE: netcore01
STORE_ENDPOINT: https://tvix-store.dgnum.eu/infra-signing/
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
STORE_USER: admin
name: Build and cache netcore01
run: nix-shell -A eval-nodes --run cache-node
netcore02: netcore02:
runs-on: nix runs-on: nix
steps: steps:

View file

@ -98,7 +98,7 @@ The general metadata is declared in `meta/nodes.nix`, the main values to declare
Create the directory `secrets` in the configuration folder, and add a `secrets.nix` file containing : Create the directory `secrets` in the configuration folder, and add a `secrets.nix` file containing :
```nix ```nix
(import ../../../keys.nix).mkSecrets [ "host02" ] [ (import ../../../keys).mkSecrets [ "host02" ] [
# List of secrets for host02 # List of secrets for host02
] ]
``` ```

View file

@ -23,12 +23,6 @@ SPDX-License-Identifier = "EUPL-1.2"
path = ["machines/nixos/compute01/ds-fr/01-smtp-tls.patch", "machines/nixos/compute01/librenms/kanidm.patch", "machines/nixos/compute01/stirling-pdf/*.patch", "machines/nixos/vault01/k-radius/packages/01-python_path.patch", "machines/nixos/web01/crabfit/*.patch", "machines/nixos/web02/cas-eleves/01-pytest-cas.patch", "patches/lix/01-disable-installChecks.patch", "patches/nixpkgs/01-pretalx-environment-file.patch", "patches/nixpkgs/03-crabfit-karla.patch", "patches/nixpkgs/05-netbird-relay.patch"] path = ["machines/nixos/compute01/ds-fr/01-smtp-tls.patch", "machines/nixos/compute01/librenms/kanidm.patch", "machines/nixos/compute01/stirling-pdf/*.patch", "machines/nixos/vault01/k-radius/packages/01-python_path.patch", "machines/nixos/web01/crabfit/*.patch", "machines/nixos/web02/cas-eleves/01-pytest-cas.patch", "patches/lix/01-disable-installChecks.patch", "patches/nixpkgs/01-pretalx-environment-file.patch", "patches/nixpkgs/03-crabfit-karla.patch", "patches/nixpkgs/05-netbird-relay.patch"]
precedence = "closest" precedence = "closest"
[[annotations]]
SPDX-FileCopyrightText = ["2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>", "2024 Maurice Debray <maurice.debray@dgnum.eu>"]
SPDX-License-Identifier = "EUPL-1.2"
path = ["patches/nixpkgs/07-kanidm-groups-module.patch", "patches/nixpkgs/08-kanidm-groups-pkgs.patch"]
precedence = "closest"
[[annotations]] [[annotations]]
SPDX-FileCopyrightText = "2024 Maurice Debray <maurice.debray@dgnum.eu>" SPDX-FileCopyrightText = "2024 Maurice Debray <maurice.debray@dgnum.eu>"
SPDX-License-Identifier = "EUPL-1.2" SPDX-License-Identifier = "EUPL-1.2"

View file

@ -1,33 +0,0 @@
# SPDX-FileCopyrightText: 2024 Ryan Lahfa <ryan.lahfa@dgnum.eu>
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
# SPDX-FileContributor: Maurice Debray <maurice.debray@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
let
unpatchedSources = import ./npins;
pkgs = import unpatchedSources.nixos-unstable { };
patch = (import ./lib/nix-patches { patchFile = ./patches; }).base {
inherit pkgs;
};
sources = builtins.mapAttrs (
k: src:
patch.applyPatches {
inherit src;
name = k;
}
) unpatchedSources;
overlays.lib = _: lib: { extra = import ./lib/nix-lib { inherit lib; }; };
in
{
inherit overlays sources unpatchedSources;
pkgs = pkgs // {
lib = pkgs.lib.extend overlays.lib;
};
}

View file

@ -3,13 +3,9 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
let
bootstrap = import ./bootstrap.nix;
in
{ {
sources ? bootstrap.sources, sources ? import ./npins,
pkgs ? bootstrap.pkgs, pkgs ? import sources.nixos-unstable { },
}: }:
let let
@ -105,16 +101,6 @@ let
]; ];
copyright = "2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>"; copyright = "2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>";
} }
{
path = [
"patches/nixpkgs/07-kanidm-groups-module.patch"
"patches/nixpkgs/08-kanidm-groups-pkgs.patch"
];
copyright = [
"2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>"
"2024 Maurice Debray <maurice.debray@dgnum.eu>"
];
}
{ {
path = [ "patches/nixpkgs/06-netbox-qrcode.patch" ]; path = [ "patches/nixpkgs/06-netbox-qrcode.patch" ];
copyright = "2024 Maurice Debray <maurice.debray@dgnum.eu>"; copyright = "2024 Maurice Debray <maurice.debray@dgnum.eu>";

View file

@ -4,26 +4,45 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
# TODO: change comments to ### \n # [text] \n #
let let
### Init some tooling sources' = import ./npins;
bootstrap = import ./bootstrap.nix; # Patch sources directly
sources =
builtins.mapAttrs (patch.base { pkgs = import sources'.nixos-unstable { }; }).applyPatches'
sources';
inherit (bootstrap.pkgs) lib; nix-lib = import ./lib/nix-lib;
inherit (lib.extra) mapSingleFuse; inherit (nix-lib) mapSingleFuse;
inherit (bootstrap) sources; patch = import ./lib/nix-patches { patchFile = ./patches; };
### Let's build meta nodes' = import ./meta/nodes;
metadata = (import ./meta) lib; nodes = builtins.attrNames nodes';
nodes = builtins.attrNames metadata.nodes; mkNode = node: {
deployment.systemType = system node;
### Nixpkgs instanciation };
nixpkgs' = import ./meta/nixpkgs.nix; nixpkgs' = import ./meta/nixpkgs.nix;
# All supported nixpkgs versions × systems, instanciated
nixpkgs = mapSingleFuse (s: mapSingleFuse (mkSystemNixpkgs s) nixpkgs'.versions) nixpkgs'.systems;
# Get the configured nixos version for the node,
# defaulting to the one defined in meta/nixpkgs
version = node: nodes'.${node}.nixpkgs.version;
system = node: nodes'.${node}.nixpkgs.system;
category = node: nixpkgs'.categories.${system node};
nodePkgs = node: nixpkgs.${system node}.${version node};
# Builds a patched version of nixpkgs, only as the source
mkNixpkgs' =
v:
patch.mkNixpkgsSrc rec {
src = sources'.${name};
name = "nixos-${v}";
};
# Build up the nixpkgs configuration for Liminix embedded systems # Build up the nixpkgs configuration for Liminix embedded systems
mkLiminixConfig = mkLiminixConfig =
@ -43,47 +62,29 @@ let
mkNixpkgsConfig = mkNixpkgsConfig =
system: system:
{ {
nixos = _: { }; # TODO: add nix-pkgs overlay here nixos = _: { };
zyxel-nwa50ax = mkLiminixConfig system; zyxel-nwa50ax = mkLiminixConfig system;
netconf = _: { }; netconf = _: { };
} }
.${system} or (throw "Unknown system: ${system} for nixpkgs configuration instantiation"); .${system} or (throw "Unknown system: ${system} for nixpkgs configuration instantiation");
# Instanciates the required nixpkgs version # Instanciates the required nixpkgs version
mkSystemNixpkgs = mkSystemNixpkgs = system: version: import (mkNixpkgs' version) (mkNixpkgsConfig system version);
system: version: import sources."nixos-${version}" (mkNixpkgsConfig system version);
# All supported nixpkgs versions × systems, instanciated ###
nixpkgs = mapSingleFuse (s: mapSingleFuse (mkSystemNixpkgs s) nixpkgs'.versions) nixpkgs'.systems;
# Get the configured nixos version for the node,
# defaulting to the one defined in meta/nixpkgs
version = node: metadata.nodes.${node}.nixpkgs.version;
system = node: metadata.nodes.${node}.nixpkgs.system;
category = node: nixpkgs'.categories.${system node};
nodePkgs = node: nixpkgs.${system node}.${version node};
##########
# Function to create arguments based on the node # Function to create arguments based on the node
# #
mkArgs = node: rec { mkArgs = node: rec {
lib = sourcePkgs.lib.extend bootstrap.overlays.lib; lib = sourcePkgs.lib // {
extra = nix-lib;
};
sourcePkgs = nodePkgs node; sourcePkgs = nodePkgs node;
meta = metadata; meta = (import ./meta) lib;
nodeMeta = metadata.nodes.${node}; nodeMeta = meta.nodes.${node};
nodePath = "machines/${category node}/${node}"; nodePath = "machines/${category node}/${node}";
}; };
##########
# Module for each node (quite empty since almost everything is in the default module)
#
mkNode = node: {
deployment.systemType = system node;
};
in in
{ {
@ -94,10 +95,7 @@ in
specialArgs = { specialArgs = {
inherit nixpkgs sources; inherit nixpkgs sources;
dgn-keys = import ./lib/keys { dgn-keys = import ./keys;
meta = metadata;
inherit lib;
};
}; };
nodeSpecialArgs = mapSingleFuse mkArgs nodes; nodeSpecialArgs = mapSingleFuse mkArgs nodes;
@ -221,6 +219,5 @@ in
}; };
}; };
}; };
} }
// (mapSingleFuse mkNode nodes) // (mapSingleFuse mkNode nodes)

View file

@ -5,9 +5,9 @@
{ lib, pkgs, ... }: { lib, pkgs, ... }:
let let
dgn-keys = import ../keys.nix; dgn-keys = import ../keys;
dgn-members = (import ../meta lib).config.organization.groups.root; dgn-members = (import ../meta lib).organization.groups.root;
in in
{ {

View file

@ -1,13 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
let
bootstrap = import ./bootstrap.nix;
inherit (bootstrap.pkgs) lib;
meta = import ./meta lib;
in
import ./lib/keys { inherit meta lib; }

109
keys/default.nix Normal file
View file

@ -0,0 +1,109 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
let
_sources = import ../npins;
inherit (import _sources.nixos-unstable { }) lib;
meta = import ../meta lib;
inherit (import ../lib/nix-lib) setDefault unique;
in
rec {
# WARNING: When updating this list, make sure that the nodes and members are alphabetically sorted
# If not, you will face an angry maintainer
_keys = {
# SSH keys of the nodes
bridge01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP5bS3iBXz8wycBnTvI5Qi79WLu0h4IVv/EOdKYbP5y7" ];
build01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIYJcEMQpOyKInqtd2/brnSQuzwgv6fNPlTSQx9tcvPu" ];
compute01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE/YluSVS+4h3oV8CIUj0OmquyJXju8aEQy0Jz210vTu" ];
geo01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEl6Pubbau+usQkemymoSKrTBbrX8JU5m5qpZbhNx8p4" ];
geo02 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFNXaCS0/Nsu5npqQk1TP6wMHCVIOaj4pblp2tIg6Ket" ];
hypervisor01 = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINPE0typcnvSioMfdLUloIfR5zcf/X0k6201xMHoQBCr"
];
hypervisor02 = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPETkWlOfESXQic+HgfGLV/T4Nqg0WjdDbEqtgDwkH+S"
];
hypervisor03 = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFLF0mxSGitsDE3/YXfrHNjtOMUt4HT2MbryyUKPLSBI"
];
rescue01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEJa02Annu8o7ggPjTH/9ttotdNGyghlWfU9E8pnuLUf" ];
storage01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA0s+rPcEcfWCqZ4B2oJiWT/60awOI8ijL1rtDM2glXZ" ];
tower01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICVpR+TMRLGAfhn7Q0C3tKOydYYjfoC/e1ZYbKpby01Z" ];
vault01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAJA6VA7LENvTRlKdcrqt8DxDOPvX3bg3Gjy9mNkdFEW" ];
web01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPR+lewuJ/zhCyizJGJOH1UaAB699ItNKEaeuoK57LY5" ];
web02 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID+QDE+GgZs6zONHvzRW15BzGJNW69k2BFZgB/Zh/tLX" ];
web03 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICrWsMEfK86iaO9SubMqE2UvZNtHkLY5VUod/bbqKC0L" ];
# SSH keys of the DGNum members
agroudiev = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDgyt3ntpcoI/I2n97R1hzjBiNL6R98S73fSi7pkSE/8mQbI8r9GzsPUBcxQ+tIg0FgwkLxTwF8DwLf0E+Le/rPznxBS5LUQaAktSQSrxz/IIID1+jN8b03vf5PjfKS8H2Tu3Q8jZXa8HNsj3cpySpGMqGrE3ieUmknd/YfppRRf+wM4CsGKZeS3ZhB9oZi3Jn22A0U/17AOJTnv4seq+mRZWRQt3pvQvpp8/2M7kEqizie/gTr/DnwxUr45wisqYYH4tat9Cw6iDr7LK10VCrK37BfFagMIZ08Hkh3c46jghjYNQWe+mBUWJByWYhTJ0AtYrbaYeUV1HVYbsRJ6bNx25K6794QQPaE/vc2Z/VK/ILgvJ+9myFSAWVylCWdyYpwUu07RH/jDBl2aqH62ESwAG7SDUUcte6h9N+EryAQLWc8OhsGAYLpshhBpiqZwzX90m+nkbhx1SqMbtt6TS+RPDEHKFYn8E6FBrf1FK34482ndq/hHXZ88mqzGb1nOnM="
];
catvayor = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAA16foz+XzwKwyIR4wFgNIAE3Y7AfXyEsUZFVVz8Rie catvayor@katvayor"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFfIJ8BToZ9EDxBsEJXQhUju7gm+rUDjGCNMvFSZCl1o openpgp:0x5CADCA1B"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICdOxx4I8BSbYPdouvuzDepwTwzQzGSBCNIV8TB5dduT openpgp:0xF6018131"
];
cst1 = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKrijwPlb7KQkYPLznMPVzPPT69cLzhEsJzZi9tmxzTh cst1@x270"
];
ecoppens = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIGmU7yEOCGuGNt4PlQbzd0Cms1RePpo8yEA7Ij/+TdA" ];
gdd = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICE7TN5NQKGojNGIeTFiHjLHTDQGT8i05JFqX/zLW2zc"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbkPWWZzOBaRdx4+7xQUgxDwuncSl2fxAeVuYfVUPZ"
];
jemagius = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOoxmou5OU74GgpIUkhVt6GiB+O9Jy4ge0TwK5MDFJ2F"
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCxQX0JLRah3GfIOkua4ZhEJhp5Ykv55RO0SPrSUwCBs5arnALg8gq12YLr09t4bzW/NA9/jn7flhh4S54l4RwBUhmV4JSQhGu71KGhfOj5ZBkDoSyYqzbu206DfZP5eQonSmjfP6XghcWOr/jlBzw9YAAQkFxsQgXEkr4kdn0ZXfZGz6b0t3YUjYIuDNbptFsGz2V9iQVy1vnxrjnLSfc25j4et8z729Vpy4M7oCaE6a6hgon4V1jhVbg43NAE5gu2eYFAPIzO3E7ZI8WjyLu1wtOBClk1f+HMen3Tr+SX2PXmpPGb+I2fAkbzu/C4X/M3+2bL1dYjxuvQhvvpAjxFwmdoXW4gWJ3J/FRiFrKsiAY0rYC+yi8SfacJWCv4EEcV/yQ4gYwpmU9xImLaro6w5cOHGCqrzYqjZc4Wi6AWFGeBSNzNs9PXLgMRWeUyiIDOFnSep2ebZeVjTB16m+o/YDEhE10uX9kCCx3Dy/41iJ1ps7V4JWGFsr0Fqaz8mu8="
];
luj = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDMBW7rTtfZL9wtrpCVgariKdpN60/VeAzXkh9w3MwbO julien@enigma"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGa+7n7kNzb86pTqaMn554KiPrkHRGeTJ0asY1NjSbpr julien@tower"
];
mboyer = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGYnwZaFYvUxtJeNvpaA20rLfq8fOO4dFp7cIXsD8YNx" ];
mdebray = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEpwF+XD3HgX64kqD42pcEZRNYAWoO4YNiOm5KO4tH6o maurice@polaris"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFdDnSl3cyWil+S5JiyGqOvBR3wVh+lduw58S5WvraoL maurice@fekda"
];
raito = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcEkYM1r8QVNM/G5CxJInEdoBCWjEHHDdHlzDYNSUIdHHsn04QY+XI67AdMCm8w30GZnLUIj5RiJEWXREUApby0GrfxGGcy8otforygfgtmuUKAUEHdU2MMwrQI7RtTZ8oQ0USRGuqvmegxz3l5caVU7qGvBllJ4NUHXrkZSja2/51vq80RF4MKkDGiz7xUTixI2UcBwQBCA/kQedKV9G28EH+1XfvePqmMivZjl+7VyHsgUVj9eRGA1XWFw59UPZG8a7VkxO/Eb3K9NF297HUAcFMcbY6cPFi9AaBgu3VC4eetDnoN/+xT1owiHi7BReQhGAy/6cdf7C/my5ehZwD"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0xMwWedkKosax9+7D2OlnMxFL/eV4CvFZLsbLptpXr"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKiXXYkhRh+s7ixZ8rvG8ntIqd6FELQ9hh7HoaHQJRPU"
];
thubrecht = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+EZXYziiaynJX99EW8KesnmRTZMof3BoIs3mdEl8L3"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHL4M4HKjs4cjRAYRk9pmmI8U0R4+T/jQh6Fxp/i1Eoy"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPM1jpXR7BWQa7Sed7ii3SbvIPRRlKb3G91qC0vOwfJn"
];
};
getKeys = ls: builtins.concatLists (builtins.map (member: _keys.${member} or [ ]) ls);
mkSecrets =
nodes: setDefault { publicKeys = unique (rootKeys ++ (builtins.concatMap getNodeKeys' nodes)); };
getNodeKeys' =
node:
let
names = builtins.foldl' (names: group: names ++ meta.organization.groups.${group}) (
meta.nodes.${node}.admins ++ [ node ]
) meta.nodes.${node}.adminGroups;
in
unique (getKeys names);
getNodeKeys = node: rootKeys ++ getNodeKeys' node;
# List of keys for the root group
rootKeys = getKeys meta.organization.groups.root;
# List of 'machine' keys
machineKeys = rootKeys ++ (getKeys (builtins.attrNames meta.nodes));
nixosMachineKeys =
rootKeys
++ (getKeys (builtins.attrNames (lib.filterAttrs (_: v: v.nixpkgs.system == "nixos") meta.nodes)));
}

View file

@ -28,4 +28,4 @@ if [[ $1 == 'apply' ]]; then
doChecks doChecks
fi fi
exec @colmena@ --nix-option nix-path "" "$@" exec @colmena@ "$@"

View file

@ -1,51 +0,0 @@
# SPDX-FileCopyrightText: 2024 Ryan Lahfa <ryan.lahfa@dgnum.eu>
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
# SPDX-FileContributor: Maurice Debray <maurice.debray@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{ meta, lib }:
let
inherit (lib.extra) setDefault unique;
getAttr = lib.flip builtins.getAttr;
in
rec {
_memberKeys = builtins.mapAttrs (_: v: v.sshKeys) meta.organization.members;
_builderKeys = builtins.mapAttrs (_: v: v.builderKeys) meta.organization.members;
_nodeKeys = builtins.mapAttrs (_: v: v.sshKeys) meta.nodes;
# Get keys of the users
getMemberKeys = name: builtins.concatLists (builtins.map (getAttr _memberKeys) name);
# Get builder keys of the users
getBuilderKeys = getAttr _builderKeys;
# Get keys of the ssh server
getNodeKeys = name: builtins.concatLists (builtins.map (getAttr _nodeKeys) name);
# List of keys for the root group
rootKeys = getMemberKeys meta.organization.groups.root;
# All admins for a node
getNodeAdmins = node: meta.organization.groups.root ++ meta.nodes.${node}.admins;
# All keys needed for secret encryption
getSecretKeys = node: unique (getMemberKeys (getNodeAdmins node) ++ getNodeKeys [ node ]);
# List of keys for all machines wide secrets
machineKeys = rootKeys ++ (getNodeKeys (builtins.attrNames meta.nodes));
mkSecrets = nodes: setDefault { publicKeys = unique (builtins.concatMap getSecretKeys nodes); };
mkRootSecrets = setDefault { publicKeys = unique rootKeys; };
machineKeysBySystem =
system:
rootKeys
++ (getNodeKeys (
builtins.attrNames (lib.filterAttrs (_: v: v.nixpkgs.system == system) meta.nodes)
));
}

View file

@ -2,13 +2,17 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu> # SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
{ lib }:
let
# Reimplement optional functions
_optional =
default: b: value:
if b then value else default;
in
rec { rec {
inherit (lib) inherit (import ./nixpkgs.nix)
flip flip
optionals
optionalString
hasPrefix hasPrefix
recursiveUpdate recursiveUpdate
splitString splitString
@ -49,24 +53,6 @@ rec {
attrsList: attrsList:
fuseAttrs (builtins.map f attrsList); fuseAttrs (builtins.map f attrsList);
/*
Generate an `attrsList` of given size with the generator before fusing
the resulting list of attribute sets.
Type: (Int -> attrs) -> Int -> attrs
Example:
f = s: { "a${toString s}" = s + s; }
genFuse f 3
=> { a0 = 0; a1 = 2; a2 = 4; }
*/
genFuse =
# Int -> attrs
f:
# Int
size:
fuseAttrs (builtins.genList f size);
/* /*
Equivalent of lib.singleton but for an attribute set. Equivalent of lib.singleton but for an attribute set.
@ -126,8 +112,11 @@ rec {
subAttrs = attrs: builtins.map (subAttr attrs); subAttrs = attrs: builtins.map (subAttr attrs);
optionalList = optionals; optionalList = _optional [ ];
optionalAttrs = _optional { };
optionalString = _optional "";
/* /*
Same as fuseAttrs but using `lib.recursiveUpdate` to merge attribute Same as fuseAttrs but using `lib.recursiveUpdate` to merge attribute
sets together. sets together.

468
lib/nix-lib/nixpkgs.nix Normal file
View file

@ -0,0 +1,468 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
###
# Collection of nixpkgs library functions, those are necessary for defining our own lib
#
# They have been simplified and builtins are used in some places, instead of lib shims.
rec {
/**
Does the same as the update operator '//' except that attributes are
merged until the given predicate is verified. The predicate should
accept 3 arguments which are the path to reach the attribute, a part of
the first attribute set and a part of the second attribute set. When
the predicate is satisfied, the value of the first attribute set is
replaced by the value of the second attribute set.
# Inputs
`pred`
: Predicate, taking the path to the current attribute as a list of strings for attribute names, and the two values at that path from the original arguments.
`lhs`
: Left attribute set of the merge.
`rhs`
: Right attribute set of the merge.
# Type
```
recursiveUpdateUntil :: ( [ String ] -> AttrSet -> AttrSet -> Bool ) -> AttrSet -> AttrSet -> AttrSet
```
# Examples
:::{.example}
## `lib.attrsets.recursiveUpdateUntil` usage example
```nix
recursiveUpdateUntil (path: l: r: path == ["foo"]) {
# first attribute set
foo.bar = 1;
foo.baz = 2;
bar = 3;
} {
#second attribute set
foo.bar = 1;
foo.quz = 2;
baz = 4;
}
=> {
foo.bar = 1; # 'foo.*' from the second set
foo.quz = 2; #
bar = 3; # 'bar' from the first set
baz = 4; # 'baz' from the second set
}
```
:::
*/
recursiveUpdateUntil =
pred: lhs: rhs:
let
f =
attrPath:
builtins.zipAttrsWith (
n: values:
let
here = attrPath ++ [ n ];
in
if builtins.length values == 1 || pred here (builtins.elemAt values 1) (builtins.head values) then
builtins.head values
else
f here values
);
in
f
[ ]
[
rhs
lhs
];
/**
A recursive variant of the update operator //. The recursion
stops when one of the attribute values is not an attribute set,
in which case the right hand side value takes precedence over the
left hand side value.
# Inputs
`lhs`
: Left attribute set of the merge.
`rhs`
: Right attribute set of the merge.
# Type
```
recursiveUpdate :: AttrSet -> AttrSet -> AttrSet
```
# Examples
:::{.example}
## `lib.attrsets.recursiveUpdate` usage example
```nix
recursiveUpdate {
boot.loader.grub.enable = true;
boot.loader.grub.device = "/dev/hda";
} {
boot.loader.grub.device = "";
}
returns: {
boot.loader.grub.enable = true;
boot.loader.grub.device = "";
}
```
:::
*/
recursiveUpdate =
lhs: rhs:
recursiveUpdateUntil (
_: lhs: rhs:
!(builtins.isAttrs lhs && builtins.isAttrs rhs)
) lhs rhs;
/**
Determine whether a string has given prefix.
# Inputs
`pref`
: Prefix to check for
`str`
: Input string
# Type
```
hasPrefix :: string -> string -> bool
```
# Examples
:::{.example}
## `lib.strings.hasPrefix` usage example
```nix
hasPrefix "foo" "foobar"
=> true
hasPrefix "foo" "barfoo"
=> false
```
:::
*/
hasPrefix = pref: str: (builtins.substring 0 (builtins.stringLength pref) str == pref);
/**
Escape occurrence of the elements of `list` in `string` by
prefixing it with a backslash.
# Inputs
`list`
: 1\. Function argument
`string`
: 2\. Function argument
# Type
```
escape :: [string] -> string -> string
```
# Examples
:::{.example}
## `lib.strings.escape` usage example
```nix
escape ["(" ")"] "(foo)"
=> "\\(foo\\)"
```
:::
*/
escape = list: builtins.replaceStrings list (builtins.map (c: "\\${c}") list);
/**
Convert a string `s` to a list of characters (i.e. singleton strings).
This allows you to, e.g., map a function over each character. However,
note that this will likely be horribly inefficient; Nix is not a
general purpose programming language. Complex string manipulations
should, if appropriate, be done in a derivation.
Also note that Nix treats strings as a list of bytes and thus doesn't
handle unicode.
# Inputs
`s`
: 1\. Function argument
# Type
```
stringToCharacters :: string -> [string]
```
# Examples
:::{.example}
## `lib.strings.stringToCharacters` usage example
```nix
stringToCharacters ""
=> [ ]
stringToCharacters "abc"
=> [ "a" "b" "c" ]
stringToCharacters "🦄"
=> [ "<EFBFBD>" "<EFBFBD>" "<EFBFBD>" "<EFBFBD>" ]
```
:::
*/
stringToCharacters = s: builtins.genList (p: builtins.substring p 1 s) (builtins.stringLength s);
/**
Turn a string `s` into an exact regular expression
# Inputs
`s`
: 1\. Function argument
# Type
```
escapeRegex :: string -> string
```
# Examples
:::{.example}
## `lib.strings.escapeRegex` usage example
```nix
escapeRegex "[^a-z]*"
=> "\\[\\^a-z]\\*"
```
:::
*/
escapeRegex = escape (stringToCharacters "\\[{()^$?*+|.");
/**
Appends string context from string like object `src` to `target`.
:::{.warning}
This is an implementation
detail of Nix and should be used carefully.
:::
Strings in Nix carry an invisible `context` which is a list of strings
representing store paths. If the string is later used in a derivation
attribute, the derivation will properly populate the inputDrvs and
inputSrcs.
# Inputs
`src`
: The string to take the context from. If the argument is not a string,
it will be implicitly converted to a string.
`target`
: The string to append the context to. If the argument is not a string,
it will be implicitly converted to a string.
# Type
```
addContextFrom :: string -> string -> string
```
# Examples
:::{.example}
## `lib.strings.addContextFrom` usage example
```nix
pkgs = import <nixpkgs> { };
addContextFrom pkgs.coreutils "bar"
=> "bar"
```
The context can be displayed using the `toString` function:
```nix
nix-repl> builtins.getContext (lib.strings.addContextFrom pkgs.coreutils "bar")
{
"/nix/store/m1s1d2dk2dqqlw3j90jl3cjy2cykbdxz-coreutils-9.5.drv" = { ... };
}
```
:::
*/
addContextFrom = src: target: builtins.substring 0 0 src + target;
/**
Cut a string with a separator and produces a list of strings which
were separated by this separator.
# Inputs
`sep`
: 1\. Function argument
`s`
: 2\. Function argument
# Type
```
splitString :: string -> string -> [string]
```
# Examples
:::{.example}
## `lib.strings.splitString` usage example
```nix
splitString "." "foo.bar.baz"
=> [ "foo" "bar" "baz" ]
splitString "/" "/usr/local/bin"
=> [ "" "usr" "local" "bin" ]
```
:::
*/
splitString =
sep: s:
let
splits = builtins.filter builtins.isString (
builtins.split (escapeRegex (builtins.toString sep)) (builtins.toString s)
);
in
builtins.map (addContextFrom s) splits;
/**
Remove duplicate elements from the `list`. O(n^2) complexity.
# Inputs
`list`
: Input list
# Type
```
unique :: [a] -> [a]
```
# Examples
:::{.example}
## `lib.lists.unique` usage example
```nix
unique [ 3 2 3 4 ]
=> [ 3 2 4 ]
```
:::
*/
unique = builtins.foldl' (acc: e: if builtins.elem e acc then acc else acc ++ [ e ]) [ ];
/**
Flip the order of the arguments of a binary function.
# Inputs
`f`
: 1\. Function argument
`a`
: 2\. Function argument
`b`
: 3\. Function argument
# Type
```
flip :: (a -> b -> c) -> (b -> a -> c)
```
# Examples
:::{.example}
## `lib.trivial.flip` usage example
```nix
flip concat [1] [2]
=> [ 2 1 ]
```
:::
*/
flip =
f: a: b:
f b a;
/**
`warn` *`message`* *`value`*
Print a warning before returning the second argument.
See [`builtins.warn`](https://nix.dev/manual/nix/latest/language/builtins.html#builtins-warn) (Nix >= 2.23).
On older versions, the Nix 2.23 behavior is emulated with [`builtins.trace`](https://nix.dev/manual/nix/latest/language/builtins.html#builtins-warn), including the [`NIX_ABORT_ON_WARN`](https://nix.dev/manual/nix/latest/command-ref/conf-file#conf-abort-on-warn) behavior, but not the `nix.conf` setting or command line option.
# Inputs
*`message`* (String)
: Warning message to print before evaluating *`value`*.
*`value`* (any value)
: Value to return as-is.
# Type
```
String -> a -> a
```
*/
warn =
# Since Nix 2.23, https://github.com/NixOS/nix/pull/10592
builtins.warn or (
let
mustAbort = builtins.elem (builtins.getEnv "NIX_ABORT_ON_WARN") [
"1"
"true"
"yes"
];
in
# Do not eta reduce v, so that we have the same strictness as `builtins.warn`.
msg: v:
# `builtins.warn` requires a string message, so we enforce that in our implementation, so that callers aren't accidentally incompatible with newer Nix versions.
assert builtins.isString msg;
if mustAbort then
builtins.trace "evaluation warning: ${msg}" (
abort "NIX_ABORT_ON_WARN=true; warnings are treated as unrecoverable errors."
)
else
builtins.trace "evaluation warning: ${msg}" v
);
}

View file

@ -1,29 +0,0 @@
# SPDX-FileCopyrightText: 2025 Lubin Bailly <lubin.bailly@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
dgn-hardware.model = "EX2300-48P";
dgn-isp = {
enable = true;
AP = [
"ge-0/0/0"
"ge-0/0/1"
"ge-0/0/2"
"ge-0/0/3"
"ge-0/0/4"
"ge-0/0/5"
];
admin-ip = "fd26:baf9:d250:8000::2001/64";
};
dgn-interfaces = {
# netcore02
"xe-0/1/0".ethernet-switching = {
interface-mode = "trunk";
vlans = [ "all" ];
};
# debug management
"me0".inet.addresses = [ "192.168.42.6/24" ];
};
}

View file

@ -1,36 +0,0 @@
# SPDX-FileCopyrightText: 2025 Lubin Bailly <lubin.bailly@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
dgn-hardware.model = "EX2300-48P";
dgn-isp = {
enable = true;
admin-ip = "fd26:baf9:d250:8000::100f/64";
};
dgn-profiles."hypervisor" = {
interfaces = [
"ge-0/0/0"
"ge-0/0/1"
"ge-0/0/2"
"ge-0/0/3"
"ge-0/0/4"
"ge-0/0/5"
"ge-0/0/6"
"ge-0/0/7"
];
configuration.ethernet-switching = {
interface-mode = "access";
vlans = [ "hypervisor" ];
};
};
dgn-interfaces = {
"xe-0/2/0".ethernet-switching = {
interface-mode = "trunk";
vlans = [ "all" ];
};
# debug management
"me0".inet.addresses = [ "192.168.2.2/24" ];
};
}

View file

@ -2,41 +2,76 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
{ let
dgn-hardware.model = "EX2300-48P"; #TODO: meta
dgn-isp = { vlansPlan = {
enable = true; "uplink-cri".id = 223;
AP = [
# H1-00 "admin-core" = {
"ge-0/0/0" id = 3000;
"ge-0/0/1" l3-interface = "irb.0";
"ge-0/0/2" };
"ge-0/0/3" "admin-ap".id = 3001;
"ge-0/0/4" "users".id-list = [
"ge-0/0/5" {
# H1-01 begin = 3045;
"ge-0/0/6" end = 4094;
"ge-0/0/7" }
"ge-0/0/8"
"ge-0/0/9"
"ge-0/0/10"
"ge-0/0/11"
# H1-02
"ge-0/0/12"
"ge-0/0/13"
"ge-0/0/14"
"ge-0/0/15"
"ge-0/0/16"
"ge-0/0/17"
]; ];
admin-ip = "fd26:baf9:d250:8000::1001/64";
"ap-staging".id = 2000;
}; };
#TODO: additionnal module (always the same for APs)
AP-staging = {
poe = true;
ethernet-switching = {
interface-mode = "access";
vlans = [ "ap-staging" ];
};
};
in
{
vlans = vlansPlan;
dgn-hardware.model = "EX2300-48P";
dgn-interfaces = { dgn-interfaces = {
# "ge-0/0/0" = AP-staging;
# "ge-0/0/1" = AP-staging;
# "ge-0/0/2" = AP-staging;
# "ge-0/0/3" = AP-staging;
"ge-0/0/4" = AP-staging;
# "ge-0/0/5" = AP-staging;
# "ge-0/0/6" = AP-staging;
# "ge-0/0/7" = AP-staging;
# "ge-0/0/8" = AP-staging;
# "ge-0/0/9" = AP-staging;
# "ge-0/0/10" = AP-staging;
# "ge-0/0/11" = AP-staging;
# "ge-0/0/12" = AP-staging;
# "ge-0/0/13" = AP-staging;
# "ge-0/0/14" = AP-staging;
# "ge-0/0/15" = AP-staging;
# "ge-0/0/16" = AP-staging;
# "ge-0/0/17" = AP-staging;
# oob # oob
"ge-0/0/42".ethernet-switching = { "ge-0/0/42".ethernet-switching = {
interface-mode = "trunk"; interface-mode = "trunk";
vlans = [ "all" ]; vlans = [ "all" ];
}; };
# AP de test
"ge-0/0/43" = {
poe = true;
ethernet-switching = {
interface-mode = "access";
vlans = [ 4000 ];
};
};
# uplink oob
"ge-0/0/46".ethernet-switching = {
interface-mode = "access";
vlans = [ 222 ];
rstp = false;
};
# ilo # ilo
"ge-0/0/47".ethernet-switching = { "ge-0/0/47".ethernet-switching = {
interface-mode = "access"; interface-mode = "access";
@ -60,9 +95,9 @@
}; };
# netcore01 (Potos) # netcore01 (Potos)
"xe-0/1/2".ethernet-switching = { "xe-0/1/2".ethernet-switching = {
interface-mode = "trunk"; interface-mode = "access";
vlans = [ vlans = [
"all" "ap-staging"
]; ];
}; };
# uplink # uplink
@ -71,7 +106,8 @@
vlans = [ "uplink-cri" ]; vlans = [ "uplink-cri" ];
}; };
# debug management # management
"me0".inet.addresses = [ "192.168.42.6/24" ]; "me0".inet.addresses = [ "192.168.42.6/24" ];
"irb".inet6.addresses = [ "fd26:baf9:d250:8000::1001/64" ];
}; };
} }

View file

@ -3,17 +3,8 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
{ _:
pkgs,
utils,
lib,
...
}:
let
inherit (lib)
getExe'
;
in
{ {
networking = { networking = {
useNetworkd = true; useNetworkd = true;
@ -23,84 +14,70 @@ in
firewall.allowedUDPPorts = [ 67 ]; firewall.allowedUDPPorts = [ 67 ];
}; };
systemd = { systemd.network = {
services."arp-resolve-router" = { networks = {
wantedBy = [ "systemd-networkd.service" ]; "10-eno1" = {
after = [ "systemd-networkd-wait-online.service" ]; name = "eno1";
bindsTo = [ "systemd-networkd-wait-online.service" ]; networkConfig = {
serviceConfig.ExecStart = utils.escapeSystemdExecArgs [ VLAN = [
(getExe' pkgs.iputils "ping") "vlan-admin"
"-c" "vlan-uplink-oob"
1
"10.120.33.245"
];
};
network = {
wait-online.anyInterface = true;
networks = {
"10-enp1s0f0" = {
name = "enp1s0f0";
# description = "To the switch";
networkConfig = {
VLAN = [
"vlan-admin"
];
LinkLocalAddressing = false;
LLDP = false;
EmitLLDP = false;
IPv6AcceptRA = false;
IPv6SendRA = false;
};
};
"10-eno1" = {
name = "eno1";
# description = "Uplink cri";
address = [
"10.120.33.246/30"
"129.199.195.158/32"
];
routes = [
{
PreferredSource = "129.199.195.158";
Gateway = "10.120.33.245";
}
];
};
"10-vlan-admin" = {
name = "vlan-admin";
# DHCP for the BMC
networkConfig.DHCPServer = "yes";
dhcpServerConfig = {
PoolOffset = 128;
EmitDNS = false;
EmitNTP = false;
EmitSIP = false;
EmitPOP3 = false;
EmitSMTP = false;
EmitLPR = false;
UplinkInterface = ":none";
};
address = [
"fd26:baf9:d250:8000::ffff/64"
"192.168.222.1/24"
]; ];
LinkLocalAddressing = false;
LLDP = false;
EmitLLDP = false;
IPv6AcceptRA = false;
IPv6SendRA = false;
}; };
# address = [ "192.168.222.1/24" ];
}; };
netdevs = { "10-vlan-admin" = {
"10-vlan-admin" = { name = "vlan-admin";
netdevConfig = { # DHCP for the BMC
Name = "vlan-admin"; networkConfig.DHCPServer = "yes";
Kind = "vlan";
}; dhcpServerConfig = {
vlanConfig.Id = 3000; PoolOffset = 128;
EmitDNS = false;
EmitNTP = false;
EmitSIP = false;
EmitPOP3 = false;
EmitSMTP = false;
EmitLPR = false;
UplinkInterface = ":none";
}; };
address = [
"fd26:baf9:d250:8000::ffff/64"
"192.168.222.1/24"
];
};
"10-vlan-uplink-oob" = {
name = "vlan-uplink-oob";
networkConfig.DHCP = "ipv4";
};
};
netdevs = {
"10-vlan-admin" = {
netdevConfig = {
Name = "vlan-admin";
Kind = "vlan";
};
vlanConfig.Id = 3000;
};
"10-vlan-uplink-oob" = {
netdevConfig = {
Name = "vlan-uplink-oob";
Kind = "vlan";
};
vlanConfig.Id = 500;
}; };
}; };
}; };

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "bridge01" ] [ "bridge01" ]
[ [
# List of secrets for bridge01 # List of secrets for bridge01

View file

@ -5,7 +5,6 @@
{ {
pkgs, pkgs,
lib, lib,
dgn-keys,
meta, meta,
... ...
}: }:
@ -13,14 +12,6 @@
config = { config = {
dgn-access-control.users = lib.genAttrs meta.organization.groups.nix-builder (u: lib.singleton u); dgn-access-control.users = lib.genAttrs meta.organization.groups.nix-builder (u: lib.singleton u);
# FIXME(Raito): this should really go into `dgn-access-control` but I don't
# know what is the desired architecture for it. Leaving it for the people with opinions™.
users.groups.nix-builders = { };
users.users = lib.genAttrs meta.organization.groups.nix-builder (u: {
extraGroups = [ "nix-builders" ];
openssh.authorizedKeys.keys = dgn-keys.getBuilderKeys u;
});
security.pam.loginLimits = [ security.pam.loginLimits = [
{ {
domain = "*"; domain = "*";
@ -52,10 +43,6 @@
nrBuildUsers = 128; nrBuildUsers = 128;
settings = { settings = {
trusted-users = [
"@wheel"
"@nix-builders"
];
keep-outputs = false; keep-outputs = false;
keep-derivations = false; keep-derivations = false;
use-cgroups = true; use-cgroups = true;

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "build01" ] [ "build01" ]
[ [
"forgejo_runners-token_file" "forgejo_runners-token_file"

View file

@ -25,7 +25,6 @@ lib.extra.mkConfig {
"kanidm" "kanidm"
"librenms" "librenms"
"mastodon" "mastodon"
# "netbox"
"nextcloud" "nextcloud"
"ollama-proxy" "ollama-proxy"
"outline" "outline"

View file

@ -40,7 +40,6 @@ let
ps.gunicorn ps.gunicorn
ps.psycopg ps.psycopg
ps.django-compressor ps.django-compressor
ps.django-htmx
ps.django-import-export ps.django-import-export
# Local packages # Local packages
@ -158,8 +157,6 @@ in
DGSI_ARCHIVES_ROOT = "/var/lib/django-apps/dgsi/archives"; DGSI_ARCHIVES_ROOT = "/var/lib/django-apps/dgsi/archives";
DGSI_ARCHIVES_INTERNAL = "_archives"; DGSI_ARCHIVES_INTERNAL = "_archives";
DGSI_STAFF_GROUP = "grp_bureau@sso.dgnum.eu";
DGSI_DATABASES = builtins.toJSON { DGSI_DATABASES = builtins.toJSON {
default = { default = {
ENGINE = "django.db.backends.postgresql"; ENGINE = "django.db.backends.postgresql";

View file

@ -4,9 +4,7 @@
{ {
lib, lib,
meta,
sources, sources,
dgn-keys,
... ...
}: }:
let let
@ -39,7 +37,7 @@ in
"DGNum Infrastructure" = "DGNum Infrastructure" =
let let
# prefer a non-patched nixpkgs # prefer a non-patched nixpkgs
infra-nixpkgs = (import "${hive-root}/bootstrap.nix").pkgs; infra-nixpkgs = (import "${hive-root}/hive.nix").meta.nixpkgs { };
infra-modulesPath = "${infra-nixpkgs.path}/nixos/modules/"; infra-modulesPath = "${infra-nixpkgs.path}/nixos/modules/";
in in
{ {
@ -47,7 +45,7 @@ in
"modules/generic" "modules/generic"
"modules/nixos" "modules/nixos"
]; ];
ignored-modules = (import "${infra-modulesPath}/module-list.nix") ++ [ ignored-modules = import "${infra-modulesPath}/module-list.nix" ++ [
"${sources.agenix}/modules/age.nix" "${sources.agenix}/modules/age.nix"
"${sources.arkheon}/module.nix" "${sources.arkheon}/module.nix"
"${sources."microvm.nix"}/nixos-modules/host" "${sources."microvm.nix"}/nixos-modules/host"
@ -55,18 +53,20 @@ in
{ system.stateVersion = "25.05"; } { system.stateVersion = "25.05"; }
]; ];
specialArgs = { specialArgs = {
inherit meta sources; inherit sources;
modulesPath = builtins.storePath infra-modulesPath; lib = infra-nixpkgs.lib // {
inherit (lib) extra;
};
modulesPath = infra-modulesPath;
pkgs = infra-nixpkgs; pkgs = infra-nixpkgs;
inherit (infra-nixpkgs) lib;
name = "nodeName"; name = "nodeName";
nodeMeta = { nodeMeta = {
nix-modules = [ ]; nix-modules = [ ];
admins = [ ]; admins = [ ];
adminGroups = [ ]; adminGroups = [ ];
}; };
dgn-keys = dgn-keys // { meta = {
getNodeAdmins = _: [ ]; organization.groups.root = [ ];
}; };
}; };
path-translations = [ path-translations = [

View file

@ -2,12 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
{ { config, ... }:
config,
pkgs,
meta,
...
}:
let let
host = "grafana.dgnum.eu"; host = "grafana.dgnum.eu";
@ -67,27 +62,6 @@ in
auto_assign_org_role = "Admin"; auto_assign_org_role = "Admin";
}; };
}; };
declarativePlugins = import ./plugins.nix { inherit pkgs; };
provision = {
enable = true;
datasources.settings.datasources = [
{
name = "VictoriaLogs";
type = "victoriametrics-logs-datasource";
access = "proxy";
url = "http://${meta.network.storage01.netbirdIp}:9428";
}
{
name = "VictoriaMetrics";
type = "victoriametrics-metrics-datasource";
access = "proxy";
url = "http://${meta.network.storage01.netbirdIp}:8428";
}
];
};
}; };
postgresql = { postgresql = {

View file

@ -1,19 +0,0 @@
# SPDX-FileCopyrightText: 2025 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{ pkgs, ... }:
builtins.map pkgs.grafanaPlugins.grafanaPlugin [
{
pname = "victoriametrics-logs-datasource";
version = "0.14.3";
zipHash = "sha256-g/ntmNyWJ9h/eYpZ0gqiESvVfm2fU6/Ci8R7FHIV7AQ=";
}
{
pname = "victoriametrics-metrics-datasource";
version = "0.13.1";
zipHash = "sha256-n1LskeOzp32LZS3PcsRh8FwQVBFVlzczfO2aGbEClSo=";
}
]

View file

@ -14,10 +14,12 @@ let
inherit (lib) inherit (lib)
attrValues attrValues
catAttrs catAttrs
concatLists
escapeRegex escapeRegex
concatStringsSep concatStringsSep
mapAttrs' mapAttrs'
nameValuePair nameValuePair
unique
; ;
domain = "sso.dgnum.eu"; domain = "sso.dgnum.eu";
@ -81,16 +83,25 @@ in
) meta.organization.members; ) meta.organization.members;
groups = groups =
(lib.extra.genFuse (id: { "vlan_${builtins.toString (4094 - id)}".memberless = true; }) 850) {
// {
grp_active.members = catAttrs "username" (attrValues meta.organization.members); grp_active.members = catAttrs "username" (attrValues meta.organization.members);
grp-ext_cri.memberless = true;
} }
// (mapAttrs' ( // (mapAttrs' (
name: members: nameValuePair "grp_${name}" { members = builtins.map usernameFor members; } name: members: nameValuePair "grp_${name}" { members = builtins.map usernameFor members; }
) meta.organization.groups) ) meta.organization.groups)
// (mapAttrs' ( // (mapAttrs' (
name: srv: nameValuePair "grp-admin_${name}" { members = builtins.map usernameFor srv.admins; } name:
{
admins ? [ ],
adminGroups ? [ ],
}:
nameValuePair "grp-admin_${name}" {
members = unique (
builtins.map usernameFor (
admins ++ (concatLists (builtins.map (group: meta.organization.groups.${group}) adminGroups))
)
);
}
) meta.organization.services); ) meta.organization.services);
# INFO: The authentication resources declared here can only be for internal services, # INFO: The authentication resources declared here can only be for internal services,
@ -144,10 +155,7 @@ in
displayName = "Netbox [Inventory]"; displayName = "Netbox [Inventory]";
enableLegacyCrypto = true; enableLegacyCrypto = true;
originLanding = "https://netbox.dgnum.eu"; originLanding = "https://netbox.dgnum.eu";
originUrl = [ originUrl = "https://netbox.dgnum.eu/oauth/complete/oidc/";
"https://netbox.dgnum.eu/oauth/complete/oidc/"
"https://netbox-v2.dgnum.eu/oauth/complete/oidc/"
];
preferShortUsername = true; preferShortUsername = true;
scopeMaps.grp_active = [ scopeMaps.grp_active = [
@ -155,12 +163,6 @@ in
"profile" "profile"
"email" "email"
]; ];
scopeMaps.grp-ext_cri = [
"openid"
"profile"
"email"
];
}; };
dgn_outline = { dgn_outline = {

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../../keys.nix).mkSecrets (import ../../../../../keys).mkSecrets
[ "compute01" ] [ "compute01" ]
[ [
"kanidm-password_admin" "kanidm-password_admin"

View file

@ -1,74 +0,0 @@
# SPDX-FileCopyrightText: 2024 Maurice Debray <maurice.debray@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
config,
lib,
nixpkgs,
...
}:
let
EnvironmentFile = [ config.age.secrets."netbox-environment_file".path ];
in
{
services = {
netbox = {
enable = true;
package = nixpkgs.nixos.unstable.netbox_4_1;
secretKeyFile = "/dev/null";
listenAddress = "127.0.0.1";
plugins = p: [ p.netbox-qrcode ];
settings = {
ALLOWED_HOSTS = [ "netbox-v2.dgnum.eu" ];
REMOTE_AUTH_BACKEND = "social_core.backends.open_id_connect.OpenIdConnectAuth";
PLUGINS = [ "netbox_qrcode" ];
PLUGINS_CONFIG = {
netbox_qrcode = {
custom_text = "DGNum. contact@dgnum.eu";
font = "Tahoma";
};
};
};
extraConfig = lib.mkForce ''
from os import environ as env
SECRET_KEY = env["SECRET_KEY"]
SOCIAL_AUTH_OIDC_OIDC_ENDPOINT = env["NETBOX_OIDC_URL"]
SOCIAL_AUTH_OIDC_KEY = env["NETBOX_OIDC_KEY"]
SOCIAL_AUTH_OIDC_SECRET = env["NETBOX_OIDC_SECRET"]
'';
};
};
systemd.services = {
netbox.serviceConfig = {
inherit EnvironmentFile;
TimeoutStartSec = 600;
};
netbox-housekeeping.serviceConfig = {
inherit EnvironmentFile;
};
netbox-rq.serviceConfig = {
inherit EnvironmentFile;
};
};
users.users.nginx.extraGroups = [ "netbox" ];
dgn-web.simpleProxies.netbox = {
inherit (config.services.netbox) port;
host = "netbox-v2.dgnum.eu";
vhostConfig.locations."/static/".alias = "${config.services.netbox.dataDir}/static/";
};
# dgn-backups.jobs.netbox.settings.paths = [ "/var/lib/netbox" ];
# dgn-backups.postgresDatabases = [ "netbox" ];
}

View file

@ -76,7 +76,7 @@ in
database.createLocally = true; database.createLocally = true;
configureRedis = true; configureRedis = true;
autoUpdateApps.enable = false; autoUpdateApps.enable = true;
settings = { settings = {
overwriteprotocol = "https"; overwriteprotocol = "https";

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "compute01" ] [ "compute01" ]
[ [
# List of secrets for compute01 # List of secrets for compute01
@ -22,7 +22,6 @@
"librenms-environment_file" "librenms-environment_file"
"mastodon-extra_env_file" "mastodon-extra_env_file"
"mastodon-smtp-password" "mastodon-smtp-password"
"netbox-environment_file"
"nextcloud-adminpass_file" "nextcloud-adminpass_file"
"nextcloud-s3_secret_file" "nextcloud-s3_secret_file"
"outline-oidc_client_secret_file" "outline-oidc_client_secret_file"

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "geo01" ] [ "geo01" ]
[ [
# List of secrets for geo01 # List of secrets for geo01

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "geo02" ] [ "geo02" ]
[ [
# List of secrets for geo02 # List of secrets for geo02

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifer: EUPL-1.2 # SPDX-License-Identifer: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "hypervisor01" ] [ "hypervisor01" ]
[ [

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifer: EUPL-1.2 # SPDX-License-Identifer: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "hypervisor02" ] [ "hypervisor02" ]
[ [

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifer: EUPL-1.2 # SPDX-License-Identifer: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "hypervisor03" ] [ "hypervisor03" ]
[ [

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "rescue01" ] [ "rescue01" ]
[ [
# List of secrets for rescue01 # List of secrets for rescue01

View file

@ -23,8 +23,6 @@ lib.extra.mkConfig {
"peertube" "peertube"
"prometheus" "prometheus"
"redirections" "redirections"
"victorialogs"
"victoriametrics"
]; ];
extraConfig = { extraConfig = {

View file

@ -14,14 +14,12 @@ let
"lanuit.ens.fr" "lanuit.ens.fr"
"simi.normalesup.eu" "simi.normalesup.eu"
"pub.dgnum.eu" "pub.dgnum.eu"
"actes-administratifs.dgnum.eu"
]; ];
buckets = [ buckets = [
"monorepo-terraform-state" "monorepo-terraform-state"
"banda-website" "banda-website"
"actes-administratifs-website"
"castopod-dgnum" "castopod-dgnum"
"hackens-website" "hackens-website"
"nuit-website" "nuit-website"

View file

@ -17,9 +17,9 @@ let
lib.mapAttrsToList ( lib.mapAttrsToList (
node: node:
{ config, ... }: { config, ... }:
lib.optional config.dgn-monitoring.exporters.enable { lib.optional config.dgn-node-monitoring.enable {
targets = map (p: "${node}.dgnum:${builtins.toString p}") ( targets = map (p: "${node}.dgnum:${builtins.toString p}") (
builtins.attrValues config.dgn-monitoring.exporters.ports builtins.attrValues config.dgn-node-monitoring.ports
); );
labels = { labels = {
host = node; host = node;

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "storage01" ] [ "storage01" ]
[ [
# List of secrets for storage01 # List of secrets for storage01

View file

@ -0,0 +1,20 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
let
host = "victoria-metrics.dgnum.eu";
port = 9099;
in
{
services.victoriametrics = {
enable = true;
listenAddress = "127.0.0.1:${builtins.toString port}";
};
dgn-web.simpleProxies.victoria-metrics = {
inherit host port;
};
}

View file

@ -1,22 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{ meta, name, ... }:
let
port = 9428;
in
{
services.victorialogs = {
enable = true;
flags = {
retentionPeriod = "4w";
httpListenAddr = "${meta.network.${name}.netbirdIp}:${builtins.toString port}";
};
};
networking.firewall.interfaces.wt0.allowedTCPPorts = [ port ];
}

View file

@ -1,23 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{ meta, name, ... }:
let
port = 8428;
in
{
services.victoriametrics = {
enable = true;
flags = {
# INFO: We keep the data for 2 years (24 months)
retentionPeriod = "24";
httpListenAddr = "${meta.network.${name}.netbirdIp}:${builtins.toString port}";
};
};
networking.firewall.interfaces.wt0.allowedTCPPorts = [ port ];
}

View file

@ -2,8 +2,7 @@
# #
# SPDX-License-Identifer: EUPL-1.2 # SPDX-License-Identifer: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "tower01" ] [ "tower01" ]
[ [
] ]

View file

@ -12,7 +12,6 @@ lib.extra.mkConfig {
enabledServices = [ enabledServices = [
# List of services to enable # List of services to enable
"k-radius" "k-radius"
"monitoring"
"networking" "networking"
"ups" "ups"
"ulogd" "ulogd"

View file

@ -1,9 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
imports = [
./victorialogs.nix
];
}

View file

@ -1,37 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{ meta, ... }:
let
port = 9428;
in
{
services = {
nginx = {
enable = true;
streamConfig = ''
server {
listen 10.0.253.1:${toString port};
listen ${meta.network.vault01.netbirdIp}:${toString port};
proxy_pass 127.0.0.1:${toString port};
}
'';
};
victorialogs = {
enable = true;
flags = {
retentionPeriod = "52w";
httpListenAddr = "127.0.0.1:${builtins.toString port}";
};
};
};
networking.firewall.interfaces = {
wt0.allowedTCPPorts = [ port ];
vlan-admin-ap.allowedTCPPorts = [ port ];
};
}

View file

@ -59,6 +59,12 @@ let
LinkLocalAddressing = "no"; LinkLocalAddressing = "no";
DHCPServer = "yes"; DHCPServer = "yes";
}; };
dhcpServerConfig = {
SendOption = [
# FIXME: should be removed, it's used only for tests
"26:uint16:1378" # send MTU to users
];
};
linkConfig = { linkConfig = {
Promiscuous = true; Promiscuous = true;
MTUBytes = 1500; MTUBytes = 1500;
@ -109,6 +115,7 @@ let
vlan-admin = { vlan-admin = {
Id = 3000; Id = 3000;
address = [ "fd26:baf9:d250:8000::1/64" ]; address = [ "fd26:baf9:d250:8000::1/64" ];
networkConfig.linkConfig.MTUBytes = 1500;
}; };
vlan-admin-ap = { vlan-admin-ap = {
@ -123,6 +130,7 @@ let
IPv6SendRA = true; IPv6SendRA = true;
DHCPServer = "yes"; DHCPServer = "yes";
}; };
linkConfig.MTUBytes = 1500;
ipv6Prefixes = [ ipv6Prefixes = [
{ {
AddressAutoconfiguration = false; AddressAutoconfiguration = false;
@ -303,12 +311,10 @@ in
]; ];
script = '' script = ''
if ping -c 1 8.8.8.8 > /dev/null || ping -c 1 1.1.1.1 > /dev/null; then if ping -c 1 8.8.8.8 > /dev/null || ping -c 1 1.1.1.1 > /dev/null; then
echo network is up
${lib.concatMapStringsSep "\n " ( ${lib.concatMapStringsSep "\n " (
{ interfaceName, ... }: "networkctl up ${interfaceName}" { interfaceName, ... }: "networkctl up ${interfaceName}"
) userVlans} ) userVlans}
else else
echo network is down
${lib.concatMapStringsSep "\n " ( ${lib.concatMapStringsSep "\n " (
{ interfaceName, ... }: "networkctl down ${interfaceName}" { interfaceName, ... }: "networkctl down ${interfaceName}"
) userVlans} ) userVlans}
@ -338,58 +344,18 @@ in
] ++ userVlans; ] ++ userVlans;
nftables = { nftables = {
enable = true; enable = true;
tables = { tables.nat = {
nat = { family = "ip";
family = "ip"; content = ''
content = '' chain postrouting {
chain postrouting { type nat hook postrouting priority 100;
type nat hook postrouting priority 100; ip saddr 10.0.0.0/16 ip saddr != 10.0.255.0/24 snat ip to 129.199.195.130-129.199.195.157
ip saddr 10.0.0.0/16 ip daddr != 10.0.0.0/16 snat ip to 129.199.195.130-129.199.195.157 ether saddr { e0:2e:0b:bd:97:73, e8:d5:2b:0d:fe:4a } snat to 129.199.195.130 comment "Elias"
} ether saddr { 1c:1b:b5:14:9c:e5, e6:ce:e2:b6:e3:82 } snat to 129.199.195.131 comment "Lubin"
''; ether saddr d0:49:7c:46:f6:39 snat to 129.199.195.132 comment "Jean-Marc"
}; ether saddr { 5c:64:8e:f4:09:06 } snat to 129.199.195.158 comment "APs"
filter = { }
family = "inet"; '';
content = ''
chain forward {
type filter hook forward priority filter; policy accept;
ct state vmap {
invalid: drop,
established: accept,
related: accept,
new: jump forward_decide,
untracked: jump forward_decide,
};
}
chain forward_decide {
# Block access to vpn
ip daddr {
10.10.17.0/30,
100.80.0.0/16,
} jump forward_reject;
# And administrative vlans
ip6 daddr {
fd26:baf9:d250::/48,
} jump forward_reject;
# These are being deployed, and so are not trusted
ip saddr 10.0.255.0/24 jump forward_reject;
# We only forward for ISP clients and our stuff
ip saddr != 10.0.0.0/16 jump forward_reject;
# Can talk to us
ip daddr 10.0.0.0/27 accept;
# Not others nor CRI
ip daddr 10.0.0.0/8 jump forward_reject;
}
chain forward_reject {
reject with icmpx type admin-prohibited;
}
'';
};
}; };
}; };
firewall = { firewall = {
@ -397,9 +363,7 @@ in
67 67
1194 1194
]; ];
# FIXME: I dont't remember why it's here, and it doesn't seems right checkReversePath = false;
# comes from https://git.dgnum.eu/DGNum/infrastructure/commit/411795c664374549e5e831722a80180b51fbf0d5
# checkReversePath = false;
}; };
}; };

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "vault01" ] [ "vault01" ]
[ [
# List of secrets for vault01 # List of secrets for vault01

View file

@ -57,13 +57,4 @@
fi fi
''; '';
}; };
environment.defaultPackages = [
(pkgs.callPackage ./fill-vlan_prefixes.nix {
inherit (config.networking) vlans-info;
postgresql = config.services.postgresql.package;
})
(pkgs.callPackage ./nat-request-daddr.nix {
postgresql = config.services.postgresql.package;
})
];
} }

View file

@ -1,39 +0,0 @@
# SPDX-FileCopyrightText: 2025 Lubin Bailly <lubin.bailly@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
lib,
writeShellApplication,
writeText,
vlans-info,
postgresql,
}:
let
inherit (lib) concatMapStringsSep;
sql-script = writeText "vlan-filling.sql" ''
DROP TABLE IF EXISTS vlan_prefixes;
CREATE TABLE vlan_prefixes (
vlan_id smallint PRIMARY KEY UNIQUE NOT NULL,
prefix inet NOT NULL
);
INSERT INTO vlan_prefixes VALUES
${concatMapStringsSep ",\n " (
{
vlan,
netIP,
prefixLen,
...
}:
"(${toString vlan}, inet '${netIP}/${toString prefixLen}')"
) vlans-info}
;
'';
in
writeShellApplication {
name = "fill-vlan_prefixes";
runtimeInputs = [ postgresql ];
text = ''
psql -d ulogd -U ulogd -f ${sql-script}
'';
}

View file

@ -1,35 +0,0 @@
# SPDX-FileCopyrightText: 2025 Lubin Bailly <lubin.bailly@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
writeShellApplication,
postgresql,
}:
writeShellApplication {
name = "nat-request-daddr";
runtimeInputs = [ postgresql ];
text = ''
TARGET_TIMESTAMP=$2
TARGET_PREFIX=$1
psql -d ulogd -U ulogd -c "
select
vlan_id,
reply_ip_daddr_str as used_ip,
reply_l4_dport as used_port,
orig_ip_daddr_str as daddr,
orig_l4_dport as dport,
flow_start_sec, flow_end_sec
from ulog2_ct
join vlan_prefixes on ulog2_ct.orig_ip_saddr_str <<= vlan_prefixes.prefix
where
-- if we don't have conn start, we considered it started before the target time
( flow_start_sec IS NULL or flow_start_sec <= $TARGET_TIMESTAMP )
and
-- similar for conn end
( flow_end_sec IS NULL or flow_end_sec >= $TARGET_TIMESTAMP )
and
orig_ip_daddr_str <<= inet '$TARGET_PREFIX'
;"
'';
}

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "web01" ] [ "web01" ]
[ [
# List of secrets for web01 # List of secrets for web01

View file

@ -61,18 +61,6 @@ in
languages = [ pkgs.wordpressPackages.languages.fr_FR ]; languages = [ pkgs.wordpressPackages.languages.fr_FR ];
}; };
"npr.wp.dgnum.eu" = {
themes = {
inherit (wp4nix.themes) twentytwentyfive;
};
plugins = {
inherit (wp4nix.plugins) user-role-editor;
};
languages = [ pkgs.wordpressPackages.languages.fr_FR ];
};
}; };
}; };

View file

@ -13,8 +13,7 @@ lib.extra.mkConfig {
enabledServices = [ enabledServices = [
# List of services to enable # List of services to enable
"cas-eleves" "cas-eleves"
# "kadenios" "kadenios"
"django-apps"
]; ];
extraConfig = { extraConfig = {
@ -22,7 +21,7 @@ lib.extra.mkConfig {
dgn-access-control.users.root = [ "thubrecht" ]; dgn-access-control.users.root = [ "thubrecht" ];
# Disable monitoring # Disable monitoring
dgn-monitoring.enable = false; dgn-node-monitoring.enable = false;
# Enable Postgres databases # Enable Postgres databases
services.postgresql = { services.postgresql = {

View file

@ -1,22 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
imports = [
./kadenios.nix
];
services.django-apps = {
enable = true;
webhook = {
domain = "web02.dj-hooks.dgnum.eu";
nginx = {
enableACME = true;
forceSSL = true;
};
};
};
}

View file

@ -1,66 +0,0 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{ config, ... }:
{
services.django-apps.sites.kadenios = {
source = "https://git.dgnum.eu/DGNum/kadenios";
branch = "production";
domain = "vote.dgnum.eu";
nginx = {
enableACME = true;
forceSSL = true;
};
webHookSecret = config.age.secrets."webhook-kadenios_token".path;
overlays.nix-pkgs = [
# Required packages
"authens"
"django-background-tasks"
"django-bulma-forms"
"django-translated-fields"
"loadcredential"
# Dependencies
"python-cas"
];
dependencies = ps: [
ps.authens
ps.django
ps.django-background-tasks
ps.django-bulma-forms
ps.django-translated-fields
ps.gunicorn
ps.loadcredential
ps.markdown
ps.networkx
ps.numpy
ps.psycopg
];
environment = {
KADENIOS_EMAIL_HOST_USER = "web-services@infra.dgnum.eu";
KADENIOS_EMAIL_USE_SSL = true;
KADENIOS_FROM_EMAIL = "Kadenios <vote@infra.dgnum.eu>";
KADENIOS_SERVER_EMAIL = "kadenios@infra.dgnum.eu";
};
credentials = {
SECRET_KEY = config.age.secrets."dj_kadenios-secret_key_file".path;
EMAIL_HOST_PASSWORD = config.age.secrets."dj_kadenios-email_password_file".path;
};
extraServices.tasks = {
script = "python3 manage.py process_tasks";
serviceConfig = {
WorkingDirectory = "/var/lib/django-apps/kadenios/source";
};
};
};
}

View file

@ -0,0 +1,190 @@
# SPDX-FileCopyrightText: 2024 Tom Hubrecht <tom.hubrecht@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2
{
config,
lib,
pkgs,
sources,
...
}:
let
inherit (lib) mapAttrsToList optionals;
host = "vote.dgnum.eu";
port = 9888;
python3 =
let
nix-pkgs = import sources.nix-pkgs { inherit pkgs; };
in
pkgs.python3.override {
packageOverrides = _: _: {
inherit (nix-pkgs)
authens
django-background-tasks
django-browser-reload
django-bulma-forms
django-translated-fields
loadcredential
;
};
};
pythonEnv =
{
debug ? false,
}:
python3.withPackages (
ps:
[
ps.django
ps.gunicorn
ps.markdown
ps.numpy
ps.networkx
ps.psycopg
ps.authens
ps.django-background-tasks
ps.django-bulma-forms
ps.django-translated-fields
ps.loadcredential
]
++ (optionals debug [
ps.django-browser-reload
ps.django-debug-toolbar
])
);
manage = pkgs.writeShellApplication {
name = "kadenios-manage";
runtimeInputs = path ++ [
config.systemd.package
pkgs.util-linux
];
text = ''
MainPID=$(systemctl show -p MainPID --value django-kadenios.service)
nsenter -e -a -t "$MainPID" -G follow -S follow python ${sources.kadenios}/manage.py "$@"
'';
};
staticDrv = pkgs.stdenv.mkDerivation {
name = "kadenios-static";
src = sources.kadenios;
nativeBuildInputs = [ (pythonEnv { debug = true; }) ];
configurePhase = ''
export KADENIOS_STATIC_ROOT=$out/static
export KADENIOS_DEBUG=true
export CREDENTIALS_DIRECTORY=$(pwd)/.credentials
'';
doBuild = false;
installPhase = ''
mkdir -p $out/static
python3 manage.py collectstatic
'';
};
environment = builtins.mapAttrs (_: builtins.toJSON) {
KADENIOS_ALLOWED_HOSTS = [ "vote.dgnum.eu" ];
KADENIOS_STATIC_ROOT = staticDrv;
KADENIOS_DATABASES = {
default = {
ENGINE = "django.db.backends.postgresql";
NAME = "kadenios";
};
};
KADENIOS_EMAIL_HOST_USER = "web-services@infra.dgnum.eu";
KADENIOS_EMAIL_USE_SSL = true;
KADENIOS_FROM_EMAIL = "Kadenios <vote@infra.dgnum.eu>";
KADENIOS_SERVER_EMAIL = "kadenios@infra.dgnum.eu";
};
path = [ (pythonEnv { }) ];
in
{
environment.systemPackages = [ manage ];
systemd.services = {
django-kadenios = {
description = "ENS simple voting server";
wantedBy = [ "multi-user.target" ];
after = [
"network.target"
"postgresql.service"
];
serviceConfig = {
DynamicUser = true;
LoadCredential = mapAttrsToList (name: value: "${name}:${value}") {
SECRET_KEY = config.age.secrets."kadenios-secret_key_file".path;
EMAIL_HOST_PASSWORD = config.age.secrets."kadenios-email_password_file".path;
};
StateDirectory = "django-kadenios";
User = "kadenios";
};
inherit environment path;
script = ''
python3 ${sources.kadenios}/manage.py migrate
gunicorn app.wsgi --pythonpath ${sources.kadenios} -b 127.0.0.1:${builtins.toString port} --workers=2 --threads=4
'';
};
django-kadenios-tasks = {
description = "Background tasks worker for Kadenios";
wantedBy = [ "multi-user.target" ];
after = [
"network.target"
"postgresql.service"
"django-kadenios.service"
];
serviceConfig = {
DynamicUser = true;
LoadCredential = mapAttrsToList (name: value: "${name}:${value}") {
SECRET_KEY = config.age.secrets."kadenios-secret_key_file".path;
EMAIL_HOST_PASSWORD = config.age.secrets."kadenios-email_password_file".path;
};
StateDirectory = "django-kadenios";
User = "kadenios";
WorkingDirectory = sources.kadenios;
};
inherit environment path;
script = ''
python3 manage.py process_tasks
'';
};
};
dgn-web.simpleProxies.kadenios = {
inherit host port;
vhostConfig.locations."/static/".root = staticDrv;
};
services.postgresql = {
ensureDatabases = [ "kadenios" ];
ensureUsers = [
{
name = "kadenios";
ensureDBOwnership = true;
}
];
};
}

View file

@ -2,13 +2,11 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "web02" ] [ "web02" ]
[ [
# List of secrets for web02 # List of secrets for web02
"bupstash-put_key"
"cas_eleves-secret_key_file" "cas_eleves-secret_key_file"
"dj_kadenios-secret_key_file" "kadenios-secret_key_file"
"dj_kadenios-email_password_file" "kadenios-email_password_file"
"webhook-kadenios_token"
] ]

View file

@ -1,29 +0,0 @@
age-encryption.org/v1
-> ssh-ed25519 jIXfPA miVq8rZazx0Y0NYZklZh8ITlY7fOTwbPsAPcHwvJ3jI
Vs0xx9ulk2++7+DfD+HqhISSvYMtuSJIs9zyGlnW8Wk
-> ssh-ed25519 QlRB9Q z5TQpHovWNJ+Dq4GEcPfByMpTcTojIamJbU3kNKlmHQ
U+ZFJ/0TVcfo85xAWYqcnzpMfU0KcY8QJ8jqWlyt1U0
-> ssh-ed25519 r+nK/Q l5oBCnALC2HSoszpawrJZZUEFHjjGwei4Fd1Y+f7OjI
PLgEu00ItWIbT3ZSNioZ3oXwBBVQTD/wf8I8akEDNWs
-> ssh-rsa krWCLQ
2rt9GmpSxUJSArSOlXKQscrApgLLIWuTo/IXensBP1uCnrpLl4IdcpEJNTs7wtZq
h4OLCaLDoZvB3ZT3k+CXXXeBqLqz1DdBGo08RgfcUADTsm2Z9LsEyLo0GtHGEFjw
m1r/VF8githDxaEK52+znr1FG8CE7+DBQAU9ZydhKKjjFS7ckDHw0qFXyGqpyWk4
KnL7FGPX2z07V3nwauElDbaD1LLt0xHhqqEjmiRskhE2UU6q35IrLyKFHC1VHsFy
ItsONTu8lDiqXSi7Z5b5Iv+iAWWTtt/glTv3WFa8u7CIahuZIfemr8NzjD2Z+Vxh
yOEqBKyVgz8sFh1U7CgxCg
-> ssh-ed25519 /vwQcQ dcnBNyypzMkxHwh76v7bKhGckPjIOL2vP2aDWhB8WxQ
tTxcMXcLrFhD7u2xTOhsjWErSiCOfsVIDZgJldVePMw
-> ssh-ed25519 0R97PA stdF6UFkWDCwNUAv+aAetpku7O9XRvtaxafCjok9yhI
gXVXcwlY4Xue9WGk+WlByXvSgMju+VWKTBTXIngWYvE
-> ssh-ed25519 JGx7Ng e+Ux4HK63pAM4scQCi4wHTUmo28z105Ok59dlki0OS8
ulkU6zhXNpa3OswEC005BZ/YIExPysg25a4/O60fcWQ
-> ssh-ed25519 bUjjig SEnDWloeuVgCGLUJNvsBL1HPYJGBSBhqdDngkQk+KiE
MYL9SudJNuFyS4Inaod2Xxldi3d/kDwlIT9rVWs8vFc
-> ssh-ed25519 IY5FSQ TO9BPLBwdlqyKXOBiohCzfZWrTDwqhLjZYeq9rZgH2c
7Hqrqe+A3wg11H3wg9Cd+6F7mDwsLpzoh70sba32gCw
-> 1DV;-grease
9Ul6qKgH063H/HI1op+Gyk2+JRUGHwRG/SlOPTAnvBtq7xEy7yrR4lblBK8bcJNY
lwmI4xOokAnIveVaPS8SAig
--- GpJyGpk3QxJljiR6FZw8hdX0dXvEAIPZEZpL6oorLcM
}­o÷ÕŸ¦A¹qç ™Ò™ö>áp™€M Õ¬Ía“ zþƒÍT VVƒvI«f®<17>!>µ\Ö-þèÿ

View file

@ -8,7 +8,7 @@
services.django-apps.sites.bocal = { services.django-apps.sites.bocal = {
source = "https://git.dgnum.eu/DGNum/www-bocal"; source = "https://git.dgnum.eu/DGNum/www-bocal";
branch = "main"; branch = "main";
domain = "bocal.cof.ens.fr"; domain = "bocal.webapps.dgnum.eu";
nginx = { nginx = {
enableACME = true; enableACME = true;
@ -50,7 +50,8 @@
}; };
environment = { environment = {
BOCAL_RHOSTS_PATH = "/users/guests/bocal/.rhosts"; BOCAL_ALLOWED_HOSTS = [ "bocal.webapps.dgnum.eu" ];
BOCAL_RHOSTS_PATH = "/var/lib/django-apps/bocal/.rhosts";
}; };
}; };
} }

View file

@ -42,7 +42,6 @@
credentials = { credentials = {
SECRET_KEY = config.age.secrets."dj_ernestophone-secret_key_file".path; SECRET_KEY = config.age.secrets."dj_ernestophone-secret_key_file".path;
ACCOUNT_CREATION_PASS = config.age.secrets."dj_ernestophone-password_file".path;
}; };
}; };
} }

View file

@ -7,8 +7,8 @@
{ {
services.django-apps.sites.gestiobds = { services.django-apps.sites.gestiobds = {
source = "https://git.dgnum.eu/DGNum/gestioCOF"; source = "https://git.dgnum.eu/DGNum/gestioCOF";
branch = "bds-prod"; branch = "django-apps";
domain = "gestion.bds.ens.fr"; domain = "gestiobds.webapps.dgnum.eu";
nginx = { nginx = {
enableACME = true; enableACME = true;
@ -46,8 +46,6 @@
credentials = { credentials = {
SECRET_KEY = config.age.secrets."dj_gestiobds-secret_key_file".path; SECRET_KEY = config.age.secrets."dj_gestiobds-secret_key_file".path;
SYMPA_PASSWORD = config.age.secrets."dj_gestiobds-sympa_password_file".path;
SYMPA_USERNAME = config.age.secrets."dj_gestiobds-sympa_username_file".path;
}; };
}; };
} }

View file

@ -11,8 +11,8 @@ in
{ {
services.django-apps.sites.gestiocof = { services.django-apps.sites.gestiocof = {
source = "https://git.dgnum.eu/DGNum/gestioCOF"; source = "https://git.dgnum.eu/DGNum/gestioCOF";
branch = "cof-prod"; branch = "cof-staging";
domain = "cof.ens.fr"; domain = "gestiocof.webapps.dgnum.eu";
nginx = { nginx = {
enableACME = true; enableACME = true;
@ -98,9 +98,6 @@ in
HCAPTCHA_SECRET = config.age.secrets."dj_gestiocof-hcaptcha_secret_file".path; HCAPTCHA_SECRET = config.age.secrets."dj_gestiocof-hcaptcha_secret_file".path;
HCAPTCHA_SITEKEY = config.age.secrets."dj_gestiocof-hcaptcha_sitekey_file".path; HCAPTCHA_SITEKEY = config.age.secrets."dj_gestiocof-hcaptcha_sitekey_file".path;
KFETOPEN_TOKEN = config.age.secrets."dj_gestiocof-kfetopen_token_file".path; KFETOPEN_TOKEN = config.age.secrets."dj_gestiocof-kfetopen_token_file".path;
SYMPA_PASSWORD = config.age.secrets."dj_gestiocof-sympa_password_file".path;
SYMPA_USERNAME = config.age.secrets."dj_gestiocof-sympa_username_file".path;
EMAIL_HOST = config.age.secrets."dj_gestiocof-email_host_file".path;
}; };
environment = { environment = {
@ -115,7 +112,6 @@ in
GESTIOCOF_CORS_ALLOWED_ORIGINS = [ GESTIOCOF_CORS_ALLOWED_ORIGINS = [
"https://${config.services.django-apps.sites.gestiocof.domain}" "https://${config.services.django-apps.sites.gestiocof.domain}"
]; ];
GESTIOCOF_SERVER_EMAIL = "gestion@cof.ens.fr";
}; };
extraServices.worker = { extraServices.worker = {
@ -126,26 +122,6 @@ in
SupplementaryGroups = [ "redis-gestiocof" ]; SupplementaryGroups = [ "redis-gestiocof" ];
}; };
}; };
timers = {
rappel-negatifs = {
script = ''
python3 manage.py sendrappelsnegatifs
'';
startAt = "*-*-* 1,13:17:19";
};
rappel-bda = {
script = ''
python3 manage.py sendrappels
'';
startAt = "*-*-* 2,14:17:19";
};
manage-reventes = {
script = ''
python3 manage.py manage_reventes
'';
startAt = "*-*-* *:01..56/5:29";
};
};
}; };
services.redis.servers.gestiocof = { services.redis.servers.gestiocof = {

View file

@ -8,7 +8,7 @@
services.django-apps.sites.gestiojeux = { services.django-apps.sites.gestiojeux = {
source = "https://git.dgnum.eu/DGNum/gestiojeux"; source = "https://git.dgnum.eu/DGNum/gestiojeux";
branch = "production"; branch = "production";
domain = "jeux.cof.ens.fr"; domain = "gestiojeux.webapps.dgnum.eu";
nginx = { nginx = {
enableACME = true; enableACME = true;

View file

@ -6,7 +6,6 @@
dgn-redirections = { dgn-redirections = {
permanent = { permanent = {
"www.ernestophone.ens.fr" = "ernestophone.ens.fr"; "www.ernestophone.ens.fr" = "ernestophone.ens.fr";
"www.cof.ens.fr" = "cof.ens.fr";
}; };
}; };
} }

View file

@ -1,33 +1,30 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA w23oZwRdOmR6ZmJ/u1UVJX3aDjvFlP9J/0DX421EzTk -> ssh-ed25519 jIXfPA HF+w4Kuk7Wo2s94SeNxAB3zFZhKNn1fPabJhUK/xGH0
GwBhoK4pLMph83ufQSh/DaKtDsQv2Vc/31kN4ahx1O0 KY5tknNrICYq0HTfNRX760OPyWPJ8B4Sasq8BjN9a6k
-> ssh-ed25519 QlRB9Q bx2P8KY31nlurmjEsq6rOGz4RivuubPRr/pwJi8vZR4 -> ssh-ed25519 QlRB9Q OGcCe/S1aIQckJGzt4Wz+DFebTZpNV+YCevnVOPDMXQ
pHUYj6nCuQfv9Y6oJmLqmIWw9rSrb7YgFIGh4/DDBxk keDckjD4Vjhj3gmQnW0V8nJ1Soubkhb9WP28fsanhMA
-> ssh-ed25519 r+nK/Q xX3R7A7Pq+l98C/4rDzZfLa5IyoW4mS1RXCg8jmCVBg -> ssh-ed25519 r+nK/Q lO6xwuhfQ6gMlJzFBF5J9c2elEg1J3leAt5x1uTYGSk
pZZ91CQNMfv+A9nUGM7FCHt79YsEIP8SA4UZ7NmIYyg HQG0VQXvn72CIOqe6FRGrSX8TIa7sBB3cOZZQzXBl8w
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
JSYdRpvAP/pb8v9Rviw+DcwTGmlVbes8LNW/Hjjc3eKNYT6f5TR56Ma0C+ZXA8hC pvF18GVS3dHr2jiss4sn00UqVVM2f/6BmkpYMgAVQ3FNpgnimQGsgCssuBo3Hjrc
BiEoDyvV631v7jf1NQENWgOrx8kIaMlJyJlndEUviFesoUXvBsrRVxZkPo9+q8gm BTO4v2U6cQ28LTUsruWdPhRChT0zfGRtx1QIn0tPzy3XKUxjt2XkBeblxtLhCHmI
2jx8uLxRlq04fIh39YOcxayNPU6ZE0k4iV5Sv8bgNdPPsiSDPEcoGh4ptB/L7PqC muQ0yA15bP+aQfZn0dE1Eb4krw1unKWE4f82L/BQ5Y/i1P2rubhyBhBoQRb6atHv
qa73mSskFsWLMdkhlF2PmobhFYBbJw76ekctHK4enABJR0wnpw76MB/1xaRysO0Z S2EWBafaNr3orbFl9FPMjhWW3WZX/zKJxlu0saN88I6ZU2967mdR4PogMpL9iqST
cE1yXy0TKPeQ6tBs+TgEbWPdjs7q2cCe78Cx14ob/bDTrSxn1VXxlTSEa+jZ8ES2 atraraA1jG6mR9Ojloyrf8FG6wTlplDlZk8Sgtg88FD1iHMN1q0DQv1LwRoD3QUa
aRJM0RnnbulZJMu8vD+ztw ywIn9MABMufNXQ+jm/DQpw
-> ssh-ed25519 /vwQcQ +etnXlMmCofk42qEtdvIZyzpdGPTUR44Ur3rNiYpqQY -> ssh-ed25519 /vwQcQ 83MxgOJhIBBGU6IRcTQPtxtyR4MapAxhdKT634w/em4
+h+hNOOJHWXi4vqsBDudgiQ3BPHVOA1bl+R4d5zCs2g scNxodN5j1HXOIPCB3glvc08Gb4wW9gmZ5gkWMCbm4E
-> ssh-ed25519 0R97PA VuTnbuLdQANqvVDvIEOJVFWh3IgOKLHXROxSCx5E0C0 -> ssh-ed25519 0R97PA LBFUS7zx26+rjiWqVwQ4UBqRxr+3Sx+j+GGrRaBbz08
euVIt58WGFPxL5IgE0Stce7q9MaQCLkWOGpLyxhszJk fnFwvJz36SiKnEoJr+0+enNVcT7wduZUrYe7bWhyxfE
-> ssh-ed25519 JGx7Ng /1DGw0uUQ99aDlw5AdNIKZNZbRSXoxCwJZU4iotnMVA -> ssh-ed25519 JGx7Ng iXjAn4Y7+yHASx4ZbIrvFffLzgX52DbQy9hIcTScHAs
v9B+dF8KmmVLjYh7IT61p757x+CeJQ0qY+kU69Ced3s 6AJZoV33mBryiCaquKTAkw8yB1NQs38QlG2p4LIcoMc
-> ssh-ed25519 bUjjig tvi0aragAV8TvSAvVVYwgAe4D/iFPy8Hmo5BFIiMigc -> ssh-ed25519 bUjjig 0cqMXUVHqhyYhygR7meIyWRr/c7H8ZGB5eO7tTHhRUk
ixKZkBQDFDoM3ntd43TPb5gzQmJKiuYHuPRvh+wlLwg GYKKGB02ElJXpObmBJKF4Bvoswd3o83vvVYIHIpDprg
-> ssh-ed25519 ZIo4kw 4mpL5GIsgcXQH3+DTwo1wBO2IGtwqYX71sSj3HRTUD8 -> ssh-ed25519 VQSaNw xHhzKnYeKxrN2MJz84v7Mjg3Nh69UJ6Q/eAyVAvC3V0
FyiH/fpn6rFmw6L1nbxqnlEQwHdgq2kacvkl4dDSpDA /bvauGesQw9/tl4DhCNFY9Rq+qWv12O4TcqzdxTCWzk
-> ssh-ed25519 9/PCvA rwGsoEUqcUK/bj0wpo/2GIcPgJPdUCs/y/0MacBXlTQ -> T:){{-grease NuQ <}vLGT%
4IRzAh7PgafkdUGOoUnTFZwQwpupt+09tNCuMQPtNow 0JSFYPMWs6LXpWacfiHNdwqvs/eHecFwj6cg0eLZEQe96shxy8/WSUBMpgasKufB
-> ssh-ed25519 VQSaNw if6Cp0uuuBCn5/sIEhhiD3Xa3MGOgxNhpA5jk/sNaxk Nc4tpfiOVWVRGm4arhunwJ+1sgg37X35PWde89Qpg5g
tZLZbxe2EswPA2DOzm1XILWxPJOfvtQEBb3J/g7gOdg --- Y6N6GuCpRLdD25EWW+05qbUAadrT3z2Pzc5golCBHJw
-> p0A#yj-grease ßNê¯3'8ú³€@/¨0,zWêS¦‘ï;ßñì)§e<C2A7>ßÉïèÞí
GR/rBHQQMBRnEs3FdKUmaxDXNLeZuXXftbiAi+6dzv4SsZoJ5oqi4UKivc5DYLfO qMjÏŒrçHBÇR2šš E2H+d­% ¶Ò–®
C8GywA
--- XSYpA1AoDYYWRAjVBKAfn9s/nI7d6hE2j57BKVdMQ5Q
#žSõ/ éž5Õn%´ªžô‰w9EŒ­¨¦TüMƒýP»?â…œ¡˜(<28>PGrj4$*<2A>Cû èü8´‡¤ô¥Jpt=H`Âî½n

View file

@ -1,32 +1,28 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA EsnCV2WNHwC5zZpIqMiOnpixioiS32MkPW2gvPW0hlA -> ssh-ed25519 jIXfPA kBFUMktUZ09T8ujSXHRIo4OIWxIiwysmRv+UTiH+02M
SdJ0CVIn+xIw851NfAVq2xi4eyIkjE5OBSjWjmXMbrA TvefF7CMKZIASBYaVQA22PzLr2rgZ3i7Q8ENBOmpQmI
-> ssh-ed25519 QlRB9Q pSqgkPUwNF0ahPyz+bRXfnJqlhiis8+JLtGVXMJFkGs -> ssh-ed25519 QlRB9Q 0R2BthIX790DAiL36WPOemUa04tOnN0Drpg6u72j7UE
gEovHZ0L9Hf0FxITH7Pw82GmtpSry9AttmYyzOget/g nFGbwKZvSXo0SpO8AMfAGcZkphcXhX+GoFxYwadNzwQ
-> ssh-ed25519 r+nK/Q abHRhq9gLkRJZnW16AkJUNkuDkFx6ZEgcfcPKD7qkl8 -> ssh-ed25519 r+nK/Q cs+vGq5RzK/AogpcGjRG3KZjl4fp2Ghhv2ngHjTdvlE
TZOo2qI9wtTr5EFyLa7XwcNu9t4TiBTjYFfDcXF5WzY AyXbgDlQbe3HurX7lodUrMZyRSWADSFWmTndnHjh0dY
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
NiW6aPN5sW1w8AWe66x5wkyJTYPnPqlmPdwkRMH62Z9rdRGoplPaThh46N1F7iSN AnU8JBZXw8xIHA3L+220wCHwddC51Fx+sQx58tYsFg7eVH1NM2PKUr57a7+0KlxH
R7YfTRNy/xcSq612Wf1PbEGtcaEBU4snLwBUMxzgCEf7lLebnBFEv+wM46c6M4Vh TkIDMUuBotY4QPA0tzv212wnWaTw9ddV+T+Xe+l7JNyurCQRj1g1gWP3NLYIyYFC
sRHm7LJP4EIFtC/OVi4Po3AOxnzWie6sgMtwVO1dxA92F52ANJm85+S9v4LyKf6B i/eXHg3XxByQG1BfBSL2nnUEiy6eJ2bLMFsJ9P6baB6hpdEnoFIuGdV4Bg3k/KGl
3j1CTlQnST4Jz+NFR1lIWkAzawQkrObj1XNw0JjAH5cCFPNX8KJwGPPtRaw6qdE2 Zp+Q1a7Ov0l/G7sRCw4WLQtq59otI2lxeKRSonCqSNOmDXyZBr82GMr/BmhebtK4
NN6boxJRuw015LFoT2REg8hFUj9mvKi1CF7zzAorlU8U5tGsTzWopFaz8sw6uw1e h19K+EXU+Ze57lUf2kDCe0b4RSHbSGU1T1fSEMNcXFV0952r6zO9YClTsQeKl+ev
hnLDEWU79TB/Ytc9mk+VgQ 1O7xqUhcRXgFUbDYRjTsLw
-> ssh-ed25519 /vwQcQ uGDPoAidrjD4YOahlB14fECk3q7JYAgK2U3AwiTZp3Q -> ssh-ed25519 /vwQcQ AtEImZ61sgC2OzZvDldY7ttRf9I5+zmL2I7hZkmBoTY
VMBSpbWgh9/+vNsxb31DztSAmuXQ2OT8PhGY8e5oEyg zQiLX4L6t+jZqzAJmN7iuRTeadD1jbs3E/NZZj/25UA
-> ssh-ed25519 0R97PA dneC7N5KN3lOt+tf+SBVHac5PiFuzah+kxPCL7taES0 -> ssh-ed25519 0R97PA JVheI/2kfdkqgM5Jf/py32lyYLtWjpmcx4zkHYMZl3g
2ax/oATQ3RCZJrwa6rhRFjP/Pb83SE/K/JqzkDe4q5s z/+qXmvziQo8yZ6f+2y5XVDv6d/uAghCVDQ9tpLXt54
-> ssh-ed25519 JGx7Ng e+gbiPqeQvqH5SsMLtJjO1Yamqf/T3zMx9sZP/lE1WM -> ssh-ed25519 JGx7Ng 41ZgklG6LmM5Mk6BkGWAf8N3j1safWPBKBAHKN2EQG0
ZaLKy2fNia1FOO/8McmHLCTs7mU02UhIEcfnWR8Rmo0 yOiGIHkyoMFI6NQMLCZavCaz+qxAy9jhf+vctWQ2z4k
-> ssh-ed25519 bUjjig YG96Anu4XdeqjveqgPKBg9DXRgQWzbZyqUh4zyp7NW8 -> ssh-ed25519 bUjjig 0o9QkwuPZPOl/db1sQ9YL50DL1uyZqQ6ICxMEIupQ20
XOW98Ncs7wa8+J7bdcni1BTvi0yt157YsqS37SyE1UE FwFbAYzLUNwoAQNcbcwWckhqRSEicQTe4O4BMK7wHyg
-> ssh-ed25519 ZIo4kw 0bsqX9eZWnobso+67zX7mv4NZHN0iLJgREpEAjsSog8 -> ssh-ed25519 VQSaNw iaWBGmaWmBxMJILFyob6CyVXyY24edPtT2itTQGP7xM
chztA4fSI+l/hFC1JG/I8csRjW6nRL5nD8H2BIvKhtc EGmCuYElC5EgwqXtcXLAy7nNFt75Hl/gAehvfh+0sgg
-> ssh-ed25519 9/PCvA u1TmEMmSAY01VT5KSkHIeGZyFR/AjO04fbdaQMOzWUU -> /Wa)P<iw-grease (;ag_e g#LM+oA Y n(M-1K+.
KgNuPOluctxdmyoRQKGhxzUdM+lJYijOTZTppx1x8Ig lWfOmA
-> ssh-ed25519 VQSaNw y6+jgJvBopK1AkLk+FRsd1hOKyYhU3udCmpSqH73F2Y --- k01yU9ZR8KIyG0JEfcYoP4iBlvqq7J676oPfDLpbvfs
qZyA/Fe6kxaIaYBtEWdIt69phdcpPgPr6hvHslYGZV8 ÎD—èŒ<C3A8>Ptáçø4Õ•?6”N|ÐïZƒ³åM/œqo¨[ÄNä
-> ~Ef{]c0-grease ]bzX}@u' 23 } pjfN*GE
cHkSTFWSdWHGclY
--- 9GRqhQV1hb50rv2MYPgyJBP6eEm5KQUEUNqJnMMMx/0
j ·!½DÚ'×­(ã°<C3A3>!³€É݈ço&Þˆo) ü½Ô~Ñå

View file

@ -1,33 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA iQr5+V3ESwwPQ0N5TWvKPQllxl51JbvY1pQ/LWFoGRM -> ssh-ed25519 jIXfPA hAdsxHTIT08JvDQGzY0Vz+Jxd48Kw3XNpf6TEjiGiTc
mmPi5TEsoKaqqCNR9wFOW9m/ZO+LybILeAr0IltAA6A hZgLRBDGwpfIFMhTRExY6JJ0poJ+nqrBK8Fy3ukINFI
-> ssh-ed25519 QlRB9Q uWG5fTIkrcvoZPwTjeUIvUBb9SSw/tqLVXQ5EgPEpA4 -> ssh-ed25519 QlRB9Q AyfmPVVcb9WVzrbyh2KdPQMwPypQ0uq3q6kkPFcMyjw
NxUobR435SRYhgtfqeL4nCTyBimMFQDeHkv1EXxyeW0 S2h//+6MMnUiBWrznI/1+qS83Gw1vpFmU8Hlma40bdA
-> ssh-ed25519 r+nK/Q mWebzwprS5rda66lWzpTXkeLBJ1cQr92jt1IKiGuhmI -> ssh-ed25519 r+nK/Q 741XzH0HZf/y8HR1AQIn+qgn0+L+2kcdPsepRcXx7w8
s5C7BIJioGzDafwDDsBBEy9FfSDLhVI8loGPMI59ITE 5aNoPnRTYHB5FTXipQV+8C/s8t1s5/ZF9PwnJfYy8bM
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
O0u81IdCYXC/caM9tEUD21d06Uq+AEaUWauHd3T4uBzx6k8KxZQsXL7FlmpyHMQy HhSOliN7XQZngyyrJ++S2JMBytkPjSt/dEUlJNbJP5n6HY5H7QKqd9rsc4LLu/Hz
jWKX3lni54qWZqyGi3AVBWwrdT3C59vAUUtOPsR9BdhuETjuNhUVgOQhfygbpNTP BXKC9T3IVeuabMPNOBhE6SiOUejGv/txbMHPMdPTCju6JL4wP/2gqIK696kP62pL
Z+1xv/H+6iY4iaijkneUqjO+Zf8XzNiBjV1jxAEgVSMAYfYi2IUKaNGfTCxsf7z6 CAS/cOZXrHS8etEFkpqSuEVquNIXbivXNHEwFMH/GkNut0SCpafvQHrN1wZdveH5
FbcOZiwKffzF9ml3jRbi0zacy2YfBVA3HLtr0G2konocqB2blx0yQx+CUN66vODT rp60R9ULzTzS3ztjEomAt9gWN6s7CtqZEozCMExPTXSW+OmBJprY+/Ae/uxeKZMS
Dg2Rvjvxj/UILT6DHfhSEienmIyRVcEV4FMyDRAqVnSWvY+5rQu7Q193lsdwxu1V x6pscBbZSEazZ476sZCWKTpeej7iFlSrIvLfkwYn9PtKqmaInoM/0F2thkqpVPkZ
imAsspRLp7cLTHO13E7HEQ /pcg11dUQpXJdaIiPEowlg
-> ssh-ed25519 /vwQcQ D7UkEEde5wt6JLVwgw09YpI1jda5PpseNb3/oYXeuxY -> ssh-ed25519 /vwQcQ m01BxY0nPTfcW0D/iFRbCNbFFp+lE/XLW315aPyNbTM
mAyubu6vZt9WGQz7LN66OFLysMJnggQM3Lzp1WL2WIw hiKCfZH9k5GcUAkCJ/+x5V20SCeql8031lOge0Y9WXk
-> ssh-ed25519 0R97PA KELROPFrMKhwm6qZa3pDGUwL46djU6KXuEvvJdvPVTY -> ssh-ed25519 0R97PA oGfUKErY65Jd0ZlcVox/HXA3itOI5KImRqDwH+UR6XI
TLnuP2JD9KWnJyFG/TniJ7SZA8MwEGWRm/slgexr6Ws 32BtXjqImmG6TjUKoDU2QaJiMxldZdZoAP9SKPfGuHA
-> ssh-ed25519 JGx7Ng frq2JO+UyHShB9/ho6SSO4gpm1x5gsT/FWNcce4FejI -> ssh-ed25519 JGx7Ng FJCtkG+Ig5dC+ftTClgrKtIt/D8s9Dr97eWObbNEZDs
0yjxhYvLi6BJCV04liQ8EUfvd/QQDfvQW/+69k81SLI i6tf7p5FDsdTZMJuBNmcTgVnL6eQDZFkjjH7AaBakqE
-> ssh-ed25519 bUjjig V8kyKJYS7AEddNQ/A1dDofL72gZhQx8S7CWXXDhO11M -> ssh-ed25519 bUjjig mOfri52IdeSNAawjBR5rhvL2eZNlVOwYK6u1uHv98xw
70GSlCUdlM1C2TtWO34E/AeP6ESA2q/2hiRsG3yKa5M nx0Ko3omL+OVq3JHuCIacYfjn96kb78IgyvECEGq0G4
-> ssh-ed25519 ZIo4kw Q9v6Hj82FPt0vOADqZZvrA1C5zw5Xi54TdkWFQhY1GY -> ssh-ed25519 VQSaNw gEQeKOEwwR8QlykdFlo7iqrsmhemiS02v8Kfx2ER9Xc
/bbWn0eVMOcKMuxhSlHL5YNBAdNGkOEWDtKFbXfl5kI jpAEZx64/AXpA8HahtJq9OdcZYbqIFti5mxaPztvul8
-> ssh-ed25519 9/PCvA umec3ZH6etHJWPhH350dg89jPisIen+g+V1biOk8uQg -> $5-grease (y&6%5f<
nrkdFNMpVaeYmxaXh9f5ZBwxjdPoCbbB0NMIGP6rgJA YSrHrNaXa7b7Ivv1yVP3idg8t4iIdu5NX3hzczFp64bY7Bjp/g7jK+bWnDG26ryd
-> ssh-ed25519 VQSaNw jcBuMSisYemI6teXpAXmIfzmkCnQRUhzR02oIED7mw4 G+fhmUbFuDj8ZtXg6yk
mRPa20AN2KGqp5Sh5rxqMbTLCd6N3eNNNKRzu1TrBN8 --- YmnVS7kPp6h4pC9u28A32/xh67NwhIXwB1dxolI1DCg
-> ;yNT#P-grease bzX .¼Zs‡…n} ®ì,èémõR€ÏêeÞ)¾bOª¶<C2AA>îնܷ†m8¼z£RyúìT/¦@¿CÜÝôW™¨F5ˆ?<ð.[Ö†r¡Ó[°M
MQVFOK4d6Iy4B1TtfEhvVM1nNBec24na1BPH++gbZE1n1dHxyy65O998u1oVml/V
3PBkae5UTR62Hm/2oSTih/TIfGRSzT+MrjxzkRAxsWFaS+wNx3I8J3/kXg
--- cevd2eHQSfWzGNPVrJB3XVoqxblBsDQEKKQn2HtbFBc
¾‡ÃŽÌ¿ì +^FdÎÍ<C38E>†Õ^yGx·í$åF7 <öŽT»¶˜.ƒ0µ ³ºOÇ'“â9ÕŽIxÕ³³ï_ŠóTÎŽ')“†<E2809C>Ý

View file

@ -1,32 +0,0 @@
age-encryption.org/v1
-> ssh-ed25519 jIXfPA BPmZDRfAOk4XKTzCbDP6g5A5rBkiPT3XYNJ7VYi4zDU
hpR40ckBN8fDmn1zJ1gsOIPNAL1nQQSjOykfC8Wmvlo
-> ssh-ed25519 QlRB9Q VR4c0MXH8TqfVl/jt1H+c7N1YZxforsbwfUdbaftwgI
P0ID0YN8g0q80gCNVy8/CesgfyNM8Hgju/YFBNNc7i4
-> ssh-ed25519 r+nK/Q 1LnsAqB3OHqlvvaGxYZFvU8Oa9Xvjrp01sUDjVOO8Bw
Z4N53ptx9ezp5Z0e8wglFN9YsTC2Wx+xcyWphqEN+SQ
-> ssh-rsa krWCLQ
uLQNwGSU9U64PTg0FB+C0NbM50mCsPY7QZTOe6JU45KRB6QaxMPRFTf/XoAmKd6Z
LiwXSODmuufSqBHT10ORDC20VHVY/5jE0OwDbO3PQNMOxSqlbDDrD6HKONESIvwt
+xRK5QvALr9qtOUQIRdIZWR62IfJpeCHsw/GAuyqGDoQiY35QXU3+54RImQXbdul
7EcZDkuPORUN5mLkcwD6Qal3LlsvppvuzbiMoM2Uf+V95l+uye4b60mr3tcuyu50
/j9Kw2bcw8/3mRxvHHIm12VkWJ7RxOKh3ZyqENOovCVAjTFjFg2WNaTQgjQyz6Q2
u/Y04YgwM20W+RfZVwy0fA
-> ssh-ed25519 /vwQcQ VBfJjQvfTB2egyV6ROWec4PHogtHvA/NwDsTIAghEyM
XCJUP4HyX3VTPcJie0UlCckTb6xH6t2UtRnYy8iAiVo
-> ssh-ed25519 0R97PA 4XLCUKQqhwcSNlGPPux5x5SaQJngLXtxnEzhvZnaYFs
i33YipEo+eCmsPXHUSJUSRcVPy0icME7p/IHfsfH3v4
-> ssh-ed25519 JGx7Ng hwjq+ArsRBw5hzQqWjdiAiYcgdKtEnOARCW8bKx5WhU
hKTFWUBIEL1yA90AxvP/zKCzslhX6f+uKBbAiONyKRM
-> ssh-ed25519 bUjjig eN6ZA6ZFTAvw6ybUhpULEliCF3ylYolKoc7Q4qNb9QE
irRbRPuK5DbNedgrl1zdvlsekKbr6uTrYQSZToUnuPs
-> ssh-ed25519 ZIo4kw YC9n67JcDrrXEvCxScfic1XxAp3p+FhMYs5f+gwMDiA
mpQSeWFRedr3N0NVx1mZIfyHvYBSPlvSkX4aS180qO4
-> ssh-ed25519 9/PCvA 9z1Q3HCLVVGoCRs/o95lPay8tpF3AkQCsTFoH6pYPVs
kLQufNXzg5Ilhu+AnXg0q7O//cG99k6XUQFfeV3xBpI
-> ssh-ed25519 VQSaNw P5JHIXN0XRL76iZ2D9h9qIszcJ4iU7Nkl4loTEAk9yg
ggCMz8DLzprbo26Pg1EPmsDVAD9TxNq70N3pve3SdgI
-> 0-grease F:o
uui5Q+g
--- 6FFZScIxri+ww/0vzMlzRMdyiFY+wP7E5b78FK1XTSs
ネXメ -<2D>=餃撈卲$g゚棚S艫ナT@*暈ー瞠<EFBDB0>ニレ4。

View file

@ -1,33 +0,0 @@
age-encryption.org/v1
-> ssh-ed25519 jIXfPA OokbMT7prPJZJjF0p6QIntLClz6D2sMUbe01RUW3BCI
hI25+2VNfhSLlXbJpvlU+Jv2SnFHOONDHU69Fb5X1AA
-> ssh-ed25519 QlRB9Q pvt/09oGgvlSl3KnJ5WjE+Eg/xD0eZNuenoz/e1SBFQ
ijatvoxkfVhiRxBDV4Krns2LKf9fcZgFe1JqmQ6FO0c
-> ssh-ed25519 r+nK/Q 3INSyjdy/Er/v5H9x5lqePbxq9z4O7jKg21J5sTvJxI
Pr5Qtf6v1ubDwB+OcfaUFKnoVAQrdWlf1QVfmXE9XAY
-> ssh-rsa krWCLQ
lEqyOxr41HNiNbuj5Yfrk0bVyfmCCIFaRR8ooHRQt2zr/Xs4DwWuuLjaReigbcTD
hunJFmsGO7A0kcsREIJ4PED6bIfNqau5H5iNYByVS3u/wpiFIrdMpotvcmTrcvjv
VU6Hd8t3EPBUWr0mFYk9pySve1rjtVatt1B9dIVQoWBfSy3NGTIuzINs68Xq2gF1
p/cUNor1kAOWm+tVJca/lthne/iulZF8+WwLOvaVM3OUS5Nkhe7tGAZ4xMoJ99UR
X8S9PSq6k+FTaBIse86/awGqxsG+FMCQ2P0KQRcQ3Jw0gaglhMv1BfeLVkQBqV15
X6/OD9QHft7ZJqp5bA1lbg
-> ssh-ed25519 /vwQcQ I6wGOkDkU4zkhGi9TzQTSpt/lKcXsvMQqQL9R97DbX8
KRdXPF7341KetuDotzj+CbzH3QvYBOUZOsuRs6fpvMs
-> ssh-ed25519 0R97PA fzovQHEruBaBn9nbKv7GpBAZFDYqhUTvhkF9WRqmEAk
1QKpz96s6bymkJJvA4Xiph0/76UM2VEiSEy88sJCzSg
-> ssh-ed25519 JGx7Ng wg04iyuGrkafjDFJR8CNYx65TItIV4O+l34sWirjdEU
x8Cd2YyQbOn53zx/SDRtxtj58S5EV7Pv5cb+2wW2n64
-> ssh-ed25519 bUjjig 8AxapWt5E4GIz4KRFyPN0IcUVPzlnvFoO1vPWoYV5Gs
B26oR1JGchThFOTe+op6cN05mp80wF3FaU360fneGKs
-> ssh-ed25519 ZIo4kw WGuR+yNBVfZ1iJB0LRjCHWyFaxiEGiIqXu++1ZI3mVE
FD3KcCScrbCrNindYkbf26kWMXCtpasHIoe+5Vr8RfM
-> ssh-ed25519 9/PCvA YSp6DaDPkilW1Brvxbjo56fffGL+zfilYjtsQKC7aiY
Y48wFLNgQAgFnKz9mV/1vVRUZ6K3xDgGYsQ/lhCjK04
-> ssh-ed25519 VQSaNw U874flU9cCoV+PECaYS7M9L93kjGej6618YTGfhfnng
T+azIdtKrZll5R66g95lvUsTmO3HI96A8PEJGqi8J7E
-> {X-grease l2'
fnV77WKZsp8DjL9aKhnMBmmbMoqj0c+V4i65+Omn/iCwz8rbsZoURxiiwN8cF157
yCV8MaGVMTBFBvL73h3Sjk7hxLI
--- TNaYRXelk5PNioHcYqgPDiKl89pF8zh2L8hdJagRsLc
­TpOdE¬H¢öšÖèp[&¬‰[€Õ¶VC~|·c5Í þh9

View file

@ -1,32 +1,28 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA 4hjU0on/SxbPxirYIlpFSJBRjmO7S0QLPx4unF6hfUk -> ssh-ed25519 jIXfPA VBCHEBE9YkosDntw4AzwbaFHbELym9LJ+oxQObZBzzk
KwHoWosU33Q9DwOjg/6IlR84EsowxRPH8OE44c5wJAk vAdwHKywgVzWDupA1PmzQUOmlbaIWK1BnFk3geQ4FKM
-> ssh-ed25519 QlRB9Q krNkxhJc6YaWiKFECX6b3vrd3L2P57Mw0/78Wr3TrCk -> ssh-ed25519 QlRB9Q AJ/c/fKpFY3JMC340o2hyseh/j1LY1+Dt+XzIc3MqVQ
UzxrrJcHKUUyBcxnT49T69fUJkwEZlvT9URxg68yMHU LBfTk6L3lZxqScbdczn7JpadvnhgCMJm5ngodRTLhNE
-> ssh-ed25519 r+nK/Q gqDzS83j1Borr8LCP+JlV6GjVyL3aSegvQbpWzbxLTs -> ssh-ed25519 r+nK/Q +4i0mhlT3xpV5YZB67djkWyejam8GkZWfOtktuuCalY
W6t7d8ptDk+BalumIrGpgKIK4a/6PDQjx+px/Ke74T8 AodcJXApJz2IiJlisepnNrZPQfLiGdfczNjFttadatA
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
gGtH4clOsmZ29CpK3zLvr08jXo2PaOWjhtSy/7IsqwPcgIlqfnvC57jkmxLo+R7i jy6jHhW4KzttqdsaB/hF03ROMYygraudW7Pya2OzBRdi2NceNOK4lYBUwHFa4fGj
jnvJW36vj2Z9+zdyh8R8r/bjq+obM3YejNa63CU2VUWfDMXJ6cLbH+4cvApjEHwW ztPP2htJkKXeQlZnnZQFcI1pL26HSJ3wf+aRq3wJqM+QVLzHsJbmWTxnsHyjQQhZ
bU7JpA42rIuBa1yOEfwCBeGZSPejn8SE8IGVde83lidHyDbE5w11tM1uZs7p6g+p 2D36inLoJaXlHeScpivyC+zphXhfwRqNqoMF+vHHErNaejcd9HSjIT5m8+2BKukX
iFAmOkJvMfeL7IySfSgKrbLArvyiJ4kKLKnq8GogbLH9K1NoEJX8AgCWW8sbl53Y QCXHHUktR4m6Rvb8ruPyz/amxFOCUCqJBFtgXJu5YiQ+Ddse536JTT/so2ej+uw5
6atYFVEoBvXpNIUBUIGbIFCxg95K8t4pTLT4NJtBYPSfVajMvgfWxYb0llaP9vcF 91yDAevF7A5mh5FN61CQUth1GG/zI5augw2CZnHnZ+v7Om/k/eLStfoOZNEkK40j
pXlLJXmK9R2mbUXi7q9KEA 9TxqJEwCq/GXm5TT7P0ggA
-> ssh-ed25519 /vwQcQ lSlAg8d/doQev0BY20FIer1HPabfU9S6xiraYkUi1xk -> ssh-ed25519 /vwQcQ RQ7rg384QaVj5MVNicokltcQHq+TAcptHSCcXYttvTQ
X5VeZeE4RBb1BmyCsUeCih+Jza8xEMtXOEorbxc3B1A tOW+gjt+v15v7Wm+6t5KUE5Dyt/rBBOI2/iZTKe2y6E
-> ssh-ed25519 0R97PA kMMyu43xgEhvu2EQradSUio0OBPrlAHbAICkAgwZCE4 -> ssh-ed25519 0R97PA BtTIq2S+RzVdlCiwgfq/EbTvnyMQB4lpvrhGVYYzvBM
5FKRscx1Pwbc2vU3P7PVeBI8H/b5Quu1kBYkBhh7+ZI 7be7fOant5YeXECI03wCHs3fCoffewtiAFccj3gLvkQ
-> ssh-ed25519 JGx7Ng P0S73HUrNcAPJytI06avYJNmzb4hEau1MKZYThIAV0Y -> ssh-ed25519 JGx7Ng vDty3aWPomDC8RxsDtqMDJjov/rmVXq8keag5vbkZ2A
VD5nM4kNkBQ0ZG4tVAHEZIGgkt+CnM4ww0QR/pQIwWc dPcVXs6FWyzB4Hu/kOhU3covn9WX0X3xSvZb2Qs1Dns
-> ssh-ed25519 bUjjig P9MW9urFRjMwFZeRTQgKKLcc8gYPcKTqRYNACheuClw -> ssh-ed25519 bUjjig 07l6L0AumSs+4aPeL5t7xcf/WNPmVpmjYBlJOdNGczY
i4d6i6UZP2hwUa/EKGCU1UFYJZSz6mGjE7o3JvkhpCY sh34ZcXDL1R8NxhHWpOrMhgItWFSLFrLkH1Wu6EuXJU
-> ssh-ed25519 ZIo4kw 3z0osjGyfGZOZfFEG6T+oEi29zzOKVPhnwiPvzW020w -> ssh-ed25519 VQSaNw 4e9ahu+KLQmjpQ5iPtpCN1GnYfq8VgxfYUiFJvNe9W0
9Wb+jrkd51SQeKN3O8OUCAdUQUldAGFe65m11/mnal0 eRcbLfNLoFcQhKj1AEfsNKhV+cNz9sCH5iEON2eSWLg
-> ssh-ed25519 9/PCvA qPVRQCMWfsiuBSP0uvatMcLKob51pau5r/DwZGzq1TQ -> :-grease |_6] 8 ik7' Ih'Sm1z(
D9K6jGpeEJWUOzoA4UUN8AHMw5V04DeCwWfMV5QNWr4 BL/IA5FVNaAa+cgAj5DAI4GjPvAI2J4E/yqfSx1Sifal3QdClazL86cmhKg
-> ssh-ed25519 VQSaNw t8xP6xwwZ4a0JHQEB9GwpVGUZ8v2FLBmhK/61wLGm1E --- xvetQPUwoScpbK37DKgs4Z4C1D2nwW4ArN3kvLG+h1s
3PZztuUXXj2rIwHGsuXUE4MB312n8346/ItQRpZDfxk ãKè¹Õ4ùÞFdãòŸºÌG`%iWZw:GÙ/ÙYÇžPXkÿàâr+ ‰ÿázï¬zr=ƒtÑå04Y^J {
-> XH-grease b# H& k
MkWCQvMT9aQ
--- nV69zhB/4Jdx1PcW/pQwquuKqhV+AV5+fwo31uyLigE
ムR~晋・ ソ;<cニマ薈dq@)ミ<>гjォy:<3A>=<ホSaCユr銚+Qd+キ;dト豊svヌ,L、Enィ゚ヒD・(ゥニo-

View file

@ -1,32 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA kLeGA1GrLQz8oC2ughSKkAZlSOE5FB5EaHCkWg3FtD8 -> ssh-ed25519 jIXfPA sm/tSFwOmGkQpURqhy9wfXdREiyrlzbAdqIjYWwEW0A
+DynFsHlO+mQqye5NhBBLghGN4NSvChMaYXecMFSB9w flk7NB7VQpTuBAc57Vt5gqF9ZT6y9EguRYyvbrLjCis
-> ssh-ed25519 QlRB9Q yy7I6++wiMC9xDBxyRqKyigrVfEZWuDtTklbjlum+j0 -> ssh-ed25519 QlRB9Q mJByrZUZ0XXzP9MAYy8BYjmn7ryXIOnh4MPjovuql3w
8pI0hrygKrYtvyEvE/m/VYgutJZ6mMKjFks6JkeIfYM F4hd1PJc9un5Fy1s2B4LJRKHYif3ijGCpbNjAT2ZQ7A
-> ssh-ed25519 r+nK/Q xDOAAqSWFSvcaNqJeXz0S5O9G55GJcom6IjZiuuFdXs -> ssh-ed25519 r+nK/Q FUNJ5xSccM/p87zWZkPgV9/EtbxvXMUXxrhFB3tgSCs
Xbseehe8YvEWrtXw303pCLoxOJyj+ej1A7/XuRexU0g WpQUc4gGWYCQqzlINHJngZQfzm9SbZix15Shg9PvEzk
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
netYNZja5O0asbYGRQpTUfPSvo/g53Q2IGLU5Fx8b8fxEiIA3AQwaZg1wzgzfSfU aXm5L4n3CyT29X03h7FIJm2HgWO566FvmiHu4FK1v/MDk+Zc54Z6MKUwZ9R79/gA
SpSLydASjukWl4tGuQYQpVXMCXlAPTREnsl3iGf8JZGBRyc4GuVx0cCXV3LSmH9i 0qtfaWyJPIR/PBPNNSs+ohCuWjq9rcwXK1VG4hryGmPBYn/tJ72esH2IOcfKi+qx
He1/Y7fKaOpfoYQkWsjMDpYufiEZTtBSiRYTtdE1XySqyQtsdd/gkStk5AJui6v1 15NM1QG/zAAVk81z4YgEK+tM0EFPb+rhFwCYP/6LHGm9Q3DR00GnvogQ4xtqib0c
DhILi4FFKzXiikO8ul1/zmLSFyg8swz0VJ9vSFAK+nP+R4SasXc0NdJLyw6Vn7xF v4MObUycsLwT13EfyQ+BUEUYtnvR7uiqLeR6cK8zuv6oZuGkNymMNxM4VfekRiqt
+DR7gzHG3WUP+9c4LWY8pbfLvcwe5/caFtzXONU0jV7itOMpEnyDmcjfUAT1SJ3O FLW9I0uksyUQ3wHCgy4HaNvOyyMbZGu94bPKswQSpw4b9p17sr2IbisMqt1ATUtC
ZaxS0JpWYEacqj/kNyPoEg lGD/IfxG4RQekRlb4zbUlQ
-> ssh-ed25519 /vwQcQ lv1c6xd9Lj07MsJ9ErRGma/WENDa3DKFU0BPfRMtzA0 -> ssh-ed25519 /vwQcQ nST2EGjIu9dZBkZtAVuwDlaE6PVminESMe8Yl3KpaRQ
VFonRj0kvHwr9+2FnI9LK0Z80HoVPLb1fv2piPhcMC0 GCaGkuXws9IKVzyBRKdY/AYQbjnHjFLoBkTZ0OYG8tA
-> ssh-ed25519 0R97PA 0xVsflR1l7Tr+RxHYJDjV03cBtkN5HEPXWYCce2DMyE -> ssh-ed25519 0R97PA wPo6NKiibzu/JtTsb0UuYzcLSNZwSX5HxuqaVZq+YRo
F6p4PO4TbGzkO4dB9UOpkpS9wLAXMM3ev0kQc/ZvkoY WBDggGViZZE7SdCdhSNPnt+Br4SuwzYH2e4MOxC8JPw
-> ssh-ed25519 JGx7Ng dRXolBjmNvpmqhhdck1a+pHET1md/YnDLGsOgaaWLnQ -> ssh-ed25519 JGx7Ng XElqI8fmr/W4l0EBfJz9ocs9A7rqdC9goHfJcn2mByM
VS9uaxn/wH8jxduz5z4BmpsxngG6HydxPVUMLugC5Co VUczeT0WgKJ8bj/PSJgYky33K5fNNtVRoRzas+GGfHw
-> ssh-ed25519 bUjjig jYoJtlMUe11fZbly2pM9EPmyeN+xdCaG3TDBGn69rBY -> ssh-ed25519 bUjjig 3XJ81o40O3UzmBn/ID1FJ+iF4GoJDgtrVNHKyYwNNSs
sFAEnPFVdt+qwi0qb4S047UqMk1CWwU/EKbEbE5cm9k T97H8FT7G5SB/aQfojLt/j6i8sCVJkbpL8Nd1f4V7ks
-> ssh-ed25519 ZIo4kw KPlH0SlnaO3ogLRvDqX2eWYw2BvoyloO3IO/3G5MGy8 -> ssh-ed25519 VQSaNw go/NCCzU0IzLgH0xEJP8SNeJ3i8C7PImiaSdY2KsyQg
CMjejAw9296aBlesgbem0fo954acGE+gZPVh33WS6XE W6FaBHUNkwqj8xKUOtBfUfUgVliD1NZmG+bAOWwv+bY
-> ssh-ed25519 9/PCvA /35Q4xJQiTQn4zDBdqvNOsM40y2kYHuTNRU0P09Yeks -> _-grease 1X_* 'y
bLGA6lQxuMYN2onRsbfS4tWBXLAVFIHvZ+S4D+V94NE qYXfi/2Gr/JQ4B05upJ4KSBwGKEg7xxnG82JR51QtzWwT4zX9r0MgLand/y/DEUF
-> ssh-ed25519 VQSaNw WaVOWg3OPNFjkXxGWfkjPn5lJmbpRDLskeU/HgL/4zQ jdyrCSlbbL/DFFCGXcv+C0BStLqnrUlUK03s8bU
K8Mhr65Z3loFyO2NTRQYwFkTyOvNG1Usf7POx7UBcQg --- ghr3+3NT3IvaUcDErgYNgaNqJTW7vTb39QcTuXZvjSI
-> H2k-grease 7n+C e'fuzViT #w /yñ%¦Ùx9µy¾»drÏÑ3©}ˆeNÛÒÞHlÇä´<C3A4>š-ãºú¸ŸIÀÙý¶^Ÿg†úÆ—Ç
bUaQJ25Xi9g
--- cwW+MFPovm31sU8S3DqMm0NzulVqOoOZIC4NhZgXBdw
2Õ,.súr¸§¡Øhµ³š È´úÁ[* 8òyIzK`¢Çi7Y·A«ýÕ0ÝÈ:H,

View file

@ -1,33 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA Mj+RSpweX+puapfgXwuaUu7BrEG0pJj+Xiadmgf/KEI -> ssh-ed25519 jIXfPA Ya0ezvnwZBJMO6K3WhawZnbNG4P2CYejb1WtpPhXvwY
SVMs6gtNgL7PzB+C31EhrRWhPYWx6o/zJKud7NtVpQA NuGAvK7fLUR9IhiWI6KTph0uhtvgNe5BWWFHDOT9XBs
-> ssh-ed25519 QlRB9Q a8TA5GfNMxx0SffG51n+Zr+huoXvm+rfDZiPG0cBazs -> ssh-ed25519 QlRB9Q kNcid7FBFyrYMsoEAVHcmo9KYKkhpM6U1+DX3bqutFQ
lRct7Cr0cfq98WzV/TmtFCfKjHTFYlYCRWsIBwWgQvk WMg/YJ4bkkztenjYWODhO+vkcKGaSYnI7TsZ9lkuYkk
-> ssh-ed25519 r+nK/Q kFeJYAAzpIvp2HQNuZym2U6BC5oh9CfYoUcnu0dViiQ -> ssh-ed25519 r+nK/Q qbnmIjKpxW/M35IS+kQBpiPsJpxdAacWr1oUKKHAXlE
T0Y6C+/xNj1/NRDrgyPho+JF2SdlA4BpJXoxobtV9IQ xGdpIOy7LfTSJ+5ZZPCS7I3n6onHca7w4tDnIKYIMNU
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
GSgK4NUuQ4rZgfYdVOtLydkgWspFtceILqTTWHGVDLxT5es+Iid4ccO06mBWi9p7 0rYhCERlMqhTgQeB+9sb/MhAYL0Y7EI8tAcEvGqfHNzNxTcMCyP19zhBKRzTeEss
LUJYEeFhKExMS+oFa/AG3eCpsqsw4Bq62joN98R7KCHWm3fbL/H2sfmB6f1HHyIj gtkeYZ75DtxzzNtgHve0dyfNHuA8/jiOVd02hcqjUbuxBM7DF1hlYWWycc8ZPcNa
BUoPxeJs6NDO6KwqJS7FnUzYq5dm+uOW7KdkhLpr4kjaSG2QlCpL0GtMPoy9wO8S odR5GdfdfoB8DmWz43zeVHK123/KfBKS1wvhoFuQWdfqBS0t541ywyCeCJ3frrx/
4NVZFO8oS7hHYx8eBInSj5hNv18s2f/MW+yR9VYOnvME81qhAWWK0R6GG5R4pGgw ZszFYBW81ABKcIvNoh41EHz6izCpiFiG3jAbgC94v4nQZEKb7Z4ReiZc2/1BbDNO
RbNeMXpn25LZMlF1YQNGVG6H8qwHw+9pqJfsnSeiYou3j6Mn79BobpGo41wqC/61 HzDepXvX0AHmbNJovjHe73AfmSaCM8ZkXoftOHri3bKKbI6i7SGWQsYRKTki5nuX
WJwuloeUC5m0CLburddxOA PO5OdT8CcxD5BR+jRw1A1g
-> ssh-ed25519 /vwQcQ d6l740FopulLX0/HlPqhy+qpEZUbJ1zKmXfWq0wr/m0 -> ssh-ed25519 /vwQcQ EZ3gzL6oDYEwvvd1IIgRlXZjSqndHHN1NDy+OKJ2hls
7AaAghPmeCpKhzXtTL3WygI28xNfevpusy31KRT5g6w FJtGY9jPWh1mIVbHcE7pT7iKHBxFPj3nZWayONkMyGQ
-> ssh-ed25519 0R97PA TWlkPlYgaFQm8yDwv/Jot/VVJerPdA/ZkF7m4vsB4ng -> ssh-ed25519 0R97PA VrmvX63CtSSMr0REOz2KsEob18GlGzy+c8Fhzqce5mI
FWaGESJf+1l2bhIOyJ3UiSE3W/olLpsMgQ4Xph7Gy+o aaVG2dPvP1j4Ovy0KajAMOL4+POOkFckOUKK/JhDFAU
-> ssh-ed25519 JGx7Ng 6wBbc7hTwvvWu7pJ+cKx8dTvUjRgBt30h1GU+ctVSTo -> ssh-ed25519 JGx7Ng 33tYHZbrAewMIIGH2P+MNc5XgFBTqDUu02YCQDbHT1Y
Mz8VxcpxZr0lbk7P0sA76CY6OhQuCHlOXn7ZMeYA6j4 5TUDTw4qTC+sL9t/WIGIAZvW2cFLnq3CGrT3rjS+aII
-> ssh-ed25519 bUjjig qnkM/4TCTmP7XBpfS17I5mKq62eIdROnOle920ClmDc -> ssh-ed25519 bUjjig 7gzyEL8mZX0lblumEu3WDJ293m7T5Fl0f117qBFIwmY
LxrWclVdyAh+iHrJGvviyZiboZDuq9Sy1eDjJDqXO4w qgppZdyZQpCU51///+sbsIEscG8RIHWEOvxYB6xf3C4
-> ssh-ed25519 ZIo4kw sn8wK7TX1viq7lqVkCtyV/BRaLnfFH/PNYZyJIYsSkU -> ssh-ed25519 VQSaNw sSsmV8dovqEWBcJ9zhRj4PbGTy3u6C3UFBIxXoALolA
gLqKABolumlpG4kX0j+DXqE6ItqXb0USFwCeofxPg9I wdXzdDiOet65BeWO9b5XoV5HDKW9HJrImXxoIOUVlpY
-> ssh-ed25519 9/PCvA 5oHC6vK6B0i7xOE/X3K67QkEvJNb/ANIOrTsD4nJo20 -> 1-grease ){ *) $*f
vn+DfR3JEuT4/iwJoYgO5U6skJTjPSqNhMDgR8XO2JI 47XqkHGvz6t7tlrZf2Eg8X3Dep1UypCHdf5j+t3wlv7CQEiJ6WY8H7fmbdrCmX/a
-> ssh-ed25519 VQSaNw AOGX4yvO4+goAjFeS4vrUtBvKcIoYqZtAinPEQL5uic 6hUldJj/WjY
aanxEX57O66Bl6hCeiUtSuRPiECeO1+RB3Gtiy4mLwo --- nwZIzSDPV8Hne6CHgkwic5kcQdNhilGsJwqBv+axmDc
-> jb1$-grease :|V57:Gk LbZ` É™x ÚSúÅn<C385>Œ>q¢õ<C2A2>ð”~·vë=­÷Œ¬ÔËF¾9=‡ê [Å Lº3Ó"³ÚÓ£úÓ C¸XªÉ¢Ì_æNäoÛnz˜Ÿ™²Â¸Z*Œ
WDd2sM9ngrVkA6IV1XlsFVIM1nJup9Po/5FmNtO0OgAfrRUAiUBmY8cgMpl6V8o/
mRKo7HprZ+kloHVuJO+XqgLnGMuJb1GPEt/Z6PV2AedrWwF8Qw
--- kfO6xPGkAx+2canLeho9W6j7Wim/BhboAHQVPeEuDbg
ßµdâ—>dvC¢ßGzqo*<2A>B .·éÖÌÍ£oÔö._.Ûq<65>u?ŒªbÍ4<·ªÄ®ú¦õ.E˜ªã×N.=Fuóä´Wf$¦>ø*

View file

@ -1,32 +0,0 @@
age-encryption.org/v1
-> ssh-ed25519 jIXfPA DOvwE74iP3OrmsTCdOtRzX5wzulOrKWO27V/Js2gQWk
lelv6pqnAIMMA/q6T0M5DJjw8GduaVZSFVxafb3KRwE
-> ssh-ed25519 QlRB9Q JaubhHgX/Td97DNgU2VjjKdHExtVg7uiBcIp7vtcBWM
nLpFsH+Wct+fOuAiJzmb3vxg2mGNo+KP598LD7q+E0Y
-> ssh-ed25519 r+nK/Q /eiCAg3tmw91BtrWaYw5GQ0yUgctzv7umLw5oyu+XXc
6qH2S2w0KXh4e3VfYw1dDbsk2qHdxxFlYGxKQuqZZUM
-> ssh-rsa krWCLQ
KEpmxnfHmqfeB+1g6YAY3Dh49Vi0fb/St3/nm9MBC1iXXg2Z0AZwxT1mOewZEPzl
JeQBxxtgLltU3MpkGHmOZfSbQ5fANIleRqjWX4khHtquXjYoUEgCzBbhBz4rgaRF
aSbsu3PNEUTEJykE7eZZOc2R4K2xJoPTCvc0qXBJYNqhjg3aAZ1y+mSspf9JUQeK
NwdLXZRNbUQ2HPYwbkXbR2/ET5YuNF9RqIrCQt1k8n0xImb0I2mTZU4ZIJMCXYDo
38S80bY7h/mrrb8wIqXE/yqbCrANkRZLzPDTDYtoI64XqjjkkeCaQGRt/pRJHbDW
4EXtcaLMnhLwGAvMBjzEkw
-> ssh-ed25519 /vwQcQ WoWf+dh9BQUdhgJMCgCFHMY8I6PcaSjUbDTMO8Bpnzg
FvBY2MZC/1aurbcs6ktYHY6pG3cAbJL4d8nylNKUqGQ
-> ssh-ed25519 0R97PA GliGVV1/sGa033xlhcDJZGLF3xHmPrvYKhZQg0w4Qjw
Gn61VstI2qAIDpYbolHfHBIw3cWr0JvRyVU8JnEYlE4
-> ssh-ed25519 JGx7Ng dskA9zgaLaMbBrRXZg8hT2XpH26iwQbmtZKZVrASgkU
zrkfE+ibw9TXgHf+3ZBZpIInwFD+bzen6RIf0yNVY+M
-> ssh-ed25519 bUjjig 1kjn2m1NxrKCOuElJNHMWkcqPHgLGrdyFNq7k/OrLGU
JNn72hRd39El37S4WgmEjNzI6W0R6KHnaamVbyThI1o
-> ssh-ed25519 ZIo4kw F5vezjoWzQWToYf36Mq/diaNMTKorKIQg0UeROL2vi0
UlgFh2h9bCrF5g2s9EuV2KZLUB1MSjWuJJ6mM3Xo+FI
-> ssh-ed25519 9/PCvA JauUBQSUBf7AFWnY5LyuFOdyHfzBCBMR/aqnXEw/hnM
bvBbFLDFiYE0Fk+Zh5rX+S8MD61roomfiS2LBhzJjSk
-> ssh-ed25519 VQSaNw QnQbe+gkAk3pqQvR2YPqrdgbfSfPbMmcv+0HfABT4kA
hAaebd4sdK/VPVpIRoQEG4XnMGyQlxjDoFF+7sb46dI
-> 5_@^MRlh-grease 5
50UfFPahorsv5B8WxLN4tQOZAPOrHYAJYYLsBwrKWHTCsouct/zu/ppMKIJyog
--- gaRQJkyCTtCiG7rklroVvdPbx092c9rGUxAqktWQ8l0
{ðP“=­ ÂÈé㠆ϣ ôhç̹JéÕ|Bp¨”ˆò Ø6<12>öŸ Ô¾Iâƒ}‰ú:ß¹,Ð.hxõÛl

View file

@ -1,32 +0,0 @@
age-encryption.org/v1
-> ssh-ed25519 jIXfPA N1vsOzYsWwqsv2IeSCfqnpdIqur3+6o8oe+YbYmmNDM
LQqUD8faNqEg21ZBYLQ2xwmfBNDk9q43lpN3Q8VWMzg
-> ssh-ed25519 QlRB9Q O0W5sqIViqPEL7kby6l9Aj6V1N1jSKgU5+9iW4B5Ol0
/mDHkjw93UFUFJAEEzICGeHwd9sanvMcUXU4xoKkPIs
-> ssh-ed25519 r+nK/Q U3Pny6Va0B8QQ6hTPN0l3tPoO/qFmAVC4/2d/x/pmGw
dpENAFOFEC+1FJHXBhc7HxPjev2KqKT8X8ayFfhLwgM
-> ssh-rsa krWCLQ
DBVzHje7MNBK65yLN4S9Z3G1vK4GhwZBQNqyzyNs7bGlWVIy3ZQACkT7rTmnrCCM
uNrO6lRso+sau91e16lPkYxG5XkKfJ8APuXpVTv0d+AS5hHluYyAzY9XaA9Ie6jJ
Q8A2IWCUF9Loj7KShu5BNWTnchgG1sIZwaOGG4tr3xn42Pvl1A4fmyIxjx+xGiiy
d1gaaFPpk2TE6owNLZAGyOX33/Ppc+mnUcJwDqM/5O5zv7UQ2K0XSk5uvUHmVcQx
pIsIhIOXUtQLr+/E6nNDhBGYtdlhmuNIiAdVWPlBUaowE/tpffkKRReM59G9y48U
8z1VNrMRXhRqd7oZnRnFqQ
-> ssh-ed25519 /vwQcQ ED5ahBRsHSt2683QUYn/SJ02hPRrbv13IMAsVJ1oyHs
H7wDLtnHXcyGOiLTMxNWNhWDikCwvCMHXa1kDbuW66k
-> ssh-ed25519 0R97PA xrqvY9+rjo6txooIwUERpGSnfYA93xSDByyxZK9AN0A
fnfq2fCbO5W9ig7jMB4f24WZoyGo9h0Q2sKGhkqB2XA
-> ssh-ed25519 JGx7Ng T831q2KWSxBKmkFkXzs7Dpr0+1M8Xi1lToOa3T7/MwE
2cg2MBO+1lZ8fiwf8PGnS4iYK3RD6wzd1rrseLNYp68
-> ssh-ed25519 bUjjig ZOHRk2Belx0dg9T0UsOXsfGa0HTKzy3tLuvKv1NfZW8
A6ccwGepjkpAqe8A+1Z9QjlOhGS+pRG3hP/OSE0+iNs
-> ssh-ed25519 ZIo4kw Pq8ZGC2qkN2mzhQgyfM2x4jslpQc234UINtXUiMGwwE
L+zFnX+PrUsvBIluuLdd2wWmSD432mB3+jHjkZsnmq0
-> ssh-ed25519 9/PCvA rDyI/wr6y1C/Ndi5FJQN8tvUjT3dQSRYllV6gnQX3GA
R0YNT6e8KKVTCbv0I417S+dVhRf7DdsRzGaciuZkvio
-> ssh-ed25519 VQSaNw uNLUKcGfx5vZA5Ds6EMHRa72JMe2UlCvAcl1sd6u2G0
PhYZWAXLrwdUhpP+buJj2+MVOdMIr5wgAX56VXtdL2Q
-> B-grease 5AlSmu%' B1 <W
oM47+2XCp0HX25MMJr28IzxyzHlRW6qqqffgL1KdlIV8CVvQ
--- R5FloNTR5d54U8LYdaPQGzvntJ+wHdSCJlX+Jcp+D6I
±²œŒ˜óuäsò<€aÍDvžu«ÂÔÛñRÖ$ä^þ–+÷hc

View file

@ -1,33 +1,30 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA F2yLcxiPRV/Zcvrb+BPb9jPv/aPh8COXxPhxo9TE1jU -> ssh-ed25519 jIXfPA tuq63SvMOBnLOZNkIA5RenFt0DTg6bwCX4zJ8ISYRxc
qjzaCR/MWWGXp8nNdli4L2dNIA9eBlcnJu/FlgTdhG0 B1K+kEO/JC0t2EL+2od+UiVNlzBbpRg29lsp2L1DhHw
-> ssh-ed25519 QlRB9Q PxeXnGimZ+uJQ8mx8wxbjaTFT7Lg+SQiwhJuosetMzw -> ssh-ed25519 QlRB9Q r3M3DQi3xJiP+3nTpwm+2PQipnAaRyaWSH+mb0es6kE
cFJVu7TAYmxu6XYPFKY7EMLpGtHIKCjAqKzgLEyLQmE codqvk7AgptYBRyz2BFVH0FcQ7ebZGGdJ6PJmoWWXTk
-> ssh-ed25519 r+nK/Q 3+GlYdbxFFAETjEYpOBws7H7PbapurOvKSN7xqnPkh0 -> ssh-ed25519 r+nK/Q Ah4Oim/N0Tdkz1KPbQiHJQaqx614/jjlMqCxtYqjBy0
+NjlS22iOmYfEfnrsxT+gWDnn+8yHY63ZvvdK/TJOrg aTrlmm3TbWN6pyDEHf9uGy9H9CyyChXGKL0RZr7U3W4
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
kZ+QyO1l0GdBS0xSXrPlwyGgoQbWm5NWJQVPB2lhB90EPySItGVUtk7x+NYo/J08 ZbbBqvj7L2XFfJBCQrn799m7FQDrFDg96Moev+Uab/U5caQoJIljMldkfD7VphEt
iOKQpkRjC6mqowGaACR1+rg1CXxjEHU1I4S0AKBSjKky0eAX8QdO1WONxwhl7n7U 56dyeJ7IdKdnwyt07213ua2gZ8Cmjyffi4b0mYhHkvRI5aSmfUtfiomXU0HkgZvK
N3u/rWnoct1CZH2Nf7Lbctu8YIns1qbKeDSWix6Wtrhf/pqj3uCtpeyT7OsihLuI rk4+AVQYXTLZKlGaq5KkTt4i0ltwzjA9ECNirciqi5JmORkUD1T41xBKCSb+7N5b
ZF6r6NEIaytt+f1Q5AD2Yzqzjoca+YyWvJ+hr49xuOmI+GfnUBG4h/UMUG3e4z4N 34Z/uka+oacxt7q27GnSonyFQIm7/owS4bTWV7vxoWLoOYTJcg4Oki/Op4gE9GkK
V0qqHFe1MdGlOXuKDgFEIv/xygivSvzsPYNmY8h14WMoB9/el0F/gfHQNbvwHJ9p 1y4RDpdVsHcRZbi7ewB9UKbvMzH44TN5VJARUf0mFQ/OHUo5IJcm/glS898fSLu/
Ulx7gg2S1kL0HNUTiJmObw mrjVT6XGAmPELB8uaVhSkg
-> ssh-ed25519 /vwQcQ dWptyg0Ye4/0glS16k05kPPCapVHoC6PmzR6jeps0QM -> ssh-ed25519 /vwQcQ 2mD6dstuZmOkYlBajNevQkeCYAGWshp0h0F1TzdcJSY
hU9XFJfxIPdfn9UVuFfuXIqM+pEoS4ffEKfWXjHQu14 pzjxW+RZDSqPAHm+c5cMJZOdIfkwTmSLw2BktGh/kHk
-> ssh-ed25519 0R97PA s5Ezbm8HvX6Tt/AmoMmTDikVS2dbAjPqMyrzdiiTZxM -> ssh-ed25519 0R97PA /vOiTSDwQVYTX+tFuJD0M8Enk+4b0ViZUnrZ/WhUKiI
xv7Tm2zl/uNTbM3v+m0LQQ0i58DXlSLjHGaVZ0jpweU 83r35uyZ/XELwTXZXzlU1yq+xzsNTUYNwK9aGGlOSAA
-> ssh-ed25519 JGx7Ng 1pNyUUXwSrJQntvYkVW2sRrF5pDr2vRILVkoDHFjHik -> ssh-ed25519 JGx7Ng V6Xnn5q1hSvWHjiWtWJAD7as5N2fdtWNKWi3JwhfYgQ
4IVatk+3s0/CVIJ7LY9aXL2KJleZfgNkl/GjYy7dIsM aL3fX67spVrgguVtNNrfJ20fy3LRaDgMZldw5D1fKuE
-> ssh-ed25519 bUjjig +7PIzrm/jY+E4HNUzMjIgiE4FHDBv6nk8eAZMWQIo2c -> ssh-ed25519 bUjjig RdTpxQYpmEtG2Cn1EACf85/ZynfPbZhGfoSF+sfw1AA
czp+K5WI02gwJxaYEt35PeJjotQSaEgU9lACDP2Vpbs YovrKYRtwRPco3luRBVA0IA1qAq1jKxoS1UdoouhLGE
-> ssh-ed25519 ZIo4kw 9gwIlnLlz4OY9g4luxUyyyraGhnPdbM48sbr6wuwlB8 -> ssh-ed25519 VQSaNw F4hYo2UaLzV8leVHx/oY9aIcZkZ9Fap5HiuTvZy+Hko
iBy0YahwFT0vmtgKkqcefPeSlqsadbBdbEYxlkf2vwg Qwf9JDKqLXmIzId7gAtG5ERirfwZlQWCV6YiKgbexS4
-> ssh-ed25519 9/PCvA W12k1RPHDQ1zeb9wizqpMWRZSPasgYrz8vtj8MKp/gk -> v>[->`-grease O {|u& 2o9 {w&!Ev
5Zc6Dv5zMyVJElOg24HHV6V9Akh5kqVnXMEX+IjCXDU jZPBNd6e20KQYli80kXK9D+qfmIVbOw9Y0aKXB3uvyNJPWDOoYTbzanjeXLuJdN+
-> ssh-ed25519 VQSaNw SM2x7ZYYZNPlAh/S0lSAjE3IxkB7pW4x9T1gG0vEUVw pB/fgMX7znIg+VP87n2qMR5jFVj/x4g4vNgKTUtglw
c213+J+1MSZ6BhfVEJ6byDnmp5sKiES9IAztwr0iklM --- j4kt4DFy3r3y6IMvNakNkmlkeb6iHYI5xAK8CZtbPD4
-> DAAZlx-grease h<2eB& -1f =2 HOG=-\ EWS¦|p^/<2F> Ž?<7F>Np%åeFU/>Ží¸0bccývr(ˆ‰Œº
8u0unS6HmifDJwOyG9rSF0a+b2pWzS4CeMpTHUDta0g5CaYgsieEgJUeu7hYylNm “.èýVŸdgðáADZ3"® ‡Ù(½\5Ó§q<
znqrgJwnSK90Vu46/H+HMEgHwch1uQ
--- 6sVHaqhrf5bqLXtxsoBPr2DkLpKThpQ8RS6fCpsXj0E
#Ä]\<5C>â‰<1F>r˜]Õ"\èâÓŸ$"Ï. ‡Œw?c}¤ A,¹ú£²5vOEÄ$a&­T!^RtYLð—r¨­âg—`eí

View file

@ -1,32 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA MalSvW8Rf+B1R6BeJyhFjOTg3Jf8qIJGfzCX3Ixg7hQ -> ssh-ed25519 jIXfPA iJSzsbA8RiEhUIyhlKWCASQKoSQstjK4drMYl+PsChw
qD2S/IjS3QIc9HWLn0S/S1RwJOBuRiJQXC0b8UV8TrA 8THrknrBu0WGFEb4xTZiJxEY26q7sW83rwViDjyTE24
-> ssh-ed25519 QlRB9Q 9Bp5jDt8gLP59UH9kbM+h92iWeQAt3zazFfmLFIFc3Y -> ssh-ed25519 QlRB9Q e7PRE212Ggt8nO6Bb+BabO85FOARsJGs9cPJmZNI9kg
iDbCd+T4rDMKugKzBj4H6atB2BW4AiY3r0/buleJNKo ubKIBxI1ZBXttA7TWj401siKNT1HyB+N2MsZ+ldkgb8
-> ssh-ed25519 r+nK/Q 84V4RkvqJsdGbjt1n3qMsCwSDfQSw+kn9XMFgcEnmTU -> ssh-ed25519 r+nK/Q EWV24Emm9hENa+yUAuQpkuJ0uJ0zIv+vRIbWpM4Wtg4
hemc6TuwlJftBmdJZfBYjzklac3nf9Hz9kVhTP7gSKE J59wnHRytgNqpX4+5HaJ9KZ5GvhckgtRK6TzfX7Ci8Y
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
sF5eSqFt831fEF9C/orPPNIlUivKn2M7PdYEBvTK2TUjdm+MCbEcKcP5nvFZo791 AvmrzShR+XTpUpKaScoqvgFQ40PTSqh8p383p98xjG5LIz5kqJoWBnxJK7JabBpq
tc1BPul9V2MYBrtioOII5wQX1LhZirEMAWanknJezTKxMZ4CzI1mn72TETH9Td+a JkqVeq5XdH5RX4weobieG4KYUV8EDheLfOMXH5BrPgeJO4yhJ1rzH+oHBw4TwvFM
so/JqUsdbjfjIlUlffNrgCZEycu2s6Do5LA7GC7vf3SEFUVM/93cujz9Ei6/rAKr UvEZEAVgi3G1/suPfJAkO7QRkZjE7fRppEo5RAI0gMlM43YyJavrfqVIqB40Uugk
rtW6wHbs+k4HKSD6sU9RHyTYKxIW6Hammy4XVDO23/HtmN/a0LEe3OwUgFXsjBay h0b0ybChUbKpXlZjqhYAAMN45jTAvW1emO0DMeIk6dbmnbZNdibul8f+NNdWKbI1
tQu8pPeLKsBCMAw+jCYQ2Ms+d5MXT6FfcsWf35rsCwiEwqzhe+J88ECiSL0BF/Gb 9NN5iH2IzuqTdc6gkE4912hdDeUJ4NZ6x/Fxp1/u3d1z/Yg7daUQUXUIoDX0Hyvb
hyJrWFaaHPugqwSREv8bjQ +01dH0D/7kzRhEdNLO2NXA
-> ssh-ed25519 /vwQcQ qByuoq9zsn0tfcWzAlO2GKqCH4UfeaUloOAxIGYvABQ -> ssh-ed25519 /vwQcQ GAsAj2i65KDQeFhe69YR2ycdGskop1wu3Lzrxp59sTg
pY+N5rw/tmFNhJsfHaPY332wJ33tKREbip0CoTBqTT8 wCSUqEtWv0i6sNg1RVtHI/jZh3VeNX3qtnbagXoNGT4
-> ssh-ed25519 0R97PA 5fvujKG6IoKXlhRZGN2XcuN0BopvZyNyCnvJvF56iBc -> ssh-ed25519 0R97PA mFZ3q/3jd1guXl8bhRWyYjgsgE4JErJEels6vdmpfCs
2gGNHuDK3sveihZ8RBg16bnaZsPtA41Sg12UDpecSwg 7oIAT0MTsaKxbf26PSDBk7KqfyFgcBq09FGJ9v/rXqE
-> ssh-ed25519 JGx7Ng d0sn0he1kbivcUImnwrGpRnIOfTnbJiTIRKMINV1/CQ -> ssh-ed25519 JGx7Ng tpslfMWMJMUH46EGycbLiXotVdXlP4xmK0slb7XKYS8
hsMMKBFKNMLJb+vH3o0WQcX5lRmuHziRXd6dxCJGsMA wLLfX4jX4mIxzI8zr2GBlpBcPztTrHqKngi/ON0TExg
-> ssh-ed25519 bUjjig hhEbxz4nar2tCF9/kNlpxI9ONR1IQ4VD9yHoryuxfH4 -> ssh-ed25519 bUjjig zLoniLfwKGH9Ctu34103WHBvjIyImtPyKx8O+5UMLUU
UnEDFZnge5U1ZUR0U1C8OI2xzUYiiloLG5XsITc6is0 sYsterVGvCg6JWA0z3AO5sSlj9DBfj8u5o5jH9K2xeA
-> ssh-ed25519 ZIo4kw +ZqTM7fJr4a3DZr07ZvfZzFf/7b+f4dlYzBxx3Rl0hQ -> ssh-ed25519 VQSaNw oHzU9Lc/7p+MZAjVylzC63h586vOcffXkkpAi4XB8Q0
cS/FV6ZahQn6kro/UPpuvolvBL5H5RuBWO7XnK9XHPg 7T8CREpaCxM58KMYW28FY2i+ELjrx3eC3K7xaBy7O6A
-> ssh-ed25519 9/PCvA cJBd7PxCMTilzWSf/RuNeRa3vfMcIuTp5dQULJfrO24 -> (_o61>U-grease .P>ZRrj~ -=7S;N
OXL9Y6nvopL4LlXvSZnHY9O00iU8dqRPIIdYqYreFCY 6vnQVKKZwp4JowIwVb4klrhaR6NZjwlZYnngVQ0wqVenMZPj9oyhIXthLRqE1Q6/
-> ssh-ed25519 VQSaNw GEQDTjuE+hOu+DNzZsKq8R/sJs77N6NRq/2vfcZmJjI k+sGxA
Rz6bW6UE4Wwh1v765YVBltRVf5/zo6sJKquqEjCx/cg --- +yT0o8oZJS+32MeUAl8T9zREh31rq77pSVsSoFjHO5A
-> P-grease !}P4V B O'Lk, è ™ñΗ´ä!î^ûØÖ8ÔzøÑaÒÓ ÐàÔ@Ö¡s\ ˜_ÃÃúoÖö<C396>wõÖ¥Cr)¾€fû¿AÃ'•3D€â
/uJ6ZehJVzp6mQ
--- Cqqr/cLuPZ+c4ODhL+so5Cok6ACXhXBhqfcDtHPvBms
¦,l¡ØÒ©Nwä϶™ŠDB&_ Çìgµ ­@¨¶ÌÏ"#/ÛD³-Šp¬ý $€ø»ÓFª~„AÌ£<C38C>7

View file

@ -2,7 +2,7 @@
# #
# SPDX-License-Identifier: EUPL-1.2 # SPDX-License-Identifier: EUPL-1.2
(import ../../../../keys.nix).mkSecrets (import ../../../../keys).mkSecrets
[ "web03" ] [ "web03" ]
[ [
# List of secrets for web03 # List of secrets for web03
@ -13,15 +13,10 @@
"dj_ernestophone-password_file" "dj_ernestophone-password_file"
"dj_ernestophone-admins_file" "dj_ernestophone-admins_file"
"dj_gestiobds-secret_key_file" "dj_gestiobds-secret_key_file"
"dj_gestiobds-sympa_password_file"
"dj_gestiobds-sympa_username_file"
"dj_gestiocof-secret_key_file" "dj_gestiocof-secret_key_file"
"dj_gestiocof-sympa_password_file"
"dj_gestiocof-sympa_username_file"
"dj_gestiocof-hcaptcha_secret_file" "dj_gestiocof-hcaptcha_secret_file"
"dj_gestiocof-hcaptcha_sitekey_file" "dj_gestiocof-hcaptcha_sitekey_file"
"dj_gestiocof-kfetopen_token_file" "dj_gestiocof-kfetopen_token_file"
"dj_gestiocof-email_host_file"
"dj_gestiojeux-secret_key_file" "dj_gestiojeux-secret_key_file"
"dj_interludes-email_host_password_file" "dj_interludes-email_host_password_file"
"dj_interludes-secret_key_file" "dj_interludes-secret_key_file"

View file

@ -1,33 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA XTwwas0xEtuVCH9RLjor/7sJi+eFgIf8hVP0qLr2RnU -> ssh-ed25519 jIXfPA NovhLzllQnEbnI7bno+zDoSRFJyZMfVVYPQMReUIymw
aDsqnVAMo0W/Wshq+fSIv1OLZ9zd5zJURryZUJj5dTI sefGtZ8fbYVqtKgMhrEj9AlwP70YM5MGkQ+o8Dmfb/Q
-> ssh-ed25519 QlRB9Q TQ8Hbjhf+bp5m1NmO4FGkGyLRyK1jaAHY6CEbpjq81A -> ssh-ed25519 QlRB9Q 9mh3vQVo5tPorLYBVCcZUJOlcEftQKA94PxNhh+pDwg
/VdXs19yIAoEx3tW4lrASII5kB7YSSeTv06oWJDhnPk GXM67qitYqnxbFoHbsfa1lNNLIahPqshosIY7h0fDBA
-> ssh-ed25519 r+nK/Q hzJ+Uxo7qJH/f7XXjbkqNS1MwD4bHnsWIw49C1El+X0 -> ssh-ed25519 r+nK/Q BOXck7k9AH+KvmoicI/fmGzWcna0nwnJ+uyteUjIukE
PJLFt1iOqVvkfcVF6bjvi4dtyLP19s8ZRo1oLqwwFak Hyts1/6EAdruuBilhifl/HwPTWEBe+Kr1RL6SDjHaaM
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
Or3oEfiA3iiI/GxfXYY7O025VplXwrknsycRvRtbyiZk8WQjmEibTXierciTlbX5 1ROqUHCkbkEgRTQUha0cVJVAqLu0nvfKik9yI392sbEQYgmpuf7F0gzA97BXcoi3
SIob012w8/T4tRcNJMliciTi+BeAn9W3Mwx9qnE02yoP6WyPmTT2BzoV34XCMUlz 2BdZWu/cJ6m6bfMvXdZ04cUjRcNrnpPHsoqie3G9s9p6aa9XIrLO5K6kH7S6f5DZ
LXuDOPSX2R2YURNCM06d7ksI3ruK4bHODdSPcAqedC5no2Jr8dE7TviZRFSvLB1i pZdOqfSYldtJKRx7F8k0D/pscN5qB1Tb1x0CIULJVo7uKf9X1MnZwapOOCY2q40U
7nuqH16BOCgvraiLInskpkHdA3kC642b0ZUcPfrfS4OX+6vAtDrx5FPUkIl2sExF Ip2aefr40h3EO7jBlswx2/fB8aqW95BR4JQzJZ/uiIsBUQDqvn39GU7R0JaLdAPB
FdNe7YTN331RdMba0aoHgfyJHZ3omSE+XRa6Cxxm/gSUxdC3LugPSXYShJr1JNB8 6kJXaJ3ORaDDtslcaAVZWLqFbOlINXYHr/mqYNTZMubE4BmNjvJL3aRozQQWraoJ
ZV3SbIOKzx7of59TDA97lg q5rDvgwUXVhpGpcaNf4/xw
-> ssh-ed25519 /vwQcQ fwtC63XD7Lv9FF++QkKpahHyuXDVoZ27CmFzIgQfDDM -> ssh-ed25519 /vwQcQ FHYnfCad1imFiV5tRIfe9mtJ2ouiu2l19th2UD7j3gw
eDwbjI9To+wcybm//jFt7BZqLpaKm0O+Jw1bHHp41ZQ Xu+Sk9GEQ9Wyf7iU790yxv80vLYHp2StArPkfRqfRhI
-> ssh-ed25519 0R97PA 4DFNn1jL86Cul2LsdUZHTpGUxjRZDsdFerYVM6sK7DU -> ssh-ed25519 0R97PA etwCsiGmvzufJGMw8aDN+M931lPlE9fTUBQmk0X4DFk
rjOsKCuw8iQdSehoZiSNau9IpwA4bH2sacYwIJ3b6DI o6xJbfNjQ3Lko1MSJ9JBu6FefZ8267dZ+vL1Gpd1eH8
-> ssh-ed25519 JGx7Ng MCchgB9GKJ4nDKo6Evgy0TKQlO/gUXYxSgudvRwiuA0 -> ssh-ed25519 JGx7Ng h0XzejD/c5F2M7sWS4vTQL9OoRG73ACwlWCtK51Dcyo
9NeUUtq7N3Bm8F8dxK7BJISOBHF5lQ2Dt+VHwWPTyhY diMDy201IpwL6Ec+Zb4pH5f1yyMOMHT3jg6yriopCRU
-> ssh-ed25519 bUjjig 4Q4vFKZ346x4Ge1YFHavHYoAmPAtHAdgwo5YJIy9yCQ -> ssh-ed25519 bUjjig 2Oh5FhWfrbA9c5TisXuxasyYF41YOlNdurZR9QowETA
p+PATQkqC/RYZ8EGOd12QZ+Bew7XllfexjcMY3vJw0U 706/MLiPT9+9xHZPZQYtvKm8zbN5qS/9XJ+TK15etIs
-> ssh-ed25519 ZIo4kw UncHT8lpi7qXA8L7d05xlhXVMr9SRuihu8QN9DCtT2Q -> ssh-ed25519 VQSaNw YbtnCoySon7jNBq7IFOl8UfxuJXRjzLrgXp238q4RRE
MnKuPXpE8S1dtKUVwMVjN4a2tu/2z3u9efuwjoeuEg0 10au0QwFP9ntPMU4u2bMl3KLYBIPy09xVoKNLxWvpw0
-> ssh-ed25519 9/PCvA fK05xfaZacnYx2OYjWXbHebbC8xECKZbpqEBouNMtWo -> Vu-grease !oqb p1-QmV
9mdTdeF8IAMfO+0re7ijiFnUP5WPKxPrjfBttBkJ5xI i1WmaOmxmdAX/se60fnUL41n57c8tN1gnUjjBjSV7GkQGzhKnxTplJTUpifP9Js3
-> ssh-ed25519 VQSaNw BIeE2LriKTvcixgno6bVAJvNRyZZPLB+JrjQh2PojxI 8D+xe86sN2l2JQ5R9QFOAbsvSa5eXSo
cK2+6Z1/x3XeXUB07Ciww+s6UOW60JvYcXaATa+lUpk --- JE+yvBRH9Jz6Sdz46AzWuhVI0kXWObODKSiNWz5L9As
-> PA`a-grease .[V<@M%r 5&?aJO _n´(I 6ÔÃPèCa\³U¼=é @ “†?6—P[Tò³ñˆjk<6A>0ãrÒ…°“ƒ¼-É(]/³a¿É õ8¶=é¤i²<69>
DCL6YRyrFvIFK0DO+xBMeRBN+rEmW5lc9/a5A7XUAU8fciat
--- r+lRXC3t5YAvRG+j/CGedfTfBWfqjywQWWSasBzWxD0
Ö"ä2 “â I¼Éi$-…
ÏܾÅëžN×6>è4!! pxµØ‹¸‡“=žÀ^Ì<>òåHÀÖ<C380>¬•ÇÌvÓÀÞÇ­ù×

View file

@ -1,33 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA 08egVQc7ktR2MhlymKTW0HdWc2mus8aJSn2Xb6Hp6Qk -> ssh-ed25519 jIXfPA Ju7YL9wvvYr9VPLmYtYTniyuj9JTVqe2V8eRLISkIH8
R/2uk//Fhe2NA7oJeqIn/5HFvzaA28ASSXdfBSTqWlg EJjZPLOhspyyrx7a+fYlPPH+1pr93KzW7E2Ztkic0cY
-> ssh-ed25519 QlRB9Q 7m1UsjXtZNrepWj5We+EUorSRsI1Deo8ZtcB7LtbmkI -> ssh-ed25519 QlRB9Q X+TAfiEk1d67rkz6CgIO66bBrahY39ZTnmj0cBGGrSo
ysD6OEWgWxr39cn4WekqCRoKd8NshmbQUxh0nFLA49Q kBLFu6DnN7rIzP3mSlPEc+yBN+yU5toLeA069vuNW6g
-> ssh-ed25519 r+nK/Q +ge9YK6GUu6Q0MT95hZ26Uu6If2P77zdSHFHebxrxV4 -> ssh-ed25519 r+nK/Q wcXXCuAS9bOp3GM6c0pU7sxpylFEHFPmnibQTEwJ1x4
cbNRLgoJA0ThRVdHDoR4wVZaO/GEI/2NnR1fNNtZN5E fR41b7fhZCzuNP1jst3vx3wUjIkBDsz54VzubwNX6+M
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
H6+NdcBX/Jk+r/BhWkomBGraoZdlO6D3rpSaq/lkgLf30bRwOEmdaNYD79XaWY9B ySG+OgB3gMW/ijdWqlGr1LnkfqeFD53ChxkOUfAe4+Z1VsK0FkVaBmqvW38SFMw9
YT10dGtON5v1/8GuPSWup4SUDjFoSw/hiEerxApWPQiccrC5roTnCKQ8U2glOd5d S4dcOkO6Km8umsaZBZi2QaItm+p8Rf/j7+W2WZPoyoKE1l1KW1ic/wGOY7uqeucn
6GKu+ZvyvsW3vu20JMrDirzR0dxVM6UuHNoKyFur+uF2Ldwmsj5K4x+KK2oQgPu2 YZRq7rWX+DaH2VLbkl12wUlVgYwJGcH6VrpRizbq2z0jcdTak6hgzcXo7WhcNAit
M+31AyyI1SxuBW+Ud29mCN4Wo0fi4qZ8+mkyHSUMjRa6oQP1sZ53NIhrjS3A5uB/ DY8W8X5Zv34mpj1VO7n2LJs5V7gzfSLq+KVMIi++QphVv2VkFpvaOqlEP2neVXnV
egLfTwlrzXbHvJ2SGwD4DY8ifZSHaN/mca7OTtQjAlhMRS9DCGE1CkKH31lrGd6X C3YNJTkVx+R6wANCao+9a5VHC261Bkm81dKgzceW2OCHkwOP6XTbDpj59sMRxRuU
0JNBnULyuy/rha3TcMTMtA B7jrvre5S1WZN9jc16Dv/Q
-> ssh-ed25519 /vwQcQ xLMRHBPx6fODmXha0Sy+vJQf1deTQXryBguot3WVh2M -> ssh-ed25519 /vwQcQ TW560PIrbJV3ZB55w+EvH2PEYOoYM93x3aaeeShYKE8
dUgdi70Lsr1rIiotYqQ0c96j3EfRkQOafKY2RrhidB8 LC6pydBK3yCq/Vs7MUoa0xjDSn3WjRaZuqwvhX24YJQ
-> ssh-ed25519 0R97PA w+hdiOdbnrWnn9tFsF6L6mZ1///cV6XoMjWtYXyKnQ8 -> ssh-ed25519 0R97PA zyerO6EIwW90XVSBVP3Y/7Q8hK+7uPe6kKENGCdDJRw
1at9SRvM5Sbu5iSYEFbYbXVoto1LMW1EzEdsJSWpwY0 WEpgo8Y64YXnat1OJU5qtpecf+Zu2P2LmB7DEtmUuAU
-> ssh-ed25519 JGx7Ng o/cdIVdkjzIAHw625tEfw7hTaQGo0vki+qdIL+CYz0c -> ssh-ed25519 JGx7Ng 7h4q8ztQ0BFJSfavV4l1pKjbNRZveOPIJG0KF98vh28
Vocwm0geOXTk0H5WrBYMDZcUNk8n/8VNdW8x6dMl2cM mYcUEL4n2+bkjpvJylIvzXSxoa71YZKMSgN21ONnvko
-> ssh-ed25519 bUjjig 5OBdUl4Arg1wZJKQdWh3V/KNZV6qUGsAO1a2v99Q0nA -> ssh-ed25519 bUjjig 9wKWtLWD+9LlAOO24iQiOdvpSDIWpL6Xo0Wt3QOLIQY
aCrZaE35dXkQlagPSaDWss+IkIwPif1/r6bfZz3TNrA Kq2QLFB7E5tiqZQlsn5pZRM52v8XqUyYsvwNHXZspRs
-> ssh-ed25519 ZIo4kw 3OQoo8uI2P00UlbjnIvFEIvQoWGKGyHU3LGXw+sXBwc -> ssh-ed25519 VQSaNw 3tJNtvi0WK9iAzx3Q7Q0Ogj1TGH0Zrm5v0ERhQILBVk
A46XyfquPbtbK8BGPp0hKgCWuoGCeYeDxVqYkD7tdyw 4232/j+xnbhQpId7ZS6+xAQBDxtumeOp4c1HVeMRqB4
-> ssh-ed25519 9/PCvA I0FpL5vPxf7U093O+NY6CJJrCHnpuY0hFWvf/qJK+Qs -> Pug13&(-grease 'w0JG}JF .t`9lMF v)8}4qW
vcl4vxnuO1iLHinvmiOM/gkjZjRVabrQvEqY1cSog6M yRriwE//abKvQgu962F7URbOAiHDFMipnsq22itGkLDvmwIRY6Bi83xOzx72EV4y
-> ssh-ed25519 VQSaNw ff4SovgItjAFXti6SvyObcPDmk5NeTlAoavPL/Wnlyo 27GNdxQOni+z8NPt0YTskqq4fHfZky/EMFUvXTfteB7izYxEliHLRKA
QO4PFFxL+W9kFo6vFa1ttc7bZeqRzqSmETeDnwhh2jo --- JNvexaDwzwOIUCxanJRLunfhBh1/PE8ssFCytr8nPjo
-> k-grease TX¹Þxòšd˜~KS?ìIò…Ce þ—3ÑJõ ¹ŸýCíÓF6qœv~Dùq¢T<>©55€bjˆfÕ5”ñëã"ø£ÅŽp
abx9DzQh9Vg7jjvbeTQkJ3HgHRgTKe4cKX26LTeRpAkJh3Su83UnhBYaa8f1LE4V
lqwHbpD3EZ43lmqKZN7MIEU4S4DV
--- rb95jJQm1T4fp8BBYzzcszoX5UZX/e8LdTPzK1EdSX0
ö©ê{ <55>$s<>sQiWh"<22>çKkiº-èdšÇ|2nØZæG¯¾´<C2BE> {<7B>/ÛÏîxž ÒÇ·e\‡Ó£ò›

View file

@ -1,33 +1,30 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA 16vr8JKVz+RF5XzpDk1oV4YxkFCzWwo3mTOBI2VFfS0 -> ssh-ed25519 jIXfPA Ifc4K8jusXCbeMSYeAL+3jdvmDK1ojYiSzHJO/uefzk
ianzE2kl4JWoueI2m/HuxdoVkf2rjFIQc4rv/VuhEQo h5ewdTYV3o8+tPCzVWvLtqEM3WxVjtOqTRnrFAwKnes
-> ssh-ed25519 QlRB9Q l5GoSxEDfUk5mkPf0zNrA91WUEjxfFVpAkfjS/niIE0 -> ssh-ed25519 QlRB9Q djvVFcR5y+WI5+rED8ztIQZuLfCj2z8wHx3WIutlfjk
EEE73Rbula4xHZqMiirGjtoiB2mziOLBUm9+4KCdev8 nsTUZEQRJAAZfNXw2YbzwV+RUJEx6Dmi0ujswMBqIro
-> ssh-ed25519 r+nK/Q 98sEpNMpoczfjW2l2yr9jJOc1VepL7Pk+TjJ6hFbkx0 -> ssh-ed25519 r+nK/Q Ryx2iuVCefSFFMEyRjVbKFxTqaX6D+Ty4B1+6mRLSCg
gpmp+Osr+idHXklG7gqVd61XMyOmuC7NxWWzXbbqOfc s7YjJa6NESaNZ9wzurlrsovu5ecJNnWLOhD80RnFqV4
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
jQixiivph6yAlVzUE+Ir6rinwMo5R+2e16I2JS1xF8JNxu4/oYIwc80nsLhmf66t utXBcdyAmbl463xcacn1+K9UyG78vKG9LW1vJ/q40ltqEsuxktP2C5YgBL2Whcld
uGrYg3SqQq9r9OajpxKsIO9JuzuJLJWpMjh3Lk+hu149RXFgIfwzuYk9vUZpwRxW UYTsNFa3b02HP1wp0fPP4eVyk0NNKqO1rairMAvLJmQk15s0OVCk7LvjZe+Q31m1
d7aJTLa00MoIlTQ+AyZgSLPtBp8WX7Mcem6ZMDAgyP4BxEJO56bIDS9Qp2x7eCif gYxBSuN4oy7gljtOlIfrHtcRqDMC5IToYSt91pwt/0wgkHDH1OcLap8jaQIuPdc1
XRdUIw6HjvEFTzhQKBqUFNNFITbNNkg+d3k/PhxtGkuc8XSEroiNpEUJoGckIu5R pQqd6iUTF96kvvp1P6XbvOHH3nVLNw/bITR5BUSqm/YBocJBrDNIL2wXcq27bBMs
+vZrJpBGuZ7o7TOj22WhH0+Kr6J4Jl3T8aSFzUxg6NL8HgYCnPle1EAHpsPXZYcJ YqF2nykztoSss+YM40XnHx14wNU0WeocbSYuPKabKvtgV0ry62w+EW5t453TfMng
q9Bi08TiS1JW1th7O9+6Sw y0dYmBdXVTKgCyL2v/onlA
-> ssh-ed25519 /vwQcQ Q+8UC629ZU+37zcq5SF7qS7biRDWda++Bh3G61sj+zU -> ssh-ed25519 /vwQcQ tax06kUoYtjoUZ8k0+2L0cBr9CTpZpWd5Ev1qRh4dWM
amTcoqlY/Ip7vLw1NNsUZs5KMb9sVAlDlcadgm3oaOg x2RYQ+53UJnBXz8plzYrpga9JCWgm+WvkjpGg+CpG8M
-> ssh-ed25519 0R97PA Ysgil3FnJTdr+kbc/WnkqMyX6gWTYyeIvOZl7br3rCE -> ssh-ed25519 0R97PA DoPbx9NVAHTe6NRxT50nwdStoUJRnATQDEKgIyq2hhA
oaJ+LtabA60dp78KNyg7jrYXvG9mzqSIoDuaf1zM6Z8 6DUg7uQ9L80KzaMJi6h/Nm5EgtLlAI+R01Mke9GpyzQ
-> ssh-ed25519 JGx7Ng GzD1qZ8quTyBQk8/rwTu9BKULhVU3FF/z5YAfzKSQHQ -> ssh-ed25519 JGx7Ng AG1PM5MB2TlfZoiF29gu01LqhcQ+rEQRQZHFVxdHYG8
OpdNcQwWY+ky4VUZqsP/DonDpT6Kmxug72BvwHwVAx0 ePz8kT+axuMZe8MKi1Yj+ZOCITIYjVAuRE2iTScgpyY
-> ssh-ed25519 bUjjig 87s2MhD6NkK8eV5hww4ylMyew12IGaOEes8o1xUbZX4 -> ssh-ed25519 bUjjig SgZgUi5qfE8wK54Mj8P/FJ4QPNs4HUV5qPc9jJTskmY
WAaALYovgjW7iYLB7itFysR7clZGoK7cVWJSLCTSttM n/fedObFehvhLwd3uhkhfBamFpjZDVK7M1J67BucoPI
-> ssh-ed25519 ZIo4kw MEAFHWzbBdah28L7NsQzwfCPuXIc0wjjXjj0/+bmnyA -> ssh-ed25519 VQSaNw a+SLVFR9PqKgyHfAPTjH4SGkp4XXjz6xz6uMjZgYOg0
WdcddcNr4+36q+nK7Y3ye9VTcK2U1rZ+02/zCaqY/IQ hv5F5ENsfpU27opx8OT4mvL0waGO+AieG/VXvHNi2hg
-> ssh-ed25519 9/PCvA hUkZ64AD3UwIIe8w5wjQwedCtm5F6o93+wcr0ahZDDY -> g**u4-grease Fb|HQ E
u/HyNw2RwdR24d7u1QF3IQrFJoUCafGZIPZoHd2QhIg FcQESlzpmCxDtrbCZhddPdNjVROYKj2XsOppqa2GPZsWqQH8cFfKzxjwlNlE7WNF
-> ssh-ed25519 VQSaNw SY3/Zld3DWCnJfwtANjFRF0Ouxj/6qY/p1Y479zdIhs Q3xupVqn8H1Cg98i
WkVhwibatw01SNLcvnxvBgGkFlPhAp/fYgX27VqRnRU --- lYBZVJ4DEtBmKhenHOOkQpuPT7TrGGgN1OmTrfCTtY4
-> uE9hj_n-grease &Ys xCJnv#]: cc@Br M^KC|v% Žy[§—ÀÒh{`Z³öNŠx/ùºóSyFú£ç
gsudKgvjsE6HDhMQ/mGXUSL38bKXvszMenPLcr6TvDTqzU7AA7fXn3Ct3bg6y4NU +¨Õr: ¶úÀ cJ¸L˜b¿Mô™w<E284A2>n+™õœ"§¢—|w¼¯¬kµ*
sfaWT2F8M8bJvg
--- m5R+t6PYaGOTy18NgUIJRBVev6HpIYd2GfM1yvLFlMg
/•éöÀ<C3B6> )ÏœëN®=è´š¸¼`gϼ‡Jx€ †ë—k.‰H´I˜d[ßÐtWyšÓ£,!E^«²âŸg'v†ŒT™ç'‡ÉàfÇ2

View file

@ -1,32 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA Em7PnBEyb7D0d6/kWwsDh4J1W+/dyUiT7FvAupHaP24 -> ssh-ed25519 jIXfPA KrKFEp6rV9xfBHAj9NeHKI0eIECjogKMyeClTaBipG0
BX8kyVQdJqUJmLcUL23sl626U9ab75/r5NTI7v/o7ns 1fxm8PtMPXJTMM7NDiTKuoFp2J+tBQxI85MgifdISho
-> ssh-ed25519 QlRB9Q 1nP4tTHiXVFeE92o+Nzr79o71QR+81+7ovrJLrB58xM -> ssh-ed25519 QlRB9Q 97pPLWOIzOee8ZAjZil29PvzCM3dUXobZErfN4/gzX0
EMCQMNZ5ca/yPPQHdFl0vTARpaPmI4xUA9SKENq/dfU UEL1QdbywRgxnMZo78/olkvV4658ezc4yG6MuISGUbY
-> ssh-ed25519 r+nK/Q 5uzQKWNt43S2mM5akwtXnYkSr02zerem1+fGI9fdITY -> ssh-ed25519 r+nK/Q DbBaSui7qk1+umFZpaLXp7BRxncPqz4z8ClFQc7m11o
BRSdgM253ZQkcuWXniiQIi8J/xLeE2pRyDd1o9CY240 DwqwK/5pCUN/mFH9wK/lv5AFWyoMmAUUntNpGu14UEI
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
A/anGDlkTsIChZfwcpsuAV8Q99L9eu8uMkFwJzQOpB3hPExG4v0fkvj5jt2LMKuP 0DqUVAzJiRi9UyttiwNWBU/bJ2j0CEn4iYa8+k+WFqtHZEPnVPKivmHSsafaaVul
rYr8TrvzfyXOx4FQwpL3IrtDMKNSu6TJ6/QvcnWO4AnGrmPUrAuZsR8xKgRkMSMY uZRdx8HsBCXQW7O5YGXGtkedmJhwDGM8JV/PaeQhr3yYQj/x+3oiEiwqOHiXKxHf
FG31ttlx0d6tdmDh3jixSEMe534L7wvPaOST1Kf9yWOygkvIqNaOK4Xatn0IFYHP K/MGXtaUlzy88bfVmVXUbxVlUXcjANS19ofvzsUa80ru45iQnjPDAxrVBdmu3AvK
N7x6fP6ZOcMl7va+os3Y9+nZaF4aeYBmHkno5Wkkn9zLZlHCqm6+yDpEt4WkVbcN 1yxmQqu0fwnfQEuBQcQq3ORlqhUlRNgcQbS/WMiB9iEavtMj0ZP8aqG39RaFlL1D
JveVujdOjnoRtvMrY4UoGnAjc1QCuKx2ZHr6AidI0DkWi2+wzD57+IfBj4J3UYB2 jfRqrliV9ihhGfa846lv/Py3NQ7pY2DFilLwYG7DUSLqDrDFuABRl9uGbsZeNNGm
xmPmL7tfF+x9k8FMSwDTyw iB5IXoTfd1NwzKWlo9oAag
-> ssh-ed25519 /vwQcQ MirX6UYf7Iwa694voS8+pzsjoe0x1f2q0+0wTRC8gXU -> ssh-ed25519 /vwQcQ +Bi7L49XCBFV07IXoNh5bjqg40J3rxTw8HXNDyOyPUI
dOT4g7oXOsT1zjivLSYFCrd4kRGPlSHU26EOdSZkgyM 4ZnfgVVKZa2LLXPgD/Aokg/CYa3Ekv9r+F1HEefGJ+c
-> ssh-ed25519 0R97PA tNB090+u+BXCoEDk5WL7cPWNp90GS9RCs/q+uc4+Amw -> ssh-ed25519 0R97PA BD4To9vKcK9/N+SsNR47XRAEGgYtQpLjxB9uHx3upmw
6inQex3VDvpQeA4eWurcTudLzzevgtSrK8BkbS/bbrc KCXt2U0wbt+YAkMbyg8IiqxSEb4PqYqcF/Eyccp+/Ss
-> ssh-ed25519 JGx7Ng rI1hOmcgwYEHc61WASstR28qNR6DZL7Lm0TUZPgFJAc -> ssh-ed25519 JGx7Ng jMBazI26/KI/SnoaW9RenfkfaaXVoC7fAzOE5ag5yik
YoJaPh59Bgh4LqLmKOaUkx6QFLFUo6nGjS9OAiDXPOE V5roh9mLqwu8U7xa8uDjE5FvJ0f9oGBZvcc8Sq95c/g
-> ssh-ed25519 bUjjig gO2MExeoxESQu0UdE4Fa/fFIs7g2RybBOyhOc34tNGA -> ssh-ed25519 bUjjig c+j4yAZbc79z8PY2mh3YKBb1Ufx5o+6mEZfBKFqx3BY
0dt92qCh9fBjyKicE4iHSPBi8PI+6j43l3nmgnuD8fg b70Yqth6WlEHCE5IayJdIOjw0LwvKRKtOAtqKKWsbcs
-> ssh-ed25519 ZIo4kw 1Dsr2GnTeovirdaQDP6rOmYVZGwEelsiMzBIIxBo+XU -> ssh-ed25519 VQSaNw qKlh7tiMBtr+nSEBk6WeZoJ7Dzh6VHO5gN4hBf4muRM
iICbsK3fq4tT+ik4Y1QFs2gm8b74HuOJKJNt6oTFJyw Aq2c0Gi5eAlwL5RKrmrygtZdRYk2aY2vjG9s3k7p9hQ
-> ssh-ed25519 9/PCvA WJkJxSSNkVB6fwNfQ4GzCaNz4G/hmCItL3/pI6fnIDQ -> kO[(ddID-grease qq^m ?
PQHvay/PkTs29OG+n2/taElF3vZDnK0JQNrs70JcfNk JNVmowjDLasojkFmvRnZ7sxMi7/SpsSan0VXIj8qxqoBo5flLWhvD7mSblGHzegP
-> ssh-ed25519 VQSaNw nR4FmyiSBDWssm3SBVnxzbONnLwaNnAZv8hUUR0IkHc /degDQCvLlok9w6XDizZGN7nRAk
ALIlf0eCDGcApxyU5Rg2SnvDyOUMvzX8SGdAZODLbJw --- skSDFui7qsitmkHgiWfNf1zkXOfGM6wrL/RwgVpyoL4
-> =Zil-grease >62kQS y ?!b&||n Kf9 õqAW—xFBâΟܟ{ü(çI?ñZ ‡IXºc4îÅìþ; Ĥ×—}(I ˆ<C38B>!Ù¬ç|Œ ÃÑË  S„
pEaW7kRzDq0EITVZzxNDb40BeNl8
--- YEvmK+6dMTyImZyFsbtEmxgF8prKBkgg7g2me/HKyD4
d2½šO¹ –Ø^Û$¬]¼8<>ÿåv3¹ƒ ´*F<1C>!LÓð½ÜÕ¨B<C2A8>qH±<48>µcÒÃ<C392>/&øLl!

View file

@ -1,32 +1,29 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 jIXfPA /sAsMjd8Hpn8Rcl5ElA42UKF7rEVyrqXRTLiIuPHKCE -> ssh-ed25519 jIXfPA dBBF9o4SBTHNv495PFZa6dszbs9nEARwg0EfOlfFwhc
vPlHKxAdC9lsD4Khvd3NTc4AVGnBsoJunAmtZ0v7WAc GkqX8sjLqFHGm4UA+zyVRB7FGGgAxilFYHarEQB0YAk
-> ssh-ed25519 QlRB9Q snCj4d7iC3RmZh+oWla2PmG+VFMAUpIlfC11rfu6Txc -> ssh-ed25519 QlRB9Q DEu91DA+qho3Zs3gSQbWH/hOKUfgP5Qd90+9ZzYs1So
eswcGvMsAHrO6s8xTujLHMhDdhl2EEN9wYKQmr9qarw aIw1ygo/e0tpqW2N27Fl8WRe362ronzqy52vSzD35Tc
-> ssh-ed25519 r+nK/Q HX54EpIo7qeg36dr9ylTbz/486Q6h5OEY7wODYmCuiQ -> ssh-ed25519 r+nK/Q JUurf12UYuJKvKusUh/GOJryFbA8lWaS8v+/pRb0kys
8wBRjVjoYzQECtYXNxQCQBl5NDCD+EzS51NGURh7LXE VsgsBSwjBXTD+tmP3jxCPVeDY7AHVFx5o57y+ubEjts
-> ssh-rsa krWCLQ -> ssh-rsa krWCLQ
zsjUt9wlEgn6nOtc9pAAao9AxFY1h5hZub9OL+sBzY1T7fjbxfymPYCJnKArZWXI o08ZnFZIj37p5hpWgl8FXwPwHKjoBD7Z0UxMRsF4CUF0sLOpwVHD4L57hAA8a80S
UyDV0aS0O4ayyvzogfodw+9i/k2uK/c9uFczjiDVq4XyW3NqYJ1uHoOrBAzYbDnn 063e48OJ5OsrtueqqJwPT+wjXfmEarLUqC+rP0X+JDW8OLwSImBcYC5DQJZLUFSK
MCFDJ7LZBR5j5lwAPw6UYkptyQs1aCtx4jk/vQsubMqDjcid/ZUfCXN/UNuLYHO9 doF8S8Bo0MbuB4eKnXUAJlhdZOk/iqYK8TYuuSIwWQxHwF/fT43hrYIkj6lmqdmG
R/uzH9VYTGYtRNjBZLxcmT/kkZz1O0ENFEluRJ1xMpuutnMGbw/m9DgnFsT2vDrw IqSXA04KpQFoL15INIAtsnj5xXJlI0gCPp0pxMNUmVyTTrNLfaEiKH191D+Elmjd
MMlwS2uBd0YfDEQWXxVICo6kaz0Oo3S9JIMd/aY6cTqoqhgA5q22ul03vsBHu1Ye xcdvMX1yzIPI/mI/+/OjeYspijY0XpRHLJ9ljfEK7E2N8IgpyzBx2BzxYhRHoQmi
tnLHV7zQjaIHQhI3PfuiMw 6SbZu9Tirw+yv5wv8oIaHA
-> ssh-ed25519 /vwQcQ uGQxrfprG+sBQES8UpdeIMeL3vKYll9llqWEY1T0lUQ -> ssh-ed25519 /vwQcQ M6QID8DMaFMnF97UWwbSYJ7Sh0wvj/fq7cszu82/oHI
0fSe/cbnnoEu8iQ/VYAw899YojJxU2+zA4JyHVQ36bI T+aT4NCbVfGXnvPK7w8fbojAwDTE41h40q0tDwnGyhE
-> ssh-ed25519 0R97PA 0GC9S/8syAeTnaKtF+DoLf4gFJwbGYpizosba/2dMEM -> ssh-ed25519 0R97PA XyZvyy80nv2tGe1fBzM0LeiIAGuyV22CzBoCPFMMrw8
STbpLqqGCkmAoKJTnkthK1EAqG0N717lg5G8Qgk7jzI 9VPiRV3GCWbH1So5LBrjBeRzEtErPM7BwOF/zaD/yGk
-> ssh-ed25519 JGx7Ng vi4vnBSi02B9zeg63FAQ12HVv1NmZ50wuVkwmbDOyGM -> ssh-ed25519 JGx7Ng OPlQBKO+Wub+PPMNPoRGWTeSZfGF3kYCD8HLbLbPR0k
QI6esTxJ9YxtwBDzdYOOZB4JeoYZZ5fS0kAd3Pcgk/M ZhBUT5ig0FnLCau+da9bfEkVjFxfZXG0mXW1o0yZ+JQ
-> ssh-ed25519 bUjjig vLtnNj1ExEEfsv8C6ivK03cVRpWP3Pw8ebygt+/45gY -> ssh-ed25519 bUjjig T5/dZtIRaXmNg8pajSAM76cVANM7MvQ7f32fz2fEqx0
Nhw5uszBnkLyz5Q7a4TfnCEkbLxDA26OE6TamfcB98o +6kRffMJX+8QAOf5jA5acGihgw4q8yJda0EzVGePD+I
-> ssh-ed25519 ZIo4kw 5fHM1qlVrjF+E3ezAPIizL9Ht+xCc6hLC4Ee2MBlfQM -> ssh-ed25519 VQSaNw InflFPtAwYwQFWqd+KK+ILwMa0XTNkVB+xEMtUXW8Us
4WZSV8fhoxK0m0C1i7CbjCYjkPPgo57gy6PwFYLoFBI XZ6LVMCpvq+QBo0EHAlnC8uBhQssixTLVCpul6ov4Dk
-> ssh-ed25519 9/PCvA HfRZ1fQvl+tJTnX+bH3Ki+lF6hccw2+ol/zsaE5pYAQ -> YKmn+c&-grease EA5d$ ="1d }cP
lUUBEdIje0/PFXqm5jlyXXioRrCr8kdQ5w8zsCedCbs 3u46NE2SdfO9ugNN/41PeU/65CRgmDiO54B9ZQLNRQtVyyLlcmvaYHCQach+s+Rs
-> ssh-ed25519 VQSaNw 4U6vBdSxE0h4su9DLfY+gTSHufnW4HfYEXdxXecMIAg tE0Gc8MD23hPw5ZhWj0nq7xF8VHtRQSTLQ
hohBOA/IF1UfDmi//k7lrbffKqqaLk6zpktelo5oxqk --- UkbfAVgnLkeg6Zdb3bsdPtx9Wh6HOjdB+qmTvrAWFuE
-> _adQ-grease :-ic1W tkUM 3e 5_E¼ñ/e)±žÑÊC×ÈY<C388>wPŽöTášt6>l_0:[èP»ÎH5·¼j—<6A> ¸â=vèFýÉIÄ4¹ÿÏD쪘ýp£§
UYm65BMlSUw
--- 8yZM8IYR6VDhkXkWksoxd+zHm/BW+Kq0CqMUGxGP+v4
¡¹ºv©U&`‘ÄÕƒ(Øér â<±û`[9¶^¨™ýym˜(¦ÞÑùbiÂâÈ µÑ*)R}5ÂË3<C38B>«xžøó™¿$<>H9-ƒ9O

View file

@ -10,11 +10,13 @@
lib: lib:
(lib.evalModules { (lib.evalModules {
modules = lib.extra.mkImports ./. [ modules = [
"network" ./options.nix
"nodes" {
"options" network = import ./network.nix;
"organization" nodes = import ./nodes;
organization = import ./organization.nix;
}
]; ];
class = "dgnumMeta"; class = "dgnumMeta";
}).config }).config

Some files were not shown because too many files have changed in this diff Show more