Compare commits
17
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f58da21d15 | ||
|
|
f398daacb5 | ||
|
|
0906700ad6 | ||
|
|
b9302e6192 | ||
|
|
5cb262857e | ||
|
|
47e536540f | ||
|
|
282a8f8287 | ||
|
|
a9254c424d | ||
|
|
5961254878 | ||
|
|
9403ddbf08 | ||
|
|
37ff958560 | ||
|
|
efa4b39782 | ||
|
|
e2341b7c79 | ||
|
|
dc1c94796a | ||
|
|
5b07b98f40 | ||
|
|
88ac5cbd83 | ||
|
|
969c006f97 |
Generated
+26
-27
@@ -135,11 +135,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781517972,
|
||||
"narHash": "sha256-G8bIXFqifs/y62GNPwg20Ksf71raYwzmyN99gf1tXak=",
|
||||
"lastModified": 1788346295,
|
||||
"narHash": "sha256-k9Ol++FFhQuPya6ZNQwVhqZZkMvE1ytLtbdrbH5zkrI=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "7fc62d0c25c7a97d7027a9c248e21c97c9b3acc1",
|
||||
"revCount": 14604,
|
||||
"rev": "b15797faeca7494a7fe5fde2691d93affa3d3e37",
|
||||
"revCount": 15239,
|
||||
"type": "git",
|
||||
"url": "https://git.clan.lol/clan/clan-core"
|
||||
},
|
||||
@@ -164,11 +164,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778718524,
|
||||
"narHash": "sha256-pXLoI6Ax0EnUK6r34UM1vibVC7CfTu6j72R2692ZzPs=",
|
||||
"rev": "12c552ad547d87254f33f33bddd1a2cdbeac754d",
|
||||
"lastModified": 1788308203,
|
||||
"narHash": "sha256-dCOb9YIJv9I2udjqukvjlGiTyOvGnO7zVbot0PxjBGk=",
|
||||
"rev": "644c49bbf121b3e256bc83ce10b5d97813d9181d",
|
||||
"type": "tarball",
|
||||
"url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/12c552ad547d87254f33f33bddd1a2cdbeac754d.tar.gz"
|
||||
"url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/644c49bbf121b3e256bc83ce10b5d97813d9181d.tar.gz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
@@ -357,11 +357,11 @@
|
||||
"std": "std"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1782964989,
|
||||
"narHash": "sha256-pU2Gye+1f+nvFleBTgXdeQfrQnKaJEuO2LT7PnsJ1p0=",
|
||||
"lastModified": 1787631179,
|
||||
"narHash": "sha256-l+Zt5XNTD0f0ChkzDJURfQlFAgANIMrGYrk51SZEJKU=",
|
||||
"owner": "kurogeek",
|
||||
"repo": "frappix",
|
||||
"rev": "ac5e2814fc1aca188080bf6b50504cd329790e56",
|
||||
"rev": "fcb797886ae753b26a6e4415a7f2c19ba6adcf3b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -416,11 +416,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781557312,
|
||||
"narHash": "sha256-QOIRYSUFSq7L5mY3dZymaVhcnne3tPgoR9riB0WocjA=",
|
||||
"lastModified": 1788355065,
|
||||
"narHash": "sha256-gAz5oTI7ur34CfuakQduiQd/2ZhO62Bn2XXg08nZYYQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "c03e4752899e55705dfa63979abd885c582a5c48",
|
||||
"rev": "d9d750e4fc11c10cab2da677bdd31e427f3a3a71",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -547,11 +547,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781242433,
|
||||
"narHash": "sha256-bchLZZ3sRn740zyvD2icZSnNoTaanN0nw7l6fjVXO+E=",
|
||||
"lastModified": 1786845137,
|
||||
"narHash": "sha256-oQFip+v0luP8NIxJzmiW4Wu8bILsbFWom5l0zonl8hQ=",
|
||||
"owner": "nix-darwin",
|
||||
"repo": "nix-darwin",
|
||||
"rev": "aabb2037edfc0f210723b72cd5f528aab5dd3f0b",
|
||||
"rev": "4cff07de74b50e64bdd68cd4e722ab5b6b35ee48",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -707,11 +707,11 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1781359544,
|
||||
"narHash": "sha256-iUuzKQcyXvopYDDzFpMK5eQKP3WIJExYny2kJtbgUcE=",
|
||||
"lastModified": 1788775869,
|
||||
"narHash": "sha256-JRf1lSypbvKj6AzUZHpUA6YC1DirVuitZWOnRwcm+Ww=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9f11f828c213641c2369a9f1fa31fe31557e3156",
|
||||
"rev": "58973d74f1893afe13f5902919803a0e99da0ca4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -752,16 +752,15 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1708640854,
|
||||
"narHash": "sha256-EpcAmvIS4ErqhXtVEfd2GPpU/E/s8CCRSfYzk6FZ/fY=",
|
||||
"lastModified": 1787579760,
|
||||
"narHash": "sha256-WGhIEINOICx7bhV3WrSz0QTzv8uzaaa9AXvD1clIWpc=",
|
||||
"owner": "paisano-nix",
|
||||
"repo": "core",
|
||||
"rev": "adcf742bc9463c08764ca9e6955bd5e7dcf3a3fe",
|
||||
"rev": "88739c84d308876714322eb9844ede6597c1a580",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "paisano-nix",
|
||||
"ref": "0.2.0",
|
||||
"repo": "core",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -830,11 +829,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1780547341,
|
||||
"narHash": "sha256-Gq8KNx5A7hBB3uGJaj6eQfLDIz5YdLu92gqBcvHvoUo=",
|
||||
"lastModified": 1788337237,
|
||||
"narHash": "sha256-gkSH8VUtCo6hnysNmb9DbTuDepH2t5pv+QWjP75xKAk=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "9ed65852b6257fbeae4355bc24ecfea307ca759a",
|
||||
"rev": "fbf759290e0cb0a98dfc813a4eb7d53ad1dacb57",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
+60
-7
@@ -36,6 +36,7 @@
|
||||
"cursa"
|
||||
"rigel"
|
||||
"vega"
|
||||
"buna"
|
||||
];
|
||||
|
||||
dm-bootstrapper = [
|
||||
@@ -45,6 +46,12 @@
|
||||
"bosona"
|
||||
"canopus"
|
||||
];
|
||||
|
||||
dm-pull-deploy = [
|
||||
"rana"
|
||||
"rigel"
|
||||
"vega"
|
||||
];
|
||||
};
|
||||
|
||||
instances = {
|
||||
@@ -181,7 +188,7 @@
|
||||
}
|
||||
)
|
||||
];
|
||||
roles.default.tags = [ "all" ];
|
||||
roles.default.tags = [ "dm-pull-deploy" ];
|
||||
roles.default.settings.action = "switch";
|
||||
};
|
||||
|
||||
@@ -313,13 +320,28 @@
|
||||
};
|
||||
roles.server.machines."alasia".settings = {
|
||||
public_url = "tailvpn.public.newedge.house";
|
||||
base_domain = "tailnet.newedge.house";
|
||||
advertise_routes = [ "10.0.10.0/24" ];
|
||||
dns = {
|
||||
magic_dns = true;
|
||||
base_domain = "tailvpn.newedge.house";
|
||||
nameservers = [
|
||||
"10.0.10.82"
|
||||
"1.1.1.1"
|
||||
"8.8.8.8"
|
||||
];
|
||||
extra_records = [
|
||||
{
|
||||
name = "poyerp.newedge.house";
|
||||
type = "A";
|
||||
value = "10.0.10.1";
|
||||
}
|
||||
{
|
||||
name = "glomerp.newedge.house";
|
||||
type = "A";
|
||||
value = "10.0.10.1";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -489,15 +511,46 @@
|
||||
exporters.smartctl = { };
|
||||
exporters.zfs = { };
|
||||
};
|
||||
buna.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
mirach.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
almach.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
wifi = {
|
||||
module = {
|
||||
name = "wifi";
|
||||
input = "clan-community";
|
||||
wifi =
|
||||
let
|
||||
networks = {
|
||||
home = { };
|
||||
glom = { };
|
||||
};
|
||||
in
|
||||
{
|
||||
module.name = "wifi";
|
||||
module.input = "clan-community";
|
||||
|
||||
roles.default = {
|
||||
machines."buna".settings = { inherit networks; };
|
||||
|
||||
extraModules = [
|
||||
(
|
||||
{ lib, ... }:
|
||||
{
|
||||
# profile names match the network attr names above;
|
||||
# 0 = retry forever for both (defaults: 4 autoconnect attempts, 3 auth attempts)
|
||||
networking.networkmanager.ensureProfiles.profiles = lib.mapAttrs (_: _: {
|
||||
connection.autoconnect-retries = 0;
|
||||
connection.auth-retries = 0;
|
||||
}) networks;
|
||||
}
|
||||
)
|
||||
];
|
||||
};
|
||||
roles.default.machines."anser".settings.networks.home = { };
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@
|
||||
"installedAt": 1765277591
|
||||
},
|
||||
"buna": {
|
||||
"installedAt": 1765343708
|
||||
"installedAt": 1787123510
|
||||
},
|
||||
"rana": {
|
||||
"installedAt": 1773134236
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
in
|
||||
{
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "aarch64-linux";
|
||||
};
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
|
||||
clan.core.settings.name = "anser";
|
||||
clan.core.settings.machine.description = "";
|
||||
|
||||
boot.loader.grub.enable = false;
|
||||
boot.loader.generic-extlinux-compatible.enable = true;
|
||||
|
||||
boot.kernelModules = [
|
||||
"aic8800_bsp"
|
||||
"aic8800_fdrv"
|
||||
];
|
||||
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
boot.kernelParams = [
|
||||
"console=ttyS2,1500000n8"
|
||||
"loglevel=4"
|
||||
];
|
||||
|
||||
image.modules.sd-card.sdImage.postBuildCommands = ''
|
||||
dd if=${pkgs.ubootRadxaZero3W}/u-boot-rockchip.bin of=$img conv=fsync,notrunc bs=512 seek=64
|
||||
'';
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
{ inputs, ... }: {
|
||||
disko = {
|
||||
imageBuilder = {
|
||||
# Avoid double emulation to significantly speed up image building process.
|
||||
# Update the system according to your host system.
|
||||
# See https://github.com/nix-community/disko/issues/856
|
||||
qemu =
|
||||
inputs.nixpkgs.legacyPackages.x86_64-linux.qemu
|
||||
+ "/bin/qemu-system-aarch64 -M virt -cpu cortex-a57";
|
||||
};
|
||||
# Default image size is 2G for a small basic CLI system.
|
||||
# devices.disk.main.imageSize = "2G";
|
||||
};
|
||||
}
|
||||
+728
-606
File diff suppressed because it is too large
Load Diff
@@ -25,8 +25,11 @@ in
|
||||
inputs.self.overlays.frappixLibsOverlay
|
||||
inputs.self.overlays.frappixPythonOverlay
|
||||
inputs.self.overlays.frappixToolsOverlay
|
||||
inputs.self.overlays.frappixAppsOverlay
|
||||
];
|
||||
|
||||
fonts.packages = [ pkgs.tlwg ];
|
||||
|
||||
clan.core.vars.generators.frappix = {
|
||||
files = {
|
||||
sslCertificate.secret = false;
|
||||
@@ -57,6 +60,7 @@ in
|
||||
pkgs.frappix.hrms
|
||||
pkgs.frappix.crm
|
||||
pkgs.frappix.posprinter
|
||||
pkgs.frappix.default_thai_company
|
||||
];
|
||||
sites = {
|
||||
"${sitename}" = {
|
||||
@@ -67,6 +71,7 @@ in
|
||||
"hrms"
|
||||
"crm"
|
||||
"posprinter"
|
||||
"default_thai_company"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
self.nixosModules.common
|
||||
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
@@ -23,15 +21,12 @@
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "aarch64-linux";
|
||||
};
|
||||
nixpkgs.buildPlatform = {
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
|
||||
services.journald.extraConfig = ''
|
||||
Storage=volatile
|
||||
RuntimeMaxUse=30M
|
||||
RuntimeMaxFileSize=10M
|
||||
'';
|
||||
|
||||
services.udisks2.enable = false;
|
||||
|
||||
nix.settings.log-lines = 25;
|
||||
@@ -54,6 +49,25 @@
|
||||
"sd_mod"
|
||||
];
|
||||
|
||||
boot = {
|
||||
consoleLogLevel = 0;
|
||||
kernel.sysctl = {
|
||||
"fs.suid_dumpable" = 0;
|
||||
"kernel.core_pattern" = "/dev/null";
|
||||
};
|
||||
tmp = {
|
||||
useTmpfs = true;
|
||||
};
|
||||
};
|
||||
|
||||
services.journald.extraConfig = ''
|
||||
Storage=none
|
||||
'';
|
||||
|
||||
systemd = {
|
||||
coredump.enable = false;
|
||||
};
|
||||
|
||||
fileSystems."/mnt/hdd" = {
|
||||
device = "zdata/nas";
|
||||
fsType = "zfs";
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# Apple Network
|
||||
|
||||
This service allows atalkd instances to connect to each other over vxlan over Yggdrasil. We need to use vxlan due to the support of broadcasting it provides. The service will form a network of star-topology vxlan using the underlying Yggdrasil network. With this vxlan network, we can have a private Apple Talk network over the internet.
|
||||
|
||||
|
||||
@@ -19,12 +19,6 @@
|
||||
description = "Public URL for accessing the instance";
|
||||
};
|
||||
|
||||
base_domain = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
default = "";
|
||||
description = "Defines the base domain to create the hostnames for MagicDNS in Headscale. `base_domain` must be a FQDN, without the trailing dot. The FQDN of the hosts will be `hostname.base_domain (e.g. myhost.tailnet.example.com)";
|
||||
};
|
||||
|
||||
advertise_routes = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default = [ ];
|
||||
@@ -32,6 +26,13 @@
|
||||
example = [ "192.168.1.0/24" ];
|
||||
};
|
||||
|
||||
dns = {
|
||||
base_domain = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
default = "";
|
||||
description = "Defines the base domain to create the hostnames for MagicDNS in Headscale. `base_domain` must be a FQDN, without the trailing dot. The FQDN of the hosts will be `hostname.base_domain (e.g. myhost.tailnet.example.com)";
|
||||
};
|
||||
|
||||
nameservers = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default = [
|
||||
@@ -41,6 +42,42 @@
|
||||
description = "List of nameservers to pass to Tailscale clients";
|
||||
example = [ "10.0.10.1" ];
|
||||
};
|
||||
|
||||
magic_dns = lib.mkOption {
|
||||
type = with lib.types; bool;
|
||||
default = true;
|
||||
description = "Whether to enable MagicDNS";
|
||||
};
|
||||
|
||||
extra_records = lib.mkOption {
|
||||
type =
|
||||
with lib.types;
|
||||
nullOr (
|
||||
listOf (submodule {
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "DNS record name.";
|
||||
example = "grafana.tailnet.example.com";
|
||||
};
|
||||
type = lib.mkOption {
|
||||
type = lib.types.enum [
|
||||
"A"
|
||||
"AAAA"
|
||||
];
|
||||
description = "DNS record type.";
|
||||
example = "A";
|
||||
};
|
||||
value = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "DNS record value (IP address).";
|
||||
example = "100.64.0.3";
|
||||
};
|
||||
};
|
||||
})
|
||||
);
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -170,10 +207,11 @@
|
||||
settings.server_url = "https://${settings.public_url}";
|
||||
|
||||
settings.dns = {
|
||||
base_domain = settings.base_domain;
|
||||
base_domain = settings.dns.base_domain;
|
||||
override_local_dns = true;
|
||||
nameservers.global = settings.nameservers;
|
||||
magic_dns = false;
|
||||
nameservers.global = settings.dns.nameservers;
|
||||
magic_dns = settings.dns.magic_dns;
|
||||
extra_records = settings.dns.extra_records;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
homeDirectory = lib.mkForce "/home/${username}";
|
||||
stateVersion = osConfig.system.stateVersion;
|
||||
packages = with pkgs; [
|
||||
libreoffice-fresh
|
||||
libreoffice-stable
|
||||
element-desktop
|
||||
signal-desktop
|
||||
brave
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
boot.supportedFilesystems = {
|
||||
ntfs = true;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
A peer to peer phone relay network built on top of yggdrasil.
|
||||
|
||||
Successor of the `phonebox` service with a global, decentralized number
|
||||
directory. Every box is reachable from any yggdrasil node running this
|
||||
service, not only from members of the same clan. A machine runs either
|
||||
`phonebox` or `phonebox-global`, not both (they share the asterisk setup).
|
||||
Regenerate vars with `clan vars generate --generator phonebox-global`.
|
||||
|
||||
## Numbers
|
||||
|
||||
Each box gets a random 6 digit number (100000-999999) when its vars are
|
||||
generated. The number is signed with the box's yggdrasil private key, so a
|
||||
number is cryptographically bound to the yggdrasil address it belongs to;
|
||||
nobody can claim a number for an address they do not own. Regenerate the
|
||||
`phonebox` vars to get a new number.
|
||||
|
||||
Dialing from a phone plugged into the ATA:
|
||||
|
||||
| dialed | reaches |
|
||||
| ------------- | ------------------------------------------ |
|
||||
| `NNNNNN` | the phone on box `NNNNNN` (line `00`) |
|
||||
| `NNNNNNXX` | line `XX` on box `NNNNNN` |
|
||||
| `00`, `01`... | local lines on this box |
|
||||
| `888` | fax of the current number directory |
|
||||
| `000` | fax echo test |
|
||||
| `999` | hello world |
|
||||
|
||||
Caller ID on the callee is the caller's box number followed by its line, so
|
||||
calling it back works.
|
||||
|
||||
## Directory
|
||||
|
||||
There is no central registry. Each box runs a serf agent on yggdrasil port
|
||||
7946 that gossips its signed number record (`number`, `key`, `sig`, `owner`
|
||||
tags) to every other box it knows about. On every membership change the
|
||||
`phonebox-sync` handler verifies all records and writes the resulting
|
||||
`number -> yggdrasil address` map to `/run/phonebox/numbers/`, which the
|
||||
asterisk dialplan reads at call time.
|
||||
|
||||
Bootstrapping: boxes of the same clan join each other automatically. To
|
||||
connect to boxes outside the clan add one of their yggdrasil addresses to
|
||||
`extraPeers`; after the first successful join the agent remembers the whole
|
||||
membership in `/var/lib/phonebox/serf.snapshot` and rejoins on its own.
|
||||
|
||||
`serf members -rpc-addr 127.0.0.1:7373` shows the live directory.
|
||||
@@ -0,0 +1,583 @@
|
||||
{
|
||||
clanLib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
_class = "clan.service";
|
||||
manifest.name = "phonebox-global";
|
||||
manifest.description = "A peer to peer phone relay network built on top of yggdrasil.";
|
||||
manifest.readme = builtins.readFile ./README.md;
|
||||
manifest.categories = [ "System" ];
|
||||
|
||||
roles.default = {
|
||||
description = "a default server role";
|
||||
interface =
|
||||
{ lib, ... }:
|
||||
{
|
||||
options.ata-ethernet-iface = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "An Ethernet interface that connect to ATA box.";
|
||||
default = "enp2s0";
|
||||
};
|
||||
options.extraClientNumbers = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
description = "List of client suffix number.";
|
||||
default = [ ];
|
||||
};
|
||||
|
||||
options.extraFixedIPClient = lib.mkOption {
|
||||
type = lib.types.attrsOf (
|
||||
lib.types.submodule {
|
||||
options = {
|
||||
ip = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "IP address for this client";
|
||||
};
|
||||
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Name of the client";
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
description = "Extra client to be added to pjsip config as a fixed IP auth";
|
||||
default = { };
|
||||
example = {
|
||||
"01" = {
|
||||
ip = "192.168.1.3";
|
||||
name = "bob";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
options.extraPeers = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
description = ''
|
||||
Yggdrasil addresses of phonebox nodes outside this clan to bootstrap
|
||||
the number directory from. Any single reachable node is enough; the
|
||||
directory is gossiped from there and remembered across restarts.
|
||||
'';
|
||||
default = [ ];
|
||||
example = [ "200:1234:5678:9abc:def0:1234:5678:9abc" ];
|
||||
};
|
||||
};
|
||||
perInstance =
|
||||
{
|
||||
roles,
|
||||
settings,
|
||||
...
|
||||
}:
|
||||
{
|
||||
|
||||
nixosModule =
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
asterisk = pkgs.asterisk.overrideAttrs (old: {
|
||||
propagatedNativeBuildInputs = [ pkgs.spandsp3 ];
|
||||
});
|
||||
|
||||
machineName = config.clan.core.settings.machine.name;
|
||||
machines = lib.attrNames roles.default.machines;
|
||||
|
||||
user = "asterisk";
|
||||
faxDir = "/run/asterisk/fax";
|
||||
rtpPortFrom = 10000;
|
||||
rtpPortTo = 20000;
|
||||
ata-interface = settings.ata-ethernet-iface;
|
||||
|
||||
# The ATA's own line. Remote callers reach it by dialing the 6
|
||||
# digit box number alone or with this extension appended.
|
||||
ataLine = "00";
|
||||
sipPort = 5060;
|
||||
|
||||
# Well-known port of the phonebox directory gossip. Every phonebox
|
||||
# node worldwide must agree on it, so it is not configurable.
|
||||
directoryPort = 7946;
|
||||
directoryRpc = "127.0.0.1:7373";
|
||||
directoryUser = "phonebox";
|
||||
directoryDir = "/run/phonebox";
|
||||
|
||||
phoneboxVars = config.clan.core.vars.generators.phonebox-global.files;
|
||||
ownNumber = phoneboxVars.number.value;
|
||||
ownerName = lib.trim phoneboxVars.owner-name.value;
|
||||
|
||||
getYggdrasilIP =
|
||||
name:
|
||||
lib.trim (
|
||||
clanLib.getPublicValue {
|
||||
flake = config.clan.core.settings.directory;
|
||||
machine = name;
|
||||
generator = "yggdrasil";
|
||||
file = "address";
|
||||
default = "";
|
||||
}
|
||||
);
|
||||
|
||||
ownYggdrasilIP =
|
||||
if config.clan.core.vars.generators.yggdrasil.files ? address then
|
||||
config.clan.core.vars.generators.yggdrasil.files.address.value
|
||||
else
|
||||
throw "clanService/yggdrasil is required";
|
||||
|
||||
seedPeers = lib.unique (
|
||||
lib.filter (ip: ip != "") (map getYggdrasilIP (lib.remove machineName machines))
|
||||
++ settings.extraPeers
|
||||
);
|
||||
|
||||
# Rebuilds the number -> yggdrasil address directory from the
|
||||
# gossip membership. Every record is verified: the yggdrasil
|
||||
# address is derived from the record's public key, so a node can
|
||||
# only publish numbers for the address it actually owns, and the
|
||||
# number is signed with the matching private key.
|
||||
phoneboxSync = pkgs.writers.writePython3Bin "phonebox-sync" {
|
||||
libraries = [ pkgs.python3Packages.cryptography ];
|
||||
flakeIgnore = [ "E501" ];
|
||||
} (builtins.readFile ./phonebox-sync.py);
|
||||
|
||||
phoneboxSyncWrapped = pkgs.writeShellApplication {
|
||||
name = "phonebox-sync";
|
||||
runtimeInputs = [ pkgs.serfdom ];
|
||||
text = ''
|
||||
exec ${lib.getExe phoneboxSync} ${directoryRpc} ${directoryDir}
|
||||
'';
|
||||
};
|
||||
|
||||
createContactListTiff = pkgs.writeShellApplication {
|
||||
name = "create-contact-tiff";
|
||||
text = ''
|
||||
magick -background white -fill black -pointsize 20 -font DejaVu-Sans label:"$(cat ${directoryDir}/contacts.txt)" "$1"
|
||||
magick "$1" -border 20x50 -bordercolor white "$1"
|
||||
magick "$1" -resize 1728x -units PixelsPerInch -compress Group4 -density 204x196 -monochrome -depth 1 "$1"
|
||||
'';
|
||||
runtimeInputs = [ pkgs.imagemagick ];
|
||||
};
|
||||
|
||||
genLocalSIPEndpoint =
|
||||
{ localNumber }:
|
||||
''
|
||||
[${localNumber}](internal_endpoint)
|
||||
aors=${localNumber}
|
||||
auth=${localNumber}
|
||||
|
||||
[${localNumber}](userpass_auth)
|
||||
username=${localNumber}
|
||||
password=${localNumber}
|
||||
|
||||
[${localNumber}](dynamic_aor)
|
||||
max_contacts=1
|
||||
remove_existing=yes
|
||||
'';
|
||||
|
||||
genLocalSIPEndpointV6 =
|
||||
{ localNumber }:
|
||||
''
|
||||
[${localNumber}](internal_endpoint)
|
||||
transport=transport-udp6
|
||||
aors=${localNumber}
|
||||
auth=${localNumber}
|
||||
|
||||
[${localNumber}](userpass_auth)
|
||||
username=${localNumber}
|
||||
password=${localNumber}
|
||||
|
||||
[${localNumber}](dynamic_aor)
|
||||
max_contacts=1
|
||||
'';
|
||||
|
||||
genLocalSIPIPEndpoint = number: ''
|
||||
|
||||
[${number}](internal_endpoint)
|
||||
aors=${number}
|
||||
auth=${number}
|
||||
contact_deny=0.0.0.0/0
|
||||
contact_deny=::/0
|
||||
contact_permit=${settings.extraFixedIPClient.${number}.ip}/128
|
||||
|
||||
[${number}](dynamic_aor)
|
||||
max_contacts=1
|
||||
remove_existing=yes
|
||||
|
||||
[${number}](userpass_auth)
|
||||
username=${number}
|
||||
password=${number}
|
||||
|
||||
'';
|
||||
|
||||
genLocalExtenConf =
|
||||
{ localNumber }:
|
||||
''
|
||||
exten => ${localNumber},1,Dial(PJSIP/${localNumber},20)
|
||||
'';
|
||||
|
||||
localNumbers = [
|
||||
ataLine
|
||||
]
|
||||
++ settings.extraClientNumbers
|
||||
++ lib.attrNames settings.extraFixedIPClient;
|
||||
in
|
||||
{
|
||||
assertions = [
|
||||
{
|
||||
assertion = !config.networking.nftables.enable;
|
||||
message = "phonebox-global: opening the yggdrasil interface to non-clan nodes is only implemented for the iptables firewall backend";
|
||||
}
|
||||
];
|
||||
|
||||
clan.core.vars.generators.phonebox-global = {
|
||||
files = {
|
||||
number.secret = false;
|
||||
public-key.secret = false;
|
||||
signature.secret = false;
|
||||
owner-name.secret = false;
|
||||
};
|
||||
|
||||
dependencies = [ "yggdrasil" ];
|
||||
|
||||
prompts.owner-name = {
|
||||
persist = true;
|
||||
type = "line";
|
||||
description = "The owner's name for this unit";
|
||||
};
|
||||
|
||||
runtimeInputs = with pkgs; [
|
||||
coreutils
|
||||
openssl
|
||||
xxd
|
||||
];
|
||||
|
||||
# A random 6 digit number (100000-999999), bound to this
|
||||
# machine's yggdrasil identity by signing it with the yggdrasil
|
||||
# private key. Other nodes accept the number only if the
|
||||
# signature checks out and the key derives to the yggdrasil
|
||||
# address the record is gossiped from. Regenerate to re-roll.
|
||||
script = ''
|
||||
cat $prompts/owner-name > $out/owner-name
|
||||
shuf -i 100000-999999 -n 1 | tr -d '\n' > $out/number
|
||||
openssl pkey -in $in/yggdrasil/privateKey -pubout -outform DER \
|
||||
| tail -c 32 | xxd -p -c 64 | tr -d '\n' > $out/public-key
|
||||
# openssl needs a regular file for one-shot ed25519 signing
|
||||
printf 'phonebox:%s' "$(cat $out/number)" > $out/message
|
||||
openssl pkeyutl -sign -rawin -inkey $in/yggdrasil/privateKey -in $out/message \
|
||||
| base64 -w0 > $out/signature
|
||||
rm $out/message
|
||||
'';
|
||||
};
|
||||
|
||||
networking.interfaces = {
|
||||
${ata-interface} = {
|
||||
useDHCP = false;
|
||||
ipv4.addresses = [
|
||||
{
|
||||
address = "192.168.254.1";
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
services.dnsmasq = {
|
||||
enable = true;
|
||||
|
||||
settings = {
|
||||
bind-dynamic = true;
|
||||
listen-address = "192.168.254.1";
|
||||
# enable-ra = true;
|
||||
domain-needed = true;
|
||||
domain = "localhost";
|
||||
dhcp-range = [
|
||||
"192.168.254.100,192.168.254.100,255.255.255.0,3m"
|
||||
];
|
||||
dhcp-leasefile = "/dev/null";
|
||||
dhcp-option = [
|
||||
"3,192.168.254.1"
|
||||
];
|
||||
interface = [ ata-interface ];
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
virtualHosts = {
|
||||
"_" = {
|
||||
locations."/" = {
|
||||
proxyPass = "http://192.168.254.100";
|
||||
extraConfig = ''
|
||||
client_max_body_size 100M;
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
networking.firewall.allowedUDPPortRanges = [
|
||||
{
|
||||
from = rtpPortFrom;
|
||||
to = rtpPortTo;
|
||||
}
|
||||
];
|
||||
|
||||
networking.firewall.allowedUDPPorts = [
|
||||
53
|
||||
67
|
||||
sipPort
|
||||
];
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
53
|
||||
];
|
||||
networking.firewall.interfaces = {
|
||||
"zt+".allowedTCPPorts = [ 80 ];
|
||||
ygg = {
|
||||
allowedTCPPorts = [ directoryPort ];
|
||||
allowedUDPPorts = [ directoryPort ];
|
||||
};
|
||||
};
|
||||
|
||||
# clanService/yggdrasil drops everything on the ygg interface that
|
||||
# does not come from a clan member. Phonebox is a global network,
|
||||
# so let SIP, RTP and the directory gossip through from anyone.
|
||||
networking.firewall.extraCommands = lib.mkAfter ''
|
||||
if ip6tables -n -L ygg-input >/dev/null 2>&1; then
|
||||
ip6tables -I ygg-input 1 -i ygg -p udp --dport ${toString sipPort} -j RETURN
|
||||
ip6tables -I ygg-input 1 -i ygg -p udp --dport ${toString rtpPortFrom}:${toString rtpPortTo} -j RETURN
|
||||
ip6tables -I ygg-input 1 -i ygg -p udp --dport ${toString directoryPort} -j RETURN
|
||||
ip6tables -I ygg-input 1 -i ygg -p tcp --dport ${toString directoryPort} -j RETURN
|
||||
fi
|
||||
'';
|
||||
|
||||
users.users.${directoryUser} = {
|
||||
isSystemUser = true;
|
||||
group = directoryUser;
|
||||
};
|
||||
users.groups.${directoryUser} = { };
|
||||
|
||||
# Decentralized number directory: a serf gossip cluster over
|
||||
# yggdrasil. Each node advertises its signed number record as
|
||||
# tags; membership changes trigger phonebox-sync, which writes the
|
||||
# verified number -> address map to ${directoryDir}/numbers/ for
|
||||
# the dialplan. The snapshot lets a node rejoin from previously
|
||||
# seen members, so seeds are only needed for the very first join.
|
||||
systemd.services.phonebox-directory = {
|
||||
description = "Phonebox number directory (serf gossip over yggdrasil)";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
wants = [ "network-online.target" ];
|
||||
after = [
|
||||
"network-online.target"
|
||||
"yggdrasil.service"
|
||||
];
|
||||
serviceConfig = {
|
||||
User = directoryUser;
|
||||
Group = directoryUser;
|
||||
RuntimeDirectory = "phonebox";
|
||||
RuntimeDirectoryMode = "0755";
|
||||
RuntimeDirectoryPreserve = "yes";
|
||||
StateDirectory = "phonebox";
|
||||
Restart = "always";
|
||||
RestartSec = 5;
|
||||
ExecStart = lib.concatStringsSep " " (
|
||||
[
|
||||
(lib.getExe pkgs.serfdom)
|
||||
"agent"
|
||||
"-node=${machineName}-${ownNumber}"
|
||||
"-bind=[::]:${toString directoryPort}"
|
||||
"-advertise=[${ownYggdrasilIP}]:${toString directoryPort}"
|
||||
"-rpc-addr=${directoryRpc}"
|
||||
"-profile=wan"
|
||||
"-snapshot=/var/lib/phonebox/serf.snapshot"
|
||||
"-rejoin"
|
||||
"-retry-max=0"
|
||||
"-retry-interval=30s"
|
||||
"-tag number=${ownNumber}"
|
||||
"-tag key=${phoneboxVars.public-key.value}"
|
||||
"-tag sig=${phoneboxVars.signature.value}"
|
||||
"-tag ${lib.escapeShellArg "owner=${ownerName}"}"
|
||||
"-event-handler=member-join,member-leave,member-failed,member-update,member-reap=${lib.getExe phoneboxSyncWrapped}"
|
||||
]
|
||||
++ map (ip: "-retry-join=[${ip}]:${toString directoryPort}") seedPeers
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
services.asterisk = {
|
||||
enable = lib.mkDefault true;
|
||||
package = lib.mkDefault asterisk;
|
||||
confFiles = {
|
||||
"logger.conf" = ''
|
||||
[general]
|
||||
dateformat = %F %T.%3q ; ISO 8601 date format with milliseconds
|
||||
use_callids = yes
|
||||
appendhostname = no
|
||||
queue_log = yes
|
||||
queue_log_to_file = no
|
||||
queue_log_name = queue_log
|
||||
queue_log_realtime_use_gmt = no
|
||||
rotatestrategy = rotate
|
||||
exec_after_rotate=gzip -9 $\{filename\}.2
|
||||
[logfiles]
|
||||
console => notice,warning,error
|
||||
security => security
|
||||
messages => notice,warning,error
|
||||
full => notice,warning,error,verbose,dtmf,fax
|
||||
syslog.local0 => notice,warning,error
|
||||
'';
|
||||
|
||||
"modules.conf" = ''
|
||||
[modules]
|
||||
autoload=yes
|
||||
|
||||
load => res_fax_spandsp.so
|
||||
'';
|
||||
|
||||
# Dial plan config
|
||||
"extensions.conf" = ''
|
||||
[from-internal]
|
||||
exten => 999,1,Answer()
|
||||
same => n,Playback(hello-world)
|
||||
same => n,Hangup()
|
||||
|
||||
exten => 000,1,Answer()
|
||||
same => n,ReceiveFAX(${faxDir}/echo-''${UNIQUEID}.tiff)
|
||||
same => n,Set(FAXFILE=${faxDir}/echo-''${UNIQUEID}.tiff)
|
||||
same => n,Set(FAXECHO=true)
|
||||
|
||||
exten => 888,1,Answer()
|
||||
same => n,Set(FAXFILE=${faxDir}/contact.tiff)
|
||||
same => n,System(${lib.getExe createContactListTiff} ''${FAXFILE})
|
||||
same => n,Set(FAXECHO=true)
|
||||
same => n,Playback(vm-goodbye)
|
||||
same => n,Wait(3)
|
||||
|
||||
exten => h,1,GotoIf($[''${FAXECHO}]?sendfax)
|
||||
same => n,Hangup()
|
||||
same => n(sendfax),Originate(PJSIP/${ataLine},app,SendFAX,''${FAXFILE})
|
||||
same => n,Set(FAXECHO=false)
|
||||
|
||||
; 6 digit box number, optionally followed by a 2 digit line
|
||||
exten => _[1-9]XXXXX,1,Goto(to-yggdrasil,''${EXTEN},1)
|
||||
exten => _[1-9]XXXXXXX,1,Goto(to-yggdrasil,''${EXTEN},1)
|
||||
|
||||
''
|
||||
+ lib.concatMapStrings (number: genLocalExtenConf { localNumber = number; }) localNumbers
|
||||
+ ''
|
||||
|
||||
; Outbound: resolve the box number through the directory and
|
||||
; send the call to that node over yggdrasil.
|
||||
[to-yggdrasil]
|
||||
exten => _[1-9]X.,1,Set(PEER=''${FILE(${directoryDir}/numbers/''${EXTEN:0:6})})
|
||||
same => n,GotoIf($["''${PEER}" = ""]?unknown)
|
||||
same => n,Set(CALLERID(num)=${ownNumber}''${CALLERID(num)})
|
||||
same => n,Set(CALLERID(name)=${ownerName})
|
||||
same => n,Dial(PJSIP/yggdrasil/sip:''${EXTEN}@[''${PEER}]:${toString sipPort},30)
|
||||
same => n,Hangup()
|
||||
same => n(unknown),Playback(ss-noservice)
|
||||
same => n,Hangup()
|
||||
|
||||
; Inbound from any yggdrasil node: only our own number is served.
|
||||
[from-yggdrasil]
|
||||
exten => ${ownNumber},1,Dial(PJSIP/${ataLine},20)
|
||||
exten => _${ownNumber}XX,1,Dial(PJSIP/''${EXTEN:6},20)
|
||||
'';
|
||||
|
||||
"rtp.conf" = ''
|
||||
[general]
|
||||
rtpstart=${toString rtpPortFrom}
|
||||
rtpend=${toString rtpPortTo}
|
||||
'';
|
||||
|
||||
"pjsip.conf" = ''
|
||||
[global]
|
||||
type=global
|
||||
; Local lines authenticate by username; everything else from
|
||||
; the yggdrasil range is a remote phonebox node.
|
||||
endpoint_identifier_order=username,ip,anonymous
|
||||
|
||||
[transport-udp]
|
||||
type=transport
|
||||
protocol=udp
|
||||
bind=0.0.0.0
|
||||
[transport-udp6]
|
||||
type=transport
|
||||
protocol=udp
|
||||
bind=::
|
||||
|
||||
[base_endpoint](!)
|
||||
type=endpoint
|
||||
disallow=all
|
||||
allow=ulaw,alaw,g722,gsm
|
||||
direct_media=no
|
||||
|
||||
[internal_endpoint](!,base_endpoint)
|
||||
context=from-internal
|
||||
|
||||
[userpass_auth](!)
|
||||
type=auth
|
||||
auth_type=userpass
|
||||
|
||||
[dynamic_aor](!)
|
||||
type=aor
|
||||
|
||||
[yggdrasil](base_endpoint)
|
||||
transport=transport-udp6
|
||||
context=from-yggdrasil
|
||||
|
||||
[yggdrasil]
|
||||
type=identify
|
||||
endpoint=yggdrasil
|
||||
match=200::/7
|
||||
|
||||
''
|
||||
+ (genLocalSIPEndpoint { localNumber = ataLine; })
|
||||
+ lib.concatMapStrings (
|
||||
number: genLocalSIPEndpointV6 { localNumber = number; }
|
||||
) settings.extraClientNumbers
|
||||
+ lib.concatMapStrings genLocalSIPIPEndpoint (lib.attrNames settings.extraFixedIPClient);
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [
|
||||
createContactListTiff
|
||||
phoneboxSyncWrapped
|
||||
];
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
"d ${faxDir} 0755 ${user} ${user} - -"
|
||||
];
|
||||
|
||||
systemd.services.asterisk-watcher = {
|
||||
enable = true;
|
||||
description = "Asterisk Configuration files watcher";
|
||||
|
||||
requires = [ "asterisk.service" ];
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
path = with pkgs; [
|
||||
inotify-tools
|
||||
asterisk
|
||||
];
|
||||
script = ''
|
||||
inotifywait -m -e move /etc/asterisk |
|
||||
while read path action file; do
|
||||
case "$file" in
|
||||
pjsip.conf)
|
||||
echo "restarting pjsip"
|
||||
asterisk -rx "pjsip reload"
|
||||
;;
|
||||
esac
|
||||
case "$file" in
|
||||
extensions.conf)
|
||||
echo "restarting core"
|
||||
asterisk -rx "core restart now"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
inputs,
|
||||
self,
|
||||
...
|
||||
}:
|
||||
let
|
||||
module = ./default.nix;
|
||||
in
|
||||
{
|
||||
clan.modules = {
|
||||
phonebox-global = module;
|
||||
};
|
||||
perSystem =
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
clan.nixosTests.service-phonebox-global = {
|
||||
imports = [ ./tests/vm/default.nix ];
|
||||
_module.args = { inherit self inputs; };
|
||||
|
||||
clan.modules."@clan/phonebox-global" = module;
|
||||
};
|
||||
|
||||
# Unit tests for the directory sync logic (record verification,
|
||||
# address derivation, collision handling, file output).
|
||||
checks.phonebox-global-sync =
|
||||
pkgs.runCommand "phonebox-global-sync-test"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
(pkgs.python3.withPackages (ps: [ ps.cryptography ]))
|
||||
pkgs.yggdrasil
|
||||
];
|
||||
PHONEBOX_SYNC = ./phonebox-sync.py;
|
||||
}
|
||||
''
|
||||
python3 ${./tests/sync/test_sync.py} -v
|
||||
touch $out
|
||||
'';
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
"""Rebuild the phonebox number directory from serf membership.
|
||||
|
||||
Usage: phonebox-sync <serf rpc addr> <state dir>
|
||||
|
||||
Runs as a serf event handler. Every alive member carries its number record
|
||||
as tags (number, key, sig, owner). A record is accepted only when the
|
||||
yggdrasil address it is gossiped from derives from `key` and `sig` is a
|
||||
valid ed25519 signature of "phonebox:<number>" under that key, so a number
|
||||
can only ever be bound to the address of the node that signed it.
|
||||
|
||||
Output, consumed by the asterisk dialplan:
|
||||
<state dir>/numbers/<number> the yggdrasil address, no trailing newline
|
||||
<state dir>/contacts.txt "<number> : <owner>" per line, for the fax
|
||||
"""
|
||||
|
||||
import base64
|
||||
import ipaddress
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import syslog
|
||||
import tempfile
|
||||
|
||||
from cryptography.exceptions import InvalidSignature
|
||||
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
|
||||
|
||||
|
||||
def yggdrasil_address(public_key: bytes) -> ipaddress.IPv6Address:
|
||||
"""Port of yggdrasil-go address.AddrForKey.
|
||||
|
||||
Invert the key; the address is 0x02, the count of leading one bits,
|
||||
then the bits following the first zero, truncated to 128 bits.
|
||||
"""
|
||||
bits = "".join(f"{b ^ 0xFF:08b}" for b in public_key)
|
||||
ones = len(bits) - len(bits.lstrip("1"))
|
||||
body = int(bits[ones + 1:ones + 113], 2).to_bytes(14, "big")
|
||||
return ipaddress.IPv6Address(bytes([0x02, ones]) + body)
|
||||
|
||||
|
||||
def verified_record(member: dict) -> tuple[str, str, str, str]:
|
||||
"""Return (number, key hex, address, owner) or raise ValueError."""
|
||||
tags = member.get("tags", {})
|
||||
try:
|
||||
number, key_hex, sig = tags["number"], tags["key"], tags["sig"]
|
||||
key = bytes.fromhex(key_hex)
|
||||
host, _ = member["addr"].rsplit(":", 1)
|
||||
address = ipaddress.IPv6Address(host.strip("[]"))
|
||||
signature = base64.b64decode(sig, validate=True)
|
||||
except (KeyError, ValueError) as e:
|
||||
raise ValueError(f"malformed record: {e}")
|
||||
if not (len(number) == 6 and number.isdigit() and number[0] != "0"):
|
||||
raise ValueError(f"invalid number {number!r}")
|
||||
if yggdrasil_address(key) != address:
|
||||
raise ValueError(f"key does not derive to address {address}")
|
||||
try:
|
||||
Ed25519PublicKey.from_public_bytes(key).verify(signature, b"phonebox:" + number.encode())
|
||||
except (ValueError, InvalidSignature):
|
||||
raise ValueError(f"bad signature for number {number}")
|
||||
return number, key_hex, str(address), tags.get("owner", "")
|
||||
|
||||
|
||||
def directory(members: list[dict]) -> dict[str, tuple[str, str, str]]:
|
||||
"""number -> (key hex, address, owner); on a collision the lowest key wins."""
|
||||
book = {}
|
||||
for member in members:
|
||||
try:
|
||||
number, key, address, owner = verified_record(member)
|
||||
except ValueError as e:
|
||||
syslog.syslog(syslog.LOG_WARNING, f"ignoring {member.get('name')}: {e}")
|
||||
continue
|
||||
if number in book:
|
||||
syslog.syslog(syslog.LOG_WARNING, f"number {number} claimed by keys {book[number][0]} and {key}")
|
||||
if book[number][0] <= key:
|
||||
continue
|
||||
book[number] = (key, address, owner)
|
||||
return book
|
||||
|
||||
|
||||
def write_atomic(path: str, content: str) -> None:
|
||||
fd, tmp = tempfile.mkstemp(dir=os.path.dirname(path))
|
||||
with os.fdopen(fd, "w") as f:
|
||||
f.write(content)
|
||||
os.chmod(tmp, 0o644)
|
||||
os.replace(tmp, path)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
rpc_addr, state_dir = sys.argv[1:]
|
||||
syslog.openlog("phonebox-sync")
|
||||
out = subprocess.run(
|
||||
["serf", "members", "-format=json", "-status=alive", f"-rpc-addr={rpc_addr}"],
|
||||
check=True, capture_output=True, text=True,
|
||||
).stdout
|
||||
book = directory(json.loads(out)["members"])
|
||||
|
||||
numbers_dir = os.path.join(state_dir, "numbers")
|
||||
os.makedirs(numbers_dir, exist_ok=True)
|
||||
for number, (_, address, _) in book.items():
|
||||
write_atomic(os.path.join(numbers_dir, number), address)
|
||||
for stale in set(os.listdir(numbers_dir)) - book.keys():
|
||||
os.unlink(os.path.join(numbers_dir, stale))
|
||||
write_atomic(
|
||||
os.path.join(state_dir, "contacts.txt"),
|
||||
"".join(f"{number}\t\t: \t\t{book[number][2]}\n" for number in sorted(book)),
|
||||
)
|
||||
syslog.syslog(syslog.LOG_INFO, f"directory has {len(book)} numbers")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,164 @@
|
||||
"""Tests for phonebox-sync: record verification and directory output.
|
||||
|
||||
Run via the `phonebox-global-sync` flake check; needs the `cryptography`
|
||||
python package and the `yggdrasil` binary on PATH.
|
||||
"""
|
||||
|
||||
import base64
|
||||
import importlib.util
|
||||
import ipaddress
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
|
||||
|
||||
spec = importlib.util.spec_from_file_location("phonebox_sync", os.environ["PHONEBOX_SYNC"])
|
||||
sync = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(sync)
|
||||
|
||||
PORT = 7946
|
||||
|
||||
|
||||
class Node:
|
||||
"""A phonebox node identity: yggdrasil key, address and signed number."""
|
||||
|
||||
def __init__(self, number: str, owner: str = ""):
|
||||
self.key = Ed25519PrivateKey.generate()
|
||||
self.public = self.key.public_key().public_bytes_raw()
|
||||
self.address = str(sync.yggdrasil_address(self.public))
|
||||
self.number = number
|
||||
self.owner = owner
|
||||
|
||||
def member(self, name="node", **overrides) -> dict:
|
||||
tags = {
|
||||
"number": self.number,
|
||||
"key": self.public.hex(),
|
||||
"sig": base64.b64encode(self.key.sign(b"phonebox:" + self.number.encode())).decode(),
|
||||
"owner": self.owner,
|
||||
}
|
||||
member = {"name": name, "addr": f"[{self.address}]:{PORT}", "port": PORT, "status": "alive", "tags": tags}
|
||||
for k, v in overrides.items():
|
||||
(tags if k in tags else member)[k] = v
|
||||
return member
|
||||
|
||||
|
||||
def yggdrasil_binary_address(key: Ed25519PrivateKey) -> str:
|
||||
private = key.private_bytes_raw() + key.public_key().public_bytes_raw()
|
||||
out = subprocess.run(
|
||||
["yggdrasil", "-useconf", "-address"],
|
||||
input=json.dumps({"PrivateKey": private.hex()}),
|
||||
check=True, capture_output=True, text=True,
|
||||
)
|
||||
return out.stdout.strip()
|
||||
|
||||
|
||||
class AddressDerivation(unittest.TestCase):
|
||||
def test_known_vector(self):
|
||||
# A real clan machine key and the address yggdrasil assigned to it.
|
||||
key = bytes.fromhex("0ec53986a2bdca8a43f74063aeab6a958fc697c528c83e7281365072926886f0")
|
||||
self.assertEqual(str(sync.yggdrasil_address(key)), "204:2758:cf2b:a846:aeb7:8117:f38a:2a92")
|
||||
|
||||
def test_matches_yggdrasil_binary(self):
|
||||
for _ in range(16):
|
||||
key = Ed25519PrivateKey.generate()
|
||||
expected = ipaddress.IPv6Address(yggdrasil_binary_address(key))
|
||||
self.assertEqual(sync.yggdrasil_address(key.public_key().public_bytes_raw()), expected)
|
||||
|
||||
|
||||
class RecordVerification(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.node = Node("482913", owner="alice")
|
||||
|
||||
def test_valid_record(self):
|
||||
number, key, address, owner = sync.verified_record(self.node.member())
|
||||
self.assertEqual((number, key, address, owner), ("482913", self.node.public.hex(), self.node.address, "alice"))
|
||||
|
||||
def test_record_from_foreign_address_is_rejected(self):
|
||||
other = Node("111111")
|
||||
with self.assertRaisesRegex(ValueError, "does not derive"):
|
||||
sync.verified_record(self.node.member(addr=f"[{other.address}]:{PORT}"))
|
||||
|
||||
def test_signature_over_other_number_is_rejected(self):
|
||||
with self.assertRaisesRegex(ValueError, "bad signature"):
|
||||
sync.verified_record(self.node.member(number="999999"))
|
||||
|
||||
def test_garbage_signature_is_rejected(self):
|
||||
with self.assertRaisesRegex(ValueError, "malformed"):
|
||||
sync.verified_record(self.node.member(sig="not base64!"))
|
||||
|
||||
def test_missing_tags_are_rejected(self):
|
||||
with self.assertRaisesRegex(ValueError, "malformed"):
|
||||
sync.verified_record({"name": "foreign", "addr": f"[{self.node.address}]:{PORT}", "tags": {}})
|
||||
|
||||
def test_number_must_be_six_digits_without_leading_zero(self):
|
||||
for bad in ["012345", "12345", "1234567", "12a456", ""]:
|
||||
node = Node(bad)
|
||||
with self.assertRaisesRegex(ValueError, "invalid number", msg=bad):
|
||||
sync.verified_record(node.member())
|
||||
|
||||
def test_owner_defaults_to_empty(self):
|
||||
member = self.node.member()
|
||||
del member["tags"]["owner"]
|
||||
self.assertEqual(sync.verified_record(member)[3], "")
|
||||
|
||||
|
||||
class Directory(unittest.TestCase):
|
||||
def test_invalid_records_are_skipped_not_fatal(self):
|
||||
good = Node("482913", owner="alice")
|
||||
bad = Node("555555")
|
||||
members = [bad.member(sig="AAAA"), good.member(), {"name": "x", "addr": "[200::1]:7946", "tags": {}}]
|
||||
self.assertEqual(sync.directory(members), {"482913": (good.public.hex(), good.address, "alice")})
|
||||
|
||||
def test_collision_lowest_key_wins_regardless_of_order(self):
|
||||
a, b = Node("482913"), Node("482913")
|
||||
winner = min((a, b), key=lambda n: n.public.hex())
|
||||
for members in ([a.member("a"), b.member("b")], [b.member("b"), a.member("a")]):
|
||||
self.assertEqual(sync.directory(members)["482913"][1], winner.address)
|
||||
|
||||
|
||||
class Main(unittest.TestCase):
|
||||
def run_sync(self, members: list[dict], state: str) -> None:
|
||||
bindir = tempfile.mkdtemp()
|
||||
with open(os.path.join(bindir, "serf"), "w") as f:
|
||||
f.write("#!/bin/sh\ncat <<'EOF'\n" + json.dumps({"members": members}) + "\nEOF\n")
|
||||
os.chmod(os.path.join(bindir, "serf"), 0o755)
|
||||
env_path = os.environ["PATH"]
|
||||
os.environ["PATH"] = bindir + os.pathsep + env_path
|
||||
argv = sys.argv
|
||||
sys.argv = ["phonebox-sync", "127.0.0.1:7373", state]
|
||||
try:
|
||||
sync.main()
|
||||
finally:
|
||||
sys.argv = argv
|
||||
os.environ["PATH"] = env_path
|
||||
|
||||
def test_writes_numbers_and_contacts_and_removes_stale(self):
|
||||
state = tempfile.mkdtemp()
|
||||
os.makedirs(os.path.join(state, "numbers"))
|
||||
with open(os.path.join(state, "numbers", "111111"), "w") as f:
|
||||
f.write("200::dead")
|
||||
a, b = Node("482913", owner="alice"), Node("555555", owner="bob")
|
||||
self.run_sync([b.member("b"), a.member("a")], state)
|
||||
|
||||
numbers = os.path.join(state, "numbers")
|
||||
self.assertEqual(sorted(os.listdir(numbers)), ["482913", "555555"])
|
||||
with open(os.path.join(numbers, "482913")) as f:
|
||||
self.assertEqual(f.read(), a.address) # no trailing newline: read by FILE() in the dialplan
|
||||
with open(os.path.join(state, "contacts.txt")) as f:
|
||||
self.assertEqual(f.read(), "482913\t\t: \t\talice\n555555\t\t: \t\tbob\n")
|
||||
|
||||
def test_empty_membership_clears_directory(self):
|
||||
state = tempfile.mkdtemp()
|
||||
self.run_sync([Node("482913").member()], state)
|
||||
self.run_sync([], state)
|
||||
self.assertEqual(os.listdir(os.path.join(state, "numbers")), [])
|
||||
with open(os.path.join(state, "contacts.txt")) as f:
|
||||
self.assertEqual(f.read(), "")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
self,
|
||||
hostPkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
name = "service-phonebox-global";
|
||||
result.update-vars =
|
||||
let
|
||||
relativeDir = lib.removePrefix "${self}/" (toString config.clan.directory);
|
||||
in
|
||||
hostPkgs.writeShellScriptBin "update-vars" ''
|
||||
set -x
|
||||
export PRJ_ROOT=$(git rev-parse --show-toplevel)
|
||||
${
|
||||
self.inputs.clan-core.packages.${hostPkgs.system}.clan-cli
|
||||
}/bin/clan-generate-test-vars $PRJ_ROOT/${relativeDir} ${config.name}
|
||||
'';
|
||||
|
||||
clan = {
|
||||
test.useContainers = false;
|
||||
directory = ./.;
|
||||
inventory = {
|
||||
machines.server = { };
|
||||
machines.nodeA = { };
|
||||
|
||||
instances = {
|
||||
yggdrasil = {
|
||||
module.name = "yggdrasil";
|
||||
roles.default.machines.server = { };
|
||||
roles.default.machines.nodeA = { };
|
||||
};
|
||||
phonebox-global-test = {
|
||||
module.name = "@clan/phonebox-global";
|
||||
module.input = "self";
|
||||
roles.default.machines.server.settings.ata-ethernet-iface = "enp2s0";
|
||||
roles.default.machines.nodeA.settings.ata-ethernet-iface = "enp2s0";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nodes = {
|
||||
server = { };
|
||||
nodeA = { };
|
||||
};
|
||||
|
||||
testScript =
|
||||
{ nodes, ... }:
|
||||
let
|
||||
number = node: nodes.${node}.clan.core.vars.generators.phonebox-global.files.number.value;
|
||||
address = node: nodes.${node}.clan.core.vars.generators.yggdrasil.files.address.value;
|
||||
in
|
||||
''
|
||||
start_all()
|
||||
|
||||
for node in [server, nodeA]:
|
||||
node.wait_for_unit("asterisk.service")
|
||||
node.wait_for_unit("phonebox-directory.service")
|
||||
|
||||
# Directory converges: each node learns the other's number and address.
|
||||
server.wait_until_succeeds("test -f /run/phonebox/numbers/${number "nodeA"}", timeout=300)
|
||||
nodeA.wait_until_succeeds("test -f /run/phonebox/numbers/${number "server"}", timeout=300)
|
||||
assert server.succeed("cat /run/phonebox/numbers/${number "nodeA"}") == "${address "nodeA"}"
|
||||
assert nodeA.succeed("cat /run/phonebox/numbers/${number "server"}") == "${address "server"}"
|
||||
assert "${number "nodeA"}" in server.succeed("cat /run/phonebox/contacts.txt")
|
||||
|
||||
# A call from server to nodeA's number is routed over yggdrasil and
|
||||
# accepted by nodeA's asterisk (no phone is registered, so it fails
|
||||
# after being identified, which is enough to prove the path).
|
||||
nodeA.succeed("asterisk -rx 'pjsip set logger on'")
|
||||
server.succeed("asterisk -rx 'channel originate Local/${number "nodeA"}@from-internal application Wait 3'")
|
||||
nodeA.wait_until_succeeds("grep -q 'INVITE sip:${number "nodeA"}@' /var/log/asterisk/full", timeout=60)
|
||||
'';
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age18yf7r0dalnue5vwzanxl046fxsskhu9lzvd488ajhz7rp62mu94scmw3w4",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age1sy8xkmssttcchjj0nkapk4tu530lrzszdp4lka6nn4gzlxam6e2s3xzp2j",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:NkOeX6FboG7NOkdgiTgAsS+XjRoDU+AEYfMhpZXIJTYEM2dQti+PMGyizKRvr1wRnSGMp56XaX0bHdToBuf1gYruqAsEkKwqsYw=,iv:RFyO5/JybroNAKe+F3vv51l4OEu5XXNs+biTTH8poEg=,tag:zfPm0ZAjT2CC734EU+36KQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA2RklrTFQxMll5VUxiaGVu\nNlRzeldTRnVrSG93TXYzc1YrRE9Nc1VqTHpNCjh4aHJMZmtpM2tDclNaT3d2SDhN\na1QxTXVFOHRuY3dpL1YxMTJKK3pUVmMKLS0tIHoyMGVyc01vak5EKzZONC9XUmFw\nMU5MRmx6UDROQzFiaTNuNXFiQTZoYmcK6wxypuP7vTnz//EcEt2pUNqUuKxjOaY3\nAmKToJQADJfzTsYGzpmWkkYaMHvG00v8Ja6TF6IxZr5SxUh4bdHr+w==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-09-18T02:02:10Z",
|
||||
"mac": "ENC[AES256_GCM,data:kRpbcT5+I80iHPjPUnveQE9jpa65n0xPPQR/by4p1iM80ZKk9KH0cObB5hHhXO4BD1OqI79UJ3O9O7Jhmylgx5Uh8RNbK6wf26p4GO2Bvqh9r15NqbCZtXkoW30MTLLIs58Q7NeK9O2LgeckWrXLtyEytfhnTuoTSDFo8Sh8NQY=,iv:rcNow1Z4BN7bo1XERB6c+G6Gwl3tRU1VHvYmoDaLTl4=,tag:vy/5EB/1gw/KLLqXHSEV3g==,type:str]",
|
||||
"version": "3.13.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
../../../users/admin
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:Sy9T0zEgSGZ/qkz5kaRN2qlH2X+pFRibzb8FpWuknuSI/9lActSG2Loq4LhmhqPGC5MGVkQcz2pcVFI7afUjzDzejfJf4De1ka4=,iv:JNLXguWEwJXR2+WNl0v0nUvkESVAbccfeQSUijKbj2I=,tag:/AAFKncO+B/XmUZYTQnTTw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqOXJoSXgvcEFXK2hWTlpi\nQWhCdnZPUCt5R2xEWFYxUnpWVlc1ei93TncwCjNKaVB0MFN1VUdheEwyUTBzcmFT\nb0RjTHp2MGE4cWIraCtZME9rQXAvVEkKLS0tIFpiZDhCN0NIY3FWTnlXaFhiMmtC\nTFJMUncvMnFRSEhNdHlhaWozcjlqYWsKLDH1VFG/QS3VIMn6Iwo2NmY5kdBiOPNR\nj4sOY6xBpWP5AiGUypGoX4Bm52gLgW5AdcBRIxxhFOekIv5G8wmRaw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-09-18T02:02:23Z",
|
||||
"mac": "ENC[AES256_GCM,data:DN97Dcpy29IZkBbwFVnMxnUnWYrgLKuvbANabkMCdpOJYgI1msYODltHJlR68Lk8Fmg25sXysvdbJOnc2cMH3pgcKxeyfhdAFwlIXdie1HRtTpZql15RF0fwPBGJjwL9YYubpZU7K4cNflGbjuOCEhp8bQOUYY8Ptd2deiDGGuw=,iv:bxTcKLUu6fcz7JKzStKiakgBeNx7aWCw6M7HolthfEo=,tag:/0nWBkdCPkpcWSpcfY/TfA==,type:str]",
|
||||
"version": "3.13.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
../../../users/admin
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
|
||||
"type": "age"
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
392268
|
||||
+1
@@ -0,0 +1 @@
|
||||
fake_line_value
|
||||
+1
@@ -0,0 +1 @@
|
||||
cf28bbcd822efec197dfaa99fbe9004f78b4efa9724b4f453d05f12a61a0bb44
|
||||
+1
@@ -0,0 +1 @@
|
||||
CrnzGbqfVORt00zeI99crpBRUMfGF+2uEfaHe1L3Y8k7CIojc+8TID40HPhwEgXNtC9/xr61mN5L0Vp4vpviBA==
|
||||
@@ -0,0 +1 @@
|
||||
200:61ae:8864:fba2:27c:d040:aacc:82d
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../../../../sops/machines/nodeA
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:hR33SvxgsU+hZnvF2hoQxE7n0IB6kLC9MgK0wS0NXpCht5NuPjTo5p51oUE8t95Dht2qlEdXAkGO39k/h42p54vhqcfuF7u/eqVMdX6pEJyOokFmsdDmdVZziyhZghrTI/nDlctxCPcqFkeCHU4SIBZs85NS8uk=,iv:Q8k8OXSS3lFw33UO8JiZYNkrH3s+Cvh0xnAbMiBmnNA=,tag:DtNYKgDYB2nSHIjvMdvu/w==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTSzk1RUhIekVJRStQd3Er\nbXlHUmtVb201dkRteVR1VFpoMTVFcTFPSG5NCmlPcVM5cWVJQ0g0VHNXaS9rTzh2\nWTIyQnRXakVCRWRQL0xuVUdDOEV0WEUKLS0tIE43RENWL1M2STF1VzdMcHJTNThh\ndHpqNE9MMnkrMlIxN2FEcjZ6anRIbDAK3rZ1lzO42bH37lb+zoeF6rKoVgI0TBST\n9EoVwom5xOKtmVAh5jobY/z4TGSD1BqQ6P2rQ/IM1Dtw3/18Yk7TXQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age18yf7r0dalnue5vwzanxl046fxsskhu9lzvd488ajhz7rp62mu94scmw3w4"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkdDFsSTZHUG54ZWNtQVdj\nZno4enBaRVlaQU1wNTBEVDVscS9Jc1JaTXhjClA3YUNQa3B2L0JXY25SSHRGbS94\nNVVNdHZ5VzdXcWpXZG1ZS1U4T0NPUkEKLS0tIFJLVmZyazU4dWUyVnpvRDRWbHNn\nZFQ3dlhxN0lwc0loWEZIOE0yMElRV0EKeUVy2QpLHbJ8JUCl07f74V+ZnRkGfDdP\n5W28yiLuq+LYfKUaFYeRDvSVFCQo6FiYJcBPGmnPF5gg1BIUtUUBYw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-09-18T02:02:10Z",
|
||||
"mac": "ENC[AES256_GCM,data:Oq1UCi+VYuuAkMmVBife740m6fiXC+PfkaQAii+FORyv8Zpj938cPrZzE9z/LO5Ixye5cbUHGRhZr0vM1egnv9nhIFyfGinKyE/BLEOXHxOtHnAXSQOJU2bWiR6w/QzVCTy6vTTVnqD2AtEfbKndIK1PJ0ASLvxMGaRqRsA/juE=,iv:xCEQg6DHV6hbyfBk62bUKA1lnC3HgQtkn2o8i2CFjhs=,tag:Zvt9tomYGoDFDQGjLZC59A==,type:str]",
|
||||
"version": "3.13.3"
|
||||
}
|
||||
}
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../../../../sops/users/admin
|
||||
@@ -0,0 +1 @@
|
||||
cf28bbcd822efec197dfaa99fbe9004f78b4efa9724b4f453d05f12a61a0bb44
|
||||
+1
@@ -0,0 +1 @@
|
||||
981794
|
||||
+1
@@ -0,0 +1 @@
|
||||
fake_line_value
|
||||
+1
@@ -0,0 +1 @@
|
||||
7291692f9a94948724377fc22055edde8e2773a581153317bc20bd5779736647
|
||||
+1
@@ -0,0 +1 @@
|
||||
IwAOYcmClqi8K8EStthYMqWCr6WsxM3nD0CLDRvvb7I3CUyihXBjdghXLutDD/bFsHKzOkDVV/gLnTuRj9IEAg==
|
||||
+1
@@ -0,0 +1 @@
|
||||
26.11
|
||||
@@ -0,0 +1 @@
|
||||
201:35ba:5b41:95ad:ade3:6f22:f7:7ea8
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../../../../sops/machines/server
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:H1ngxnRS+cFNSxe9K7C/xNS5hzXyeTWBLZI18TPvEyT5l/MSBeRuK6FZ/G0xUGQAJw4Xo1nyX2PZEYH5wjhnG0UziKAZeM2Oe0G/ilpNbHeMS+HLVriDETlMQz2Hf4Y1J6jOZqSTgFuPMVG5armpZUYTcW+p2zo=,iv:u9sO6eiFzxtT7uImnHLXT3aYJJxgby8d5H2ckfZdNIw=,tag:ZLl7AHHRF+jmr0tnujrpIg==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzdy9HVVFoa0N5ZnBDVDhM\ncm1vQzR3MUpSbW9KSjE0YmZueUlsY1gvUVc4CmlqaTBxMTNvZzdmdkJSMmMwN01N\nVGsvUzJ5Q055Tmk2L2ZUNjRpSHp0bE0KLS0tIGJhUUNDbGh1a09aeXMzWkl4K0F0\nZ0dYY1FnNCtkVXRVTVkyeXZPbFlVbUUK3a/V6XP6m8MDYPKwlu8z0cr4inuKGGNc\nYJjQw00ou3BdM/HOPZrMjYHtjg5WdtzYiFCOl8IRkeiDaEmXcOBjiw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSbW9lcXZweHZ6b0F1eVIy\nd2RWV2lkOHpoM2RkZWxSVEFwU1h5aXNMWldnCk5lS1E4b1BDMmRYUDNHK2NhTlVT\nWGpLWm4rUnpFVWNvMHNzclJuemNGZkEKLS0tIGZxcmowODUydm1kL24yVHd4YXl4\nWVd5eWZMZ0dyS2dpTDhuNXo4S25Ha0EKvc3hwrmlP5JcH7eQeRfoq40w/QdnQL8s\n+DAwsajzRp6H3/XVTm+nDQ+Qoc3aenewZkk6Pgn+x43hAh9zwuvGkA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sy8xkmssttcchjj0nkapk4tu530lrzszdp4lka6nn4gzlxam6e2s3xzp2j"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-09-18T02:02:24Z",
|
||||
"mac": "ENC[AES256_GCM,data:xrshyxQAnlSORTzxxcpt0ABaNWSCCVnwHl6oPUQ59reumF7BoAy8HmdSyWeEpIKBNo2Ane1xxXBHa62+w58r0WjcneNzy8yIBBwXr1BIRZPX83HrSz3+bENPtj6TPWdHpFZ5aDFM2jVlUvwIkn/4g+1B9FnQtoH8kuYBGe2uGCM=,iv:slMt0ag3Kp3iD89jQa/YDta4mJccKiSqcTCt8C+1Dzs=,tag:o56eg/BSHOtBUeNQqRjQDg==,type:str]",
|
||||
"version": "3.13.3"
|
||||
}
|
||||
}
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../../../../sops/users/admin
|
||||
+1
@@ -0,0 +1 @@
|
||||
7291692f9a94948724377fc22055edde8e2773a581153317bc20bd5779736647
|
||||
@@ -14,11 +14,6 @@
|
||||
...
|
||||
}:
|
||||
{
|
||||
nixpkgs.overlays = [
|
||||
(final: prev: {
|
||||
libreoffice = prev.libreoffice-fresh;
|
||||
})
|
||||
];
|
||||
|
||||
services.stirling-pdf = {
|
||||
enable = lib.mkDefault true;
|
||||
|
||||
@@ -10,10 +10,10 @@ in
|
||||
perSystem =
|
||||
{ ... }:
|
||||
{
|
||||
clan.nixosTests.service-stirling-pdf = {
|
||||
imports = [ ./tests/vm/default.nix ];
|
||||
|
||||
clan.modules."@clan/stirling-pdf" = module;
|
||||
};
|
||||
# clan.nixosTests.service-stirling-pdf = {
|
||||
# imports = [ ./tests/vm/default.nix ];
|
||||
#
|
||||
# clan.modules."@clan/stirling-pdf" = module;
|
||||
# };
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,5 +7,6 @@
|
||||
frappixLibsOverlay = inputs.frappix.libsOverlay.x86_64-linux;
|
||||
frappixPythonOverlay = inputs.frappix.pythonOverlay.x86_64-linux;
|
||||
frappixToolsOverlay = inputs.frappix.toolsOverlay.x86_64-linux;
|
||||
frappixAppsOverlay = import ../pkgs/frappix/overlay.nix;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
buildPythonPackage,
|
||||
pythonRelaxDepsHook,
|
||||
flit-core,
|
||||
mkAssets,
|
||||
fetchFromGitea,
|
||||
}:
|
||||
let
|
||||
version = "0.0.1";
|
||||
src = fetchFromGitea {
|
||||
domain = "git.b4l.co.th";
|
||||
owner = "newedge";
|
||||
repo = "default_thai_company";
|
||||
rev = "caad6e77da35c9359b0dbd75ff0f39bb01891caf";
|
||||
sha256 = "sha256-LH7E1EkecNPrhfQWSlWzPHHuJLM6SReCAifcFPDr61o=";
|
||||
};
|
||||
in
|
||||
buildPythonPackage (finalAttrs: {
|
||||
# pname doubles as the frappe app name (services.frappe reads app.pname)
|
||||
pname = "default_thai_company";
|
||||
inherit version;
|
||||
|
||||
pyproject = true;
|
||||
|
||||
src = mkAssets {
|
||||
inherit (finalAttrs) pname version;
|
||||
inherit src;
|
||||
yarnHash = "sha256-oZgyP0hTU9bxszOVg3Bmiu6yos2d2Inc1Do8To4z8GQ=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
pythonRelaxDepsHook
|
||||
flit-core
|
||||
];
|
||||
})
|
||||
@@ -0,0 +1,9 @@
|
||||
# Extends the frappix app scope with in-house frappe apps.
|
||||
# Must be applied after frappixFrappeOverlay (needs prev.frappix).
|
||||
final: prev: {
|
||||
frappix = prev.frappix.overrideScope (
|
||||
ffinal: _fprev: {
|
||||
default_thai_company = ffinal.callPackage ./default-thai-company.nix { };
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -1 +0,0 @@
|
||||
../../../groups/admins
|
||||
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:IvMl875ImDUJ3Xs3symK/4UCo80hO1pdG6mi8KWMxpP0UMX/nT5otxEeFq7AJzs4YYMXW0K4tRL/hvt6mRRxku9vGJVAu9Vs/A0=,iv:W9v37uSJ29UwnF0rFLs8R8Hlkx8/yhZDm2e2XXOfwkA=,tag:Q81/tcyAv9HmFczKZpFmXw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNMm93WSs0N3YyeEtrczBZ\nbiszcDA3T2RNTWE0VHEreWhWVlB6ckQ0VjFFCi9teEJJNmhCSUtuZk5pVG42NEUx\nT0ZIbFZEYzBiMVV6bWFXVGZKL1NDUTgKLS0tIFhON2luYmozd1FKNTFqVVdMN1Vu\nV1UxeTJmV0J6c3N5QW9ISDhySHNJaVEK/JU/d7w+sbEz84OUnvTZSJVyC9QJ8ood\nXjkgJHsZgMsejbH7lYCzRC2TW3RT5Ua/V8UkMXdwS8xJPIwuH9c4gw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIER0OHEzRkZw\naXo3L1h0YjJqVnI2WWwvUGxUUk1DQVRDY0NOaTFDRE5KaEkgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpCMWdaNjE3cnhVbjRyd1N3aXBncDFa\ncWdNenRQbEVoWlowTG81K1ZCbzZ3Ci0tLSBYQmFqVXQ0ZVJtOGQ3d0VyQUpUL0Nq\ndDBzd2FTemRjRnpuTzJVek1UakRzCpykqaKGjEBAzyZfGjrQLLp+/Xq54eBgfXut\ndvOlzztraSD8zSjb0wlyoAz2FsblvR1fTSsMStiOIso49PzPDQE=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGpYdU9lZkJE\nNTNacUNDK3kzNHdvdEhDR3U5Q1FCUlVlM2gvVXlEN0g5aDAgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwo2NkVNWkN2RjBXUlQzSkhqV2kvMFYr\nS2tXbGR0bkR1RXlWSExUVmR6SlFVCi0tLSBWVDUrVTIvVE1mTms3RWlOL250NmIw\nSmdXelpqVUlTdk1LNzBobzZhME5NCvMuiIIOBmYEtKwKgaBLR2F7ggBKAeiKi5X3\n/vjRvd+dHuw7AscQGFhQFQAtQS61gmpKcbYEW6lgMlLEH/ClG7E=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIEtRWmZRVWpH\nd2hwVGRVQmQ1Y3JRMUp6eWVBRmZEbXRiYitpdllvNlhtRkUgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwo3VUtyRk9UNVJ3ai92UmtseXAwbzZN\nOGhlVm96L3pHV3c5d2kvaVpFU0l3Ci0tLSBsRTl3SUN0anU2OXZGVmNZVkd1ckFN\nRVVRT0pmTzR5VUpNR0lDZnd4cjZZCp6lMaOHy6xphC2YDON61ocx3yncwkqrRZGO\nQ/9bgQ5qmS1oIwJ39dZBKm7zFSL8DRDKUWV3fRAcPnZfJcZFn2w=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzQ2xoK01TTFg5QmNrK01J\nTk1IZkU5RStGYmc4SWtMYm1wMEpxbno1N2xrCmxZRyt5VlBXMTlkelpqbW9hTURQ\nVFo4VUhUQUhZcklqTDR6TW9ydmlxb0UKLS0tIGdzQ2Z1ZjRIL1o0Y1liZjdCb1FG\ndmp2dEQwaGlDaEJGeTFnUDV3dU5lYkEKWZlL1rH7BDdhkLXXBJS9gtrMRlyvZCQQ\nDHLG1ZjLo1lGCHcBwzQJ7q6qCQDLlMxXJVbms/1oIktQOJ0Z3t57VQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvRG50eGw4NDBEcnM5d3ov\nOVRlczQ2QTlkTHJGUnhRZkNNWXVOc29hU25jCkhyM3BjSHZCTVZjVy9uVmpkdXJv\nWlRETGFWSDJvRWU5R0lJRElveE1SZVkKLS0tIFV0RmRlNWJnQjVMWmlOMC9NdGxa\nZVlvRzJsR3lNNDV3YUxhOVJtN3FNZkkKf7nK9X9EM9bdSxZDrdFK4pNzoRogq1Hl\nuuAg0JVIrYQzxLnJoyQ71TYegbTdgdG2za4NTsDCBIQt7gXfC/bTvQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqNXdjQnpRYjluaUdrVVhJ\ndk9pQzByS0ZSN0ZmdnQ2WktYQ2lSTktlZXhBCmROUmErbXlVSCszM1VldVViN3g5\nZUZySlhsUmxYdnZCcjJ1eWk0bDZ4NjgKLS0tIGxtdTdNNnFqUlJwOXluOEIzL25P\nL3VOeVl3djA3WGdKZlV1Wm56c3dCN1EK/r/FdrcgtKyWVnFHXNaRpVet1tOQvug2\n31/46/GTV5Ze6lN/GDcupu2a0n5ShWAy0OeC4IhKTQPZC/c7SdEqag==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjV3J2UkM2ZXNkUzVPZHlW\nNzExUnY3UEMvd0xib3YyRWxNcHRnRzRic1VZCmtNdERhNGVrRFJYTDZCUzBvTDl6\nWS84YzFPa0VualJyb2FPcVROVkdWQ1kKLS0tIElsNm44VzlIcFVhdWpjRHNTMVh0\nNEx1MFB6NTNYWGJYNkticW10T0xTcVkK84kDLpPXz7AFWiU85NQ6i2cz+6IJAAiz\nmIIRh8ZDV0xWEsRMYjgQ/nsASZ2f/CWNKXx69OQc8i1K69cpolE3Og==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:50Z",
|
||||
"mac": "ENC[AES256_GCM,data:8QCATjju4hNMWABf14VEiikdSpo4HMX9cir/2IFJgw6UfEj+HQvusUidCCQqDkEInGbPgQtGEhZvjkuxw+wldHcNBpquIeWKa1VWuXAgudjAt77FH4WklhOel40FwsbjNYEj9gP9IJgir6Rq3bLyhFQAcUZWZH7/ho3e89H83Sw=,iv:Q6DxVST634mpw4ZO1bjhOTeZiBunNHS0Pz6X2up300k=,tag:7Mmxo6zSPRjiXLZSpEZxrA==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:tUZ5LYtqBRWOfYxY3yiLiX6hIzj+72MVC6yjj7mhf3i6Iuo2ImTiJCtv9LluBbae+wXA1VSapkziGq/+00iLNYlQZhD2IPKRvG5QkjoQmEQWSldZYlij3wX4T8tmDEcK6IWSJeWU4x2Avy54OSQUOxIwPrIN4pxZwgvipnyFuyoRSpBPdfbLwc9WSd/5R9gOu0mE2RHbdV4nRVDLZ7nN1YcNsLxIebY+lWdGuQyn0yfWSm7Q+d7zxIRlhvJ29viq7SqyM9JJeO9ZFujyKamPlWwWdoSzA9zCoqMDo4UereUEIFtoa8ENwuRZ+iMu,iv:EPwm6L/aLKMjC0n4WUNPtAvZDq9tAwLKNl8bvuynpPg=,tag:5yFbIEJ4rudQM+WZZs3+pQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0WHhncUs2dlJDVHpMeGdR\nb0s1M2wxSk9VMnhsN21oaU10RDZSSUJTbFd3CldpemxScHpOREhVS0FuN0NTWEZh\nS3FpQUU4Nkp3djZ4aE5vWm1Pd21SMWsKLS0tIHBYN0Evc2k1L3I2UnZUTXVra0ZI\nSnN3YnV4QnFjN0lPN0p6cnc5M0dEVDQKQBTISXgiM61kzoJKI97pLdsgHtD3SKQ+\nHgUbfrZoMGMHzi+6FTX+USy42rX5NzD+B2goLGUSOfHbANdfnONkGQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtZmJwYjY0UDNuQ0VnMjVI\nZzZVTnp2RytEM2NQU1VoU0F3QnVmc0dKYndRCkVpYktMcUY5L3U5bm1UY1pDRzlM\nMlNCZTVCeE4vS245UDdsRFViM1hZbjQKLS0tICtBdGorT0pTM2RWMzZuWUhpM3BH\nQUpXaGpiRGpDR1lEWjRMNUYyK1p6SDAK9p/xZ4H8bvIRoVBDRuJdqBVNFekRrCHw\nYJ60rTC+hTg+shVz4DYKSOsD/bi4U6pngNbOYYcXaosXApI/UZVR9A==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGQxai9YZy90\nNGpjMzhWNm1DdU9OOHRvVkkrTmh2M0J0b0lWOExSVTVMRXcgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpZOWVCc3oveXJNa2VkSjVJRkxVc1Mw\nNWQyazN2NXlHUjVQNWNTQ2NkKzQ4Ci0tLSAxZTI4TU0yYUxFS0xZaHYxRnh2Vkwx\ncThoTEhXSVZGVGZZWVAvVzlBYVE0CmEjqR1hUhtSqdwcBYfiXXAZaFdcbhZkTIgL\nl5m/X3KCPDW1DhE7V5L/jK4WGY/DEVubj5iJs+jgKfzf1b7Ut98=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJICswKzBRdXZP\nUXptS2Nkc3BIVDlrU1dmUzVEMEdjZmRXWmFTT3N2Q3ZObGsgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwpEcExtOStoci9xWVljbEtzamxBNUJV\nZXlCMU1FeThLODBUdGc4cDNMOTE4Ci0tLSBkMSs3dkdFSmppeDZSRWwzVXgzaThT\naW9pNjhCZ09XQ0gxSHA2Q3BqVWwwCh2/zLWar1lzR23FC3LZmnRLO3rkmxjYYBHw\n7UgCFw9UDzwrhYxgz8v+kybYJtSQBdcqSBDj+oHBdHVZ4g0rxwU=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIFRxK2FRdEhP\nOXorOTUvTGFyVi9vOXpuQWFJUDFkU2xBaENqdEJMZE1jV1UgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwo0aTlkNURkSEE5MUJjV29ueW9jeDVl\nbzZHSWg3NndrQ3ZndTVnaG5ueVpZCi0tLSBBbDlrSG03b2ZHWFVLdE9DaVY3bHNs\nMVNwS2w3N1pCT2MvcWtRcUtaeThBCh/+sNjdNGS4M5H1J1lXLnBREfFADgoTI8xG\ncG8c0POg3zTctbhiGj/Ilxkmqt7VXOTPc7j8f64QznJa8y/U7Vc=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvWU4yOUdaL2dCSTB5Tnhx\nNGdueVBIeFFkWU1oM0NKL3U1OTlMV0pwSVJjCldrcER0SjNvMCtNSXVja3VGVEhR\nYjA4Z3RLNUZUS2FBLzJGRHUzclJCTE0KLS0tIHh3bDJmSzExS3B4c0lBVnA0b2lG\nWkZDbjQxa2FJcG9SOUN3em9NNytGaEkK54p2+lei9pJtWIq8bYmPydsoWf3tb1NE\nK2SJVf/uO/GIHpL01kaePjdnvDANJJ9xmtC0UzdcAlFKPSu4bOeWBw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnOU0xcEFwcmRSaTFMdUFY\nanFabEt0aHZjcjZsM2xvR29WVER1K1Z0Z3hNCjRoakM4QTdmcUlvRlNLVkdwR3lp\nWTE2RktEdDgrTlUvYnNNaE5UcjBGRUUKLS0tIHRyVVd5U0hSMkJvbVZJTllBVzdV\nMUxnVjFvTVhReXNIRm1MKzNNTXdLTlkK6uIT+q2LEreo2w86yQT/9BZTrEvCQrxH\nyd6Ky3QlDrF39GviD3tdPZvyhYV4ToB4gw89zE8PR40xAf2inhW8+A==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1Uk0wUXVnb3UxSWE3eGRH\neFFIRVJDRDkwemZ0eDU3QWo4ZmVhWGxrYWx3CmFRdnRGMEl4emJSL1JWZ2IwMmF1\nWkVFU3lMU2p1ZE1pMUpEVFZ2Zkx1ZDQKLS0tIDFSWXpjcldYQnBleU4zU0JpZmxN\nWGhuZmVXUjY1VGdVYTQzbmtLUnEyVUUKqTdqSUOvd+RweI6TIGfDJ8yB17sryOgK\nEQo+JqF4/B4HWn6yAVqDclU8u/7UqOoHOmO6hUve40NqDbmCBtE+3A==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxMnZTMGJpMzN5ZW5OdkRO\nWU8xcnhlQ1AzSHpoeitXc2V0MXFpZkc0ZFNzCmorakV0NE5WNGY1Z0Jzc3ZSL2tr\nWGtweCt6K1I4M09zL2hVRnlja1ZMOXMKLS0tIHBqUVBNMzYxU29hUXpFKzRyRGFx\ncys5UmROMTZTUTZ5UGVoQUtJb2t0VTAKIb/lergoqns5JtJCSc4dbxANj4M5/sap\nZkeb6wVOKxVu95IN2XEYv4xIVf5bQhBux3R9yZ9NYqL7f1HPHody7w==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:51Z",
|
||||
"mac": "ENC[AES256_GCM,data:tz8Uv5ivlq/QXbHaEKuSTFF0aFLXzzeks/tHTMDnyZk74DmLXMH6uHq32zr0vKxCJE8Wj1idk+YuTCEAXZ0iiFrqSj41h/Sxy7/9zP8+/TyVorXd13h21qCus+n0MEKDRx0FH48UqJnFsighkUUmxLwTwoqxe2kbIJPMBFMHvNU=,iv:O2zTDDBSVpNDOajMfVQcCx9znMFR4HKUBq1eUEkODpE=,tag:9Qw7Wh3fPsCoJr+vr6nFEQ==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:xTqEDXSAj6B01PEHWX4BcjrCDoIohHHKa9CdYUpFzwoXDN0aTf6kMu///cNMbopQPt7Zk75ms3ZI9rGgWZS8mcLEP2I8G3FZSEWpD8NFp3Rd/K/HnHcLH/kH9B+S0lOos8noqlDamADfUXsTB3dVXn5UL77Nai0=,iv:QwBWcf604NgxbuZzPy6c2FQd+02EtHIim8lZYqbtl00=,tag:hWggE0DiF41D3tFM8nW2ag==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTdjJRdXpHVVhyeGdTRkZa\ncDBsY1dPSlVPUEdUZFkrZmNocmlucGduUlVRCk1CbTdaaXdHK1R6ZUF5MkxRL3Vu\nMnVlamVYeEtOQXVjNjczOThHcStoWHcKLS0tIFI2Q0JSVkd1czdVb1hNQ0F6YzhQ\nbTBMclBLN3dLR0ZPMENCMFQrd2hPOXcKy8OhNHyNRz+Fnyh2gjiHBgSHuATqFTgC\nI+oTgxOhApy0OFvmUIMO5cDyvHQDZrk8xUgGbTd8d58MNRj5CV1HXw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPaDVNT3dEMTlNTHdYZHpQ\nb0hkQ0dBMmczRHF6dFUxUVJKTTVVNUNJOGdFCmFyVzhpTnZiY2lSbExJMUxReXU3\nZ20xSEl1L2s0ZEV2WHBnVlpPLzBad0UKLS0tIFhCdmZHNC9YOEpPZGdORDZ0M3JZ\nNXlKdWFicmxyUitjWHZnaWVmL1dvSE0KLI7B1JKoZeVXr0hkNywrSRbCG8QevGmf\ndkcF5o0KILcEG+9zHHjKdkYF2vZU1OwBxzGWyIyqPs4ZAtVucOR6OQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIEF3VSs2OEl3\nSExRbmp5Qng3NzRJUTVmNE01akNjQnVKK3dIUVRHTDVyRXcgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpKbG43NkM4Q29oSHpaRXVUckFONTdW\naEVuZFMzT2JOZzVEcWFxN09DMy9VCi0tLSBicDVIazJkYkFZYU12T1F2ZEtSVzhN\nL2dhUlJDa1BPQUFHbUgvcXg5ZDNVCiIh3MoR0FL4GoZ6JrdJlKnk/TPCeTLjJCra\nRruqeb0BKShSX9vz52mk83/9i7aawdEPsFzX7mM6gmKhHOSxEyA=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIFloeks1bit5\nWC9hZXdLMWZ5OW8vTU03M3dHek5BNDY3LzJqc2p6NGVSMXMgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwp0UHNZd2c5eVJSUmxrQ3gwK3lzUmVr\nSFJnbHJvYndvY2syWkprdG9aSWxBCi0tLSBlV3UrSDJZT2hjV0xoYVU0TUVSZ01a\nazc1Y253NHM4R2xVRlJ4SVdFWkpRCgAOxjQ5xv5Trz5YNRGEPSvr9lyNsBMZxEwM\nc4wPiliulHU6PjIhqOucilfI4qdlAv9GJlyDENEzQlyouWVqCKw=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGZWR1pTalJr\nRGowbmQraUNPcjBKVjZFRWhlWW9jN240NnBxWktRWks3MFUgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpNMHJTbnZTVFlxdHp5amlxTE41UDFP\nUHRTb1FoVkd6YTJjRGt1NDVEVGFzCi0tLSBjZ202UUplMjd6VnVWZS81Qk5uTndP\nZ3N6a21MUEhWS1ZqSERsaVdKdm5BCgDsnjbntpSpd4o0AXMc5TViUrRLL8jJyQ6w\n/f6hQjU4AM/en+OpME3ncX/4PhmqoeSKMGbw28Y+RnW3UQzfNSU=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRWXkrTzBpNVJ1bmwyWHUv\nbVJFdmZVSjRBVGc4RDVybWVHU3BvLzJrbVhJCkdObkxpUkFzN2NZR2F5OXlXY1lz\nY2puT01HU05xWjdtYk5QeDU3Q0hWV2cKLS0tIGx4WXI5dGplZXFKaGVyUllpVGh1\nWkhuVG43N0pHUmRSYS9wdkRzZm5WemsK7kYVFkpXQlUsysLR0cC1AAQkdYjZ7cn+\nY+Lo4CJPUEwybqE9dSNvOosmqPkyXWtaIT1YmD9HunU/qoQ2lyHsKQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4YTFHUlFlaWc3NUdQM2Jn\nZEVEYlU2QnZQNWJaVEtMTzFOamM5Wm16WG5JClE1dXlRNHNWbm5haTlpZzA5R1NX\ndk1Xa0p1TkFaYXpra0l1cC9QTmlaV0UKLS0tIDJHa0hIbXdqWUZLM1FiUUtTdFFJ\nZ0xyRGF6T2NNVXBwamdQNG1PdjlqaWMKmzYuTZEURU0S4tQc2lZhRVVy7DPZQseZ\nA9xCWKagbB90r3WWibYEXYVgN8091diLzLijQGOkVTFIkK1EtDLtFw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIS2RyRllNUCtaNGZ2WGJ3\nMTkxSkI2TElsOFZGYjVQTkgvUjVNeTRPMEhJClVFNDBpL1NLL2g0S2RwNVRncHRt\nSUx3NXUwc01NOHNHVHc1NklWMHhVc0EKLS0tIGIzSG0ycVlFYnhDT1ZDdXJxWmE3\nZGZNSDJ3bnFmK1dSS2FRV0RtOGoxc1kKO9aYqhXMCK3T0f762sp0kUKXhF4RUb2u\nAVyKKinThT7/TsjYl4bzwAeAbrZ7oqU+Lecm9grcXtI8GkTEVV/f0g==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSM0xyRVZkUWJleHNNTUZP\nZmlMNlF6cUtnelFQcUp1MG1JOEdvUkFtbEF3Ckc2M2RzNGk4ZDhxQjRPNXRkeU56\nZVhUSEpON0RrRy81UzNPNmZmSFhZWW8KLS0tIGdyV0V3Nm16Wjl3bjFZWWFxT1Ex\nN0dQaWMxUytmOW5ka0FmUVMxTEg3N28KFr+19T8+mk0qHxZWD1hrl6S4IT4TPwlr\nydlMjMM3QT52HwaCszj6MaYxiBsRgNxAl8DMa+ZDVssS1QPU/uOOvQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:51Z",
|
||||
"mac": "ENC[AES256_GCM,data:u2MSief2SeSIkXZQz7uEYxQxCdXLmJwbCWVHzhKZdGr91pU6OdowT0+S8au7NIB8xILbaLXfjEvv+D+Gn5EsuX6iXXWDnVMR1yNJ0Z5JTGLlPg9THv0b6yTxZQsDtSofziMpVm+rjnwp+JZWQpiwMNao0f2XbDU2rtQz+gtbub0=,iv:34r1Z4OvGprZQuTRI3B7prill2n/2h/bfqatJ9WfYY8=,tag:3Wa78sgoE90TSMQQZoNkmw==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1,3 +0,0 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MCowBQYDK2VwAyEAsPajePQC3rQWVseVRLlQF5RhCRjV3LOjVNvu+Z2MRpw=
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -1 +0,0 @@
|
||||
12D3KooWMjA3yE1LYzMyHbgQzWj7Km4mMZMn6jAbMz4kLMVxtdmm
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:peOgqM0KlpbY8A9bufRdl1F/8XivMHUeOvvEvlEZnWN+ET32JDeQlR99Ik/xDm29SMrIqVeOu2yAZeyz4/b/8uqj12QeUKarLMW0oHcU+eHGFhxDpViTT5jq7NRaZItJV7LzjFZ262T21vpqLKg4+pawUDR+JYc=,iv:ukA9zzm4CWrXs6ERqfGIcsAXhinapOg6XzcvmyydbC0=,tag:Nz2+vQLaV+lZW6Os2bPRMQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtSktOUCtxMWMzSUVHSlE5\nQWxvcUF6YnBJemFCMUtjZHY3Yk95RUEvVkdzClM1MUJwMTRQTzUzbHkzNWttR1R4\nNGM0KzhHaWtNUHd0WmtpQkptdXdqRGMKLS0tIFprNTdDcnp2cXR0eCsrV3lyK0xZ\nQko0NDlvNzN2R1NSVTAwVWVITWg4YmcKD2S5iFx2eNBWcUf2x4g0ZQCyUJVHzI/e\ncvcD8KYOBeFkHBSMFyC5wp/5qEyRUjFUgaWHDMl/UC/f++C70t8y+A==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiZE1GbkVrOW52anRRZ1J4\nNCswdWpOeENoeXcrcndqRkorTWVLd05oa0FVCjdpUUNjQ0VOZ2Z6UVZiQUt0REsx\nSTlYaFZUcGJxQ3BjQ0FHMTZMSFpDQVkKLS0tIGxpVTJxd1dBeUl5NG1EYXFPVG1F\nT3lEYXgyTVpUMXJqUkxGTTl4cWFMbG8KxLLflg1q49vfgJXMPt9bIcaJ0qd5djNJ\nSzdc1XJtTt3oOk+wsomgasV2ogCHz6br+oqJqkI6ELeE3biquwttMw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGtDbHlXL1dM\nT1hrTEVpU2dscEF4MUtEbHdRSjBsV1FSOVJuT2JrSlZXanMgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpIckNkQ2pUVittWTNnSG93Y0dyUEQ5\nNzkyS2VLeSt1UkJudmErMXd2cTdFCi0tLSByYURQdS9KTURSemh1dzU4L3pUN3pn\nZVNJMFE0cyszRWxwTk9TQ3JnRG9ZCoRLWBl/lEZe6bctuswFvJJpWp/FSZgimM4E\n6V8CpCqCG41Vf+wGc0kBp2crGys0aOwFUSOh+sSuFLgw7kj44lw=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGxlcDdDRUxX\naWNZa0YwaVRsS2kwejQrdEcydFJDTU5qcmdRZUhXRlRqRVkgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwp4K2VjeCs2VjdtejN5V1IyYWhkVnNH\nb2NzbVk4OHpuN256V3F0UmNFelNJCi0tLSByaGh2VFQyWm5uZjdtenpHWDZqRTdJ\nOVdyOEZISXh1alFRTHdLaVZSNVp3Cnq/UiiK3HQQvC07KggLL0Ws+puFdx7Ksnuh\nL4poXEVnVjtd1YnaCzIsU2Ym/KJax9JPki5pRMQqG6bNUkXr6cc=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGorWnNod2xp\nMmk2YkttNTZwMHhNWlhvWGdRVWJUMFpNQ1JwNDh5dzNXR28gQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpIV3lYS3BSMWNEMTJ3dnBBcVRWUlBl\nMWJHbXZEVHNaenJBeW82QmFYMWxNCi0tLSB5YWV6S2pieCtYaU51MkQraWd5eENW\neUlqSVREN1dvdWM4cmRFZTh1ZEYwCknfj6BeXiM74riY6PP/2ulVnOSOR/smZiDI\n0YSAtO1QZUsqcbjrru5DdL+I2EWwKBx4nmN4GQpAbFxaT3cpJlU=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwcVV6T3dpZEErTFZMNXFT\nVTF4Q3oydUxFRW92TWJBOEoxRnRGQ0dRVHlVCjd3d0tpUFpFSy9SUWovYkVwT1hC\nQmJaQjVXd21qdkhwUnlLeGFtVkZZTzgKLS0tIGkrU2lhdlRqR1lQbDVnR1l0MnFG\nU3hTUDZ3NVlLQ0tJcW5wSDRUek16eHcKGSeTkMkjyHGJZ04FrNA50kTiNOEIOVzh\n0c7FCUe2RTP0JKqJcN3oPeGyl1brbDHmnPnFZVk/lbJ+gg0AjGNZrg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRR2Vab2lZaGIxMUdoYmVi\na0pNU0szSTB5TnJqVnVVSUd2T3NQalNmN2g4CjVXaWx3U215M0l2MmtjL3FtUFBO\nblR1ekh2MjMzMEdFb0NqczE1U2ZpRXcKLS0tIGdwcWhSNFhBL2k1dk54TGREQVlr\nZExJNDZBYmorOWNFYW1ic1FYeFBZREEK6BHFqIkYP95E3fKuyucVPvLzOP89YZSw\nL5gdbAVMtJrnIbbKbX5kradEt7wSUjLc4j6fzf56W/J0sZ/uyM/XrQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwUGpMQ3ZCSkRJNTI4MHJG\nU3prdzRVRHFaMkFDQlN1Q0xOSXZpakJaUnlBCk43aTZ5R1pJN1BreGNwR01YR2dv\nQmNsbnVUbnRsU1pjMUJNNndhY2I4dDQKLS0tIHQvc3ZkVHZsVHUxNGRVMDQ0bjEw\nS2hlVlAvTmM4OENhellWcXFjTGVoV1EK1+mntP6ICCkxd0nKbA0tlGxMG/2wvT5O\nsUiqI3aRtyGZ5kYACvI8BvoUEn9llit1hWPTfgiBrAzz3+NdCbqHkA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCSjQyZTNCMDMxMkpZSXNh\nQldUa3pDK2lWMjdMRnUxczVsK3J2Y1BBZlR3CkhaanJXQUU2V0Z2Nzl5N01TQWdS\nUHpyNlhQdXM3clEvbWxnVnljOWNIdmcKLS0tIE0wQWdVcDdPblVMZE9xM0xIamQ3\nd0ZQZUZ3MjgrL3NKaHBGWVpLSmFaYmcKUnZ+fHFMXSiYjwe5aZ0RFT2o+TKelug7\nj8FOYLsonHzswm0WZ4lnEfQeXqFWpT3fs6mFIM4aNeeD9lY+5yA3RQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:52Z",
|
||||
"mac": "ENC[AES256_GCM,data:+rOq3y1/AFQtpuWvnI3jP7cTFVeBa7tTUMflZvvYkmD+/sy5TXPzmVbCNNdlr5QHiMcO83Ajh0MG17zE9mWPVYZQ1qWX+1qY50bmgsJA9O2e5AIHxzZqkT/S0eESta50n4+tsvZ0JwPtYBFN2kFv1uiQkwbIecNACbWcC8yYGS0=,iv:BHz3heo2zDbAVqMzz0HZA3l9qwlccKwRXWLj3I88tF4=,tag:ePCn1WzagQSPe/Gi/F/eNw==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1,3 +0,0 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MCowBQYDK2VwAyEAdYtPnS/sqwX6zy7lKDDFXFEmNRKDuNuDCZA8WfIGrnY=
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -1 +0,0 @@
|
||||
7f42f9f088638a4bb9e64f4efa32c7c2100c4e5e17757cf17900136ef75b8564
|
||||
@@ -1 +0,0 @@
|
||||
ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIKNOZ8RYgQz4fHKe42WClOdkDzuiik6htBkcDQ/oFGIkAAAAINk1lx2vq3TJeXWEj/LEwiFdcZsI0/8gk/v+uSwLCX8MAAAAAAAAAAAAAAACAAAABWFuc2VyAAAADgAAAAphbnNlci5jbGFuAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgJdtRPKmGj15w0IbOFAfMRO5WujLxefAHBlews3TeS+sAAABTAAAAC3NzaC1lZDI1NTE5AAAAQCRkHTk4YDtwTkKDzMH0OaPVeFLtbSpEJShUxnUu3VYZbn7+A1Sa3guKgWLa7QyRyyPQeMOHi8eTgkbjtr6rSAs= /tmp/vars-kwhezost/in/openssh/ssh.id_ed25519.pub
|
||||
@@ -1 +0,0 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINk1lx2vq3TJeXWEj/LEwiFdcZsI0/8gk/v+uSwLCX8M
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:pbNCacL+ooegPuvBvj6dkLk0t87nniwSD3fhW1hUj4zezpawqkP4nYbni0WufSBtGqFtcCKuSTqskuWf93U6v2JQL7FegazcqHLQHu9H0+MrqdsMGZyEzGL9LCKynRoTrc0ggGY+KFpqI6o/jm3e0rPH/AvnLKZMKO9KXchXGWbSK8iyeu0NWY3vH/dbudhg36oQYBAW9UsypyRIADZzPyVliPhsu6HWQttV4vkzGt7PaAeq6OAv+1swSajzNRGKdTVF6EIq5ZIAfq+RtWAmudz+7g433eh1K1uJ3yueYRgvS5HdqmxGprXXQUTzogK00P5QDgHlc8J23OFnmyoZe/ppq1dncVMePWK+MFfXHu1oAtvcaqZzcjigBZOlnaXFnchB2659Bp343cPMT7wCtvV9OruBOPX6twWQNEUJaWtLcUaJawzdR+mUvAGYuuSn8BFdjXKn1WrIUlHT1iuaIECZMe2/Nn53Ukk4ByCTr3s01+odtGQFkMTJrQPxO5VhpNLf,iv:uyJ43DSfnUyvTVbljGhWmGsMcOoAOcqywN46ohZtUAs=,tag:mqGGDtmuqJEZpgZqUc5uCQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvelNOanNoM0hDNVg1SlpI\ncEoybUh0N2lFKzBid3NuV0J3QlIzOVlsYlZvCjNnQmh4aFdDZkJndVpIaXdYaUNh\nVEYvcm1SSFlkYWhha3c0QlN3b3VFUU0KLS0tIHVXc0lXT01TQkFJUnBlanhZS2t0\nTEpuQ0dvWHZpVCt4SS80MlhxM0FUTmMKsLphibDgT2YsZfX3evygA7rfgBh5OxOK\nFRbq+EHQPdKnU9aroMcaCBkRunp6y/VxY7FJvUMslPbBe0iaRfpgqg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0NnAzK2RGV0NZZWdUYzBD\nOXNpNi92QTF0SUFRcXNLa0loRTdVaDdKcDBvClcwVWcvdmlmTWpKQTBlVUtYR1Ju\na2F2dnlQTUJvL0N3TjUxU2ZYZXhyN2cKLS0tIGhnSG81Qm00V292TTdUWnV2NW1p\nWWg4L0NseUJtb3NPMVkxMDNFVkZqQkEKJR0FmZ6FAFq03+w+5+sqLCRCK+o4EIpM\nhVgttDFZo/qEQ5z1aLlWvfPtowzN4P93DrmIByG7CqeKn3qaHH4J+Q==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGdwSlFQTE1F\nK2xCR0xZT2FmSEpiekpSdW1tajkrS0NVdGJEdVdQYnFVbjggQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpjZUs3NitjREN1RkZsRHNGd1hGc1dC\nai9RVUcwMitXbUNiS3hUejFWa1pJCi0tLSBiczdrWENCVFlUcS9oT05QNXVsZ3F6\nUW1DcE5ONmNCWmlsQ1FDTnBTK3RjCj3XTO027m9xZiXW+F8gvTo2PTYN27WLptcB\nly42kmCpP0mgtXLGeIrFG2M+9LJf2NA2f7B1ZRjB5qNp4m4SDSU=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIHRqNnB4U0hq\nSzF2NTRSOHJmKzJmU29ZSEl5dlpqSDFINk9VTWJ3ZEJYQk0gQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwphSFBHR3g3bmZpeWl3YTNtdVkyQ2VY\nR2dMNVdmdHVhUG93YVM3SlZQbGFzCi0tLSB2OHhGMFIrUGhKSGI1RUJaQU1nTXlT\nQ2l3b3orOVRCM09Vcm5yMG5HSlRBCgacRDSGNF94N61P7e6IAjvWZi5LkR1kYLOy\nCGZnkJj1tkJmjZ7LYWNgMhMSGege4iJ5+WMJTK+7cTAPi5vb8Xc=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIG1mRlZuMmlh\nS3FTSXU3NmYycy9nWjFkbHI3ZzJ5K1o4ZW02c0RIY0JyUkEgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpUMWluTmNUMXdZT2lxT1BvQjQvbGFs\nREIyczcyTXhHbFZpWFY2aVA1eS9JCi0tLSA5MElJbkk4cWw0aEdhanlHc3pTZ3pu\nbWptQmhiRmQ3ZzUxS2FsRTNWT09FCgyiz+GcavNWod014NUk8EPWKyaSU8Z8hDpL\nA9sIRY1RkJE9sQfYDIW++thukLB87Bx4JqqBzgZd5yDEYQgL1ks=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxdTQxa0cvV0toTFd3U2Ni\nSklKTjV1ekhvVkZrTVdCNmhreGh5d1U5VEVRCnJweXloSUdVWXpQT2hFaUNZdTRi\nOUN1YmNmUnRoaytQbEhWdDBLUldlclEKLS0tIFNlemMwemZ2OTR1NitLaTlCcmo3\nSUxoR3FTQnQvUUxWYTdkYzMySEVoQ2sKE+KkAGJOp68X2QHOZkvUIWG4QCka7iV9\nq9Bww7AAsx96sTyEzzUlKchx/EMqzUwPyQ2MxItnCjSI8UQD3FhXBw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsamVnUmRQSm4zWjZYSjFK\nMm5nWVI2aFVUbVY1V1o4SW9CRmtYZDAycjJzCm9CY0ZBS0x2Z3RwbkNMMkZwbXRh\ncFN1c25GTUFDSkhHK2FMdDdqalp1bzQKLS0tIElMT09lTmh6aWJ1cnNPbEp2WWx0\nNUIwVjBSRGhUckQya0RDaURMZENtNncKVfbuGrCtCgbtQjM0hZrcnfZnrFTJT3vb\nlqJMNQzMed2mgtmbQ2Od99zvEz0oj1UsRX93eLpqolKssINwklpP0w==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3eUt2QmxITStuMFJWS1Y1\nSGlSaUhvVklRRzE4dTc1dFFxZkl5bW1majM0Ckp2bnFIVHV4VnRXQzc5Tmt6cTBx\naVVhSjlabmFlYzlkRnYySW43cGxFYjgKLS0tIGtUQkE1aUlYTFhDN2ZXVFgxdGti\nTllXZHI2YVp5THNDMDNoeVFpdk9yT28K/jTLzafJqEr2rphKhcNmWR0+RhIVRkvK\n1sW93ik/vTLwuZID+IbJw6rIG35/1q0v/XLJOdBfTgMRmgi6/ncQbw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2b3dHTmdNa0pVWjNMS1VP\nTkUvM3RPd2pGOVNBczFHZVdYSDRUaWtSL0ZNCjhXYjJXQjRNR1MxN1JFeWNLZjcz\nWXBBUEppR3g2RGlNMEVmeUYwaG5DNDQKLS0tIGlUU0hObWlNYWcyYTVwTGNWb00w\neGZ1ZFlnckFBZnA1OWNoL1lnbnNjQ2MKuJPp12f16DZpuVaI/lRvIaTPDpv1ctAs\n+yNPCfvPKJ4G/wdNRNEaxIvfFmrhZgShBPqdKxFVpDhXEuJjOJgJfg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:52Z",
|
||||
"mac": "ENC[AES256_GCM,data:uJQakKJF8BgFgCQ7xbsZMCRJ8Qr1A1OqWdZQFFWUpNltyJL22fOXKLFCD1O1WrBMKOQ0jxh9BPNOAcmE8T1zxWHiGnJCuBGTm2LPgyEHykidHXJ5Inj//LolfjJZBJDrMjNlAb7DtWalZoNfRocu8F6lQP8ACKlVgqin6Wl55Es=,iv:ay9gfnjfcxOuUHJj5uW8ShrmEAsQRYDsgUZKV6wNYCY=,tag:6lsCKysPmKa1gmTFw+Z7BQ==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:3ZR7x6ob7up/xgojWJRAJTc6d70w04Lj1ZHwsysHqqa2kHcyxrJvwlO/5Jdus++DH63QCHp2KNUV4s/P0FL6,iv:DtzRLUQZWUMnh9EP/7QVLnmpIQxbTMyCxv0JcERdDns=,tag:kl0gBuaxZnEsQEyI551M1w==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkSU01U2xURkVxbi9pVVoy\nODc3WjdCQnhmbko0MWlhQlU1ZXNJVFY1em5RCjhHb0Nnd1NVZlNsNHFtY0FVdUZM\nNGY0UG1MUFFaNXc2alFtNXBMV3pIMW8KLS0tIGorWEZYeTFYcjMrY2x4UkordzFs\ncjJ0S3EzNnN6ZG5yUU5nZnF3R2h6blkK6A2un+LAuUhZ2OFIjE2bPuIi3svZ/TN5\nh+mkOxqptMgbKUvpLCmONTwfRCJjGAQTdtAYzwxb4ZJRqcXWJSiJOw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYSlBFMHpGR0dna2cyUTNz\nRWdhcjNqbVJHbkRFYkFJcEVVZDczYjQvTUhnCnR1ckUvVHVjWEhaVkY4TysyeUhT\ndW5iWkE5bEVCNW1wVHdoOEZrcDRqbEEKLS0tIHZONGR6MW0rd3ZtbXlTZldXdFB4\nMTFMQTZEU2NSMGFZR3ROOGZsMkpsOFUK8SpipGo8a3U++h94eoAeQFESQUSHLXaS\nH4gnnZYdlXB0onN9TYikkSB2SytijAb7f+vV8ZjQqpNKiXTbj+8iBg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGlBbkVpQ21o\nQXBydEN4dnRhckRkcHRtd2FmR05heEE4bzgwUlpsOUpKVVUgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpQU0MydE1XV3lkWWJBa0o2NTV1cjFS\nVEROWGdac0g4Z1VMcnN0S2tZazA0Ci0tLSBjRlNWRDh2dm9kWWN3Q1BpNkxvK3cw\nRklZMXB6YlpaU2FiMTVGelhGUXRVCvMlC3O0mhLGgsqe+/qFHRtCjRDguk1T/baB\nQdB6d79XUsOM2qzlOQh1uOR1lBl16xjQmnubrmmQJ1uQDLBBQq0=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIEptMXBwbThq\nY2R4SFIwRElCTGZET1hNUnEwYzhXWmd4OW5QS1VFMU40VWcgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwpITWFwZnY4TFRrOXp5eE9HLzNMNGlq\ncUNtZ241ampOU3RtQUIyRmQ5QnJvCi0tLSBjRkkvVGNXeSt4QTYrU1gzWTQyeXpZ\nK2gwNk5HdHp4emg1Y1BSOHhSYm1ZCkiR2oNXtE+/9Px5XQZOE3wMmfg1vlzxkFBY\n4yRi8qIVq8o9fK7scF/MNd+j9zolp67fczBX84X+ytz3mmd2UZ4=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIEVDaVg4THdD\nbHVrS0xwZVpLR2N6TW82MVhKdGtEUVJlZHlINzdwalo3VncgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwppRWQ0ZmdCeGlLTHJEQU9NZ29EQldx\nSGV4QjVSRVdBSUJtOTdycFpiUEVRCi0tLSBVVWlKdE1HazY2SzM3dWRmRGZIWHNZ\na3ZPTkRWanJiVUd6dFNJTjgxSzRrCjIiG8oacjAhtnzaxx/dF+9s5GyKNQskHI0T\ny/qCBwQPXjfk0igSFgXGihe2v0tr0wAlSjPOAR5B6+nibv7Pni4=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlbjRWQzdjQXVMejlhRU1O\ncTJMU3AzWnB3K05LdUFCYUYyVUpQN1BXRTFJCmtwSDJMWkxqVjFtY3BoY1BKVzUv\nemJRbnNJajVTOTZlYVhBNytEUmgrZ0kKLS0tIC9kSkJGN2lLU3kyK2JxZ21xbHdv\nb0dKKy82Q3dyUlo5UXBnd1g0U3JxSEEKRFXKkxSaa4pzLRclCd0hebmlE1H6IV9l\nU4BHFGR++D+FjrkqK13eQLGNwc7HtaN1k9TmWMraLwFBBDBdImk46Q==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArcHRHMUJBQVM1d1RJL2FY\nN2JYOXBFOWdwclBKdENycm9JMUdid1pKbWtFClplU2FNM0p1MG1QbElwK3pxVjRV\nNUUyelh2aXJ0NG5JYVAwaVVwSmZodTQKLS0tIHRSN0xCVUZzY0F0OXRETkQ1WDgw\nSmtzMDlYVUw2akdDUTRLLzBVQXZvMWsKQmAjMJ4b00AGXDXhCgctjuOuEZE7GnDN\nESqGcYY5tXfIf3lXNpaIs1eI4Tp1EnOHRhOB2qf5rRssEl9/Qm81mw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDV2krU2pzcDMxUjRPc2Vp\nTG90cTIwQ2dvczlvVWhRRHJ5aGgyd3F6NlhJCmtuSGFNOFJqM3BjZ1R3Q0FsOSsx\nZDdGTFF5QnBta1ROYmVrSzVZc1V3ajgKLS0tIDh3ZXg2NFA2R2VNNjl2c1FPbE5M\nRU13ZUluUExiU211eVNGVEs5WkRLdUUKboZGrUaYNpeOpCmlz7pnmzS8tRF/Jn92\ndfqDgPtXMldo9gHk4i4bfBB6tSQzu9FXWV/t8nqOMcJ5bTYl2c1Hmw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0VTRsbXhCWGF0T3R4OTVz\nUUdYaWtWN3lBZ2xaYW5wbi9EWVEyWmhvR2w4CmZrWThNVEV6S0hXa01YN204WW1k\na3gzVUUrblFoYVJwd0svNDBqRDAza3cKLS0tIHluUTJlcGhONU5QMTZkdUZvRHJj\ncWVoVk12czB3RTNjamlKYzNmaE9WTEUK+h+OKoQlATHhyC/ctzbRaKByniymWIIM\n3MYigAW5RfNcfykp7WRcRSTNeloKZb75geO5HTvJq+aVakqflTGLWA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:54Z",
|
||||
"mac": "ENC[AES256_GCM,data:+bSG7IPIyXs8Xiu41Oml9/HHnaLasgl5qId1TuQDcEVwaTQSRDE57Kud8+DKOqoajV3ys826zcdqxv2UUuwKKVTZz1u+hg8UmurkBZi4rV1wipFcnq7iDTK4Zp+vVcheAfwB/UrQRYu39fwXtioXzpKEwcvhPZJ0woTbB7o3iPs=,iv:K6MU1Styx7YkpIokRR5qEircWkjVAIIKpn9hWN4miog=,tag:08rnMh2bnQbwBU61wXGyeQ==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:QqGnVvetsHQ7+JBTkdXuVLBnCIwF8gQ5x6PDqvxFYAI51lF+lmwHJmjafkReRYu3sN2U2M9jNkfRbOBptWAB1M+4doVS2p16+hQoje2rCwCZtR9p+tv/eho0HFrTJKWU,iv:+yiaTSzxSym56bZCFFII494k0FlhSgAZSUlQOtKtRnQ=,tag:VML0whJmFixzAdYKmTO6KQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCS1VkdFVlWGRGaDZScVVq\ncERtUkhUbzVoYjloZGRhQm9mWVA4SmpFZlZFCkFqVXpVbU9Pa0FJeVlpRjFXZU1i\nN2UyM0ZPelVMN1ZQQnBrcERhNWVZcVkKLS0tIFZsMTRJVWV4K0pXMlp3alBRWW5l\nZ0g4YkNnR2tNOXo2QXpzRUVnTWY3YWsKBnuxhRm09VKGwi7wLXP+Fm3Djz6pGYO3\nM9GuUBgO9mbCjXPEcaT9vd9W7zmkWiBrMQN4yufj95rahreFcoT57g==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrd1NCR0lVdlJ1MzRtdFkr\nRUloTE5rU1MwSFEzYTJJVDRhNS92VlRDYzIwClRlcDdDVkwvSjF3YkVLdzNSN1o0\nZ0Y0V2JKK1FnbVNaemJvTmh2dHpGYzQKLS0tIFAxeUp1S2ozcnBuY1JsSUlqMk9B\nWmlxL0tid0NzYmo1OTFRbmZwSmQ0ekEKoa+iB57N3GJN2l1d7XmmQolN/5UiGbI0\nQ5IgcPReeYOhhc/sBfmea/b5+hWv54+anHloJgWNHfVBCUK8btgTrg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIDMyZFNJcWh2\nS2xvMGlRV0prV0pzZ0wxRXBlZi94d2hlRjNUWVVDcHh5MVEgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpFc0p2YTdWVDNEejB3dmJDNEt2OElR\nRDUwQnZTODJhdVEwV3hTSlp2VnNrCi0tLSBsbGwrY2RDSXpqd0NVbjEycUVmUmp3\nK3p6VGhrdEtGV3J1clBvMEtwTmVVCm/00VMmgGUAYgQ1M7G5mqLjG341umwcEP5R\njvr6dRLEF9Zhfo8M/SJK9C8fDWehz1dqwMxtBoIPLAaWRNu6CUk=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIHhqKy95dDI5\nQ3dYa3NYTktZZCttN1hBN1hUallVM0grSTdNQTRGS1N6QnMgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwoxMGdQb2p1UUx4T3hJUHFwSDBtNWFM\nVldUTTJUeEFvUGZvZU9mMlExSnBVCi0tLSB0L1VTSWxEZGIxRFRiNHI3UStmSzJW\nSTErOVYvWWhQbElMZENMK1U0M01vCldORZkxFZanGrP+OBDEA7nvAi8IkfBJnATG\nXpP80YgiX5uj6qvrjOniPul63GCGWMeGMTTcScOz4uDZqGVzKD0=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIFNxajFOZDRt\neDlGMElBMWJYUDRVVHlzSzhPY0MramhTbXVDdi9VZ1BXeFUgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpXZCtYVDhJWFRkY0VQUFdmUjJIYVpD\naCtzWnJwK2paRHhSVG1FMTVpdnhjCi0tLSBDRjdWNkRFWGs4R2JZMDJTMEJ6N0pF\nT1B6ektWV3pGRzBWajNXM095K1hvCgeCMRqX1wyzXcldr7jzyOrbScSzcZ/xuREk\nY5EuNsO3QVN3TjcwzZjSa5NUWA+i4+48xpSzfVkYBANl5oRCzSU=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTTHdjRU40VUYrdGxIVjVU\ncXFTUGtxK2srL1g4RGpZTWpDWTkxYmt1cUdRCmE1eXovbkFIaVpuT2VVb25BcHMz\nOVlqS1lPV1VHQWwxSDdSZDl1MFlVR2cKLS0tIGJCRXUraGVXQndGVFRyQktEOTVZ\nRjcwRTJjZHpid2dMakl5WktEc2Y2M1EKrgSGYnuM/O5pb/ALYShHiYJBnkSdCyMa\nAcX/V7GYw1ecp2HFf5amTB36X/wpyu/oybU5YxbtB5WZ2euCY01kwA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyWTdpbUdIWnpVWGVoVkUx\nT055YTJ5Y1MzSk9jSnFTM1FwY25OVkR1NVdFClRSaUVOZ2twdVhLQ0lHNnYyd1Uw\ndjFzaGJBU0N3NE1WSWlmTHhFVXJFOVUKLS0tIHY5ZThrWVBhTXpRNndsNVN6bXpo\nMmVId2VBZzR6NU0wWjFmVmhqTDVzbk0KHx8aEvShI2ufaZN8UFBG85c4g5GwWxjl\n7OOR7xZXrqDUBag8cf6v2TP94tcVfPV+N6DeNeQzKxbIVBGbv5yRbw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYUDhyRU1GNFhLK1JDeUVN\nbFZUdzEvcEtsUjJhOGhBVThXUUdVdVlTT1VnCmtVL3ljejNBQmNaRTBiNndrZWt4\nS2xZa0RJU1AwcVhkVXM1b1B3Y1ExU2MKLS0tIGU2cGtBSHVVZWowYi9UclBQblNQ\nWERVZkl2Q0FIQ3BCemVjVmt1bUlBNUUKJWRbpFyBOoPzIni4pqpERPsdFx/Kch2U\nxLApZkj06EGuZjMLs1i1GfSzgOuFfOMxcuHiSV2ZtSWmxjhikGBisw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkbHRaTmxnditUQ2FpbjJ0\nMDVRcytzZXlQZnAxOGlSZFNRZlNWUDRocFhjCkQ1UVNRK3N3YzZKZXlXYXY1VVoz\nZHZ1L0t3R1BrRzVNMG4veFQwUElCb2cKLS0tIDlwN0FYL2ZLSDUycEI5ai8zMktZ\nQ1IyNXlhRnRoUk5hSjl0eEdjS1l2Z1kKSt9U5jta89D3aGZVMdpCigRkFwHHlbkE\nBxvHLF9OhmjtpUyFR2DIHrRScaMaMgNiz3bLGnpiv8WpOykWyUOfZw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:55Z",
|
||||
"mac": "ENC[AES256_GCM,data:BdE8N187hPfHl39qQBrZ7KQR/knxStx8IHkQsEqdSVOSID8Wm02pIEUT/1NBWwbxI8nTO9xr0XCwj9p2izOey7UMqaHvPNyevlq5CF2lrWaYcqw8nE+lJXLyLYaEcHgMb1jkyFHnEkJpNBljE0HbMyczFfLS/6prThYcJ9JYPnA=,iv:ZxIIgRwAdyTwzlCQCotK+IY10E/nsSi6dTCvB71gSJc=,tag:y1BGu3AtkdiDsIm4sVuNSQ==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:fXVg/YsThytb4Bk52PjbO0VFZHIYszo8rF3pX67puveBVMm6GHGSkeATxDjrAwJoFNjursmQ6T6+ABWMwnwtFMWqK+uh56VReA==,iv:U0Z8iDfu9+D4L8KMpayJS/EOpMha3UK7hZz4R3SKOz0=,tag:I2Y7TBdm/ZeBOBU0DYMKvg==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIYkFHblZDVDBZcjFJcEJo\nT1QxYVIrdUpJN0tlUEh0YXBwTVEzVnR5Y3lVCkFRVnJWMXZ1WGNlUnlIQ21oditW\nc2gyRXR0bERDaHh6cHExTHNMUElRMmMKLS0tIFhySnBUR0NLZkdsTFBFKy9NSzlq\ndElkT2s5Z2ZMU1l3dytpbDUwdHFhQ0kKwu/ip3iQ3kl6LnDnQ7Gh8nut3HLx2wsT\nZOphkNgMpTipjLsUvEJxbB2l+klqnv71O5qeYPtkad1YrGtDuyGQ0w==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArV3BlUzlsYzF4WEl0SnpV\nbTc2cTY1d29KZDZRVWJLTnc4LzIwNU9waWxBCjRpS3FUOFEyRGxFZVNEN3BIK1M4\nWXpNcmtqSTRPdlpESlVRM1c4SllvNkUKLS0tIEFKUUorT0NGaW9WenZ1VGJqQWpU\nak1FSEpLSEJ3VFF1cjNMR2JyM0JXM3MKek4UFVKH7BlWHx1jAQAdv2RgOobMS+b7\n/wtYgyXa6+9Hzz4YmSnt2UpTMC+UCwj44uytcO74HalElPg/j+nQlw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIDFkdnovNk1j\nS0p3YW5oTWJibDc4YU9yNkdDTmRVZmRwWnV1Y2YrU0NhUlEgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpJLzFYNWttUXlNZlZvalpGNHR4dVhD\nRkk0ZFgwNnFNQXlicGtVV2x1SFpJCi0tLSBCeEt6SGZRdW1GeCtUNWFkbzJiOWZU\nZEdCVG1PM3pwaVZoaVIrbm1PdVcwCh4efyboDYJVORdvsAYQfboctvNqxElYjFSK\niWKzrxO7YnDKpjhCk1jjpTanIvyXkj5/3YwvS4/q7iuavf/amO8=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIFpNSGJWNmFY\naXdBUTZCcFJTSlZrRklZK0xpWmF6MTJRMm5id1VFVUxTMWcgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwpIcHc1YUZOSUwvTEt3c3UvSSt5SlF4\nZHV5TmpLR3VyeFp0dVZGUy9GR2tZCi0tLSBmMEFCT1dFblFib3paWEZ1dWtLQWpz\nUjgyK1ArdVpFYmlaMDJDT0tJcXVVCiDmAdLgxUQQ5n4ESSKhITQtOXryWdZ80vm9\nl2pYFnmxhIFFRm+yQqgM9+pXSpn7msEg112b3hCZgOXEOaUqDHk=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIE1mTGgxYSt1\nd3BVaW5XTFErZDY4SjBrYVhiN1ZPaHVaNFZJQW51S0J4MkEgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpzTEM4YllrbnBwa3RIdUplcEFMeS9n\neFNRTjQyc25ONEpyVVQrdXZxTkI4Ci0tLSB3T0laWjRyYlhXTjdJK0xlSkc3R3ln\naWhqWVBGUHFZY0RiQmFPN3FLSzNJCk97lBANAjo690ZrXNF22z+qOwHBvWkWr8m8\nGCbnh8tqbXTGxPA/tw954BHtxj8GgI/3xJrNArliUqP8urwh0fg=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRRU9xVDhodk5nRlFRZDVa\nV3Y5aTlGaTUrTkhDOENQWVo0dmtaMGlLMHlzCjMwOFhEZzgzVVRnRmo5TmdPQUhM\nNCt3YWdIV283Sk9iZFRLa2lscFNDSk0KLS0tIGhSTW9NSFFhUVpPRk5xTnNDc1dG\nRk0yUXg1Sjg3SExiY09JWm5RZGI1YTAKA4x6ce8/BtnWgmvxZe5wfIcXwke13aNs\nuCyTn3iTlxb9kT8JQPlZYwnIDdTKc179YPIi7FjfbeNzb3CRwtNO5A==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4T2hGQ01rUnIwZU5WRGty\nRWNEN2todmU4d01tNGtpVXQwTDBtMEVsWENnCjdSK2dhcis4WGgvZ0xTS0FJU2NO\nYkp4aWh1Qk9YSU5VZThmWEVPY0sycjgKLS0tIHJKZnpxS3k4dFZmb2sxVEkxaDh4\nRXRIVmZYbzZKNUNYR0lpaWduSXRIUGcKW6lXD9Hz8l8WcFI2cqARfPoMn8ekKZGZ\nejstSAPq1QS3cqQ9EZ1BiG1duyHq6ChOpP63b8x2uS/+WSWQfzH0ZA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkeHpkYlJ2a3ZOS09waFR0\nRTkyZjdSZGo2Kyt3Y0xleXFWemFRWUwwcldrCjdBTzRZOTczekcwRHJjT25VSXZP\nU3JFcUZpNm1BV3JVRW9pMGJzQ1llcDAKLS0tIHFJbHhXTEtUSUhFSVJvRWwxdDdB\nQVZ5elhybnpCaXdTK1BOWDN0NEREakUKqfN2jitR8viwG7Y7EJ/Xx7wZx/iMNn1G\nRQfmXKFHYNdKvtby2geTKZhoqHKq4AmLSI8I+jSGI8li3k+QoDRF0g==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaRWZWUjM1TU9rTmNyZFJa\nWkcwa1M4WExubFNsa3g3UVkvVVFZemxPZTBJCkJxSW0wYnp3ZUFROWhnVWRIdjUv\nS2ZjeXp3S1M1ZFZPUmx0SFpGVTgvQTgKLS0tIG9uMmsyUkZPcWsxTjBPS1U3QTVH\nanMyczBrNDBoZVowVVM5dVZTcDRBNVEKhBpmXhhx0CcnnYhIGu3CbouleqHGXmsm\n0E28qwUNh2ytJkM/Kctvzw2iwPYDDqYb61HFPbwPgO0MqBiX4dR6mw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:55Z",
|
||||
"mac": "ENC[AES256_GCM,data:k0JeGn5YPYn5YEK1LRkVvi98mYumlVV1qa29h14zDh6O/1xpEpfiCPe065L26LQgHillL9dciaTCzWO9Ni13Ulc9JUY08rHio3tANDUTrVyLhXjMhj1H47XyYfJpJdQThK8M9U4DFBpEA1lCBd4gs3W9d5/kwtu9wtFIxjqChuU=,iv:9CA4Fr6jsZqrROB2emarZkOJkMWUNnCZj0H3L3lrXCg=,tag:J56ftd6NauzsPPulbrHYEA==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:yEnBtw6nvEs4rtNGPtLJyOU4VBlWjBaqMKWdlRgxLEjexYcQ844VE7qUTkStQ/JWGi1m,iv:1hlJ4viRCm9HsyLZy3xJxCED7ZIhYR5hZqbudWH4sOk=,tag:hll1ctNwZZ687lOe2TCnSw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1OWpQM3NOakFqNldubmJS\nVlVSYytEcXNNbTQvRDh1T0lJZkNRMG5hUDJvCnVvd0lyYmkyWUdRRjNNVU5VVzdu\nMHl1UDN1QklxQVJwRGZoNTBiSG9jaU0KLS0tIGdFWFM2M1Nha3hneFIzbGhBS05k\nS0dEMXFUMUV1ZWFtVzlpM0FkOHlIM00Kynt2fue67O4vco8VsV41aKJDMgXChDGD\nbY1ctk/sDIf1lsHK0wIses+luX7dLvX/DXe01kjkIBFvHkbQWnWU+w==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIFlnM2pFRTBZ\nMXRHbXVuR2x2cjlwc0RBZStjb2wvUzM4ZEVIVWdnTE9ZVVkgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQoxQ3ZXdXlnMkpyNittdm11WmpHLzV4\nZXBHTGVzWFVCQXowbkF5OWFxZ09RCi0tLSBsNGVyR04wSWpBWXltd1hFREQ3UXRv\ncEJVMGJXbVo1NlFLS1BXb25RdGc4ChiIYJVw90k0QTonYD2g8Aa5RtdQOoYtFnpH\npuIjGkf6pQkYMTm9rKxm6y1qDQa087POUlw6qtYte7y0SRjRH+8=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIG8wS3ZwWXhh\nS0tQeWZKQTlGK0x5eE1vT3J1RUtTSFNmbm5TNGc1RjlMUUUgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwpnT3BzYk8rMzNRTjNWNlRvMmUxTmdF\nZHAzT084a0RoN2d4cmFEMGh1WmJjCi0tLSBwUWNJcitZb3BlNmlFQm8wRUk2UFln\nUU5IeEJEVEhzaE1jbUowZG1NeUwwClxW5WAFo/kVKeSEjrTefK8f/hLa6oNwAE5E\nk5Wil5xK53A8jaoniCAGxFIzzPepVGD2kxZ06WvlcBNfpFi1nV0=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIDUwSGRUYXFx\nVnBnRlhpUFU0eEdGYVB0SDVGZ3RFRXRaWXVRakVCQWJDaUkgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpFcForY2lQNHdtczdpTW1iY1pnbTNZ\nNHRWT251d2o3S3dHeUN0eHZKODdrCi0tLSAxM1hnKzB4c3ZRdlJTMmRnclBtQUVR\nVE5BU294RW80SGY2NU1kR2IrQlg0Cvp35pmMR35YDdbZXHUuFnkHdKfYoQZDEUj+\n9Udwb+dYeVgsXNdtXzkQBSiRfvrvbM84rwbk1W64xwjTbMP4E6g=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxeXYvLzBNN0xKckhPeVd6\nczhGN0dDT2Y1aU5HS1lHNGI4MXZqZzh0S1FVClBRNWVFVCtXMjlJVER4bzlXdzAy\nQm13VXVub056Y2N5R0pRZ0ZhcUZ4bkEKLS0tIGhZaEdoOW9TM3JBWHhEU3Zucm5F\nZnJMR3F5VG5WNGVpc1FteW95U0JvSFkKTdIwbrKj2avl1cYBu7OgLC5ghsuldymC\nEZ/fb2Dh48vQ/n7sJt7knmrhcExwj9YhrbnZdoebFqt+qHV4Oq+MAg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBERkRHc3VLNFpkcEhsdzZr\nVWx5ZGVJK0dxNGsvZkN5QU9OdDZPYlhPOXdjClE4ZlRCeWt4UEZtNTZoRUc4NXUx\nSlZYaklrMkVBZkJUNlBIZFF3WXpJb1EKLS0tIEhUTWU5aTZUR291NkZoKytML2VN\nTjMxVVpRYWM2Y3A5cW91ZVRrMjZIelUKjuPWplXksEg/uAevISCPtjIYndN28s6Z\nmtE7y54B/LphEGCPncn9RXMKpuYx64tDho2l7ho745hS9a6OvqidUQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3THNqdExpa2MyMUdBbkl2\nUW81VmxacUtic1BTdit4T3VLZnpKRWliOFRJCkZuekJ4TlhZcmt3MFFGQU85bnk5\ndklJMnZ6UWt3enhzc1R4ZGJjcm05eHcKLS0tIFo0d3BSdnNtUnJpNHZNTmc3b21O\nQThYOUFGMkt4eFFnRkw2ZUorNXliUDgKg17nsdk7wxT8Yhr5mTw8tVj7SjQU5J/q\nM94+ZDCjB+yfe4vFBYl25C7LDtP9m7vmfRWafSRJ1/EMS7jiQBfRVg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAycjJoZW8xSVQ5VTRJVTBz\nWnhSV0NNb3NmQ2xJL0puVE1TUlgyQmhVbGpZCm9JZkhzMWtnUFRVMHgvemk3SDZu\nYXVwWjkxN0tsSU43cW0wckl6QkN0N0UKLS0tIEh6VFhvK0VjNCtvek9OcW1sS0lx\nTU9pS3o1d3dRYTdPdG9vTEptSXZGWjgKSpwGVl7k9kR4gE292++EW60yr6t4F2ik\nciV25avyGJPR+bOrK1siAOixyn048jgunU5ubeduAUbh4ceAo2fQww==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:55Z",
|
||||
"mac": "ENC[AES256_GCM,data:QnoWKT3OniM52QNhpciH+IEtZZ8haAgdfSoTSYBq8ZTcWaqi1WSZG21IO9iGccufuRS20QR6swp24fXhCdCZGQaBHrNixE/uNA6MUx+B0g1CCGf9nBMkzThg6RAgiu4L/QgvrpBn+0IxA9igMi63Acq3dtL7Iz5z+t2JGKW3Irw=,iv:68v4GAjaFU1T/X8QcOk0e40tjMcfVWYuAQwPGukUF8c=,tag:zWY7Hx1qGy3aPJ5V3wEZ2A==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
200:d1fd:fc2e:e24f:b5fa:a56d:d5e3:f12b
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/groups/admins
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/anser
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:oXhW9+FbFGjZJP9WSCPZHjhVt7+yDaoVQn74kqnov6mu/U1Px77Nhs7GxNDzz8vU4Jp2HzdmJ9qcu7M6YRDXVtsfU8VB++30Ff6IasoCKVZbuv8m427PwpifCWFeF+O/bqZ3AyG63znh+xaEtzqfr7NnTK3wXoU=,iv:UDWpWrSoXwTNMxIMY6u2nECNjaVuXvxMu3TiA8tNzLs=,tag:dTEXbhpnU0FvZemy5Opf9g==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPU3VtSnNHanJiSlpCM1pm\nVFpZRGlrNGE1NGdnWmdwaTcyajJQVlR1eFdBCnd4ekxLUnpGdDRvT010QjJzYTJl\ncVNjTUI3WlNpamk4a2E4Z2FDYTZkekUKLS0tIHNycGRpRnppaUw0UlpqYVl0R2FP\neHN3VnpwTVljTGtIQ0hXeE5iNEUyY2MKpn0iGbiP7HYtp1yvUFzordAtNWw002lV\nAe/fanCH2JQ0fFNHCpP7t8TInQGuWwavBc0x45H2mpM9grAszGD6Ew==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtMFQzdzVIUTlqNks4RVU5\nQ1kwNHEyZXJnWlBmbVZ4YUs3MlRvWVVEQWxrCktvRFI1akJta3NkSjdkZUUxdGdL\nQlozaE8yZTFJWjZFWGlYZk5udHF0QmMKLS0tIHUxSjQ4blZNYXZzUnhoQ25hYjRX\nR3c0STRVWDA5Z1JzMGxZK25pUkpTLzQKVo9E12m3C/6rAiMx6GAn8rkJrW8yq2gF\nCYdldd2stxQIK6OxYf6Z/2zvmo2Bo2rb1S6d3yrdlkk+4ybnlrBQwA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age19hn633nzg6kga9xmnfjaw06h3lkdg0sfqmt2uefp7neefy3xhyws5mf5y5"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGVNRGF2dWQx\nVi9pM2swVitMcS9jVVd6d1B2dFZYZEtmbW9XdDRjMjlwRlUgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQo0a3BxWWgwdk5sWWRBU01WbElvSzJY\nN210dCszNTU0Z2FuNUtlTE5VSUxNCi0tLSBERHh6VmtEK2d6Y2tlMWY5azhnTjNv\nSmYxV2U3SlRrNjlaTmZrbHdQOFpvClsy5yc+lZUZKE6Im69+WQItsUqJXqxcj5K6\njCXh2WNSiIB53dqKcFUFuIonQfO8ClU66O+XCCHUslcrUwN4Gk8=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIHJxMnVuSFpD\nTm5FM1AzelJWbnVaUHhPcnJ5MzBNVEpBdnFqaTlsdUptVlkgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwovZm1YbFhVWkxUNUx0VnRub2hKeEJy\nMG5zT2ZhWnlCN1c4RTZvMUJPN29VCi0tLSBFZmMydk42UUx1b2d0YWFCdEVwRERl\ndFpRTVgzbGZoU08zTWxpNHR1RklBCgndxcnBpDAs6sK4p9+D8GaLx4aJwrTnTuOA\n3uNSCiXCB2CyRXsEjJOe1VU2B2iqVbzbDPsSYPenfFG4NFg5378=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGFQamhKZU1j\nZXVZK2lpQ3RLUEdrdEJXWlVyTjlIYUtCb0NoWmVicTh1U1UgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpTeWI3dG5hdjF3OHM4UCtpbjNiYU5k\naGkrKy9KWkxGTlZ0amZNYWZOS1dnCi0tLSAyZSs5VUhiRitRZlJGSm5zc3JRRDYr\nNjdJUkcrYkt1S0hWZnFYRWp0cXE4Cg9L1D581HrKPWO+eo2J49p4H+PI3uqeHFr7\nL4ESFF8DNN1HHkCPAaPzEUm0SeKJehcyS2ful/q5rPh5kJCNgSE=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwS1FpOFJJV3BxK1phQlpi\ndWlRaVZuSXVCWnRSOVZKMnA0bG45WDhiTUJJCk9pOHBUUmZqVGRwRlhYYWdLVWZC\nbm5DWEVNZUYwcUp0Vk91T1BWZWx2c2MKLS0tIDR3cUFwMElDQUdiQm4xTnBDM0tI\nK01nQjl0RmVvUFAzUzVZc1F6Mm5IdVEKq9KH8Q7VsT5ZoB/I2nW0dJUWFUaRYmgl\n3+l1+UQG5DSgcJ+eWzN6vndygCg7ln3VhOokVJCQ3xc01tR7RVZnNw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlQjBmeXl6ekRmY0NsYkV1\nTENWVWc4djAzZmpPWHlqZ01vQlgxbVgvM0ZjCkJIdWYxRytLSDlIdk1ad1VCNUVq\nUlNwS1FtOWt1aGdxT1lJNGNzNDNhN0UKLS0tIFpOMGQ3cTBENkdRb1h1OGVFaXlH\naUxVZDlvdTdtKzZkckJZRWp1cExFQ2sK9mXCzmyiRCGiJZnAe2k20EOxMfwrnvaM\ncNu+hiGr10YW6IZs5/4SID9JXV/lYZQqPIUZJh+3oWFBq2wDJ6X2WA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWMVBrUW5yQytpMGdZbjh3\nYysxNG42TlhSeHY3aEt4dllkWkZhSEdyeHdBCnYyZ1BiRnAyb2ZYb0Z5UG01dzBE\nU3hMbTVFUWs0MjJ3TENuOUU5YWlSbVEKLS0tIHlXcnB1cTM4d0pRWlI1S0dqa255\nZVIzYXZFY3E4REJGNC91VTM5dlFDb0kKQ+A9JpqUrhb2eM4tpXX/Sn8zHLJNG0IF\neSNds4s3YYvQQvYwmqQrICCYJFWHeEEPJs7L7bUmNNk38NLMNrhOpg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4VXZ6dldDOG1CQk5IbXZS\ndUI1WjZTN3pBS2hGajNseFNqSWFrMG43akZZCkRkUFN5OUN0aXpoU2xVVjBlY2xV\nQ2VPdzA5Rk9PR3ptQ2t1YjhWZXFkVDAKLS0tIDNUaXNpV2JEQWZSMlkyODdoNFo3\nK01VLzBCSWdGaEw3bWowN2dKREVSYlkK39/nUqaB9f0UxK/ZLPoJh5i0L//4H7xK\nOMThqWDBhZWfWeR5HMmbl8THdtrcUCU3e/d7qK4pRlwjyI2Mdzy6MQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-27T06:45:56Z",
|
||||
"mac": "ENC[AES256_GCM,data:zUv0iPTotaqMDpMA09gIH9qgswnkDq+hjfSvo/mA0YRP47fk05DI9RjwBQ1lwGxtkXLqcY/1aGY6Y/y+Hh1pm0mOKRV69AWxvnCVmOuVA1VsrfNGHgeZxhwTTieZc9yDr1tkQ07ogy+hnNqLkYvjRMwYJ8eoQ8G3AJGxWCtFykw=,iv:3vW/WI82Mae2JSrgJ9QFhHVLiP/ATFjd7kUHeD51qJA=,tag:47hyo688fimGZKf2sLa/yw==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/kurogeek
|
||||
@@ -1 +0,0 @@
|
||||
970101e88ed82502ad49150e076a481aae2016f236ccf4438fd7d514353670df
|
||||
@@ -0,0 +1 @@
|
||||
../../../../../sops/groups/admins
|
||||
@@ -0,0 +1 @@
|
||||
../../../../../sops/machines/buna
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:KuFHnA==,iv:lvao2ckPM9O/fgs1r3mh40Gnr5vuvQqZTRaQ+anHNoU=,tag:cBqhneA3C3VXABTOvadIgw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzMUN6cnNNdm5CMFdjMGlW\nNDNvSVFzeFpaSGFNczF4Ri9VMkZVc1VQOWtzCkNDRzZ0Y0ZDOUhsK1RpQ1AwQWZV\nZnI2eUkxZHFJZlVwa3JKZzE0TDd1QmsKLS0tIGJIamNRQVh6Vkc5dU9MSzlJM0VK\ndHV2MFl6Sjc5TzJGZ1l6ck5UZnp4U2MKN+A+25PmavBjV6Py7Lex/LhWLTBO2fFu\nQajDNL3WcXE2lgRICk4QuiW/vKCpB7cfWrZjbTbKIi5jneyXZA4+IQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIEFyMG5TNE5k\nSXo4dW9FOUVFZTQ1VTlXM3ZYQkdxRXhLQzZkWVl0R2QzQmcgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpBbU1qQTc0K0ZHdGFqV1h2d2VQblhs\nQjRqS253dlMxb2R2VU9YSXRSUVRjCi0tLSByWnlta0ZqbENrejYwUXJxdWJHVGdP\nYmlHanZnRzNjUHZOQjd0NjZweVRZCmrJo9GKl4L8fHXUwn59pe0MIxasg1cVG/Td\nqfa2WBtRFTHC08MJ9NHIOJtngGUdt9FO56Hdu0hCH/+SQE/dGHk=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGZMeGpoQkVp\ncHRGemphOGJsNEhzTzhTTGY0ZUpHMG85dFcxcjQveGFEQzQgQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwpna1N3ekFCc3k2OStDVmZkeVNwa09P\nZHdxZ3M5dHFWcC9ESXBzVWtXdkRvCi0tLSBwdUJGaXJxOTJlL2tKcDRLZlFYeEFo\nSVBtTjVoQ1VzdXh0akJrNWxDbDJNCi1AsTs5S5MV8a6QIIzWYBSQu3ZemxE7+sNl\ns0mE9vpeTNoEbUQeGtR01YDoBkyLK7oyW9bV+aGdpsHXjIwROVI=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIHN4dEp4YkIy\nY2EwTFN6dEZwSW5Ma21rVjZYNnlRL1Z3S1FBZ3F0ekpIRlkgQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpEQmF2blAzMGVBZldOT1ExSHhlVi90\nemkrQlVHMEVweHEvQUlZY3FjUG93Ci0tLSBEM0VVQmlCdFZtY1NELzBwSWhLTFRT\nd1ozQVJIcVJ5NVRMVEZrQ2o2Q244CvEbyfK6vlwVYl7Y5Aa29Op1ea3eeFW2PAdx\nHeAFeni3LPJyZhya/Q+Z+ZFWyuEdGdclMTeaqzQBhefmAJzM6jU=\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlTkUrNTBNRWdDUnpRdkxq\naC9wd2VEb3hPRVBxa0I0am83QzVrZmhsS25jCnFpSW8zTi9KRmRYVThxb1RZVEdw\nMmJxRlB1Q0NGSTdiZEpISUVFTWtwUFkKLS0tIEw4TTZEV2dMQURxV3NiVnMyZGUr\nUU9TcVM0RE5mdVBnOEVBcFpFNTNOM0EKQlQ7V88MhDLHsD9AQc3tA1oQo4uj1RQD\njX5uDH2HnxTVI7KGMU0NvnsT9Y5IEVdXVLCOUKNFU1eKQmsyzl4IQg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYSVdDL21tclJWak9reFc4\naDU3VTNFb2RKSExUSldLbjlPbkpiNW5lb0NNCkptdnMxMTRqaDJqZkl5c0ZReERJ\ncmkzVDhVSVNxQXNQZHFFWXFIaEFnNlUKLS0tIGZ1N2ttQnA1eG8rZ1dyckVxVFJI\neTYrc203RUhjVllUNUwzTVBIK1gyYm8KOJFlCD3akcnK1aplNpmmH8eQXLNM4H3V\noqnDgxJzaL62MgJVIn9Z6hayL1vLnUyu8FbEjT+Axaf6/jmEOmG/yA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1pgxgvwck2vr3va6c4c3utj7w2rfg2st9qvm76nc92vhfmplqmu4qs928lm"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5N1cwK0l1dHV0cThCdm9k\nYkxkRUhsbHdrWTJyRVViVXRtd1A3TFU1WXlVCkxWbDhseS9yQitYNi9lMC94eFpk\nM1Backl6N2dhWVJiZ1k4MlFYU3dQMTgKLS0tIEZ4SUs5b3BUY1hTdks0ZlB4TDVO\nOE1qMTNUY3N1aW8rc1p2dzRtNEQ2bVEKooGSsl+xPK8svd4lOQAgA3/F+plSBOkB\nbZVg2yVlm2f29BSB5gZVKFjjQVVl7WcRe4Q+2cAiANbplvLXSRY0KA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2amhaUzU0VmxBZERCUTVh\nTStBQXpKTzVhRjJZQ04reEE2YVZRR2IrYmprCmFtV1ZoMnhnUExzWk1xTzZ6THl5\nMnJqQ3o2emdrV1lxVjlrNlVqZFhGRVEKLS0tIGxMakQ3aTI5WkNlYXUzUDNCRWti\nMVQ2ZjE5eFdxcEM1Q3lCWW8yYmJRTU0KMg5tVdQK+/boAFPzYlLDT4rjO09VyYXg\nToyMwVvHW1pPuc910ol0esn7twJPUCDlAcsW6mW74VxHIqY+9exykw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0ZTIxR1Z1QmZFNXZKNUl5\nZVdLRFBVOTN3dWZZaktzQ2NvUjArU29EcGhzClZGemJtem9yMjNNcEhnMXFiV1ly\nNnBvcFpPUGhFWjNHWXgzcXBNc3JOMkUKLS0tIEtKaHBTWU9qK2QyTUwwZWUxZkh3\nQTYzdFFWdHpYdnhSSHR3UEIyVURtQWsKFC3YPPY4bQse7fKmRi9QjGoNWBuNobje\nLKWhQsk1Xuv1VUz4DXJ/QJECthEZ01eE8k716ybgRxgk8nTAKoV3kQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-08-18T09:45:23Z",
|
||||
"mac": "ENC[AES256_GCM,data:CgxPzt40hURezZ7cxH+Gcaa+/z1lZXqLwepB0epCQ03fh6Hg9xoEedzVaeAByhNi/v0cQ9Eq2qYc5SrbmZVBeBOzZLUUGQn8xYNoDpbUvKDDRnfBg3kIjh9f/Oj6QzpesYloc2JMsiNaWuQd3U8yvKXXTM/hJ3w/KaflOZMkOCE=,iv:AshLE+wgaaZ8tmzvsGv5UP0k3oV46mXlTdgIb553pRo=,tag:U3dc7S41Dt2q+v6GNYRj9w==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user