Compare commits
No commits in common. "master" and "installer" have entirely different histories.
54
flake.lock
generated
54
flake.lock
generated
@ -193,11 +193,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1735644329,
|
"lastModified": 1728330715,
|
||||||
"narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=",
|
"narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "devshell",
|
"repo": "devshell",
|
||||||
"rev": "f7795ede5b02664b57035b3b757876703e2c3eac",
|
"rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -437,11 +437,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1739757849,
|
"lastModified": 1732466619,
|
||||||
"narHash": "sha256-Gs076ot1YuAAsYVcyidLKUMIc4ooOaRGO0PqTY7sBzA=",
|
"narHash": "sha256-T1e5oceypZu3Q8vzICjv1X/sGs9XfJRMW5OuXHgpB3c=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "9d3d080aec2a35e05a15cedd281c2384767c2cfe",
|
"rev": "f3111f62a23451114433888902a55cf0692b408d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -457,11 +457,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741457641,
|
"lastModified": 1732884235,
|
||||||
"narHash": "sha256-HIoSAfme6BReJI8wbtZxSuALfI21OqagDPlbGkeVX0c=",
|
"narHash": "sha256-r8j6R3nrvwbT1aUp4EPQ1KC7gm0pu9VcV1aNaB+XG6Q=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "2c87a6475fba12c9eb04ccb7375da0e32da48dc1",
|
"rev": "819f682269f4e002884702b87e445c82840c68f2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -471,11 +471,11 @@
|
|||||||
},
|
},
|
||||||
"impermanence": {
|
"impermanence": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1737831083,
|
"lastModified": 1731242966,
|
||||||
"narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=",
|
"narHash": "sha256-B3C3JLbGw0FtLSWCjBxU961gLNv+BOOBC6WvstKLYMw=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "impermanence",
|
"repo": "impermanence",
|
||||||
"rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170",
|
"rev": "3ed3f0eaae9fcc0a8331e77e9319c8a4abd8a71a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -545,11 +545,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-mine": {
|
"nixpkgs-mine": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741543477,
|
"lastModified": 1732985787,
|
||||||
"narHash": "sha256-CIXkalXwVcUFxb2TF33j45GlWWVHGmHu0GaMvVM/f6M=",
|
"narHash": "sha256-6rSJ9L4QywpHLi/xvpOHdTuPm6/eOJcXxnYzDbP3U1k=",
|
||||||
"owner": "devplayer0",
|
"owner": "devplayer0",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "811543d59a6dec53bd025bb17be0896f3c37c03a",
|
"rev": "a28c46933ef5038fb7a2dd483b85152a539c7969",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -561,11 +561,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-mine-stable": {
|
"nixpkgs-mine-stable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741456679,
|
"lastModified": 1732985894,
|
||||||
"narHash": "sha256-5f6f3yFT4+KDV02PXlKxhJ7ig++oa+NzGwlW8vxWPHk=",
|
"narHash": "sha256-YYuQQCcSF6KjgtAenZJiBmqt5jqP3UvYgC424VQ+22s=",
|
||||||
"owner": "devplayer0",
|
"owner": "devplayer0",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "c82613e3e6a22d4cc1e80e1e91bea15c601dbbe7",
|
"rev": "e0a3f4e2bbc5f7b681e344b389dcbab23f2e92a8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -577,11 +577,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-stable": {
|
"nixpkgs-stable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741332913,
|
"lastModified": 1732824227,
|
||||||
"narHash": "sha256-ri1e8ZliWS3Jnp9yqpKApHaOo7KBN33W8ECAKA4teAQ=",
|
"narHash": "sha256-fYNXgpu1AEeLyd3fQt4Ym0tcVP7cdJ8wRoqJ+CtTRyY=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "20755fa05115c84be00b04690630cb38f0a203ad",
|
"rev": "c71ad5c34d51dcbda4c15f44ea4e4aa6bb6ac1e9",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -592,11 +592,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs-unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741246872,
|
"lastModified": 1732758367,
|
||||||
"narHash": "sha256-Q6pMP4a9ed636qilcYX8XUguvKl/0/LGXhHcRI91p0U=",
|
"narHash": "sha256-RzaI1RO0UXqLjydtz3GAXSTzHkpb/lLD1JD8a0W4Wpo=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "10069ef4cf863633f57238f179a0297de84bd8d3",
|
"rev": "fa42b5a5f401aab8a32bd33c9a4de0738180dc59",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -785,11 +785,11 @@
|
|||||||
"sbt": "sbt"
|
"sbt": "sbt"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741328331,
|
"lastModified": 1720592125,
|
||||||
"narHash": "sha256-OtsHm9ykxfAOMRcgFDsqFBBy5Wu0ag7eq1qmTIluVcw=",
|
"narHash": "sha256-vR89LefkY8mBPWxDTQ8SNg6Z7/J6Yga80T4kSb6MNdk=",
|
||||||
"owner": "eikek",
|
"owner": "eikek",
|
||||||
"repo": "sharry",
|
"repo": "sharry",
|
||||||
"rev": "6203b90f9a76357d75c108a27ad00f323d45c1d0",
|
"rev": "604b20517150599cb05dbe178cd35cd10659aa4c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -126,7 +126,6 @@
|
|||||||
nixos/boxes/home/palace
|
nixos/boxes/home/palace
|
||||||
nixos/boxes/home/castle
|
nixos/boxes/home/castle
|
||||||
nixos/boxes/britway
|
nixos/boxes/britway
|
||||||
nixos/boxes/britnet.nix
|
|
||||||
nixos/boxes/kelder
|
nixos/boxes/kelder
|
||||||
|
|
||||||
# Homes
|
# Homes
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
let
|
let
|
||||||
inherit (lib) genAttrs mkIf mkMerge mkForce mapAttrs mkOptionDefault;
|
inherit (lib) genAttrs mkIf mkMerge mkForce mapAttrs mkOptionDefault;
|
||||||
inherit (lib.my) mkBoolOpt';
|
inherit (lib.my) mkBoolOpt';
|
||||||
inherit (lib.my.c) pubDomain;
|
|
||||||
|
|
||||||
cfg = config.my.gui;
|
cfg = config.my.gui;
|
||||||
|
|
||||||
@ -16,24 +15,13 @@ let
|
|||||||
url = "https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad";
|
url = "https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad";
|
||||||
hash = "sha256-HX1DvlAeZ9kn5BXguPPinDvzMHXoWXIYFvZSpSbKx3E=";
|
hash = "sha256-HX1DvlAeZ9kn5BXguPPinDvzMHXoWXIYFvZSpSbKx3E=";
|
||||||
};
|
};
|
||||||
subwaySurfers = pkgs.fetchurl {
|
|
||||||
url = "https://p.${pubDomain}/video/subway-surfers-smol.mkv";
|
|
||||||
hash = "sha256-fMe7TDRNTymRHIJOi7qG3trzu4GP8a3gCDz+FMkX1dY=";
|
|
||||||
};
|
|
||||||
minecraftParkour = pkgs.fetchurl {
|
|
||||||
url = "https://p.${pubDomain}/video/minecraft-parkour-smol.mkv";
|
|
||||||
hash = "sha256-723pRm4AsIjY/WFUyAHzTJp+JvH4Pn5hvzF9wHTnOPA=";
|
|
||||||
};
|
|
||||||
|
|
||||||
doomsaver = pkgs.runCommand "doomsaver" {
|
doomsaver = pkgs.runCommand "doomsaver" {
|
||||||
inherit (pkgs) windowtolayer;
|
inherit (pkgs) windowtolayer;
|
||||||
chocoDoom = pkgs.chocolate-doom2xx;
|
chocoDoom = pkgs.chocolate-doom2xx;
|
||||||
ffmpeg = pkgs.ffmpeg-full;
|
|
||||||
python = pkgs.python3.withPackages (ps: [ ps.filelock ]);
|
python = pkgs.python3.withPackages (ps: [ ps.filelock ]);
|
||||||
|
|
||||||
inherit doomWad;
|
inherit doomWad;
|
||||||
enojy = ./enojy.jpg;
|
enojy = ./enojy.jpg;
|
||||||
inherit subwaySurfers minecraftParkour;
|
|
||||||
} ''
|
} ''
|
||||||
mkdir -p "$out"/bin
|
mkdir -p "$out"/bin
|
||||||
substituteAll ${./screensaver.py} "$out"/bin/doomsaver
|
substituteAll ${./screensaver.py} "$out"/bin/doomsaver
|
||||||
|
@ -86,25 +86,6 @@ class TTESaver(Screensaver):
|
|||||||
self.running = False
|
self.running = False
|
||||||
self.proc.terminate()
|
self.proc.terminate()
|
||||||
|
|
||||||
class FFmpegCACASaver(Screensaver):
|
|
||||||
def __init__(self, video, weight=2):
|
|
||||||
cols, lines = os.get_terminal_size()
|
|
||||||
# IDK if it's reasonable to do this as "1:1"
|
|
||||||
size = lines - 4
|
|
||||||
super().__init__(
|
|
||||||
['@ffmpeg@/bin/ffmpeg', '-hide_banner', '-loglevel', 'error',
|
|
||||||
'-stream_loop', '-1', '-i', video,
|
|
||||||
'-pix_fmt', 'rgb24', '-window_size', f'{size}x{size}',
|
|
||||||
'-f', 'caca', '-'],
|
|
||||||
env={
|
|
||||||
'CACA_DRIVER': 'ncurses',
|
|
||||||
},
|
|
||||||
weight=weight,
|
|
||||||
)
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
super().stop(kill=True)
|
|
||||||
|
|
||||||
class MultiSaver:
|
class MultiSaver:
|
||||||
savers = [
|
savers = [
|
||||||
DoomSaver(0),
|
DoomSaver(0),
|
||||||
@ -119,9 +100,6 @@ class MultiSaver:
|
|||||||
TTESaver('ss -nltu'),
|
TTESaver('ss -nltu'),
|
||||||
TTESaver('ss -ntu'),
|
TTESaver('ss -ntu'),
|
||||||
TTESaver('jp2a --width=100 @enojy@'),
|
TTESaver('jp2a --width=100 @enojy@'),
|
||||||
|
|
||||||
FFmpegCACASaver('@subwaySurfers@'),
|
|
||||||
FFmpegCACASaver('@minecraftParkour@'),
|
|
||||||
]
|
]
|
||||||
state_filename = 'screensaver.json'
|
state_filename = 'screensaver.json'
|
||||||
|
|
||||||
|
@ -22,13 +22,12 @@ rec {
|
|||||||
kea = 404;
|
kea = 404;
|
||||||
keepalived_script = 405;
|
keepalived_script = 405;
|
||||||
photoprism = 406;
|
photoprism = 406;
|
||||||
adbusers = 407;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kernel = {
|
kernel = {
|
||||||
lts = pkgs: pkgs.linuxKernel.packages.linux_6_12;
|
lts = pkgs: pkgs.linuxKernel.packages.linux_6_6;
|
||||||
latest = pkgs: pkgs.linuxKernel.packages.linux_6_13;
|
latest = pkgs: pkgs.linuxKernel.packages.linux_6_12;
|
||||||
};
|
};
|
||||||
|
|
||||||
nginx = rec {
|
nginx = rec {
|
||||||
@ -200,16 +199,11 @@ rec {
|
|||||||
port = 25566;
|
port = 25566;
|
||||||
dst = aa.simpcraft-staging-oci.internal.ipv4.address;
|
dst = aa.simpcraft-staging-oci.internal.ipv4.address;
|
||||||
}
|
}
|
||||||
{
|
|
||||||
port = 25567;
|
|
||||||
dst = aa.kevcraft-oci.internal.ipv4.address;
|
|
||||||
}
|
|
||||||
|
|
||||||
# RCON... unsafe?
|
{
|
||||||
# {
|
port = 25575;
|
||||||
# port = 25575;
|
dst = aa.simpcraft-oci.internal.ipv4.address;
|
||||||
# dst = aa.simpcraft-oci.internal.ipv4.address;
|
}
|
||||||
# }
|
|
||||||
|
|
||||||
{
|
{
|
||||||
port = 2456;
|
port = 2456;
|
||||||
@ -233,10 +227,6 @@ rec {
|
|||||||
dst = aa.simpcraft-oci.internal.ipv4.address;
|
dst = aa.simpcraft-oci.internal.ipv4.address;
|
||||||
proto = "udp";
|
proto = "udp";
|
||||||
}
|
}
|
||||||
{
|
|
||||||
port = 25567;
|
|
||||||
dst = aa.kevcraft-oci.internal.ipv4.address;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
port = 15636;
|
port = 15636;
|
||||||
@ -277,8 +267,8 @@ rec {
|
|||||||
"stream"
|
"stream"
|
||||||
];
|
];
|
||||||
routersPubV4 = [
|
routersPubV4 = [
|
||||||
"109.255.108.88"
|
"109.255.31.155"
|
||||||
"109.255.108.121"
|
"109.255.252.63"
|
||||||
];
|
];
|
||||||
|
|
||||||
prefixes = with lib.my.net.cidr; rec {
|
prefixes = with lib.my.net.cidr; rec {
|
||||||
@ -344,20 +334,6 @@ rec {
|
|||||||
assignedV6 = "2001:19f0:7402:128b:5400:04ff:feac:6e06";
|
assignedV6 = "2001:19f0:7402:128b:5400:04ff:feac:6e06";
|
||||||
};
|
};
|
||||||
|
|
||||||
britnet = {
|
|
||||||
domain = "bhx1.int.${pubDomain}";
|
|
||||||
pubV4 = "77.74.199.67";
|
|
||||||
vpn = {
|
|
||||||
port = 51820;
|
|
||||||
};
|
|
||||||
prefixes = with lib.my.net.cidr; rec {
|
|
||||||
vpn = {
|
|
||||||
v4 = "10.200.0.0/24";
|
|
||||||
v6 = "fdfb:5ebf:6e84::/64";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
tailscale = {
|
tailscale = {
|
||||||
prefix = {
|
prefix = {
|
||||||
v4 = "100.64.0.0/10";
|
v4 = "100.64.0.0/10";
|
||||||
|
@ -53,7 +53,7 @@ rec {
|
|||||||
in mkApp "${app}/bin/${app.meta.mainProgram}";
|
in mkApp "${app}/bin/${app.meta.mainProgram}";
|
||||||
flakePackageOverlay' = flake: pkg: system: (final: prev:
|
flakePackageOverlay' = flake: pkg: system: (final: prev:
|
||||||
let
|
let
|
||||||
pkg' = if pkg != null then flake.packages.${system}.${pkg} else flake.packages.${system}.default;
|
pkg' = if pkg != null then flake.packages.${system}.${pkg} else flake.defaultPackage.${system};
|
||||||
name = if pkg != null then pkg else pkg'.name;
|
name = if pkg != null then pkg else pkg'.name;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
@ -248,8 +248,8 @@ rec {
|
|||||||
in
|
in
|
||||||
{
|
{
|
||||||
trivial = prev.trivial // {
|
trivial = prev.trivial // {
|
||||||
release = "25.03:u-${prev.trivial.release}";
|
release = "24.12:u-${prev.trivial.release}";
|
||||||
codeName = "Frick";
|
codeName = "Epic";
|
||||||
revisionWithDefault = default: self.rev or default;
|
revisionWithDefault = default: self.rev or default;
|
||||||
versionSuffix = ".${date}.${revCode self}:u-${revCode pkgsFlake}";
|
versionSuffix = ".${date}.${revCode self}:u-${revCode pkgsFlake}";
|
||||||
};
|
};
|
||||||
|
@ -1,191 +0,0 @@
|
|||||||
{ lib, ... }:
|
|
||||||
let
|
|
||||||
inherit (lib.my) net;
|
|
||||||
inherit (lib.my.c) pubDomain;
|
|
||||||
inherit (lib.my.c.britnet) domain pubV4 prefixes;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
nixos.systems.britnet = {
|
|
||||||
system = "x86_64-linux";
|
|
||||||
nixpkgs = "mine";
|
|
||||||
|
|
||||||
assignments = {
|
|
||||||
allhost = {
|
|
||||||
inherit domain;
|
|
||||||
ipv4 = {
|
|
||||||
address = pubV4;
|
|
||||||
mask = 24;
|
|
||||||
gateway = "77.74.199.1";
|
|
||||||
};
|
|
||||||
ipv6 = {
|
|
||||||
address = "2a12:ab46:5344:99::a";
|
|
||||||
gateway = "2a12:ab46:5344::1";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
vpn = {
|
|
||||||
ipv4 = {
|
|
||||||
address = net.cidr.host 1 prefixes.vpn.v4;
|
|
||||||
gateway = null;
|
|
||||||
};
|
|
||||||
ipv6.address = net.cidr.host 1 prefixes.vpn.v6;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
configuration = { lib, pkgs, modulesPath, config, assignments, allAssignments, ... }:
|
|
||||||
let
|
|
||||||
inherit (lib) mkMerge mkForce;
|
|
||||||
inherit (lib.my) networkdAssignment;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
"${modulesPath}/profiles/qemu-guest.nix"
|
|
||||||
];
|
|
||||||
|
|
||||||
config = mkMerge [
|
|
||||||
{
|
|
||||||
boot = {
|
|
||||||
initrd.availableKernelModules = [
|
|
||||||
"ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "ahci" "sr_mod" "virtio_blk"
|
|
||||||
];
|
|
||||||
loader = {
|
|
||||||
systemd-boot.enable = false;
|
|
||||||
grub = {
|
|
||||||
enable = true;
|
|
||||||
device = "/dev/vda";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems = {
|
|
||||||
"/boot" = {
|
|
||||||
device = "/dev/disk/by-uuid/457444a1-81dd-4934-960c-650ad16c92b5";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
"/nix" = {
|
|
||||||
device = "/dev/disk/by-uuid/992c0c79-5be6-45b6-bc30-dc82e3ec082a";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
"/persist" = {
|
|
||||||
device = "/dev/disk/by-uuid/f020a955-54d5-4098-98ba-d3615781d96a";
|
|
||||||
fsType = "ext4";
|
|
||||||
neededForBoot = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment = {
|
|
||||||
systemPackages = with pkgs; [
|
|
||||||
wireguard-tools
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
iperf3 = {
|
|
||||||
enable = true;
|
|
||||||
openFirewall = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
tailscale = {
|
|
||||||
enable = true;
|
|
||||||
authKeyFile = config.age.secrets."tailscale-auth.key".path;
|
|
||||||
openFirewall = true;
|
|
||||||
interfaceName = "tailscale0";
|
|
||||||
extraUpFlags = [
|
|
||||||
"--operator=${config.my.user.config.name}"
|
|
||||||
"--login-server=https://hs.nul.ie"
|
|
||||||
"--netfilter-mode=off"
|
|
||||||
"--advertise-exit-node"
|
|
||||||
"--accept-routes=false"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
networking = { inherit domain; };
|
|
||||||
|
|
||||||
systemd.network = {
|
|
||||||
netdevs = {
|
|
||||||
"30-wg0" = {
|
|
||||||
netdevConfig = {
|
|
||||||
Name = "wg0";
|
|
||||||
Kind = "wireguard";
|
|
||||||
};
|
|
||||||
wireguardConfig = {
|
|
||||||
PrivateKeyFile = config.age.secrets."britnet/wg.key".path;
|
|
||||||
ListenPort = lib.my.c.britnet.vpn.port;
|
|
||||||
};
|
|
||||||
wireguardPeers = [
|
|
||||||
{
|
|
||||||
PublicKey = "EfPwREfZ/q3ogHXBIqFZh4k/1NRJRyq4gBkBXtegNkE=";
|
|
||||||
AllowedIPs = [
|
|
||||||
(net.cidr.host 10 prefixes.vpn.v4)
|
|
||||||
(net.cidr.host 10 prefixes.vpn.v6)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
links = {
|
|
||||||
"10-veth0" = {
|
|
||||||
matchConfig.PermanentMACAddress = "00:db:d9:62:68:1a";
|
|
||||||
linkConfig.Name = "veth0";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
networks = {
|
|
||||||
"20-veth0" = mkMerge [
|
|
||||||
(networkdAssignment "veth0" assignments.allhost)
|
|
||||||
{
|
|
||||||
dns = [ "1.1.1.1" "1.0.0.1" ];
|
|
||||||
routes = [
|
|
||||||
{
|
|
||||||
# Gateway is on a different network for some reason...
|
|
||||||
Destination = "2a12:ab46:5344::1";
|
|
||||||
Scope = "link";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
"30-wg0" = mkMerge [
|
|
||||||
(networkdAssignment "wg0" assignments.vpn)
|
|
||||||
{
|
|
||||||
networkConfig.IPv6AcceptRA = mkForce false;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
my = {
|
|
||||||
server.enable = true;
|
|
||||||
secrets = {
|
|
||||||
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJIEx+1EC/lN6WKIaOB+O5LJgVHRK962YpZEPQg/m78O";
|
|
||||||
files = {
|
|
||||||
"tailscale-auth.key" = {};
|
|
||||||
"britnet/wg.key" = {
|
|
||||||
owner = "systemd-network";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
firewall = {
|
|
||||||
udp.allowed = [ lib.my.c.britnet.vpn.port ];
|
|
||||||
trustedInterfaces = [ "tailscale0" ];
|
|
||||||
extraRules = ''
|
|
||||||
table inet filter {
|
|
||||||
chain forward {
|
|
||||||
iifname wg0 oifname veth0 accept
|
|
||||||
}
|
|
||||||
}
|
|
||||||
table inet nat {
|
|
||||||
chain postrouting {
|
|
||||||
iifname { tailscale0, wg0 } oifname veth0 snat ip to ${assignments.allhost.ipv4.address}
|
|
||||||
iifname { tailscale0, wg0 } oifname veth0 snat ip6 to ${assignments.allhost.ipv6.address}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -11,24 +11,23 @@ in
|
|||||||
config = {
|
config = {
|
||||||
my = {
|
my = {
|
||||||
secrets.files."britway/bgp-password-vultr.conf" = {
|
secrets.files."britway/bgp-password-vultr.conf" = {
|
||||||
owner = "bird";
|
owner = "bird2";
|
||||||
group = "bird";
|
group = "bird2";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.etc."bird/vultr-password.conf".source = config.age.secrets."britway/bgp-password-vultr.conf".path;
|
environment.etc."bird/vultr-password.conf".source = config.age.secrets."britway/bgp-password-vultr.conf".path;
|
||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
services.bird.after = [ "systemd-networkd-wait-online@veth0.service" ];
|
services.bird2.after = [ "systemd-networkd-wait-online@veth0.service" ];
|
||||||
network = {
|
network = {
|
||||||
config.networkConfig.ManageForeignRoutes = false;
|
config.networkConfig.ManageForeignRoutes = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
bird = {
|
bird2 = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.bird2;
|
|
||||||
preCheckConfig = ''
|
preCheckConfig = ''
|
||||||
echo '"dummy"' > vultr-password.conf
|
echo '"dummy"' > vultr-password.conf
|
||||||
'';
|
'';
|
||||||
|
@ -8,9 +8,8 @@ in
|
|||||||
{
|
{
|
||||||
config = {
|
config = {
|
||||||
services = {
|
services = {
|
||||||
bird = {
|
bird2 = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.bird2;
|
|
||||||
# TODO: Clean up and modularise
|
# TODO: Clean up and modularise
|
||||||
config = ''
|
config = ''
|
||||||
define OWNAS = 211024;
|
define OWNAS = 211024;
|
||||||
|
@ -399,9 +399,8 @@ in
|
|||||||
|
|
||||||
ip6 daddr ${aa.middleman.internal.ipv6.address} tcp dport { http, https, 8448 } accept
|
ip6 daddr ${aa.middleman.internal.ipv6.address} tcp dport { http, https, 8448 } accept
|
||||||
${matchInet "tcp dport { http, https } accept" "git"}
|
${matchInet "tcp dport { http, https } accept" "git"}
|
||||||
ip6 daddr ${aa.simpcraft-oci.internal.ipv6.address} tcp dport 25565 accept
|
ip6 daddr ${aa.simpcraft-oci.internal.ipv6.address} tcp dport { 25565, 25575 } accept
|
||||||
ip6 daddr ${aa.simpcraft-staging-oci.internal.ipv6.address} tcp dport 25565 accept
|
ip6 daddr ${aa.simpcraft-staging-oci.internal.ipv6.address} tcp dport 25565 accept
|
||||||
ip6 daddr ${aa.kevcraft-oci.internal.ipv6.address} tcp dport 25567 accept
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
chain routing-udp {
|
chain routing-udp {
|
||||||
@ -409,7 +408,6 @@ in
|
|||||||
ip6 daddr ${aa.waffletail.internal.ipv6.address} udp dport 41641 accept
|
ip6 daddr ${aa.waffletail.internal.ipv6.address} udp dport 41641 accept
|
||||||
ip6 daddr ${aa.simpcraft-oci.internal.ipv6.address} udp dport 25565 accept
|
ip6 daddr ${aa.simpcraft-oci.internal.ipv6.address} udp dport 25565 accept
|
||||||
ip6 daddr ${aa.enshrouded-oci.internal.ipv6.address} udp dport { 15636-15637 } accept
|
ip6 daddr ${aa.enshrouded-oci.internal.ipv6.address} udp dport { 15636-15637 } accept
|
||||||
ip6 daddr ${aa.kevcraft-oci.internal.ipv6.address} udp dport 25567 accept
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
chain filter-routing {
|
chain filter-routing {
|
||||||
|
@ -154,8 +154,6 @@ in
|
|||||||
simpcraft-staging IN A ${assignments.internal.ipv4.address}
|
simpcraft-staging IN A ${assignments.internal.ipv4.address}
|
||||||
simpcraft-staging IN AAAA ${allAssignments.simpcraft-staging-oci.internal.ipv6.address}
|
simpcraft-staging IN AAAA ${allAssignments.simpcraft-staging-oci.internal.ipv6.address}
|
||||||
enshrouded IN A ${assignments.internal.ipv4.address}
|
enshrouded IN A ${assignments.internal.ipv4.address}
|
||||||
kevcraft IN A ${assignments.internal.ipv4.address}
|
|
||||||
kevcraft IN AAAA ${allAssignments.kevcraft-oci.internal.ipv6.address}
|
|
||||||
|
|
||||||
mail-vm IN A ${net.cidr.host 0 prefixes.mail.v4}
|
mail-vm IN A ${net.cidr.host 0 prefixes.mail.v4}
|
||||||
mail-vm IN AAAA ${net.cidr.host 1 prefixes.mail.v6}
|
mail-vm IN AAAA ${net.cidr.host 1 prefixes.mail.v6}
|
||||||
|
@ -49,7 +49,6 @@ let
|
|||||||
"/.well-known/webfinger".return = "301 https://toot.nul.ie$request_uri";
|
"/.well-known/webfinger".return = "301 https://toot.nul.ie$request_uri";
|
||||||
"/.well-known/nodeinfo".return = "301 https://toot.nul.ie$request_uri";
|
"/.well-known/nodeinfo".return = "301 https://toot.nul.ie$request_uri";
|
||||||
"/.well-known/host-meta".return = "301 https://toot.nul.ie$request_uri";
|
"/.well-known/host-meta".return = "301 https://toot.nul.ie$request_uri";
|
||||||
"/.well-known/atproto-did".return = "301 https://pds.nul.ie$request_uri";
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
@ -80,10 +79,6 @@ in
|
|||||||
sha256 = "018wh6ps19n7323fi44njzj9yd4wqslc90dykbwfyscv7bgxhlar";
|
sha256 = "018wh6ps19n7323fi44njzj9yd4wqslc90dykbwfyscv7bgxhlar";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
{
|
|
||||||
name = "ssh.pub";
|
|
||||||
path = lib.my.c.sshKeyFiles.me;
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
wellKnown
|
wellKnown
|
||||||
@ -327,15 +322,6 @@ in
|
|||||||
useACMEHost = pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"pds.nul.ie" = {
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://toot-ctr.${domain}:3000";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = proxyHeaders;
|
|
||||||
};
|
|
||||||
useACMEHost = pubDomain;
|
|
||||||
};
|
|
||||||
|
|
||||||
"share.${pubDomain}" = {
|
"share.${pubDomain}" = {
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
proxyPass = "http://object-ctr.${domain}:9090";
|
proxyPass = "http://object-ctr.${domain}:9090";
|
||||||
@ -357,8 +343,6 @@ in
|
|||||||
useACMEHost = pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
"public.${pubDomain}" = {
|
"public.${pubDomain}" = {
|
||||||
onlySSL = false;
|
|
||||||
addSSL = true;
|
|
||||||
serverAliases = [ "p.${pubDomain}" ];
|
serverAliases = [ "p.${pubDomain}" ];
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
root = "/mnt/media/public";
|
root = "/mnt/media/public";
|
||||||
@ -429,14 +413,6 @@ in
|
|||||||
}
|
}
|
||||||
(ssoServer "generic")
|
(ssoServer "generic")
|
||||||
];
|
];
|
||||||
"hass.${pubDomain}" = {
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://hass-ctr.${home.domain}:8123";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = proxyHeaders;
|
|
||||||
};
|
|
||||||
useACMEHost = pubDomain;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
minio =
|
minio =
|
||||||
|
@ -26,8 +26,6 @@ in
|
|||||||
let
|
let
|
||||||
inherit (lib) mkMerge mkIf genAttrs;
|
inherit (lib) mkMerge mkIf genAttrs;
|
||||||
inherit (lib.my) networkdAssignment systemdAwaitPostgres;
|
inherit (lib.my) networkdAssignment systemdAwaitPostgres;
|
||||||
|
|
||||||
pdsPort = 3000;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
config = mkMerge [
|
config = mkMerge [
|
||||||
@ -38,7 +36,7 @@ in
|
|||||||
|
|
||||||
secrets = {
|
secrets = {
|
||||||
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILSslLkDe54AKYzxdtKD70zcU72W0EpYsfbdJ6UFq0QK";
|
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILSslLkDe54AKYzxdtKD70zcU72W0EpYsfbdJ6UFq0QK";
|
||||||
files = (genAttrs
|
files = genAttrs
|
||||||
(map (f: "toot/${f}") [
|
(map (f: "toot/${f}") [
|
||||||
"postgres-password.txt"
|
"postgres-password.txt"
|
||||||
"secret-key.txt"
|
"secret-key.txt"
|
||||||
@ -50,12 +48,7 @@ in
|
|||||||
(_: with config.services.mastodon; {
|
(_: with config.services.mastodon; {
|
||||||
owner = user;
|
owner = user;
|
||||||
inherit group;
|
inherit group;
|
||||||
})) // {
|
});
|
||||||
"toot/pds.env" = {
|
|
||||||
owner = "pds";
|
|
||||||
group = "pds";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
firewall = {
|
firewall = {
|
||||||
@ -63,7 +56,6 @@ in
|
|||||||
19999
|
19999
|
||||||
|
|
||||||
"http"
|
"http"
|
||||||
pdsPort
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -163,32 +155,6 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pds = {
|
|
||||||
enable = true;
|
|
||||||
environmentFiles = [ config.age.secrets."toot/pds.env".path ];
|
|
||||||
settings = {
|
|
||||||
PDS_HOSTNAME = "pds.nul.ie";
|
|
||||||
PDS_PORT = pdsPort;
|
|
||||||
|
|
||||||
PDS_BLOBSTORE_DISK_LOCATION = null;
|
|
||||||
PDS_BLOBSTORE_S3_BUCKET = "pds";
|
|
||||||
PDS_BLOBSTORE_S3_ENDPOINT = "https://s3.nul.ie/";
|
|
||||||
PDS_BLOBSTORE_S3_REGION = "eu-central-1";
|
|
||||||
PDS_BLOBSTORE_S3_ACCESS_KEY_ID = "pds";
|
|
||||||
PDS_BLOB_UPLOAD_LIMIT = "52428800";
|
|
||||||
|
|
||||||
PDS_EMAIL_FROM_ADDRESS = "pds@nul.ie";
|
|
||||||
|
|
||||||
PDS_DID_PLC_URL = "https://plc.directory";
|
|
||||||
PDS_INVITE_REQUIRED = 1;
|
|
||||||
PDS_BSKY_APP_VIEW_URL = "https://api.bsky.app";
|
|
||||||
PDS_BSKY_APP_VIEW_DID = "did:web:api.bsky.app";
|
|
||||||
PDS_REPORT_SERVICE_URL = "https://mod.bsky.app";
|
|
||||||
PDS_REPORT_SERVICE_DID = "did:plc:ar7c4by46qjdydhdevvrndac";
|
|
||||||
PDS_CRAWLERS = "https://bsky.network";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
(mkIf config.my.build.isDevVM {
|
(mkIf config.my.build.isDevVM {
|
||||||
|
@ -53,7 +53,6 @@ in
|
|||||||
simpcraft-oci = 3;
|
simpcraft-oci = 3;
|
||||||
simpcraft-staging-oci = 4;
|
simpcraft-staging-oci = 4;
|
||||||
enshrouded-oci = 5;
|
enshrouded-oci = 5;
|
||||||
kevcraft-oci = 6;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
configuration = { lib, pkgs, modulesPath, config, assignments, allAssignments, ... }:
|
configuration = { lib, pkgs, modulesPath, config, assignments, allAssignments, ... }:
|
||||||
|
@ -104,46 +104,6 @@ in
|
|||||||
# ''--network=colony:${dockerNetAssignment allAssignments "simpcraft-staging-oci"}''
|
# ''--network=colony:${dockerNetAssignment allAssignments "simpcraft-staging-oci"}''
|
||||||
# ];
|
# ];
|
||||||
# };
|
# };
|
||||||
|
|
||||||
kevcraft = {
|
|
||||||
# 2025.2.1-java21-alpine
|
|
||||||
image = "itzg/minecraft-server@sha256:57e319c15e9fee63f61029a65a33acc3de85118b21a2b4bb29f351cf4a915027";
|
|
||||||
|
|
||||||
environment = {
|
|
||||||
TYPE = "VANILLA";
|
|
||||||
VERSION = "1.20.1";
|
|
||||||
SERVER_PORT = "25567";
|
|
||||||
QUERY_PORT = "25567";
|
|
||||||
|
|
||||||
EULA = "true";
|
|
||||||
ENABLE_QUERY = "true";
|
|
||||||
ENABLE_RCON = "true";
|
|
||||||
MOTD = "§4§k----- §9K§ae§bv§cc§dr§ea§ff§6t §4§k-----";
|
|
||||||
ICON = "/ext/icon.png";
|
|
||||||
|
|
||||||
EXISTING_WHITELIST_FILE = "SYNCHRONIZE";
|
|
||||||
WHITELIST = whitelist;
|
|
||||||
EXISTING_OPS_FILE = "SYNCHRONIZE";
|
|
||||||
OPS = op;
|
|
||||||
DIFFICULTY = "normal";
|
|
||||||
SPAWN_PROTECTION = "0";
|
|
||||||
# VIEW_DISTANCE = "20";
|
|
||||||
|
|
||||||
MAX_MEMORY = "4G";
|
|
||||||
|
|
||||||
TZ = "Europe/Dublin";
|
|
||||||
};
|
|
||||||
environmentFiles = [ config.age.secrets."whale2/simpcraft.env".path ];
|
|
||||||
|
|
||||||
volumes = [
|
|
||||||
"kevcraft_data:/data"
|
|
||||||
"${./kev.png}:/ext/icon.png:ro"
|
|
||||||
];
|
|
||||||
|
|
||||||
extraOptions = [
|
|
||||||
''--network=colony:${dockerNetAssignment allAssignments "kevcraft-oci"}''
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 10 KiB |
@ -150,7 +150,6 @@ in
|
|||||||
mstflint
|
mstflint
|
||||||
qperf
|
qperf
|
||||||
ethtool
|
ethtool
|
||||||
android-tools
|
|
||||||
];
|
];
|
||||||
|
|
||||||
nix = {
|
nix = {
|
||||||
|
@ -188,13 +188,6 @@
|
|||||||
hostBDF = "44:00.4";
|
hostBDF = "44:00.4";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
qemuFlags = [
|
|
||||||
"device qemu-xhci,id=xhci"
|
|
||||||
# Front-right port?
|
|
||||||
"device usb-host,hostbus=1,hostport=4"
|
|
||||||
# Front-left port
|
|
||||||
"device usb-host,hostbus=1,hostport=3"
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./unifi.nix
|
./unifi.nix
|
||||||
./hass.nix
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -1,258 +0,0 @@
|
|||||||
{ lib, ... }:
|
|
||||||
let
|
|
||||||
inherit (lib.my) net;
|
|
||||||
inherit (lib.my.c) pubDomain;
|
|
||||||
inherit (lib.my.c.home) domain prefixes vips hiMTU;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
nixos.systems.hass = { config, ... }: {
|
|
||||||
system = "x86_64-linux";
|
|
||||||
nixpkgs = "mine";
|
|
||||||
rendered = config.configuration.config.my.asContainer;
|
|
||||||
|
|
||||||
assignments = {
|
|
||||||
hi = {
|
|
||||||
name = "hass-ctr";
|
|
||||||
altNames = [ "frigate" ];
|
|
||||||
inherit domain;
|
|
||||||
mtu = hiMTU;
|
|
||||||
ipv4 = {
|
|
||||||
address = net.cidr.host 103 prefixes.hi.v4;
|
|
||||||
mask = 22;
|
|
||||||
gateway = vips.hi.v4;
|
|
||||||
};
|
|
||||||
ipv6 = {
|
|
||||||
iid = "::5:3";
|
|
||||||
address = net.cidr.host (65536*5+3) prefixes.hi.v6;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
lo = {
|
|
||||||
name = "hass-ctr-lo";
|
|
||||||
inherit domain;
|
|
||||||
mtu = 1500;
|
|
||||||
ipv4 = {
|
|
||||||
address = net.cidr.host 103 prefixes.lo.v4;
|
|
||||||
mask = 21;
|
|
||||||
gateway = null;
|
|
||||||
};
|
|
||||||
ipv6 = {
|
|
||||||
iid = "::5:3";
|
|
||||||
address = net.cidr.host (65536*5+3) prefixes.lo.v6;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
configuration = { lib, config, pkgs, assignments, allAssignments, ... }:
|
|
||||||
let
|
|
||||||
inherit (lib) mkMerge mkIf mkForce;
|
|
||||||
inherit (lib.my) networkdAssignment;
|
|
||||||
|
|
||||||
hassCli = pkgs.writeShellScriptBin "hass-cli" ''
|
|
||||||
export HASS_SERVER="http://localhost:${toString config.services.home-assistant.config.http.server_port}"
|
|
||||||
export HASS_TOKEN="$(< ${config.age.secrets."hass/cli-token.txt".path})"
|
|
||||||
exec ${pkgs.home-assistant-cli}/bin/hass-cli "$@"
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
config = {
|
|
||||||
my = {
|
|
||||||
deploy.enable = false;
|
|
||||||
server.enable = true;
|
|
||||||
|
|
||||||
secrets = {
|
|
||||||
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGpYX2WbYwUqHp8bFFf0eHFrqrR8xp8IheguA054F8V4";
|
|
||||||
files = {
|
|
||||||
"hass/cli-token.txt" = {
|
|
||||||
owner = config.my.user.config.name;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
firewall = {
|
|
||||||
tcp.allowed = [ "http" 1883 ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment = {
|
|
||||||
systemPackages = with pkgs; [
|
|
||||||
usbutils
|
|
||||||
hassCli
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd = {
|
|
||||||
network.networks = {
|
|
||||||
"80-container-host0" = networkdAssignment "host0" assignments.hi;
|
|
||||||
"80-container-lan-lo" = networkdAssignment "lan-lo" assignments.lo;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
mosquitto = {
|
|
||||||
enable = true;
|
|
||||||
listeners = [
|
|
||||||
{
|
|
||||||
omitPasswordAuth = true;
|
|
||||||
settings = {
|
|
||||||
allow_anonymous = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
go2rtc = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
streams = {
|
|
||||||
reolink_living_room = [
|
|
||||||
# "http://reolink-living-room.${domain}/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=admin#video=copy#audio=copy#audio=opus"
|
|
||||||
"rtsp://admin:@reolink-living-room:554/h264Preview_01_main"
|
|
||||||
];
|
|
||||||
webcam_office = [
|
|
||||||
"ffmpeg:device?video=/dev/video0&video_size=1024x576#video=h264"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
frigate = {
|
|
||||||
enable = true;
|
|
||||||
hostname = "frigate.${domain}";
|
|
||||||
settings = {
|
|
||||||
mqtt = {
|
|
||||||
enabled = true;
|
|
||||||
host = "localhost";
|
|
||||||
topic_prefix = "frigate";
|
|
||||||
};
|
|
||||||
|
|
||||||
cameras = {
|
|
||||||
reolink_living_room = {
|
|
||||||
ffmpeg.inputs = [
|
|
||||||
{
|
|
||||||
path = "rtsp://127.0.0.1:8554/reolink_living_room";
|
|
||||||
input_args = "preset-rtsp-restream";
|
|
||||||
roles = [ "record" "detect" ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
detect = {
|
|
||||||
enabled = false;
|
|
||||||
};
|
|
||||||
record = {
|
|
||||||
enabled = true;
|
|
||||||
retain.days = 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
webcam_office = {
|
|
||||||
ffmpeg.inputs = [
|
|
||||||
{
|
|
||||||
path = "rtsp://127.0.0.1:8554/webcam_office";
|
|
||||||
input_args = "preset-rtsp-restream";
|
|
||||||
roles = [ "record" "detect" ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
detect.enabled = false;
|
|
||||||
record = {
|
|
||||||
enabled = true;
|
|
||||||
retain.days = 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
home-assistant =
|
|
||||||
let
|
|
||||||
cfg = config.services.home-assistant;
|
|
||||||
|
|
||||||
pyirishrail = ps: ps.buildPythonPackage rec {
|
|
||||||
pname = "pyirishrail";
|
|
||||||
version = "0.0.2";
|
|
||||||
src = pkgs.fetchFromGitHub {
|
|
||||||
owner = "ttroy50";
|
|
||||||
repo = "pyirishrail";
|
|
||||||
tag = version;
|
|
||||||
hash = "sha256-NgARqhcXP0lgGpgBRiNtQaSn9JcRNtCcZPljcL7t3Xc=";
|
|
||||||
};
|
|
||||||
|
|
||||||
dependencies = with ps; [
|
|
||||||
requests
|
|
||||||
];
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
extraComponents = [
|
|
||||||
"default_config"
|
|
||||||
"esphome"
|
|
||||||
"google_translate"
|
|
||||||
|
|
||||||
"met"
|
|
||||||
"zha"
|
|
||||||
"denonavr"
|
|
||||||
"webostv"
|
|
||||||
"androidtv_remote"
|
|
||||||
"heos"
|
|
||||||
"mqtt"
|
|
||||||
];
|
|
||||||
extraPackages = python3Packages: with python3Packages; [
|
|
||||||
zlib-ng
|
|
||||||
isal
|
|
||||||
|
|
||||||
gtts
|
|
||||||
(pyirishrail python3Packages)
|
|
||||||
];
|
|
||||||
customComponents = with pkgs.home-assistant-custom-components; [
|
|
||||||
alarmo
|
|
||||||
frigate
|
|
||||||
];
|
|
||||||
|
|
||||||
configWritable = false;
|
|
||||||
openFirewall = true;
|
|
||||||
config = {
|
|
||||||
default_config = {};
|
|
||||||
homeassistant = {
|
|
||||||
name = "Home";
|
|
||||||
unit_system = "metric";
|
|
||||||
currency = "EUR";
|
|
||||||
country = "IE";
|
|
||||||
time_zone = "Europe/Dublin";
|
|
||||||
external_url = "https://hass.${pubDomain}";
|
|
||||||
internal_url = "http://hass-ctr.${domain}:${toString cfg.config.http.server_port}";
|
|
||||||
};
|
|
||||||
http = {
|
|
||||||
use_x_forwarded_for = true;
|
|
||||||
trusted_proxies = with allAssignments.middleman.internal; [
|
|
||||||
ipv4.address
|
|
||||||
ipv6.address
|
|
||||||
];
|
|
||||||
ip_ban_enabled = false;
|
|
||||||
};
|
|
||||||
automation = "!include automations.yaml";
|
|
||||||
script = "!include scripts.yaml";
|
|
||||||
scene = "!include scenes.yaml";
|
|
||||||
|
|
||||||
sensor = [
|
|
||||||
{
|
|
||||||
platform = "irish_rail_transport";
|
|
||||||
name = "To Work from Home";
|
|
||||||
station = "Glenageary";
|
|
||||||
stops_at = "Dublin Connolly";
|
|
||||||
direction = "Northbound";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
platform = "irish_rail_transport";
|
|
||||||
name = "To Home from Work";
|
|
||||||
station = "Dublin Connolly";
|
|
||||||
stops_at = "Glenageary";
|
|
||||||
direction = "Southbound";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -29,7 +29,7 @@ in
|
|||||||
|
|
||||||
configuration = { lib, modulesPath, pkgs, config, assignments, allAssignments, ... }:
|
configuration = { lib, modulesPath, pkgs, config, assignments, allAssignments, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib) mapAttrs mkMerge mkForce;
|
inherit (lib) mapAttrs mkMerge;
|
||||||
inherit (lib.my) networkdAssignment;
|
inherit (lib.my) networkdAssignment;
|
||||||
inherit (lib.my.c) networkd;
|
inherit (lib.my.c) networkd;
|
||||||
inherit (lib.my.c.home) domain;
|
inherit (lib.my.c.home) domain;
|
||||||
@ -83,12 +83,6 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
environment = {
|
|
||||||
systemPackages = with pkgs; [
|
|
||||||
usbutils
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.network = {
|
systemd.network = {
|
||||||
links = {
|
links = {
|
||||||
"10-lan-hi" = {
|
"10-lan-hi" = {
|
||||||
@ -111,13 +105,6 @@ in
|
|||||||
MTUBytes = toString lib.my.c.home.hiMTU;
|
MTUBytes = toString lib.my.c.home.hiMTU;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
"10-lan-lo-ctrs" = {
|
|
||||||
matchConfig = {
|
|
||||||
Driver = "virtio_net";
|
|
||||||
PermanentMACAddress = "52:54:00:a5:7e:93";
|
|
||||||
};
|
|
||||||
linkConfig.Name = "lan-lo-ctrs";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
networks = {
|
networks = {
|
||||||
@ -131,28 +118,8 @@ in
|
|||||||
linkConfig.RequiredForOnline = "no";
|
linkConfig.RequiredForOnline = "no";
|
||||||
networkConfig = networkd.noL3;
|
networkConfig = networkd.noL3;
|
||||||
};
|
};
|
||||||
"30-lan-lo-ctrs" = {
|
|
||||||
matchConfig.Name = "lan-lo-ctrs";
|
|
||||||
linkConfig.RequiredForOnline = "no";
|
|
||||||
networkConfig = networkd.noL3;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
systemd.nspawn = {
|
|
||||||
hass = {
|
|
||||||
networkConfig = {
|
|
||||||
MACVLAN = mkForce "lan-hi-ctrs:host0 lan-lo-ctrs:lan-lo";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services = {
|
|
||||||
"systemd-nspawn@hass".serviceConfig.DeviceAllow = [
|
|
||||||
"char-ttyUSB rw"
|
|
||||||
"char-video4linux rw"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
my = {
|
my = {
|
||||||
secrets = {
|
secrets = {
|
||||||
@ -174,17 +141,7 @@ in
|
|||||||
containers.instances =
|
containers.instances =
|
||||||
let
|
let
|
||||||
instances = {
|
instances = {
|
||||||
# unifi = {};
|
unifi = {};
|
||||||
hass = {
|
|
||||||
bindMounts = {
|
|
||||||
"/dev/bus/usb/001/002".readOnly = false;
|
|
||||||
"/dev/video0".readOnly = false;
|
|
||||||
"/dev/serial/by-id/usb-Nabu_Casa_Home_Assistant_Connect_ZBT-1_ce549704fe38ef11a2c2e5d154516304-if00-port0" = {
|
|
||||||
readOnly = false;
|
|
||||||
mountPoint = "/dev/ttyUSB0";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
mkMerge [
|
mkMerge [
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
# Blocklist for LG WebOS Services (US)
|
|
||||||
ad.lgappstv.com
|
|
||||||
ibis.lgappstv.com
|
|
||||||
info.lgsmartad.com
|
|
||||||
lgtvsdp.com
|
|
||||||
ngfts.lge.com
|
|
||||||
rdx2.lgtvsdp.com
|
|
||||||
smartshare.lgtvsdp.com
|
|
||||||
lgappstv.com
|
|
||||||
us.ad.lgsmartad.com
|
|
||||||
us.ibs.lgappstv.com
|
|
||||||
us.info.lgsmartad.com
|
|
||||||
us.lgtvsdp.com
|
|
||||||
|
|
||||||
# Community Contributions
|
|
||||||
lgad.cjpowercast.com
|
|
||||||
edgesuite.net
|
|
||||||
yumenetworks.com
|
|
||||||
smartclip.net
|
|
||||||
smartclip.com
|
|
||||||
|
|
||||||
# Non-US Entries
|
|
||||||
rdx2.lgtvsdp.com
|
|
||||||
info.lgsmartad.com
|
|
||||||
ibs.lgappstv.com
|
|
||||||
lgtvsdp.com
|
|
||||||
lgappstv.com
|
|
||||||
smartshare.lgtvsdp.com
|
|
||||||
|
|
||||||
# Full Block for Europe and Other Regions
|
|
||||||
de.ad.lgsmartad.com
|
|
||||||
de.emp.lgsmartplatform.com
|
|
||||||
de.ibs.lgappstv.com
|
|
||||||
de.info.lgsmartad.com
|
|
||||||
de.lgeapi.com
|
|
||||||
de.lgtvsdp.com
|
|
||||||
de.rdx2.lgtvsdp.com
|
|
||||||
eu.ad.lgsmartad.com
|
|
||||||
eu.ibs.lgappstv.com
|
|
||||||
eu.info.lgsmartad.com
|
|
||||||
app-lgwebos.pluto.tv
|
|
||||||
it.lgtvsdp.com
|
|
||||||
it.lgeapi.com
|
|
||||||
it.emp.lgsmartplatform.com
|
|
||||||
|
|
||||||
# LG ThinQ Services
|
|
||||||
eic.common.lgthinq.com
|
|
||||||
eic.iotservice.lgthinq.com
|
|
||||||
eic.service.lgthinq.com
|
|
||||||
eic.ngfts.lge.com
|
|
||||||
eic.svc-lgthinq-com.aws-thinq-prd.net
|
|
||||||
eic.cdpsvc.lgtvcommon.com
|
|
||||||
eic.cdpbeacon.lgtvcommon.com
|
|
||||||
eic.cdplauncher.lgtvcommon.com
|
|
||||||
eic.homeprv.lgtvcommon.com
|
|
||||||
eic.lgtviot.com
|
|
||||||
eic.nudge.lgtvcommon.com
|
|
||||||
eic.rdl.lgtvcommon.com
|
|
||||||
eic.recommend.lgtvcommon.com
|
|
||||||
eic.service.lgtvcommon.com
|
|
||||||
gb-lgeapi-com.esi-prd.net
|
|
||||||
gb.lgeapi.com
|
|
||||||
lgtvonline.lge.com
|
|
||||||
lg-channelplus-de-beacons.xumo.com
|
|
||||||
lg-channelplus-de-mds.xumo.com
|
|
||||||
lg-channelplus-eu-beacons.xumo.com
|
|
||||||
lg-channelplus-eu-mds.xumo.com
|
|
||||||
kr-op-v2.lgthinqhome.com
|
|
||||||
ngfts.lge.com
|
|
||||||
noti.lgthinq.com
|
|
||||||
objectcontent.lgthinq.com
|
|
||||||
|
|
||||||
# Update Server Block
|
|
||||||
#snu.lge.com
|
|
@ -63,35 +63,16 @@ in
|
|||||||
webserver-allow-from = [ "127.0.0.1" "::1" ];
|
webserver-allow-from = [ "127.0.0.1" "::1" ];
|
||||||
|
|
||||||
lua-dns-script = pkgs.writeText "pdns-script.lua" ''
|
lua-dns-script = pkgs.writeText "pdns-script.lua" ''
|
||||||
blocklist = newDS()
|
-- Disney+ doesn't like our IP space...
|
||||||
|
|
||||||
function preresolve(dq)
|
function preresolve(dq)
|
||||||
local name = dq.qname:toString()
|
local name = dq.qname:toString()
|
||||||
|
|
||||||
-- Disney+ doesn't like our IP space...
|
|
||||||
if dq.qtype == pdns.AAAA and (string.find(name, "disneyplus") or string.find(name, "disney-plus") or string.find(name , "disney.api")) then
|
if dq.qtype == pdns.AAAA and (string.find(name, "disneyplus") or string.find(name, "disney-plus") or string.find(name , "disney.api")) then
|
||||||
dq.rcode = 0
|
dq.rcode = 0
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
if blocklist:check(dq.qname) then
|
|
||||||
if dq.qtype == pdns.A then
|
|
||||||
dq:addAnswer(dq.qtype, "127.0.0.1")
|
|
||||||
elseif dq.qtype == pdns.AAAA then
|
|
||||||
dq:addAnswer(dq.qtype, "::1")
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
for line in io.lines("${./dns-blocklist.txt}") do
|
|
||||||
entry = line:gsub("%s+", "")
|
|
||||||
if entry ~= "" and string.sub(entry, 1, 1) ~= "#" then
|
|
||||||
blocklist:add(entry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -225,8 +206,6 @@ in
|
|||||||
ups IN A ${net.cidr.host 20 prefixes.lo.v4}
|
ups IN A ${net.cidr.host 20 prefixes.lo.v4}
|
||||||
palace-kvm IN A ${net.cidr.host 21 prefixes.lo.v4}
|
palace-kvm IN A ${net.cidr.host 21 prefixes.lo.v4}
|
||||||
|
|
||||||
reolink-living-room IN A ${net.cidr.host 45 prefixes.lo.v4}
|
|
||||||
|
|
||||||
${lib.my.dns.fwdRecords {
|
${lib.my.dns.fwdRecords {
|
||||||
inherit allAssignments names;
|
inherit allAssignments names;
|
||||||
domain = config.networking.domain;
|
domain = config.networking.domain;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
import cloudflare
|
import CloudFlare
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='Cloudflare DNS update script')
|
parser = argparse.ArgumentParser(description='Cloudflare DNS update script')
|
||||||
@ -19,22 +19,17 @@ def main():
|
|||||||
if args.api_token_file:
|
if args.api_token_file:
|
||||||
with open(args.api_token_file) as f:
|
with open(args.api_token_file) as f:
|
||||||
cf_token = f.readline().strip()
|
cf_token = f.readline().strip()
|
||||||
cf = cloudflare.Cloudflare(api_token=cf_token)
|
|
||||||
|
|
||||||
zones = list(cf.zones.list(name=args.zone))
|
cf = CloudFlare.CloudFlare(token=cf_token)
|
||||||
|
zones = cf.zones.get(params={'name': args.zone})
|
||||||
assert zones, f'Zone {args.zone} not found'
|
assert zones, f'Zone {args.zone} not found'
|
||||||
assert len(zones) == 1, f'More than one zone found for {args.zone}'
|
records = cf.zones.dns_records.get(zones[0]['id'], params={'name': args.record})
|
||||||
zone = zones[0]
|
|
||||||
|
|
||||||
records = list(cf.dns.records.list(zone_id=zone.id, name=args.record, type='A'))
|
|
||||||
assert records, f'Record {args.record} not found in zone {args.zone}'
|
assert records, f'Record {args.record} not found in zone {args.zone}'
|
||||||
assert len(records) == 1, f'More than one record found for {args.record}'
|
|
||||||
record = records[0]
|
|
||||||
|
|
||||||
print(f'Updating {args.record} -> {address}')
|
print(f'Updating {args.record} -> {address}')
|
||||||
cf.dns.records.edit(
|
cf.zones.dns_records.patch(
|
||||||
zone_id=zone.id, dns_record_id=record.id,
|
zones[0]['id'], records[0]['id'],
|
||||||
type='A', content=address)
|
data={'type': 'A', 'name': args.record, 'content': address})
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
@ -132,32 +132,6 @@ in
|
|||||||
hw-address = "24:8a:07:a8:fe:3a";
|
hw-address = "24:8a:07:a8:fe:3a";
|
||||||
ip-address = net.cidr.host 40 prefixes.lo.v4;
|
ip-address = net.cidr.host 40 prefixes.lo.v4;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
# avr
|
|
||||||
hw-address = "8c:a9:6f:30:03:6b";
|
|
||||||
ip-address = net.cidr.host 41 prefixes.lo.v4;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
# tv
|
|
||||||
hw-address = "00:a1:59:b8:4d:86";
|
|
||||||
ip-address = net.cidr.host 42 prefixes.lo.v4;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
# android tv
|
|
||||||
hw-address = "b8:7b:d4:95:c6:74";
|
|
||||||
ip-address = net.cidr.host 43 prefixes.lo.v4;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
# hass-panel
|
|
||||||
hw-address = "80:30:49:cd:d7:51";
|
|
||||||
ip-address = net.cidr.host 44 prefixes.lo.v4;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
# reolink-living-room
|
|
||||||
hw-address = "ec:71:db:30:69:a4";
|
|
||||||
ip-address = net.cidr.host 45 prefixes.lo.v4;
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@ -45,12 +45,12 @@
|
|||||||
|
|
||||||
services = {
|
services = {
|
||||||
mjpg-streamer = {
|
mjpg-streamer = {
|
||||||
enable = false;
|
enable = true;
|
||||||
inputPlugin = "input_uvc.so";
|
inputPlugin = "input_uvc.so";
|
||||||
outputPlugin = "output_http.so -w @www@ -n -p 5050";
|
outputPlugin = "output_http.so -w @www@ -n -p 5050";
|
||||||
};
|
};
|
||||||
octoprint = {
|
octoprint = {
|
||||||
enable = false;
|
enable = true;
|
||||||
host = "::";
|
host = "::";
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
plugins = {
|
plugins = {
|
||||||
|
@ -98,7 +98,6 @@ in
|
|||||||
https = true;
|
https = true;
|
||||||
config = {
|
config = {
|
||||||
adminpassFile = config.age.secrets."kelder/nextcloud-root.txt".path;
|
adminpassFile = config.age.secrets."kelder/nextcloud-root.txt".path;
|
||||||
dbtype = "sqlite";
|
|
||||||
};
|
};
|
||||||
settings = {
|
settings = {
|
||||||
updatechecker = false;
|
updatechecker = false;
|
||||||
|
@ -23,7 +23,7 @@ let
|
|||||||
pkgs = pkgs'.${config'.nixpkgs}.${config'.system};
|
pkgs = pkgs'.${config'.nixpkgs}.${config'.system};
|
||||||
allPkgs = mapAttrs (_: p: p.${config'.system}) pkgs';
|
allPkgs = mapAttrs (_: p: p.${config'.system}) pkgs';
|
||||||
|
|
||||||
modules' = [ hmFlakes.${config'.home-manager}.nixosModules.default ] ++ (attrValues cfg.modules);
|
modules' = [ hmFlakes.${config'.home-manager}.nixosModule ] ++ (attrValues cfg.modules);
|
||||||
in
|
in
|
||||||
# Import eval-config ourselves since the flake now force-sets lib
|
# Import eval-config ourselves since the flake now force-sets lib
|
||||||
import "${pkgsFlake}/nixos/lib/eval-config.nix" {
|
import "${pkgsFlake}/nixos/lib/eval-config.nix" {
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
network = ./network.nix;
|
network = ./network.nix;
|
||||||
pdns = ./pdns.nix;
|
pdns = ./pdns.nix;
|
||||||
nginx-sso = ./nginx-sso.nix;
|
nginx-sso = ./nginx-sso.nix;
|
||||||
gui = ./gui;
|
gui = ./gui.nix;
|
||||||
l2mesh = ./l2mesh.nix;
|
l2mesh = ./l2mesh.nix;
|
||||||
borgthin = ./borgthin.nix;
|
borgthin = ./borgthin.nix;
|
||||||
nvme = ./nvme;
|
nvme = ./nvme;
|
||||||
|
@ -15,7 +15,6 @@ let
|
|||||||
passAsFile = [ "code" ];
|
passAsFile = [ "code" ];
|
||||||
code = ''
|
code = ''
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <systemd/sd-daemon.h>
|
#include <systemd/sd-daemon.h>
|
||||||
|
@ -4,12 +4,6 @@ let
|
|||||||
inherit (lib.my) mkBoolOpt';
|
inherit (lib.my) mkBoolOpt';
|
||||||
|
|
||||||
cfg = config.my.gui;
|
cfg = config.my.gui;
|
||||||
|
|
||||||
androidUdevRules = pkgs.runCommand "udev-rules-android" {
|
|
||||||
rulesFile = ./android-udev.rules;
|
|
||||||
} ''
|
|
||||||
install -D "$rulesFile" "$out"/lib/udev/rules.d/51-android.rules
|
|
||||||
'';
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.my.gui = with lib.types; {
|
options.my.gui = with lib.types; {
|
||||||
@ -32,12 +26,6 @@ in
|
|||||||
pam.services.swaylock-plugin = {};
|
pam.services.swaylock-plugin = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
users = {
|
|
||||||
groups = {
|
|
||||||
adbusers.gid = lib.my.c.ids.gids.adbusers;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
# for pw-jack
|
# for pw-jack
|
||||||
pipewire.jack
|
pipewire.jack
|
||||||
@ -58,9 +46,6 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
udev = {
|
udev = {
|
||||||
packages = [
|
|
||||||
androidUdevRules
|
|
||||||
];
|
|
||||||
extraRules = ''
|
extraRules = ''
|
||||||
# Nvidia
|
# Nvidia
|
||||||
SUBSYSTEM=="usb", ATTR{idVendor}=="0955", MODE="0664", GROUP="wheel"
|
SUBSYSTEM=="usb", ATTR{idVendor}=="0955", MODE="0664", GROUP="wheel"
|
||||||
@ -103,13 +88,5 @@ in
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
my = {
|
|
||||||
user = {
|
|
||||||
config = {
|
|
||||||
extraGroups = [ "adbusers" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,6 @@ let
|
|||||||
|
|
||||||
cfg = config.my.netboot;
|
cfg = config.my.netboot;
|
||||||
|
|
||||||
# Newer releases don't boot on desktop?
|
|
||||||
ipxe = pkgs.ipxe.overrideAttrs (o: rec {
|
ipxe = pkgs.ipxe.overrideAttrs (o: rec {
|
||||||
version = "1.21.1-unstable-2024-06-27";
|
version = "1.21.1-unstable-2024-06-27";
|
||||||
src = pkgs.fetchFromGitHub {
|
src = pkgs.fetchFromGitHub {
|
||||||
@ -14,9 +13,6 @@ let
|
|||||||
rev = "b66e27d9b29a172a097c737ab4d378d60fe01b05";
|
rev = "b66e27d9b29a172a097c737ab4d378d60fe01b05";
|
||||||
hash = "sha256-TKZ4WjNV2oZIYNefch7E7m1JpeoC/d7O1kofoNv8G40=";
|
hash = "sha256-TKZ4WjNV2oZIYNefch7E7m1JpeoC/d7O1kofoNv8G40=";
|
||||||
};
|
};
|
||||||
|
|
||||||
# This upstream patch (in newer versions) is needed for newer GCC
|
|
||||||
patches = (if (o ? patches) then o.patches else []) ++ [ ./fix-uninitialised-var.patch ];
|
|
||||||
});
|
});
|
||||||
tftpRoot = pkgs.linkFarm "tftp-root" [
|
tftpRoot = pkgs.linkFarm "tftp-root" [
|
||||||
{
|
{
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
From 7f75d320f6d8ac7ec5185b2145da87f698aec273 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Michael Brown <mcb30@ipxe.org>
|
|
||||||
Date: Mon, 2 Sep 2024 12:24:57 +0100
|
|
||||||
Subject: [PATCH] [etherfabric] Fix use of uninitialised variable in
|
|
||||||
falcon_xaui_link_ok()
|
|
||||||
|
|
||||||
The link status check in falcon_xaui_link_ok() reads from the
|
|
||||||
FCN_XX_CORE_STAT_REG_MAC register only on production hardware (where
|
|
||||||
the FPGA version reads as zero), but modifies the value and writes
|
|
||||||
back to this register unconditionally. This triggers an uninitialised
|
|
||||||
variable warning on newer versions of gcc.
|
|
||||||
|
|
||||||
Fix by assuming that the register exists only on production hardware,
|
|
||||||
and so moving the "modify-write" portion of the "read-modify-write"
|
|
||||||
operation to also be covered by the same conditional check.
|
|
||||||
|
|
||||||
Signed-off-by: Michael Brown <mcb30@ipxe.org>
|
|
||||||
---
|
|
||||||
src/drivers/net/etherfabric.c | 15 +++++++++------
|
|
||||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/drivers/net/etherfabric.c b/src/drivers/net/etherfabric.c
|
|
||||||
index b40596beae7..be30b71f79f 100644
|
|
||||||
--- a/src/drivers/net/etherfabric.c
|
|
||||||
+++ b/src/drivers/net/etherfabric.c
|
|
||||||
@@ -2225,13 +2225,16 @@ falcon_xaui_link_ok ( struct efab_nic *efab )
|
|
||||||
sync = ( sync == FCN_XX_SYNC_STAT_DECODE_SYNCED );
|
|
||||||
|
|
||||||
link_ok = align_done && sync;
|
|
||||||
- }
|
|
||||||
|
|
||||||
- /* Clear link status ready for next read */
|
|
||||||
- EFAB_SET_DWORD_FIELD ( reg, FCN_XX_COMMA_DET, FCN_XX_COMMA_DET_RESET );
|
|
||||||
- EFAB_SET_DWORD_FIELD ( reg, FCN_XX_CHARERR, FCN_XX_CHARERR_RESET);
|
|
||||||
- EFAB_SET_DWORD_FIELD ( reg, FCN_XX_DISPERR, FCN_XX_DISPERR_RESET);
|
|
||||||
- falcon_xmac_writel ( efab, ®, FCN_XX_CORE_STAT_REG_MAC );
|
|
||||||
+ /* Clear link status ready for next read */
|
|
||||||
+ EFAB_SET_DWORD_FIELD ( reg, FCN_XX_COMMA_DET,
|
|
||||||
+ FCN_XX_COMMA_DET_RESET );
|
|
||||||
+ EFAB_SET_DWORD_FIELD ( reg, FCN_XX_CHARERR,
|
|
||||||
+ FCN_XX_CHARERR_RESET );
|
|
||||||
+ EFAB_SET_DWORD_FIELD ( reg, FCN_XX_DISPERR,
|
|
||||||
+ FCN_XX_DISPERR_RESET );
|
|
||||||
+ falcon_xmac_writel ( efab, ®, FCN_XX_CORE_STAT_REG_MAC );
|
|
||||||
+ }
|
|
||||||
|
|
||||||
has_phyxs = ( efab->phy_op->mmds & ( 1 << MDIO_MMD_PHYXS ) );
|
|
||||||
if ( link_ok && has_phyxs ) {
|
|
@ -1,6 +1,6 @@
|
|||||||
{ lib, pkgs, config, ... }:
|
{ lib, pkgs, config, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib) flatten optional mkIf mkDefault mkMerge versionAtLeast;
|
inherit (lib) flatten optional mkIf mkDefault mkMerge;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
config = mkMerge [
|
config = mkMerge [
|
||||||
@ -13,11 +13,9 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
additionalUpstreamSystemUnits = mkIf (config.system.nixos.release == "24.12:u-24.11") [
|
additionalUpstreamSystemUnits = [
|
||||||
# TODO: NixOS has its own version of this, but with `network` instead of `networkd`. Is this just a typo? It
|
# TODO: NixOS has its own version of this, but with `network` instead of `networkd`. Is this just a typo? It
|
||||||
# hasn't been updated in 2 years...
|
# hasn't been updated in 2 years...
|
||||||
# This has been done upstream now :)
|
|
||||||
# TODO: Remove when 25.05 releases
|
|
||||||
"systemd-networkd-wait-online@.service"
|
"systemd-networkd-wait-online@.service"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
@ -551,42 +551,6 @@ in
|
|||||||
];
|
];
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
(mkIf (config.services ? "pds" && config.services.pds.enable) {
|
|
||||||
my.tmproot.persistence.config.directories = [
|
|
||||||
{
|
|
||||||
directory = "/var/lib/pds";
|
|
||||||
mode = "0750";
|
|
||||||
user = "pds";
|
|
||||||
group = "pds";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
})
|
|
||||||
(mkIf config.services.home-assistant.enable {
|
|
||||||
my.tmproot.persistence.config.directories = [
|
|
||||||
{
|
|
||||||
directory = config.services.home-assistant.configDir;
|
|
||||||
mode = "0750";
|
|
||||||
user = "hass";
|
|
||||||
group = "hass";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
})
|
|
||||||
(mkIf config.services.frigate.enable {
|
|
||||||
my.tmproot.persistence.config.directories = [
|
|
||||||
{
|
|
||||||
directory = "/var/lib/frigate";
|
|
||||||
mode = "0755";
|
|
||||||
user = "frigate";
|
|
||||||
group = "frigate";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
directory = "/var/cache/frigate";
|
|
||||||
mode = "0755";
|
|
||||||
user = "frigate";
|
|
||||||
group = "frigate";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
})
|
|
||||||
]))
|
]))
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHNqUFR5ZyBVVkI0
|
|
||||||
dE5YN1pJWExzLzltcmhna2tJUmdRNjZ1Y1hwbzdtRE0wa2hReTNBCk4ydmNFK0FF
|
|
||||||
b0RUdVl3a3d4amhKSEVhZWZPeHZDenBiTXpkVVFiNXFXNGsKLT4gWDI1NTE5IG9i
|
|
||||||
K0ZrNEc5SVlyWU1EbXdlbWppRG1DdjFRbTBCREY2OUxrMmVqNHhSazQKVnRaVmVn
|
|
||||||
MFBRL1dWeFNOaEwyU2szb1lOVzF1enQwdmVZZWRJcHd5MHdFbwotPiB2Wy1gUV8/
|
|
||||||
LWdyZWFzZSBdSDFebHsgKkBkVzl+KnggJTEKdlhrdzVpMHYxUUliQnhaYXNaVWNR
|
|
||||||
S3NxbjhFMEFGamZkRU1RNURhcmwzOGxFbGxXelhOdDBWTHBSY1hBcGFtUwpkampi
|
|
||||||
WnhzMDcxTk1seWZ6VURZb1l1QU1GdwotLS0gRFNpcXpDUFZLTXFJN3Z0bEJQd280
|
|
||||||
WGROWUVvdSt3ZUdBbmRNcGFhRE9BWQoDDlPEY/t2eapa4Xbv8FcW6gdLzQn7Y2cH
|
|
||||||
5UwD+0CTF3JdUpxWUIx9RWFleHekkt8j1+2/oO+m7+24yCg5mdqTJ3ZIwu9uk1eI
|
|
||||||
0As8IA==
|
|
||||||
-----END AGE ENCRYPTED FILE-----
|
|
@ -1,16 +0,0 @@
|
|||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFQrc2JHQSBmTlVp
|
|
||||||
RnlKNE9ySGo4L2h3VXBXRzIyZGdqU0RtUWk4ZmJVcGNKZ3BqTmpjCjJtQjUyTmJN
|
|
||||||
dkpsbVI3M01mQlNPSEI0U1lVeUJTMVlXUlpheGxVblhUbUkKLT4gWDI1NTE5IG5K
|
|
||||||
K0F3QWxJaW5CbW5TZElEVklIeUJxS0JCc2IxaFI5dVZrbDc3NDZGV2MKOVR6M0k5
|
|
||||||
eW5HWDQrT3Rtb0tIM1EyajI1V0dKbHBLb0tVNU9nb21OUjcxYwotPiA5anw6bk56
|
|
||||||
dC1ncmVhc2UgPCVeLiZyIH4KTGFRWHBGZFBJUElONUZLb3pJeXNZeXhoakYwT3BM
|
|
||||||
TW9kUXBhOGhNbHh1Q1RPRTlCRnhSckg5NEUxWk5MVHJucQp4YlFDcVRzK2V5bWVT
|
|
||||||
V0xLQjN1SjVTaWNJajJaTjRrQTd2VHlMRy82TExXbAotLS0gVE5YZVhTWXl4VUN2
|
|
||||||
WUpidkJLV1JDU0R2QkdHZE5ZbCt2K2FlbGNjK0ZlNApzDh+kgAy4SBqC51mJi+VX
|
|
||||||
ON8wbwLVTQRs1H30eyWNzt/3MO++eS4AoZUKQZUxURwXfhV0t0zd5/MlByBsqaHR
|
|
||||||
+W6O/9Dp8e/8GYSX3D892r1LKN0AYHgcKeKwEtJojt5CTNJS2IgU6UxZhTliqAEc
|
|
||||||
NkfxvcoAEHhGhPOudEIX2SgjrgVGJA8MYm6/46zAolZws3TWim3NEgJpb9tWXpvi
|
|
||||||
1f/MXuxiowplF+PqCsd1EGzpXKsvADq6Rwyxpo6CbJzrq+GhFrTHF+LRkzjWx6JE
|
|
||||||
LUsZwDqOZUY=
|
|
||||||
-----END AGE ENCRYPTED FILE-----
|
|
@ -1,18 +1,14 @@
|
|||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHNqUFR5ZyArUnBS
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IERMTWVGZyByYlJn
|
||||||
MCtjZERmK2IwTm16eGcrZFF5QlpYZU9VbUNzbHZ2VDBoZkJkam0wCndDdmhHc2pu
|
aERLcEhadS9jVUlyUmgxWEk5K0U2cE9WUlhCc0ZXbzhDRnZLTERvCmo2Vy9XeFhq
|
||||||
TFFiT3MzcU13YklrdFpiRW1ZSU4zUGFQbXF3ellUU3U3bUkKLT4gc3NoLWVkMjU1
|
NTcwdG5PZjlDb1JIM3BYWEVzMlBFWHFmRWt2dkF2OEQ2TDQKLT4gc3NoLWVkMjU1
|
||||||
MTkgRExNZUZnIE9EbUtYRFg0Z0xuVGNRM2pad3FFVGRDVTA3ZE50SHlvT1ZrU1NW
|
MTkgT0VxTXNnIHROaUlGUExERTZFaU5QL3dBcFpQVWNobGQwSEZ1YTU3NXJkekRi
|
||||||
b3VYREkKL0dPV3RGMHYyUW9jSlJhTU5yTnR3L0pHVjZTNWpoaGJiSmlPVWlDYlFv
|
c0RUMGsKUHg4V0hIdFJ0aGxwOTFhaVB6MUdVWE0wUFgrMjI2am5uZlhWL09ObjhB
|
||||||
RQotPiBzc2gtZWQyNTUxOSBPRXFNc2cgRkwrZEY4RjAxYzhpbEE2eU0ya2N4emE5
|
VQotPiBYMjU1MTkgTWwyQjZjcUFYQ01KUHpoajRrVkpZd0czSzVrMTZxdjVHaHRh
|
||||||
T0NlUnJwUi8vdVlJWlVOWEZESQo0OFdldUdML0hoR0NENHp2UktCTFhOYkxUZyti
|
bERCSjBqSQpYOXJibDZPM2Z6bkNCSGpMRExZT21UTzU0N0RiT2FNM0l3N1pnRkl6
|
||||||
OGlhS3V1RnFUdHhVT0JvCi0+IFgyNTUxOSBOcnEzanBFWnltMUwwd3VBd3Jablk1
|
WUJBCi0+IE0qLWdyZWFzZSB6TDVwIGRiQm0gajFFIEVqUXcKU3pEOFBqRVQ0dDZi
|
||||||
Z3hDU283RVJxSlkzKy9JQW1adVVVCmtnSjVTTSsxblpsczMzR2NldlFlTFk0S210
|
REszS1h0T2FnOFF6cHBrN2xtOHdEQkIrCi0tLSBTM3EwNHhDaEo1eldDOTN5dzQz
|
||||||
T1AxV1RQRjhDSU1CQ2p6M1UKLT4gVnNOLWdyZWFzZSB1fDAgYy1xRSBESjoyIDJz
|
Q3Rpeno1K25KRU15L01wU21tczNmdlVJCqHBdFLovtLJGH9IY86pvc3xhpoLnfI/
|
||||||
CkdRcWxTa1NHVkJDcUVmeDlIVEZTcW13N0I4ek5jTjliQ2t6Zk9nRkloQmhSY3hG
|
OVAF5RdpR9T2oNCr3oAiVURkPocYXLHnbjZhLKoj3uDoSZAE52VN9l05jhyX1wwY
|
||||||
TUdJekhXdlRzUGJ6WU8zRXgKZXFGUGgrTndSQmVyMFcyL2J0bEdKY09paTkzRHd0
|
/Vfnp48kP8xfbQ==
|
||||||
R1ZWVVVuaDljWE4zK00rdllOdGRVTzVZTnFtT1p0WlZOYgpGdwotLS0gd3dvU08x
|
|
||||||
SzJkdjAvQys5Mnp0dDZQUWp1dzZ3U2tuYUpqR09xeTJnSzVDTQooXx8cndfMYlmf
|
|
||||||
7eCLssPnHKj7KKgUfiihj91X8pokJR/++wQSarMdRtFB0S0MpDs/khwgG0HkmrKp
|
|
||||||
XB1jureGwJs7gmJ6gafKCKSkBv9Jkaw=
|
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IDYySmNjQSBONnFw
|
|
||||||
QVduaWJac2hVVDl0bHY5dXFQSkFUNGlWaTNUbGkxN3d1RWpSZGdRCmpBZ2pLZHZ0
|
|
||||||
V21EenE0U3lYblp3dTFyRlRrMGVjWGpxdVVRWW5pcnpCVlUKLT4gWDI1NTE5IEx0
|
|
||||||
QUM0aEVsbCtLd3ZmS0kyb0Q3d2RuVW1oc2pHSFpMbUZHY2VXYlhYR28KSHhraW9K
|
|
||||||
RXArS1lia0NsMWkvRFhTVEduM1M0c2JnYmduY0ZmSjhCN1M1YwotPiAlL1lJLWdy
|
|
||||||
ZWFzZSAhVCpkTAplMU5KckU1K2diWnBreG9LbERtbGJZQjZwK0lOZjJHcEJyMWZp
|
|
||||||
c1lxL1UvbTE5QzRIMm9wSXFmY2xUSzhBMEJiCmgxUQotLS0gOUhYVERseXJlVksr
|
|
||||||
SEZtby92YUIrTG4ra0hneklheFBERHhqSlFlT0YwVQr5gAYwgdPqUqW2XEtN7+ZR
|
|
||||||
VblX1NFXjMLljiGcW+ZlMXHIaKMxizPr+S/6U183e4wiUUqcpipnznnslhm/Zkny
|
|
||||||
iHmW37pnNC0T9kctqOXeEjqsQxAMo2YKFroxo1iK0YvN+VyoIDSYMDKu8uDe1Cna
|
|
||||||
rabi42KfdZNDjtPLrJyHSo2cCdnDUeWalAjQ3eQqn4y85gfPZq8kZcwvK6SmurDN
|
|
||||||
GkwxXpZpSd6MdY4fIaaBEwe7WY9hq4fE7WgcQaz5yG47F+ArCwWauAz38+309XHj
|
|
||||||
omsDSzj1jrN7T4kr2gjtUX227NrCw3REHYRNN6IQK/6fDNyPF1wbLFpXU4dnANLT
|
|
||||||
OdMRnsDRPafNLAOYn0pgCVcVs0KLpaJvy3KLevVt2MZEtSZe/S+ys28H3JJCB8qz
|
|
||||||
igaX3gw9+W8by4ET864fpFgufJrpufVvdz/MZ1207YHz1URQACWRtFKwnwfzP45+
|
|
||||||
l47Y4s+xy34V+IXLJduEQdQ0ZHqKmTv02BjEjqksBwZswjI0EbTvD3Nsiw==
|
|
||||||
-----END AGE ENCRYPTED FILE-----
|
|
@ -1,74 +1,72 @@
|
|||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHNqUFR5ZyBlbHl0
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IERMTWVGZyBVUDR4
|
||||||
S0lQbXBKVGpNNnJOUS9TSlp0U0EvYWFVanN3N0RMb1JudEdwYVQ4CnJGdklzeEFy
|
Um1XS00yUDFIRnYyZzg2KzYzanBIMWFNTmV1MVF6ei8rZDBiTXowCnBBRFEyQU14
|
||||||
RmxjamNyUWszYjFGb0ZZbk9EQVdERERtckpqczVscjdmUE0KLT4gc3NoLWVkMjU1
|
ZU5MdSt0NnRJdUMyMyt6dVlOWHBqUnkvRWNmMjNRUENKeTgKLT4gc3NoLWVkMjU1
|
||||||
MTkgRExNZUZnIGR4czhRYjUyU29JbnFnRk5IeXliNzZzMVMya1ZuS2tkUlFVTkxU
|
MTkgM2JCM1pnIHFyc2laWnBTQU0rcThOamJTcEtlUGNsSW8reTc2eTJjbVBkZlJu
|
||||||
aFd0VWsKenprWWQ0UEdaUGhvRlJUbnU1T2h1czZBK1dpOGwwcjJxc2p6ejV1RnM0
|
cXEzbUUKcmFrTEVjaXY2a0lJNEtCWXNjTUsxNENkSWZmZUJhRm5ydWZ6WlJ1aDdR
|
||||||
RQotPiBzc2gtZWQyNTUxOSAzYkIzWmcgMHB6dzVFQ3FtaWErVWNyRXo3WnNhT2NF
|
RQotPiBzc2gtZWQyNTUxOSBxKzBYY3cgRVBuOEJ4K0NRVjdLdFhIU2Y3ZGQwL3F4
|
||||||
eldUVWtOaVlWOTVwcVVaOUlGMApJUDUzNmhKbUxleTV6SjV0Zmk3dno0STVIRDIv
|
clFjMVNsOWNvTU8wVlRoNG5CZwpycFRlMzFjZ0drN0t5QXpoMkJ4aERMYkxVSFhU
|
||||||
SUkyd1M2Z21mdUtMUXIwCi0+IHNzaC1lZDI1NTE5IHErMFhjdyBnRFBPRnNSa0Nn
|
STJTdUNzeWtkUmFMTHVBCi0+IHNzaC1lZDI1NTE5IFpCM2U2USBBRUhnNlNzbDVX
|
||||||
UTlpR1Y4OU1UQmNLRnRWaGxzU3RBV0c1bG90K2I5QUQ0CjArUFlGS1B2RkVKSEtP
|
Q1ArRENrZzBrNkhhSUd5dEZnM2oxRUtmYWx2L1NtbG53ClZIalNsaUNBUUtKWGpT
|
||||||
ajRpUUNlMkRPN3pxaEkrZ1M3RndxRDZ6U09Wc2cKLT4gc3NoLWVkMjU1MTkgWkIz
|
dTM3VExldm0xRXJoSWZ0SU4vdWk5SDlZTEFPczQKLT4gc3NoLWVkMjU1MTkgajY3
|
||||||
ZTZRIFRPdXRTeEVvUTM1dlQzMll2VDFkUlY2eEFRcnRrc1lNeDZDbFE1a3BjaDgK
|
RlhRIGR0VkhtNWxCK2xSYUNlS2hhdzRldEVZRDQwNmVnN0dtRTdOamFSM1Jqek0K
|
||||||
MytBM0Y2Mmo2M1JOWExLQy8xTm9SR05WcmxrV2xBZ0RpeXQxeGVkZ1VZcwotPiBz
|
YS9uWGMyY3JzeUZCWkhLTzk4d1dxT0NkbEQ3UnlWOStCdUh0bkg3K2N3TQotPiBz
|
||||||
c2gtZWQyNTUxOSBqNjdGWFEgYUw5cnJabnhhdU9lN0NPVXVUazRnVWpzcUVtM3VR
|
c2gtZWQyNTUxOSBjMFROYVEgYXJhZUdOeEphOGxkMTZmamJxdmMrTElkYkFScVA3
|
||||||
bWQxNVVSQTN5N3hXRQp0blhXUC94TlRPbS9Ba2N1eVM0QkNNblJBa1hJYjZ1Y1lM
|
alExSC9TVTJzeUFqNApsZXo1cC9wdnp3Zml4bG52ekFHMEUyU29acFFJeU1VN3Mr
|
||||||
UDhWbUd5bWNVCi0+IHNzaC1lZDI1NTE5IGMwVE5hUSA0TXowVjA0N2FvcER6OEts
|
ZlorWC9VWDZzCi0+IHNzaC1lZDI1NTE5IG44Q3BVdyBTenhVdjNncGxudDJ2Y3lw
|
||||||
VTVwa0UzUEtsY005WDhmaU8zZ3VLaXQvaVRJCjB4cjJiMHVGM3hyWlg0OHhaT0lu
|
K0JIOFJDd2VVQzFkWGc1STROdFZqbnUrYlJnCk5MTWxRYVRPcUFjMmdySEJ5Rndy
|
||||||
K2NJQWVndzYrSDAyK25NMklSVUI4S28KLT4gc3NoLWVkMjU1MTkgbjhDcFV3IFNE
|
TzdnNGErNnBRa1dTSFVFekxQUitOYTAKLT4gc3NoLWVkMjU1MTkgakk4UkFnIGtL
|
||||||
Q1NZbnpqUkdiaktnYkxZdzZrYUVqWDEvYnMvOTJqSUpybERTNk9uQ0kKYlMzZkVu
|
c1psRWRRN1hNZUNiVHFmR3JGVm1jUWJtdm91ZVR6M01zNmhGdW9pRTAKNGpwek8w
|
||||||
SXVtaWk2WEtDMEpwZFM3ZVIyWHQwUWNOZjVRS0I0ZjN5MklHYwotPiBzc2gtZWQy
|
QkRnSkZXUjhEMEpPaUdkeGwxZDRGbTRSMjg1Z1pMdEVSaTJEdwotPiBzc2gtZWQy
|
||||||
NTUxOSBqSThSQWcgWTZIMCtNMCtzTFpROHpBMnA3b2s2UFE2dDZGbnlxU2VxMlkz
|
NTUxOSBoTWE0bncgYmRqR1FRaDdQQ09ZZHQwWmQxVUJ2QWdLYjdoRlNLU09GYUNi
|
||||||
aGJFUzV6awpKNDhobHQrTCs4cUVpNE5wblJMako3bU5tVldjVDBjVlJOOHhkUTNk
|
ajJhMWx5QQo3ZWFNWjMvTzNxSXJjeTY5cTNMWmk0K0IzZ053Mmd6T1hhaVFTVVBj
|
||||||
NFdrCi0+IHNzaC1lZDI1NTE5IFQrc2JHQSBTbVlBTXIzQ09SOHRJakZXK3NkT1Uy
|
NHBrCi0+IHNzaC1lZDI1NTE5IGV5cTNkZyBXbUdJKzdMZDF1NW1pTi94aUtjNGpo
|
||||||
RFgrUTZncSsyK3p5WlVDSFNwM2lFClErRHk4Qmp2VlIvZW8rV2lNME53ZFlIUmVC
|
aGVLbno0RzE1MXlURTJJQ3hRb1dVClg5K2FwRHBvcXIwVUl1U21GSnJsSmJmMGZN
|
||||||
bXF5RlVvV2FUM3ZmeWpaQzgKLT4gc3NoLWVkMjU1MTkgaE1hNG53IDBINGhyMDBy
|
cmdBcmRiRERzcjJmZzV4Q2sKLT4gc3NoLWVkMjU1MTkgN1dROVBBIEIrays1YUJN
|
||||||
bkp0RWpTU0F6Uk1kaXllRHBHbXF2QWUwNkN1U0tEWE53VGsKdi9QRlhwRCtyQkRq
|
TkRMS01oVzQyZEJuSjFPTTV4YkZSMDdTV0UvZE4rZ1U3SFEKWEZSL0g0dmFnelJC
|
||||||
cng1Wk1rZkx2NnJTMUxGajN3b2Z3SG0zd0ptcklCZwotPiBzc2gtZWQyNTUxOSBl
|
S3VGZDlaTHhJQ3NaaEc2aUsvRmdKdjRNZ1VXMExmQQotPiBzc2gtZWQyNTUxOSBn
|
||||||
eXEzZGcgcnQ4WUFMcGRtL1BvYTkxWU12WTdkT1lLRmJlZXZ4cWtHNG54QVo0dDYw
|
U3hQMFEgODNUUEg4M0hLL3RSUXk4M3dGV0tZNjJXQWxabmxLanF0Slc0WWMyUkNo
|
||||||
RQp2NkMwbTROZTBuRUVLNEs3L3BmOTZ2S3dDL0hUbm5OaHZXbjVCRG15bExnCi0+
|
bwpCMGlaZDdodk4zeDROczVFc0FxM25qMFdicWZZSVpjb2tiT081bUVUTGFzCi0+
|
||||||
IHNzaC1lZDI1NTE5IDdXUTlQQSBPL0t1ZWptTm5YQXIwc3ZNUGhkaVM5QU1DMkNL
|
IHNzaC1lZDI1NTE5IFZGY3c1ZyBKanVnSDI0bUhvS3RVbzdSc0s2TmQzSVdEczRF
|
||||||
NU1WSFlTT05KOWR3dGhJCmdTTEIrNEZma3E0UzArMndqVEgzWnVLNzl0TjhsbG9P
|
eU1CazZPM094eEt1ZGp3Cm1HWGluLzhoRUtNRDZOcVJDVUR1R3dneHNHa1M1VGpH
|
||||||
OE9aRVk1Ung1cEkKLT4gc3NoLWVkMjU1MTkgZ1N4UDBRIGJNazFtRThSVVVvb3dP
|
YWF3TDQ5cS9saFUKLT4gc3NoLWVkMjU1MTkgaGtidHZnIHJLN2dJQnA4eGo5SnU3
|
||||||
RHV5WGxCbktDK3c5aEhiYkphNU4zUnVNUVNNV2sKbWZJYkNSZFMvTDI1WVg5SnJV
|
SkttSlM2YXNERXJOYjc1Tlo4NnhFakdYT0dqUWMKQllrZm83NHJrYmtWaytCc1VI
|
||||||
bUFSY2JsNDJBc253dlN5Y2Nqdm9TbU9IawotPiBzc2gtZWQyNTUxOSBWRmN3NWcg
|
aVhESUtYeHpoT0JmdStSRURMZ0JldlQwYwotPiBzc2gtZWQyNTUxOSBldDJ6cFEg
|
||||||
eEo0dmRNWVpuVGdxRHpXc09tUDZldFRKcTBIMVVWcXdmVFRhZnZmenBETQpJWHVp
|
d3NnSXpMRzU0QjBBL0c4SGw5Znl6d3hRdWxvbHdXZCtIeVdnU1F6MFVVQQpiQjVX
|
||||||
NWJNRWhacHlMbHlQcjEzdEZWdUVpbGg0N2pqMjcvTk92UDJpNUlvCi0+IHNzaC1l
|
TSsycGZqMVNWajZHcFkyN2JwY2RqcGRlNitRWXgxWnN5TzlpU1lRCi0+IHNzaC1l
|
||||||
ZDI1NTE5IGhrYnR2ZyB0SFJGRE03T3lnTUJZakVCcnQxVklPNXhzak94eU5KUzNX
|
ZDI1NTE5IFpiTEpXQSB3VmFwR2ZqR2p4OXlpSnQrbExqTktkaEJ4emxLM2ZZbGdx
|
||||||
L216SCtUWEVzCmRrS2Rlc1JiNEg1KzExaUsrNHJuSDlTcU5Oa0J4QVZKVmNBRGFP
|
U0drOWtxUGprClgyYnd1M1NQem1rZkxwUk5tVXBLNGVDMFVjNjc5Lys4N0RsajZN
|
||||||
ZWlqUjAKLT4gc3NoLWVkMjU1MTkgZXQyenBRIEFhMFVxZ3RRbk4za2t5cWtwVjVi
|
eG9LeEEKLT4gc3NoLWVkMjU1MTkgWk5xSW9nIFl3QUlPNnVHNXNwQ2sxRUEycFda
|
||||||
Qm9ucVdMekVsSHEwSWlML0JIdmQ2SFkKWW5mWnQvRWlaT3hJLzJyTE5RdTNUMWNM
|
TkJsUmx0dCtRdnRVRVAzY3pPbm1LM0EKbVZDMHBSOFBiMFVQbkxHOGpkQjhrbDRJ
|
||||||
SDB4TjVKZCtDN0tCR1NhdnRqbwotPiBzc2gtZWQyNTUxOSBaYkxKV0EgV1loMWZx
|
YUN0M2JPOW1PbjVtQURaUnVFbwotPiBzc2gtZWQyNTUxOSBxTGpxeVEgUXc5TUxn
|
||||||
OHhKelNvNzErMDc4cUE5amgycTFTem5lVmlGYTk5bUM2T2dEUQpkMVQ0VS80Y3Jt
|
YXk2ai9EbHdVeFVsUk96bHZIRFdlcDFqYkxLQ3FJaFBQVG93bwpTSFJ5dmJiN2tt
|
||||||
QTZUVnNZV0daczM0Titvc3Q1T2JiTVZYV2tXOW4xV0VRCi0+IHNzaC1lZDI1NTE5
|
TVlLUlBhb3VmSG8zVHNYdC9HVjcwN3JUVVVWN3BFUkhvCi0+IHNzaC1lZDI1NTE5
|
||||||
IFpOcUlvZyAzMnZ2NjR1R2R2UlJNZjNvOU9RckR0MEtnbllyYVJPSUZtUDNWSU5k
|
IEJhUWxSZyAxYkNsekljV0s1ZWR2eVZnSk9Oc2QvWjE2a2dMaldDYzJRU0FWUVE0
|
||||||
U3c4Ckgza2txalJhOW14c1dGZ0VTc3EzK2NpOUJaVWhqN2lMWU9HL3hMSWlJUVkK
|
Z0FvCnk5UlhrT0ZaK3FXTThVY0RKZlE0d0FTajJLRCtSNWdvWjd5V3hZNEg4dUkK
|
||||||
LT4gc3NoLWVkMjU1MTkgcUxqcXlRIHMxNStVTnY1TUZJaHlXQnNTSFhXditsWnVF
|
LT4gc3NoLWVkMjU1MTkgcytxUmZnIHA5cGpXWlMvTlVreDNremhCa1FDUlFVYk45
|
||||||
Y2ZKRWZ5UXVPZUVKY2VjakEKV1N3ODVFYXROTzFReWE5Y1A5MkpXUjJVc00wVVd3
|
OHhjaUhYTWZVa3dySzNLeW8KNXZnZzFPNC8zMExuMG4yUTJFMDgxTFdGdDZ6VVl1
|
||||||
ZUpzTC9rRGdOWUpxWQotPiBzc2gtZWQyNTUxOSBCYVFsUmcganpkWlpaWlRVQ3Vp
|
WEFGUC9zNVgrd2RRdwotPiBzc2gtZWQyNTUxOSA2MkpjY0EgMG51elJWRWRDNzRM
|
||||||
Y2hvbkpld2kzdzVtdERHajBNUTEyM0NOWlp0WkxtRQp1MEJUKzFUSW9tWjluVU9Y
|
SERza2RiNFBoOHc1eCt0SWtmUy90dGl0VEd6QTJENApodnNBM1FkUlZ2ZjB6b1Np
|
||||||
clBzNFpzdU83MXdGN2dJSGducnplbEd4M1JNCi0+IHNzaC1lZDI1NTE5IHMrcVJm
|
QWNXdjVoNFlsa0NOQWp6TUw2TVQrU3VNRlVZCi0+IHNzaC1lZDI1NTE5IC9oeC9k
|
||||||
ZyBSRW1pZWFhQkpQRTFYTG9IZnVmWmx6S2pNUll4MGhtRFd1Y0ZhS25JNFZVCjhU
|
QSBxdlhXM3Rqb3J4YjVDUzdhUUVYQlFvSTJjZXA5MHBYY0NXWVR0VzllR2hzCkU2
|
||||||
UDhoOTlTUEtqbytZMjZ2NlozcnZTNXVNcVA3cU1TRmtsL1g4bEhKUzgKLT4gc3No
|
K2xCY2tGeEJjK1dMYkhCZ29pR3EzYndWUXF4bWorNC83d1E3U3luMFUKLT4gc3No
|
||||||
LWVkMjU1MTkgNjJKY2NBIElSSXZjc3J5cWNwOHFNV281YzBrVzc2TlVwMnRwb0NJ
|
LWVkMjU1MTkgV3pMR0hBIGg1MjIydFM3YlM3aWVFR0h4TytwRWxYWTVkTXN4VkdW
|
||||||
dEdST0s4MEhmQnMKaTNEdkFjRktCZHNCY3FsWE5UbFo1R3lXSlI2NE5MR25neWJ4
|
TnJ0bXQ0WTduQUEKemtad2lsTTlPUEtUaVpFLzNPVFhqd3VpeWJWbDFyayt2VVhy
|
||||||
NTlsSllxWQotPiBzc2gtZWQyNTUxOSAvaHgvZEEgOExaRjJiNTJkUGFxZllSK1Uz
|
Q0FSb01rRQotPiBzc2gtZWQyNTUxOSBISi9KN0EgTkdKZUx2U1NTODZzTlpJb2xT
|
||||||
eWxQTmtxOVFPZkVFb2w2Z0tmZVpwTndDWQpuRFlqZWdaQjZaT1BZSmllVzB5NWhY
|
VFptQ3hWOS9BMCsyZXdsM3ErMXhtaHlFQQoyUnp3RW81VUh6OVRQcGhJOXYxNXRR
|
||||||
MmhHaWtZOXFERzhSRWRXWk5TR1RRCi0+IHNzaC1lZDI1NTE5IFd6TEdIQSBtZW04
|
NHNGT3ZIU2ZQb2c5aEg0UmhRcG13Ci0+IHNzaC1lZDI1NTE5IE9FcU1zZyBLMi9r
|
||||||
eWlNWU9JOXYvcVlsb1JXM2JKRlREeXJXNHd6MlkvazZrSzdscG5BCnZzWUFwb3lK
|
bmFyTnBCU1lsdUpDWTJsd3ltRzAxZmw5eDNqVUtjMkR0OGF1dVRjCndrNmVHcmYy
|
||||||
dUhkcDZNakFPN0RMRG5LQzdqU1UzNlJ6eGRGSGlhYUx0YXMKLT4gc3NoLWVkMjU1
|
c0lQOFM5SjBjN1ZqZXk1Vkk3RzA0b3JtaWZrdDBmdmFrYXcKLT4gc3NoLWVkMjU1
|
||||||
MTkgSEovSjdBIDBaNzZGVkdaVWlWNk4yVW5UdnFCZ2xWUEtIc2QzQmJTMnlINVF1
|
MTkgL0VKWHZnIEV6eVNrNEZvVWhPMXppeFpmSEt1Y2NqcmtUOXAxQ1lOWVdtcnlm
|
||||||
V093UmsKcXNhSnlnWHQrRzVSU296NENDN29aMUN5VlRIcittdGNySGhvMHZlT0xl
|
R3B3VFEKVXJJRWlmOFVHZ3hyWWhLZE03VlNlM0M4ejFDYjM1b1c0YWhMMVcrRXlH
|
||||||
NAotPiBzc2gtZWQyNTUxOSBPRXFNc2cgNUFSc045eUVqQWI3MXB4Tkd2RndDS2Na
|
bwotPiBYMjU1MTkgUkRPY2JrSGZYeGNVWldVbTAzbkdtbHdUS1hoZXg2R2JEOGtC
|
||||||
VGJrblFLaENPVlZucFdGRGFDTQp6dlRHTnRLSFkxb1RFdmxGS09Jenh2Q25VZ2ha
|
ckZSOWV3TQpGejNQOUlxb05oWE9hRWdjbzI2a0NKVkpHMG1PMWlMWVZpYkVQNlpx
|
||||||
QWQ4YUNjdVNJbW8vVGVrCi0+IHNzaC1lZDI1NTE5IC9FSlh2ZyBGM2lrUG1DWUx3
|
c2xRCi0+ICwlLDsrbWYtZ3JlYXNlIE8mcz1jaywgeiJbOE9FeyAjXFl4Ugo1c2VM
|
||||||
YndZWWdobVo3TjZHTDNabmdsa3ZHcndwUXVZSVg5T0VZCjNYdlFYSHBsWjBTWXlS
|
THdsOFlhODVMV3JsYzY3QU5Hb1BJTHBWNFEvalRHN3lXQlBBZFVvQXRIdXpXYVpU
|
||||||
V0lSZkpwVE05eU1LcFBEbWdXWEZ0U0tSTkthQnMKLT4gWDI1NTE5IDF5SmczUWpo
|
b0NLRG40WWhMQ2hDCnZyS1d6SGxGekIzWUs2Uk5XSFRscTIrTTEwNzJKMExGcG5m
|
||||||
bkdmWS9SamxtTTF1eVJnc1QxUGJiUjQwR1VSTmdxMEtqQzAKeTF0NWp6dG1CWGNy
|
UWR0MWtBNnk4bDBYYStVQzFwZDlWRzRDNXJVZm0KajVrCi0tLSBkQ044Z3A5R0dt
|
||||||
VVVXVGFLV3dkWWo2YTVkZmtXcHRZai9FSDVBSmJhbwotPiAmJC1ncmVhc2UgaWU3
|
S0htaUZaSzdPOTNCcXZrSWFVVHlTZk0zejBuT21yQzFBCo6rc9fznstf3eXBRUA8
|
||||||
YGkpVSBNV0ZfIDM1fltQdzBcCmZYRXB1NEVMNkVqWVF3Ci0tLSB2RVRFYmVGVklB
|
73MZAYqSnJ5wVMrYrwGfT9lXvKbHCOvkgjUI6Ieo0nuw+aZpXoV3t9HfZv62UEll
|
||||||
bGFiUTBKYlMrRitvN2NnUkhScTMvWml6ZzRKU3ZIeEtvChoKB2c5roTC97pdDOi6
|
ZZVu+ieRCZqOOqZKKZ3TCP24vdXun8Tu+3YK8fyn88QSRH/0ZMnqI9FXbtsUhsF8
|
||||||
aPFIaTyOu9NZ4ESwwRjpEgB0D6GP2r7YR3CnxVyXa4sCFUnTF8dLUkABFnSeNeQZ
|
2o7m7Fn48B0nVKy16HZyBsksknAuZCkfS/JOkgI=
|
||||||
M64tM6J+tZAyJa9IKaTgSqvQaGYHHYinygNvf6BShCK4nPUJu0cV6gFtqFle0MWA
|
|
||||||
Rez5eRMFH/M2aubhwBeDyHG4WRelkt7oMVXyY6U=
|
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
Loading…
x
Reference in New Issue
Block a user