Kieran's opinionated (and probably slightly dumb) nix config

Compare changes

Choose any two refs to compare.

+8
.github/workflows/deploy.yaml
···
- name: Install Nix
uses: DeterminateSystems/determinate-nix-action@main
+
with:
+
extra-conf: |
+
extra-platforms = aarch64-linux
+
+
- name: Set up QEMU
+
uses: docker/setup-qemu-action@v3
+
with:
+
platforms: arm64
- name: Setup Tailscale
uses: tailscale/github-action@v3
-1
README.md
···
├── machines
│ ├── atalanta # my macOS M4 machine
│ ├── ember # my dell r210 server (in my basement)
-
│ ├── john # shared server for cedarville
│ ├── moonlark # my framework 13 <dead>
│ ├── nest # shared tilde server through hc
│ ├── prattle # oracle cloud x86_64 server
+163 -56
flake.lock
···
"type": "github"
}
},
+
"battleship-arena": {
+
"inputs": {
+
"nixpkgs": [
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1765226744,
+
"narHash": "sha256-3uCn0DQPlyYufnTeugp4qZbdddv4q2a+y9hXdgH/iOU=",
+
"owner": "taciturnaxolotl",
+
"repo": "battleship-arena",
+
"rev": "20d9604ef8fdd7e30244ef6e7d4cde541c4a0863",
+
"type": "github"
+
},
+
"original": {
+
"owner": "taciturnaxolotl",
+
"repo": "battleship-arena",
+
"type": "github"
+
}
+
},
"catppuccin": {
"inputs": {
"nixpkgs": [
···
]
},
"locked": {
-
"lastModified": 1758376412,
-
"narHash": "sha256-/Tin8S9fPSRu5iiOYohW7r7mCUwcEtYyGqZhtgZzV6k=",
+
"lastModified": 1758312668,
+
"narHash": "sha256-ChN8Upf1TCMSJ0a7keuVCZr3DJIm3YPOFLZauVlQc+Y=",
"owner": "taciturnaxolotl",
"repo": "ctfd-alerts",
-
"rev": "75e964f2088acf02e63dd94e44c942357a43e53f",
+
"rev": "db05e69b7ae683d83aac019cc632346b25e941e2",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1764110879,
-
"narHash": "sha256-xanUzIb0tf3kJ+PoOFmXEXV1jM3PjkDT/TQ5DYeNYRc=",
+
"lastModified": 1765326679,
+
"narHash": "sha256-fTLX9kDwLr9Y0rH/nG+h1XG5UU+jBcy0PFYn5eneRX8=",
"owner": "nix-community",
"repo": "disko",
-
"rev": "aecba248f9a7d68c5d1ed15de2d1c8a4c994a3c5",
+
"rev": "d64e5cdca35b5fad7c504f615357a7afe6d9c49e",
"type": "github"
},
"original": {
···
"type": "github"
}
},
+
"flake-utils_7": {
+
"inputs": {
+
"systems": "systems_10"
+
},
+
"locked": {
+
"lastModified": 1731533236,
+
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+
"owner": "numtide",
+
"repo": "flake-utils",
+
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+
"type": "github"
+
},
+
"original": {
+
"owner": "numtide",
+
"repo": "flake-utils",
+
"type": "github"
+
}
+
},
"flare": {
"inputs": {
"flake-utils": "flake-utils_3",
···
]
},
"locked": {
-
"lastModified": 1764194154,
-
"narHash": "sha256-ePo8T182dm9qIKdz/38/iU37NrxVoxg8M4ma8qFDkb8=",
+
"lastModified": 1764827700,
+
"narHash": "sha256-9xpbmlCXEYU3rWv23OT4qcW0lyeelud0ZrNRicqoTkQ=",
"owner": "frc4451",
"repo": "frc-nix",
-
"rev": "da2384220608b1725ea702a593b98b3989313702",
+
"rev": "2a52c5c29093d1cd9494ac0e5b7c70ef970ef7ff",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1709087332,
-
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+
"lastModified": 1762808025,
+
"narHash": "sha256-XmjITeZNMTQXGhhww6ed/Wacy2KzD6svioyCX7pkUu4=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
-
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
"type": "github"
},
"original": {
···
},
"hardware": {
"locked": {
-
"lastModified": 1764080039,
-
"narHash": "sha256-b1MtLQsQc4Ji1u08f+C6g5XrmLPkJQ1fhNkCt+0AERQ=",
+
"lastModified": 1764440730,
+
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
"owner": "NixOS",
"repo": "nixos-hardware",
-
"rev": "da17006633ca9cda369be82893ae36824a2ddf1a",
+
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1763992789,
-
"narHash": "sha256-WHkdBlw6oyxXIra/vQPYLtqY+3G8dUVZM8bEXk0t8x4=",
+
"lastModified": 1765384171,
+
"narHash": "sha256-FuFtkJrW1Z7u+3lhzPRau69E0CNjADku1mLQQflUORo=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "44831a7eaba4360fb81f2acc5ea6de5fde90aaa3",
+
"rev": "44777152652bc9eacf8876976fa72cc77ca8b9d8",
"type": "github"
},
"original": {
"owner": "nix-community",
-
"ref": "release-25.05",
+
"ref": "release-25.11",
"repo": "home-manager",
"type": "github"
}
···
]
},
"locked": {
-
"lastModified": 1759613406,
-
"narHash": "sha256-PzgQJydp+RlKvwDi807pXPlURdIAVqLppZDga3DwPqg=",
+
"lastModified": 1765113580,
+
"narHash": "sha256-b8YOwGDFprkQJjXsKGuSNS1pWe8w4cUW36YxlUelNpU=",
"owner": "hyprwm",
"repo": "contrib",
-
"rev": "32e1a75b65553daefb419f0906ce19e04815aa3a",
+
"rev": "db18f83bebbc2cf43a21dbb26cd99aabe672d923",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1762912391,
-
"narHash": "sha256-4hpBE7bGd24SfD28rzMdUGXsLsNEYxCCrTipFdoqoNM=",
+
"lastModified": 1765066094,
+
"narHash": "sha256-0YSU35gfRFJzx/lTGgOt6ubP8K6LeW0vaywzNNqxkl4=",
"owner": "nix-darwin",
"repo": "nix-darwin",
-
"rev": "d76299b2cd01837c4c271a7b5186e3d5d8ebd126",
+
"rev": "688427b1aab9afb478ca07989dc754fa543e03d5",
"type": "github"
},
"original": {
"owner": "nix-darwin",
-
"ref": "nix-darwin-25.05",
+
"ref": "nix-darwin-25.11",
"repo": "nix-darwin",
"type": "github"
}
···
"nixpkgs": "nixpkgs_3"
},
"locked": {
-
"lastModified": 1764122296,
-
"narHash": "sha256-HTsPRp1Y3H5OQKocn0hKLQHU5vR5y6qlIU92l+OQWJM=",
+
"lastModified": 1765418662,
+
"narHash": "sha256-8SSYagIUn+m9CKUYddq3DN1xkh04KCO0itB/LMgEgpc=",
"owner": "nix-community",
"repo": "nix-vscode-extensions",
-
"rev": "4b5d357fd9b7ffce8fded947e3e4e883ed1b2109",
+
"rev": "0f6679daa3f5bc2b09827b67f49caf0ac8e3a4c8",
"type": "github"
},
"original": {
···
},
"nixos-facter-modules": {
"locked": {
-
"lastModified": 1764252389,
-
"narHash": "sha256-3bbuneTKZBkYXlm0bE36kUjiDsasoIC1GWBw/UEJ9T4=",
+
"lastModified": 1765442039,
+
"narHash": "sha256-k3lYQ+A1F7aTz8HnlU++bd9t/x/NP2A4v9+x6opcVg0=",
"owner": "numtide",
"repo": "nixos-facter-modules",
-
"rev": "5ea68886d95218646d11d3551a476d458df00778",
+
"rev": "9dd775ee92de63f14edd021d59416e18ac2c00f1",
"type": "github"
},
"original": {
···
},
"nixpkgs-unstable": {
"locked": {
-
"lastModified": 1763966396,
-
"narHash": "sha256-6eeL1YPcY1MV3DDStIDIdy/zZCDKgHdkCmsrLJFiZf0=",
+
"lastModified": 1765186076,
+
"narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=",
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "5ae3b07d8d6527c42f17c876e404993199144b6a",
+
"rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8",
"type": "github"
},
"original": {
···
},
"nixpkgs_4": {
"locked": {
-
"lastModified": 1763948260,
-
"narHash": "sha256-dY9qLD0H0zOUgU3vWacPY6Qc421BeQAfm8kBuBtPVE0=",
+
"lastModified": 1765311797,
+
"narHash": "sha256-mSD5Ob7a+T2RNjvPvOA1dkJHGVrNVl8ZOrAwBjKBDQo=",
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "1c8ba8d3f7634acac4a2094eef7c32ad9106532c",
+
"rev": "09eb77e94fa25202af8f3e81ddc7353d9970ac1b",
"type": "github"
},
"original": {
"owner": "nixos",
-
"ref": "nixos-25.05",
+
"ref": "nixos-25.11",
"repo": "nixpkgs",
"type": "github"
}
···
"type": "github"
}
},
+
"nixpkgs_8": {
+
"locked": {
+
"lastModified": 1764635402,
+
"narHash": "sha256-6rYcajRLe2C5ZYnV1HYskJl+QAkhvseWTzbdQiTN9OI=",
+
"owner": "nixos",
+
"repo": "nixpkgs",
+
"rev": "5f53b0d46d320352684242d000b36dcfbbf7b0bc",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nixos",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
"nixvim": {
"inputs": {
"flake-parts": "flake-parts",
···
]
},
"locked": {
-
"lastModified": 1764205859,
-
"narHash": "sha256-stgoOn8HDDHybp/6+0FzzEj8LiTA/nL4KFgQqQl+W6Y=",
+
"lastModified": 1765470296,
+
"narHash": "sha256-bURojPUn8jloR046JNZf6qrYNmEPfFEoDaLTKoP9pg4=",
"owner": "nix-community",
"repo": "NUR",
-
"rev": "55f06cc0c0a6d3ef798292c8321075d210f31b76",
+
"rev": "441a70568483c0c48b338cca2030e3d9c7aef3ba",
"type": "github"
},
"original": {
···
"root": {
"inputs": {
"agenix": "agenix",
+
"battleship-arena": "battleship-arena",
"catppuccin": "catppuccin",
"catppuccin-vsc": "catppuccin-vsc",
"cedarlogic": "cedarlogic",
···
"spicetify-nix": "spicetify-nix",
"tangled": "tangled",
"terminal-wakatime": "terminal-wakatime",
-
"wakatime-ls": "wakatime-ls"
+
"wakatime-ls": "wakatime-ls",
+
"zmx": "zmx"
},
"rust-overlay": {
···
},
"locked": {
-
"lastModified": 1761705569,
-
"narHash": "sha256-dqljv29XldlKvdTwFw8GkxOQHrz3/13yxdwHW8+nzBI=",
+
"lastModified": 1764557621,
+
"narHash": "sha256-kX5PoY8hQZ80+amMQgOO9t8Tc1JZ70gYRnzaVD4AA+o=",
"owner": "oxalica",
"repo": "rust-overlay",
-
"rev": "bca7909cb02f5139e0a490b0ff4bae775ea3ebf6",
+
"rev": "93316876c2229460a5d6f5f052766cc4cef538ce",
"type": "github"
},
"original": {
···
"systems": "systems_8"
},
"locked": {
-
"lastModified": 1763985453,
-
"narHash": "sha256-vUqODgLIjeyHN7DP8dVx7oH9yB/L8qcxpN//4EmMQcM=",
+
"lastModified": 1765082296,
+
"narHash": "sha256-EcefoixU9ht+P6QB/TfjLY9E3MdJVfeSec6G8Ges0pA=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
-
"rev": "89cd40c646ec5b12e5c20c0e18f082e7629d4819",
+
"rev": "ac4927ea1ec7e7ea3635a1d8b933106a596c4356",
"type": "github"
},
"original": {
···
"type": "github"
},
+
"systems_10": {
+
"locked": {
+
"lastModified": 1681028828,
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+
"owner": "nix-systems",
+
"repo": "default",
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-systems",
+
"repo": "default",
+
"type": "github"
+
}
+
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
···
"sqlite-lib-src": "sqlite-lib-src"
},
"locked": {
-
"lastModified": 1764005195,
-
"narHash": "sha256-PzuWiW/nMxwQTX0i1bHwGazQF4ptLNI9OGwpmhDb9i0=",
+
"lastModified": 1765368304,
+
"narHash": "sha256-Q3JC5+FYtsKJU70WIhGhsAYWzu0CvUmmbdYhcFe46Pg=",
"ref": "refs/heads/master",
-
"rev": "7358ec6edfa4d17b8b8f543d99e83a4705901148",
-
"revCount": 1687,
+
"rev": "a53d124ea4746109c1933f7adc72f0bde1309890",
+
"revCount": 1731,
"type": "git",
"url": "https://tangled.org/tangled.org/core"
},
···
"rust-overlay": "rust-overlay"
},
"locked": {
-
"lastModified": 1761849542,
-
"narHash": "sha256-5fNSKIUG54TD5jq5hgsCmB4FB0mO8teiBE18fU81mfc=",
+
"lastModified": 1764772399,
+
"narHash": "sha256-iZmN5d42tOsmssuFzOf3saUUeXbrwraQmDgh5czuMis=",
"owner": "mrnossiom",
"repo": "wakatime-ls",
-
"rev": "89e4091ef5e4c1830dd9bd463f8b063f8335bfad",
+
"rev": "b8b9c1e612f198d767a64142f34c33ffbd347fae",
"type": "github"
},
"original": {
"owner": "mrnossiom",
"repo": "wakatime-ls",
+
"type": "github"
+
}
+
},
+
"zig2nix": {
+
"inputs": {
+
"flake-utils": "flake-utils_7",
+
"nixpkgs": "nixpkgs_8"
+
},
+
"locked": {
+
"lastModified": 1764678235,
+
"narHash": "sha256-NNQWR3DAufaH7fs6ZplfAv1xPHEc0Ne3Z0v4MNHCqSw=",
+
"owner": "Cloudef",
+
"repo": "zig2nix",
+
"rev": "8b6ec85bccdf6b91ded19e9ef671205937e271e6",
+
"type": "github"
+
},
+
"original": {
+
"owner": "Cloudef",
+
"repo": "zig2nix",
+
"type": "github"
+
}
+
},
+
"zmx": {
+
"inputs": {
+
"zig2nix": "zig2nix"
+
},
+
"locked": {
+
"lastModified": 1765397837,
+
"narHash": "sha256-nMlS9SA8MLJHJ0X/zEg3eG18mLw5vvZpZBbTbVcGFTI=",
+
"owner": "neurosnap",
+
"repo": "zmx",
+
"rev": "a22dba538a31480ed450b389f397e15880a1c53a",
+
"type": "github"
+
},
+
"original": {
+
"owner": "neurosnap",
+
"repo": "zmx",
"type": "github"
+16 -13
flake.nix
···
inputs = {
# Nixpkgs
-
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
+
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# NixOS hardware configuration
hardware.url = "github:NixOS/nixos-hardware/master";
# Home manager
-
home-manager.url = "github:nix-community/home-manager/release-25.05";
+
home-manager.url = "github:nix-community/home-manager/release-25.11";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
# Nix-Darwin
-
nix-darwin.url = "github:nix-darwin/nix-darwin/nix-darwin-25.05";
+
nix-darwin.url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
disko.url = "github:nix-community/disko";
···
tangled = {
url = "git+https://tangled.org/tangled.org/core";
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
battleship-arena = {
+
url = "github:taciturnaxolotl/battleship-arena";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
zmx = {
+
url = "github:neurosnap/zmx";
};
};
···
nixpkgs.overlays = [
(final: prev: {
unstable = import nixpkgs-unstable {
-
system = final.system;
+
system = final.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
···
hash = "sha256-7mkrPl2CQSfc1lRjl1ilwxdYcK5iRU//QGKmdCicK30=";
};
});
+
+
zmx-binary = prev.callPackage ./packages/zmx.nix { };
})
];
};
···
home-manager.darwinModules.home-manager
agenix.darwinModules.default
unstable-overlays
+
nur.modules.darwin.default
./machines/atalanta
];
};
···
# Deploy-rs configurations
deploy.nodes = {
# NixOS servers
-
prattle = {
-
hostname = "prattle";
-
profiles.system = {
-
sshUser = "kierank";
-
user = "root";
-
path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.prattle;
-
};
-
};
-
terebithia = {
hostname = "terebithia";
profiles.system = {
+6 -2
machines/atalanta/default.nix
···
pkgs.gcc
pkgs.rustc
pkgs.cargo
-
pkgs.jdk23
+
pkgs.jdk
pkgs.ruby
pkgs.cmake
pkgs.unstable.biome
···
pkgs.nh
pkgs.rustscan
pkgs.vhs
-
inputs.soapdump.packages.${pkgs.system}.default
+
inputs.soapdump.packages.${pkgs.stdenv.hostPlatform.system}.default
];
programs.direnv.enable = true;
···
};
context7 = {
file = ../../secrets/context7.age;
+
owner = "kierank";
+
};
+
frp-auth-token = {
+
file = ../../secrets/frp-auth-token.age;
owner = "kierank";
};
};
+74 -4
machines/atalanta/home/default.nix
···
{
inputs,
pkgs,
+
osConfig,
...
}:
{
···
(inputs.import-tree ../../../modules/home)
];
-
nixpkgs.enable = true;
-
home = {
username = "kierank";
homeDirectory = "/Users/kierank";
packages = with pkgs; [
-
inputs.nixvim.packages.${system}.default
+
inputs.nixvim.packages.${pkgs.stdenv.hostPlatform.system}.default
vesktop
];
};
···
};
apps = {
halloy.enable = true;
-
spotify.enable = true;
crush.enable = true;
helix = {
enable = true;
swift = true;
};
+
};
+
bore = {
+
enable = true;
+
authTokenFile = osConfig.age.secrets.frp-auth-token.path;
+
};
+
ssh = {
+
enable = true;
+
+
zmx = {
+
enable = true;
+
hosts = [ "t.*" "p.*" "e.*" "j.*" ];
+
};
+
+
hosts = {
+
# Dynamic zmx sessions per server
+
"t.*" = {
+
hostname = "150.136.15.177"; # terebithia
+
};
+
+
"p.*" = {
+
hostname = "150.136.63.103"; # prattle
+
};
+
+
"e.*" = {
+
hostname = "192.168.0.94"; # ember
+
};
+
+
"j.*" = {
+
hostname = "john.cedarville.edu";
+
user = "klukas";
+
};
+
+
# Regular hosts
+
john = {
+
hostname = "john.cedarville.edu";
+
user = "klukas";
+
zmx = true;
+
};
+
+
bandit = {
+
hostname = "bandit.labs.overthewire.org";
+
port = 2220;
+
};
+
+
kali = {
+
user = "kali";
+
};
+
+
terebithia = {
+
hostname = "150.136.15.177";
+
zmx = true;
+
};
+
+
prattle = {
+
hostname = "150.136.63.103";
+
zmx = true;
+
};
+
+
ember = {
+
hostname = "192.168.0.94";
+
zmx = true;
+
};
+
+
remarkable = {
+
hostname = "10.11.99.01";
+
user = "root";
+
};
+
};
+
+
extraConfig = ''
+
IdentityFile ~/.ssh/id_rsa
+
'';
};
};
+1
machines/atalanta/home-manager.nix
···
];
home-manager = {
+
useGlobalPkgs = true;
extraSpecialArgs = {
inherit inputs outputs;
};
+5
machines/ember/default.nix
···
{
imports = [
(inputs.import-tree ../../modules/home)
+
../../modules/home/system/nixpkgs.nix.disabled
];
nixpkgs.enable = true;
···
shell.enable = true;
apps = {
helix.enable = true;
+
};
+
ssh = {
+
enable = true;
+
zmx.enable = true;
};
};
-35
machines/john/default.nix
···
-
{
-
inputs,
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
(inputs.import-tree ../../modules/home)
-
];
-
-
nixpkgs.enable = true;
-
-
home = {
-
username = "klukas";
-
homeDirectory = "/home/students/2029/klukas";
-
-
packages = with pkgs; [ ];
-
};
-
-
atelier = {
-
shell.enable = true;
-
};
-
-
# Enable home-manager
-
programs.home-manager.enable = true;
-
-
# keep hm in .local/state since we are using nix-portable
-
xdg.enable = true;
-
-
# Nicely reload system units when changing configs
-
systemd.user.startServices = "sd-switch";
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
home.stateVersion = "23.05";
-
}
+9 -9
machines/moonlark/default.nix
···
pkgs.mako
pkgs.unstable.hyprpicker
pkgs.wl-screenrec
-
inputs.hyprland-contrib.packages.${pkgs.system}.grimblast
+
inputs.hyprland-contrib.packages.${pkgs.stdenv.hostPlatform.system}.grimblast
pkgs.playerctl
pkgs.libnotify
pkgs.notify-desktop
···
pkgs.gcc
pkgs.rustc
pkgs.cargo
-
pkgs.jdk23
+
pkgs.jdk
pkgs.ruby
pkgs.cmake
pkgs.unstable.biome
···
pkgs.gobang
pkgs.love
#frc
-
inputs.frc-nix.packages.${pkgs.system}.elastic-dashboard
-
inputs.frc-nix.packages.${pkgs.system}.pathplanner
-
inputs.frc-nix.packages.${pkgs.system}.roborioteamnumbersetter
-
inputs.frc-nix.packages.${pkgs.system}.sysid
-
inputs.frc-nix.packages.${pkgs.system}.wpilib-utility
-
inputs.frc-nix.packages.${pkgs.system}.advantagescope
+
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.elastic-dashboard
+
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.pathplanner
+
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.roborioteamnumbersetter
+
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.sysid
+
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.wpilib-utility
+
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.advantagescope
# misc
pkgs.invoice
pkgs.pop
···
pkgs.unstable.kicad-testing
pkgs.zenity
pkgs.atproto-goat
-
inputs.cedarlogic.packages.${pkgs.system}.cedarlogic
+
inputs.cedarlogic.packages.${pkgs.stdenv.hostPlatform.system}.cedarlogic
pkgs.unstable.betaflight-configurator
];
-2
machines/moonlark/home/default.nix
···
(inputs.import-tree ../../../modules/home)
];
-
nixpkgs.enable = true;
-
home = {
username = "kierank";
homeDirectory = "/home/kierank";
+1
machines/moonlark/home-manager.nix
···
];
home-manager = {
+
useGlobalPkgs = true;
extraSpecialArgs = {
inherit inputs outputs;
};
+5
machines/nest/default.nix
···
{
imports = [
(inputs.import-tree ../../modules/home)
+
../../modules/home/system/nixpkgs.nix.disabled
];
nixpkgs.enable = true;
···
shell.enable = true;
apps = {
helix.enable = true;
+
};
+
ssh = {
+
enable = true;
+
zmx.enable = true;
};
};
+36 -52
machines/prattle/default.nix
···
trusted-users = [
"kierank"
];
+
# Limit resource usage
+
max-jobs = 1;
+
cores = 1;
};
channel.enable = false;
-
optimise.automatic = true;
+
# Disable automatic optimization to save CPU/memory
+
optimise.automatic = false;
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
+
# Enable automatic GC to free up disk space
+
gc = {
+
automatic = true;
+
dates = "weekly";
+
options = "--delete-older-than 7d";
+
};
};
time.timeZone = "America/New_York";
environment.systemPackages = with pkgs; [
-
# core
-
coreutils
-
screen
-
bc
-
jq
-
psmisc
-
# cli_utils
-
direnv
-
zsh
-
gum
+
# core essentials only
vim
-
# networking
-
xh
curl
-
wget
-
dogdns
-
inetutils
-
mosh
-
# nix_tools
-
inputs.nixvim.packages.x86_64-linux.default
-
nixd
-
nil
-
nixfmt-rfc-style
inputs.agenix.packages.x86_64-linux.default
-
# security
-
openssl
-
gpgme
-
gnupg
-
# dev_langs
-
nodejs_22
-
python3
-
go
-
gopls
-
gotools
-
go-tools
-
gcc
-
# misc
-
neofetch
];
-
-
programs.nh = {
-
enable = true;
-
clean.enable = true;
-
clean.extraArgs = "--keep-since 4d --keep 3";
-
flake = "/home/kierank/dots";
-
};
age.identityPaths = [
"/home/kierank/.ssh/id_rsa"
···
XDG_CONFIG_HOME = "$HOME/.config";
XDG_DATA_HOME = "$HOME/.local/share";
XDG_STATE_HOME = "$HOME/.local/state";
-
EDITOR = "nvim";
-
SYSTEMD_EDITOR = "nvim";
-
VISUAL = "nvim";
+
EDITOR = "vim";
+
SYSTEMD_EDITOR = "vim";
+
VISUAL = "vim";
};
atelier = {
···
networking = {
hostName = "prattle";
-
networkmanager.enable = true;
+
# Use systemd-networkd instead of NetworkManager (lighter)
+
useDHCP = true;
+
networkmanager.enable = false;
};
-
programs.zsh.enable = true;
-
programs.direnv.enable = true;
+
# Use bash instead of zsh to save memory
+
programs.bash.enableCompletion = true;
users.users = {
kierank = {
initialPassword = "changeme";
isNormalUser = true;
-
shell = pkgs.zsh;
+
shell = pkgs.bashInteractive;
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
];
extraGroups = [
"wheel"
-
"networkmanager"
];
};
root.openssh.authorizedKeys.keys = [
···
allowedTCPPorts = [ 22 80 443 ];
logRefusedConnections = false;
rejectPackets = true;
+
# Disable firewall logging to reduce overhead
+
logReversePathDrops = false;
};
services.tailscale = {
···
enable = true;
package = pkgs.caddy.withPlugins {
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.2" ];
-
hash = "sha256-Z8nPh4OI3/R1nn667ZC5VgE+Q9vDenaQ3QPKxmqPNkc=";
+
hash = "sha256-ea8PC/+SlPRdEVVF/I3c1CBprlVp1nrumKM5cMwJJ3U=";
};
email = "me@dunkirk.sh";
globalConfig = ''
···
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.kernelParams = [ "console=ttyS0" ];
+
+
# Memory and resource optimizations
+
zramSwap = {
+
enable = true;
+
memoryPercent = 50; # Use 50% of RAM for compressed swap
+
};
+
+
# Reduce system logging overhead
+
services.journald.extraConfig = ''
+
SystemMaxUse=100M
+
MaxRetentionSec=7day
+
'';
system.stateVersion = "23.05";
}
+246 -2948
machines/prattle/facter.json
···
},
"bridge": [
{
-
"index": 6,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.1",
-
"sysfs_bus_id": "0000:00:03.1",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290570752,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 10,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 8,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.7",
-
"sysfs_bus_id": "0000:00:02.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290578944,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 8,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 9,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.4",
-
"sysfs_bus_id": "0000:00:04.4",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290525696,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 4,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 21,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 10,
+
"index": 7,
"attached_to": 0,
"class_list": [
"pci",
···
},
"slot": {
"bus": 0,
-
"number": 31
+
"number": 1
},
"base_class": {
"hex": "0006",
···
"value": 6900
},
"device": {
-
"hex": "2918",
-
"value": 10520
+
"hex": "7000",
+
"value": 28672
},
"sub_device": {
"hex": "1100",
"value": 4352
},
-
"revision": {
-
"hex": "0002",
-
"value": 2
-
},
"model": "Intel ISA bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1f.0",
-
"sysfs_bus_id": "0000:00:1f.0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.0",
+
"sysfs_bus_id": "0000:00:01.0",
"detail": {
"function": 0,
"command": 3,
···
"irq": 0,
"prog_if": 0
},
-
"driver": "lpc_ich",
-
"driver_module": "lpc_ich",
-
"drivers": [
-
"lpc_ich"
-
],
-
"driver_modules": [
-
"lpc_ich"
-
],
-
"module_alias": "pci:v00008086d00002918sv00001AF4sd00001100bc06sc01i00"
-
},
-
{
-
"index": 11,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.5",
-
"sysfs_bus_id": "0000:00:02.5",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290587136,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 5,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 6,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
+
"module_alias": "pci:v00008086d00007000sv00001AF4sd00001100bc06sc01i00"
},
{
-
"index": 12,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.2",
-
"sysfs_bus_id": "0000:00:04.2",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290533888,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 19,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 15,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.3",
-
"sysfs_bus_id": "0000:00:02.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290595328,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 4,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 16,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.0",
-
"sysfs_bus_id": "0000:00:04.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290542080,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 17,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 17,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.6",
-
"sysfs_bus_id": "0000:00:03.6",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290550272,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 6,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 15,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 18,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 31
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1f.7",
-
"sysfs_bus_id": "0000:00:1f.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 16,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290497024,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 25,
-
"irq": 16,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 19,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.1",
-
"sysfs_bus_id": "0000:00:02.1",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290603520,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 2,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 20,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.4",
-
"sysfs_bus_id": "0000:00:03.4",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290558464,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 4,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 13,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 21,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.7",
-
"sysfs_bus_id": "0000:00:04.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290513408,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 24,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 22,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.2",
-
"sysfs_bus_id": "0000:00:03.2",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290566656,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 11,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 24,
+
"index": 9,
"attached_to": 0,
"class_list": [
"pci",
···
"value": 6900
},
"device": {
-
"hex": "29c0",
-
"value": 10688
+
"hex": "1237",
+
"value": 4663
},
"sub_device": {
"hex": "1100",
"value": 4352
},
+
"revision": {
+
"hex": "0002",
+
"value": 2
+
},
"model": "Intel Host bridge",
"sysfs_id": "/devices/pci0000:00/0000:00:00.0",
"sysfs_bus_id": "0000:00:00.0",
···
"irq": 0,
"prog_if": 0
},
-
"module_alias": "pci:v00008086d000029C0sv00001AF4sd00001100bc06sc00i00"
-
},
-
{
-
"index": 26,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.5",
-
"sysfs_bus_id": "0000:00:04.5",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290521600,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 5,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 22,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 27,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.0",
-
"sysfs_bus_id": "0000:00:03.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290574848,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 9,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 28,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.6",
-
"sysfs_bus_id": "0000:00:02.6",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290583040,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 6,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 7,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 29,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.3",
-
"sysfs_bus_id": "0000:00:04.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290529792,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 20,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 31,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.4",
-
"sysfs_bus_id": "0000:00:02.4",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290591232,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 4,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 5,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 32,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.1",
-
"sysfs_bus_id": "0000:00:04.1",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290537984,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 18,
-
"irq": 20,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 34,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.7",
-
"sysfs_bus_id": "0000:00:03.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290546176,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 16,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
+
"module_alias": "pci:v00008086d00001237sv00001AF4sd00001100bc06sc00i00"
},
{
-
"index": 35,
+
"index": 10,
"attached_to": 0,
"class_list": [
"pci",
···
},
"slot": {
"bus": 0,
-
"number": 2
+
"number": 1
},
"base_class": {
"hex": "0006",
···
"value": 6
},
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.2",
-
"sysfs_bus_id": "0000:00:02.2",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 22,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290599424,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 3,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 36,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
+
"hex": "0080",
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
+
"value": 128
},
"vendor": {
-
"hex": "1b36",
-
"value": 6966
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
},
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
+
"hex": "1af4",
+
"value": 6900
},
"device": {
-
"hex": "000c",
-
"value": 12
+
"hex": "7113",
+
"value": 28947
},
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.5",
-
"sysfs_bus_id": "0000:00:03.5",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290554368,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 5,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 14,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 37,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
+
"hex": "1100",
+
"value": 4352
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
+
"revision": {
+
"hex": "0003",
+
"value": 3
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0",
-
"sysfs_bus_id": "0000:00:02.0",
+
"model": "Intel Bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.3",
+
"sysfs_bus_id": "0000:00:01.3",
"resources": [
{
"type": "irq",
-
"base": 22,
+
"base": 9,
"triggered": 0,
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290607616,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 1,
-
"irq": 22,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 39,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.3",
-
"sysfs_bus_id": "0000:00:03.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 23,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290562560,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
}
],
"detail": {
"function": 3,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 12,
-
"irq": 23,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 41,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.6",
-
"sysfs_bus_id": "0000:00:04.6",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290517504,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 6,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 23,
-
"irq": 20,
+
"command": 3,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 9,
"prog_if": 0
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
+
"driver": "piix4_smbus",
+
"driver_module": "i2c_piix4",
"drivers": [
-
"pcieport"
+
"piix4_smbus"
],
"driver_modules": [
-
"pcieportdrv"
+
"i2c_piix4"
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
+
"module_alias": "pci:v00008086d00007113sv00001AF4sd00001100bc06sc80i00"
}
],
"cpu": [
{
"architecture": "x86_64",
"vendor_name": "AuthenticAMD",
-
"family": 25,
-
"model": 17,
-
"stepping": 1,
+
"family": 23,
+
"model": 1,
+
"stepping": 2,
"features": [
"fpu",
"vme",
···
"ssse3",
"fma",
"cx16",
-
"pcid",
"sse4_1",
"sse4_2",
"x2apic",
···
"topoext",
"perfctr_core",
"ssbd",
-
"ibrs",
"ibpb",
-
"stibp",
"vmmcall",
"fsgsbase",
"tsc_adjust",
···
"avx2",
"smep",
"bmi2",
-
"erms",
-
"invpcid",
-
"avx512f",
-
"avx512dq",
"rdseed",
"adx",
"smap",
-
"avx512ifma",
"clflushopt",
-
"clwb",
-
"avx512cd",
"sha_ni",
-
"avx512bw",
-
"avx512vl",
"xsaveopt",
"xsavec",
"xgetbv1",
-
"xsaves",
-
"avx512_bf16",
"clzero",
"xsaveerptr",
-
"wbnoinvd",
+
"virt_ssbd",
"arat",
"npt",
"nrip_save",
"vgif",
-
"vnmi",
-
"avx512vbmi",
-
"umip",
-
"pku",
-
"ospke",
-
"avx512_vbmi2",
-
"gfni",
-
"vaes",
-
"vpclmulqdq",
-
"avx512_vnni",
-
"avx512_bitalg",
-
"avx512_vpopcntdq",
-
"la57",
-
"rdpid",
"overflow_recov",
"succor",
-
"fsrm",
"arch_capabilities"
],
"bugs": [
···
"spectre_v1",
"spectre_v2",
"spec_store_bypass",
+
"retbleed",
+
"smt_rsb",
"srso",
+
"div0",
"ibpb_no_ret"
],
-
"bogo": 5192.19,
+
"bogo": 3992.5,
"cache": 512,
"units": 2,
"physical_id": 0,
···
"cores": 1,
"fpu": true,
"fpu_exception": true,
-
"cpuid_level": 16,
+
"cpuid_level": 13,
"write_protect": false,
"tlb_size": 1024,
"clflush_size": 64,
"cache_alignment": 64,
"address_sizes": {
"physical": "0x28",
-
"virtual": "0x39"
+
"virtual": "0x30"
}
}
],
"disk": [
{
-
"index": 46,
-
"attached_to": 42,
+
"index": 18,
+
"attached_to": 14,
"class_list": [
"disk",
"scsi",
···
"model": "ORACLE BlockVolume",
"sysfs_id": "/class/block/sda",
"sysfs_bus_id": "0:0:0:1",
-
"sysfs_device_link": "/devices/pci0000:00/0000:00:04.7/0000:18:00.0/virtio1/host0/target0:0:0/0:0:0:1",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:04.0/virtio1/host0/target0:0:0/0:0:0:1",
"unix_device_name": "/dev/sda",
"unix_device_number": {
"type": 98,
···
"range": 16
},
"unix_device_names": [
-
"/dev/disk/by-id/scsi-3604bd4d2f6eb4a7ca150fb89c99df77d",
-
"/dev/disk/by-id/wwn-0x604bd4d2f6eb4a7ca150fb89c99df77d",
-
"/dev/disk/by-path/pci-0000:18:00.0-scsi-0:0:0:1",
+
"/dev/disk/by-id/scsi-36031c628421d4d309553ce9700b81f0d",
+
"/dev/disk/by-id/wwn-0x6031c628421d4d309553ce9700b81f0d",
+
"/dev/disk/by-path/pci-0000:00:04.0-scsi-0:0:0:1",
"/dev/sda"
],
"unix_device_name2": "/dev/sg0",
···
},
"slot": {
"bus": 0,
-
"number": 1
+
"number": 2
},
"base_class": {
"hex": "0003",
···
"value": 2
},
"model": "VGA compatible controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.0",
-
"sysfs_bus_id": "0000:00:01.0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:02.0",
+
"sysfs_bus_id": "0000:00:02.0",
"resources": [
{
"type": "mem",
-
"base": 3221225472,
+
"base": 2147483648,
"range": 16777216,
"enabled": true,
"access": "read_only",
···
},
{
"type": "mem",
-
"base": 3290611712,
+
"base": 2164334592,
"range": 4096,
"enabled": true,
"access": "read_write",
···
],
"hub": [
{
-
"index": 48,
-
"attached_to": 14,
+
"index": 19,
+
"attached_to": 6,
"class_list": [
"usb",
"hub"
···
"name": "6.14",
"value": 0
},
-
"serial": "0000:00:1d.1",
+
"serial": "0000:00:01.2",
"model": "Linux 6.14.10 uhci_hcd UHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.1/usb3/3-0:1.0",
-
"sysfs_bus_id": "3-0:1.0",
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 12000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "hub",
-
"driver_module": "usbcore",
-
"drivers": [
-
"hub"
-
],
-
"driver_modules": [
-
"usbcore"
-
],
-
"module_alias": "usb:v1D6Bp0001d0614dc09dsc00dp00ic09isc00ip00in00"
-
},
-
{
-
"index": 49,
-
"attached_to": 30,
-
"class_list": [
-
"usb",
-
"hub"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "010a",
-
"name": "Hub",
-
"value": 266
-
},
-
"vendor": {
-
"hex": "1d6b",
-
"name": "Linux 6.14.10 uhci_hcd",
-
"value": 7531
-
},
-
"device": {
-
"hex": "0001",
-
"name": "UHCI Host Controller",
-
"value": 1
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "6.14",
-
"value": 0
-
},
-
"serial": "0000:00:1d.2",
-
"model": "Linux 6.14.10 uhci_hcd UHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.2/usb4/4-0:1.0",
-
"sysfs_bus_id": "4-0:1.0",
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 12000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "hub",
-
"driver_module": "usbcore",
-
"drivers": [
-
"hub"
-
],
-
"driver_modules": [
-
"usbcore"
-
],
-
"module_alias": "usb:v1D6Bp0001d0614dc09dsc00dp00ic09isc00ip00in00"
-
},
-
{
-
"index": 50,
-
"attached_to": 33,
-
"class_list": [
-
"usb",
-
"hub"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "010a",
-
"name": "Hub",
-
"value": 266
-
},
-
"vendor": {
-
"hex": "1d6b",
-
"name": "Linux 6.14.10 uhci_hcd",
-
"value": 7531
-
},
-
"device": {
-
"hex": "0001",
-
"name": "UHCI Host Controller",
-
"value": 1
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "6.14",
-
"value": 0
-
},
-
"serial": "0000:00:1d.0",
-
"model": "Linux 6.14.10 uhci_hcd UHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-0:1.0",
"sysfs_bus_id": "1-0:1.0",
"resources": [
{
···
"usbcore"
],
"module_alias": "usb:v1D6Bp0001d0614dc09dsc00dp00ic09isc00ip00in00"
-
},
-
{
-
"index": 51,
-
"attached_to": 38,
-
"class_list": [
-
"usb",
-
"hub"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "010a",
-
"name": "Hub",
-
"value": 266
-
},
-
"vendor": {
-
"hex": "1d6b",
-
"name": "Linux 6.14.10 ehci_hcd",
-
"value": 7531
-
},
-
"device": {
-
"hex": "0002",
-
"name": "EHCI Host Controller",
-
"value": 2
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "6.14",
-
"value": 0
-
},
-
"serial": "0000:00:1d.7",
-
"model": "Linux 6.14.10 ehci_hcd EHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.7/usb2/2-0:1.0",
-
"sysfs_bus_id": "2-0:1.0",
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 480000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "hub",
-
"driver_module": "usbcore",
-
"drivers": [
-
"hub"
-
],
-
"driver_modules": [
-
"usbcore"
-
],
-
"module_alias": "usb:v1D6Bp0002d0614dc09dsc00dp00ic09isc00ip00in00"
}
],
"memory": [
···
{
"type": "mem",
"base": 0,
-
"range": 12531773440,
+
"range": 1004576768,
"enabled": true,
"access": "read_write",
"prefetch": "unknown"
},
{
"type": "phys_mem",
-
"range": 12884901888
+
"range": 1006632960
}
]
}
],
"monitor": [
{
-
"index": 44,
+
"index": 16,
"attached_to": 13,
"class_list": [
"monitor"
···
],
"mouse": [
{
-
"index": 47,
-
"attached_to": 51,
+
"index": 20,
+
"attached_to": 19,
"class_list": [
"mouse",
"usb"
···
"name": "QEMU USB Tablet",
"value": 1
},
-
"serial": "28754-0000:00:1d.7-1",
+
"serial": "28754-0000:00:01.2-1",
"compat_vendor": "Unknown",
"compat_device": "Generic USB Mouse",
"model": "QEMU USB Tablet",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0",
-
"sysfs_bus_id": "2-1:1.0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-1/1-1:1.0",
+
"sysfs_bus_id": "1-1:1.0",
"unix_device_name": "/dev/input/mice",
"unix_device_number": {
"type": 99,
···
"resources": [
{
"type": "baud",
-
"speed": 480000000,
+
"speed": 12000000,
"bits": 0,
"stop_bits": 0,
"parity": 0,
···
],
"network_controller": [
{
-
"index": 43,
-
"attached_to": 40,
+
"index": 15,
+
"attached_to": 11,
"class_list": [
"network_controller"
],
···
"vendor": "Virtio",
"device": "Ethernet Card 0",
"model": "Virtio Ethernet Card 0",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.0/virtio0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.0/virtio0",
"sysfs_bus_id": "virtio0",
-
"unix_device_name": "enp0s5",
+
"unix_device_name": "ens3",
"unix_device_names": [
-
"enp0s5"
+
"ens3"
],
"resources": [
{
···
],
"network_interface": [
{
-
"index": 52,
-
"attached_to": 43,
+
"index": 21,
+
"attached_to": 0,
+
"class_list": [
+
"network_interface"
+
],
+
"base_class": {
+
"hex": "0107",
+
"name": "Network Interface",
+
"value": 263
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Loopback",
+
"value": 0
+
},
+
"model": "Loopback network interface",
+
"sysfs_id": "/class/net/lo",
+
"unix_device_name": "lo",
+
"unix_device_names": [
+
"lo"
+
]
+
},
+
{
+
"index": 22,
+
"attached_to": 15,
"class_list": [
"network_interface"
],
···
"value": 1
},
"model": "Ethernet network interface",
-
"sysfs_id": "/class/net/enp0s5",
-
"sysfs_device_link": "/devices/pci0000:00/0000:00:05.0/virtio0",
-
"unix_device_name": "enp0s5",
+
"sysfs_id": "/class/net/ens3",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:03.0/virtio0",
+
"unix_device_name": "ens3",
"unix_device_names": [
-
"enp0s5"
+
"ens3"
],
"resources": [
···
"driver_modules": [
"virtio_net"
-
},
-
{
-
"index": 53,
-
"attached_to": 0,
-
"class_list": [
-
"network_interface"
-
],
-
"base_class": {
-
"hex": "0107",
-
"name": "Network Interface",
-
"value": 263
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Loopback",
-
"value": 0
-
},
-
"model": "Loopback network interface",
-
"sysfs_id": "/class/net/lo",
-
"unix_device_name": "lo",
-
"unix_device_names": [
-
"lo"
-
]
],
"pci": [
-
"index": 23,
+
"index": 11,
"attached_to": 0,
"class_list": [
"pci",
···
},
"slot": {
"bus": 0,
-
"number": 31
-
},
-
"base_class": {
-
"hex": "000c",
-
"name": "Serial bus controller",
-
"value": 12
-
},
-
"sub_class": {
-
"hex": "0005",
-
"name": "SMBus",
-
"value": 5
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "2930",
-
"value": 10544
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0002",
-
"value": 2
-
},
-
"model": "Intel SMBus",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1f.3",
-
"sysfs_bus_id": "0000:00:1f.3",
-
"resources": [
-
{
-
"type": "io",
-
"base": 24576,
-
"range": 64,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 16,
-
"triggered": 0,
-
"enabled": true
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 3,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 16,
-
"prog_if": 0
-
},
-
"driver": "i801_smbus",
-
"driver_module": "i2c_i801",
-
"drivers": [
-
"i801_smbus"
-
],
-
"driver_modules": [
-
"i2c_i801"
-
],
-
"module_alias": "pci:v00008086d00002930sv00001AF4sd00001100bc0Csc05i00"
-
},
-
{
-
"index": 40,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"unknown"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
+
"number": 3
},
"base_class": {
"hex": "0002",
···
"value": 4238
},
"device": {
-
"hex": "1041",
-
"value": 4161
+
"hex": "1000",
+
"value": 4096
},
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
"hex": "0001",
"value": 1
},
"model": "Ethernet controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.0",
-
"sysfs_bus_id": "0000:00:05.0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.0",
+
"sysfs_bus_id": "0000:00:03.0",
"resources": [
+
"type": "io",
+
"base": 49216,
+
"range": 32,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
"type": "irq",
-
"base": 21,
+
"base": 10,
"triggered": 0,
"enabled": true
},
"type": "mem",
-
"base": 3290509312,
+
"base": 2164330496,
"range": 4096,
"enabled": true,
"access": "read_write",
···
},
"type": "mem",
-
"base": 35198599168,
+
"base": 34359738368,
"range": 16384,
"enabled": true,
"access": "read_only",
···
"command": 1031,
"header_type": 0,
"secondary_bus": 0,
-
"irq": 21,
+
"irq": 10,
"prog_if": 0
},
"driver": "virtio-pci",
···
"driver_modules": [
"virtio_pci"
],
-
"module_alias": "pci:v00001AF4d00001041sv0000108Esd00001100bc02sc00i00"
+
"module_alias": "pci:v00001AF4d00001000sv0000108Esd00000001bc02sc00i00"
],
"storage_controller": [
-
"index": 7,
+
"index": 8,
"attached_to": 0,
"class_list": [
"storage_controller",
···
},
"slot": {
"bus": 0,
-
"number": 31
+
"number": 4
},
"base_class": {
"hex": "0001",
···
"value": 1
},
"sub_class": {
-
"hex": "0006",
-
"value": 6
-
},
-
"pci_interface": {
-
"hex": "0001",
-
"value": 1
+
"hex": "0000",
+
"name": "SCSI storage controller",
+
"value": 0
},
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
+
"hex": "1af4",
+
"value": 6900
},
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
+
"hex": "108e",
+
"value": 4238
},
"device": {
-
"hex": "2922",
-
"value": 10530
+
"hex": "1004",
+
"value": 4100
},
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0002",
-
"value": 2
+
"hex": "0008",
+
"value": 8
},
-
"model": "Intel Mass storage controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1f.2",
-
"sysfs_bus_id": "0000:00:1f.2",
+
"model": "SCSI storage controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:04.0",
+
"sysfs_bus_id": "0000:00:04.0",
"resources": [
"type": "io",
-
"base": 24640,
-
"range": 32,
+
"base": 49152,
+
"range": 64,
"enabled": true,
"access": "read_write"
},
"type": "irq",
-
"base": 57,
+
"base": 11,
"triggered": 0,
"enabled": true
},
"type": "mem",
-
"base": 3290501120,
+
"base": 2164326400,
"range": 4096,
"enabled": true,
"access": "read_write",
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 34359754752,
+
"range": 16384,
+
"enabled": true,
+
"access": "read_only",
+
"prefetch": "no"
],
"detail": {
-
"function": 2,
+
"function": 0,
"command": 1031,
"header_type": 0,
"secondary_bus": 0,
-
"irq": 57,
-
"prog_if": 1
+
"irq": 11,
+
"prog_if": 0
},
-
"driver": "ahci",
-
"driver_module": "ahci",
+
"driver": "virtio-pci",
+
"driver_module": "virtio_pci",
"drivers": [
-
"ahci"
+
"virtio-pci"
],
"driver_modules": [
-
"ahci"
+
"virtio_pci"
],
-
"module_alias": "pci:v00008086d00002922sv00001AF4sd00001100bc01sc06i01"
+
"module_alias": "pci:v00001AF4d00001004sv0000108Esd00000008bc01sc00i00"
},
-
"index": 25,
-
"attached_to": 21,
+
"index": 12,
+
"attached_to": 0,
"class_list": [
"storage_controller",
"pci"
···
"value": 4
},
"slot": {
-
"bus": 24,
-
"number": 0
+
"bus": 0,
+
"number": 1
},
"base_class": {
"hex": "0001",
···
"value": 1
},
"sub_class": {
-
"hex": "0000",
-
"name": "SCSI storage controller",
-
"value": 0
+
"hex": "0001",
+
"name": "IDE interface",
+
"value": 1
+
},
+
"pci_interface": {
+
"hex": "0080",
+
"value": 128
},
"vendor": {
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
+
},
+
"sub_vendor": {
"hex": "1af4",
"value": 6900
},
-
"sub_vendor": {
-
"hex": "108e",
-
"value": 4238
-
},
"device": {
-
"hex": "1048",
-
"value": 4168
+
"hex": "7010",
+
"value": 28688
},
"sub_device": {
"hex": "1100",
"value": 4352
},
-
"revision": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "SCSI storage controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.7/0000:18:00.0",
-
"sysfs_bus_id": "0000:18:00.0",
+
"model": "Intel IDE interface",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.1",
+
"sysfs_bus_id": "0000:00:01.1",
"resources": [
-
"type": "irq",
-
"base": 20,
-
"triggered": 0,
-
"enabled": true
+
"type": "io",
+
"base": 1014,
+
"range": 1,
+
"enabled": true,
+
"access": "read_write"
},
-
"type": "mem",
-
"base": 3240099840,
-
"range": 4096,
+
"type": "io",
+
"base": 368,
+
"range": 8,
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
+
"access": "read_write"
},
-
"type": "mem",
-
"base": 35131490304,
-
"range": 16384,
+
"type": "io",
+
"base": 49280,
+
"range": 16,
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
+
"access": "read_write"
+
},
+
{
+
"type": "io",
+
"base": 496,
+
"range": 8,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "io",
+
"base": 886,
+
"range": 1,
+
"enabled": true,
+
"access": "read_write"
],
"detail": {
-
"function": 0,
-
"command": 1031,
+
"function": 1,
+
"command": 7,
"header_type": 0,
"secondary_bus": 0,
-
"irq": 20,
-
"prog_if": 0
+
"irq": 0,
+
"prog_if": 128
},
-
"driver": "virtio-pci",
-
"driver_module": "virtio_pci",
+
"driver": "ata_piix",
+
"driver_module": "ata_piix",
"drivers": [
-
"virtio-pci"
+
"ata_piix"
],
"driver_modules": [
-
"virtio_pci"
+
"ata_piix"
],
-
"module_alias": "pci:v00001AF4d00001048sv0000108Esd00001100bc01sc00i00"
+
"module_alias": "pci:v00008086d00007010sv00001AF4sd00001100bc01sc01i80"
],
"system": {
···
},
"unknown": [
-
"index": 42,
-
"attached_to": 25,
+
"index": 14,
+
"attached_to": 8,
"class_list": [
"unknown"
],
···
"vendor": "Virtio",
"device": "",
"model": "Virtio Unclassified device",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.7/0000:18:00.0/virtio1",
+
"sysfs_id": "/devices/pci0000:00/0000:00:04.0/virtio1",
"sysfs_bus_id": "virtio1",
"driver": "virtio_scsi",
"driver_module": "virtio_scsi",
···
"module_alias": "virtio:d00000008v0000108E"
},
-
"index": 45,
+
"index": 17,
"attached_to": 0,
"class_list": [
"unknown"
···
],
"usb_controller": [
-
"index": 14,
-
"attached_to": 0,
-
"class_list": [
-
"usb_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 29
-
},
-
"base_class": {
-
"hex": "000c",
-
"name": "Serial bus controller",
-
"value": 12
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Controller",
-
"value": 3
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "UHCI",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "2935",
-
"value": 10549
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0003",
-
"value": 3
-
},
-
"model": "Intel USB Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.1",
-
"sysfs_bus_id": "0000:00:1d.1",
-
"resources": [
-
{
-
"type": "io",
-
"base": 24704,
-
"range": 32,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 17,
-
"triggered": 0,
-
"enabled": true
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 7,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 17,
-
"prog_if": 0
-
},
-
"driver": "uhci_hcd",
-
"driver_module": "uhci_hcd",
-
"drivers": [
-
"uhci_hcd"
-
],
-
"driver_modules": [
-
"uhci_hcd"
-
],
-
"driver_info": {
-
"type": "module",
-
"db_entry_0": [
-
"uhci-hcd"
-
],
-
"active": true,
-
"modprobe": true,
-
"names": [
-
"uhci-hcd"
-
],
-
"module_args": [
-
""
-
],
-
"conf": ""
-
},
-
"module_alias": "pci:v00008086d00002935sv00001AF4sd00001100bc0Csc03i00"
-
},
-
{
-
"index": 30,
+
"index": 6,
"attached_to": 0,
"class_list": [
"usb_controller",
···
},
"slot": {
"bus": 0,
-
"number": 29
+
"number": 1
},
"base_class": {
"hex": "000c",
···
"value": 6900
},
"device": {
-
"hex": "2936",
-
"value": 10550
+
"hex": "7020",
+
"value": 28704
},
"sub_device": {
"hex": "1100",
"value": 4352
},
"revision": {
-
"hex": "0003",
-
"value": 3
+
"hex": "0001",
+
"value": 1
},
"model": "Intel USB Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.2",
-
"sysfs_bus_id": "0000:00:1d.2",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2",
+
"sysfs_bus_id": "0000:00:01.2",
"resources": [
"type": "io",
-
"base": 24672,
+
"base": 49248,
"range": 32,
"enabled": true,
"access": "read_write"
},
"type": "irq",
-
"base": 18,
+
"base": 11,
"triggered": 0,
"enabled": true
···
"command": 7,
"header_type": 0,
"secondary_bus": 0,
-
"irq": 18,
+
"irq": 11,
"prog_if": 0
},
"driver": "uhci_hcd",
···
],
"conf": ""
},
-
"module_alias": "pci:v00008086d00002936sv00001AF4sd00001100bc0Csc03i00"
-
},
-
{
-
"index": 33,
-
"attached_to": 0,
-
"class_list": [
-
"usb_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 29
-
},
-
"base_class": {
-
"hex": "000c",
-
"name": "Serial bus controller",
-
"value": 12
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Controller",
-
"value": 3
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "UHCI",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "2934",
-
"value": 10548
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0003",
-
"value": 3
-
},
-
"model": "Intel USB Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.0",
-
"sysfs_bus_id": "0000:00:1d.0",
-
"resources": [
-
{
-
"type": "io",
-
"base": 24736,
-
"range": 32,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 16,
-
"triggered": 0,
-
"enabled": true
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 7,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 16,
-
"prog_if": 0
-
},
-
"driver": "uhci_hcd",
-
"driver_module": "uhci_hcd",
-
"drivers": [
-
"uhci_hcd"
-
],
-
"driver_modules": [
-
"uhci_hcd"
-
],
-
"driver_info": {
-
"type": "module",
-
"db_entry_0": [
-
"uhci-hcd"
-
],
-
"active": true,
-
"modprobe": true,
-
"names": [
-
"uhci-hcd"
-
],
-
"module_args": [
-
""
-
],
-
"conf": ""
-
},
-
"module_alias": "pci:v00008086d00002934sv00001AF4sd00001100bc0Csc03i00"
-
},
-
{
-
"index": 38,
-
"attached_to": 0,
-
"class_list": [
-
"usb_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 29
-
},
-
"base_class": {
-
"hex": "000c",
-
"name": "Serial bus controller",
-
"value": 12
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Controller",
-
"value": 3
-
},
-
"pci_interface": {
-
"hex": "0020",
-
"name": "EHCI",
-
"value": 32
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "293a",
-
"value": 10554
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0003",
-
"value": 3
-
},
-
"model": "Intel USB Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:1d.7",
-
"sysfs_bus_id": "0000:00:1d.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 19,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 3290505216,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 7,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 19,
-
"prog_if": 32
-
},
-
"driver": "ehci-pci",
-
"driver_module": "ehci_pci",
-
"drivers": [
-
"ehci-pci"
-
],
-
"driver_modules": [
-
"ehci_pci"
-
],
-
"driver_info": {
-
"type": "module",
-
"db_entry_0": [
-
"ehci-hcd"
-
],
-
"active": true,
-
"modprobe": true,
-
"names": [
-
"ehci-hcd"
-
],
-
"module_args": [
-
""
-
],
-
"conf": ""
-
},
-
"module_alias": "pci:v00008086d0000293Asv00001AF4sd00001100bc0Csc03i20"
+
"module_alias": "pci:v00008086d00007020sv00001AF4sd00001100bc0Csc03i00"
},
···
"handle": 768,
"manufacturer": "QEMU",
-
"version": "pc-q35-7.2",
+
"version": "pc-i440fx-7.2",
"chassis_type": {
"hex": "0001",
"name": "Other",
···
"name": "Multi-bit",
"value": 6
},
-
"max_size": "0xc00000",
+
"max_size": "0x100000",
"error_handle": 65534,
"slots": 1
···
"handle": 4864,
"array_handle": 4096,
"start_address": "0x0",
-
"end_address": "0x80000000",
-
"part_width": 1
-
},
-
{
-
"handle": 4865,
-
"array_handle": 4096,
-
"start_address": "0x100000000",
-
"end_address": "0x380000000",
+
"end_address": "0x40000000",
"part_width": 1
],
···
"error_handle": 65534,
"width": 0,
"ecc_bits": 0,
-
"size": 12582912,
+
"size": 1048576,
"form_factor": {
"hex": "0009",
"name": "DIMM",
···
},
"socket_populated": true,
"manufacturer": "QEMU",
-
"version": "pc-q35-7.2",
+
"version": "pc-i440fx-7.2",
"part": "",
"processor_type": {
"hex": "0003",
···
"system": {
"handle": 256,
"manufacturer": "QEMU",
-
"product": "Standard PC (Q35 + ICH9, 2009)",
-
"version": "pc-q35-7.2",
+
"product": "Standard PC (i440FX + PIIX, 1996)",
+
"version": "pc-i440fx-7.2",
"wake_up": {
"hex": "0006",
"name": "Power Switch",
+2 -7
machines/prattle/home/default.nix
···
(inputs.import-tree ../../../modules/home)
];
-
nixpkgs.enable = true;
-
home = {
username = "kierank";
homeDirectory = "/home/kierank";
};
atelier = {
-
shell = {
+
ssh = {
enable = true;
-
};
-
apps = {
-
helix.enable = true;
-
irssi.enable = true;
+
zmx.enable = true;
};
};
+1
machines/prattle/home-manager.nix
···
];
home-manager = {
+
useGlobalPkgs = true;
extraSpecialArgs = {
inherit inputs outputs;
};
+3 -3
machines/tacyon/default.nix
···
{
pkgs,
inputs,
-
system,
...
}:
{
imports = [
(inputs.import-tree ../../modules/home)
+
../../modules/home/system/nixpkgs.nix.disabled
];
nixpkgs.enable = true;
···
homeDirectory = "/home/pi";
packages = with pkgs; [
-
inputs.nixvim.packages.${system}.default
+
inputs.nixvim.packages.${pkgs.stdenv.hostPlatform.system}.default
# languages
go
···
go-tools
# my apps
-
inputs.ctfd-alerts.packages.${system}.default
+
inputs.ctfd-alerts.packages.${pkgs.stdenv.hostPlatform.system}.default
# Fonts
fira
+65 -2
machines/terebithia/default.nix
···
file = ../../secrets/github-knot-sync.age;
owner = "git";
};
+
battleship-arena = {
+
file = ../../secrets/battleship-arena.age;
+
owner = "battleship-arena";
+
};
+
frp-auth-token = {
+
file = ../../secrets/frp-auth-token.age;
+
};
};
environment.sessionVariables = {
···
networking.firewall = {
enable = true;
-
allowedTCPPorts = [ 22 80 443 ];
+
allowedTCPPorts = [
+
22
+
80
+
443
+
];
logRefusedConnections = false;
rejectPackets = true;
};
···
enable = true;
package = pkgs.caddy.withPlugins {
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.2" ];
-
hash = "sha256-Z8nPh4OI3/R1nn667ZC5VgE+Q9vDenaQ3QPKxmqPNkc=";
+
hash = "sha256-ea8PC/+SlPRdEVVF/I3c1CBprlVp1nrumKM5cMwJJ3U=";
};
email = "me@dunkirk.sh";
globalConfig = ''
···
}
'';
};
+
virtualHosts."battleship.dunkirk.sh" = {
+
extraConfig = ''
+
tls {
+
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
+
}
+
header {
+
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
+
}
+
reverse_proxy localhost:8081 {
+
header_up X-Forwarded-Proto {scheme}
+
header_up X-Forwarded-For {remote}
+
}
+
'';
+
};
extraConfig = ''
# Default response for unhandled domains
:80 {
···
secretsFile = config.age.secrets.emojibot.path;
};
+
atelier.services.battleship-arena = {
+
enable = true;
+
domain = "battleship.dunkirk.sh";
+
sshPort = 2222;
+
package = inputs.battleship-arena.packages.aarch64-linux.default;
+
secretsFile = config.age.secrets.battleship-arena.path;
+
};
+
services.tangled.knot = {
enable = true;
package = inputs.tangled.packages.aarch64-linux.knot;
···
atelier.services.knot-sync = {
enable = true;
secretsFile = config.age.secrets.github-knot-sync.path;
+
};
+
+
atelier.services.frps = {
+
enable = true;
+
domain = "bore.dunkirk.sh";
+
authTokenFile = config.age.secrets.frp-auth-token.path;
+
};
+
+
services.n8n = {
+
enable = true;
+
environment = {
+
N8N_HOST = "n8n.dunkirk.sh";
+
N8N_PROTOCOL = "https";
+
WEBHOOK_URL = "https://n8n.dunkirk.sh";
+
};
+
};
+
+
services.caddy.virtualHosts."n8n.dunkirk.sh" = {
+
extraConfig = ''
+
tls {
+
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
+
}
+
header {
+
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
+
}
+
reverse_proxy localhost:5678 {
+
header_up X-Forwarded-Proto {scheme}
+
header_up X-Forwarded-For {remote}
+
}
+
'';
};
boot.loader.systemd-boot.enable = true;
+4 -2
machines/terebithia/home/default.nix
···
(inputs.import-tree ../../../modules/home)
];
-
nixpkgs.enable = true;
-
home = {
username = "kierank";
homeDirectory = "/home/kierank";
···
apps = {
helix.enable = true;
irssi.enable = true;
+
};
+
ssh = {
+
enable = true;
+
zmx.enable = true;
};
};
+1
machines/terebithia/home-manager.nix
···
];
home-manager = {
+
useGlobalPkgs = true;
extraSpecialArgs = {
inherit inputs outputs;
};
+107
modules/home/apps/bore/bore.1.md
···
+
% BORE(1) bore 1.0
+
% Kieran Klukas
+
% December 2024
+
+
# NAME
+
+
bore - secure tunneling service for exposing local services to the internet
+
+
# SYNOPSIS
+
+
**bore** [*SUBDOMAIN*] [*PORT*] [**--label** *LABEL*] [**--save**]
+
+
**bore** **--list** | **-l**
+
+
**bore** **--saved** | **-s**
+
+
# DESCRIPTION
+
+
**bore** is a tunneling service that uses frp (fast reverse proxy) to expose local services to the internet via bore.dunkirk.sh. It provides a simple CLI for creating and managing HTTP tunnels with optional labels and persistent configuration.
+
+
# OPTIONS
+
+
**-l**, **--list**
+
: List all active tunnels on the bore server.
+
+
**-s**, **--saved**
+
: List all saved tunnel configurations from bore.toml in the current directory.
+
+
**--label** *LABEL*
+
: Assign a label/tag to the tunnel for organization and identification.
+
+
**--save**
+
: Save the tunnel configuration to bore.toml in the current directory for future use.
+
+
# ARGUMENTS
+
+
*SUBDOMAIN*
+
: The subdomain to use for the tunnel (e.g., "myapp" creates myapp.bore.dunkirk.sh). Must contain only lowercase letters, numbers, and hyphens.
+
+
*PORT*
+
: The local port to expose (e.g., 8000 for localhost:8000).
+
+
# CONFIGURATION
+
+
Tunnel configurations can be saved to a **bore.toml** file in the current directory. This file uses TOML format and can be committed to repositories.
+
+
## bore.toml Format
+
+
```toml
+
[myapp]
+
port = 8000
+
+
[api]
+
port = 3000
+
label = "dev"
+
```
+
+
When running **bore** without arguments in a directory with bore.toml, you'll be prompted to choose between creating a new tunnel or using a saved configuration.
+
+
# EXAMPLES
+
+
Create a simple tunnel:
+
```
+
$ bore myapp 8000
+
```
+
+
Create a tunnel with a label:
+
```
+
$ bore api 3000 --label dev
+
```
+
+
Save a tunnel configuration:
+
```
+
$ bore frontend 5173 --label local --save
+
```
+
+
List active tunnels:
+
```
+
$ bore --list
+
```
+
+
List saved configurations:
+
```
+
$ bore --saved
+
```
+
+
Interactive mode (choose saved or new):
+
```
+
$ bore
+
```
+
+
# FILES
+
+
**bore.toml**
+
: Local tunnel configuration file (current directory)
+
+
# SEE ALSO
+
+
Dashboard: https://bore.dunkirk.sh
+
+
# BUGS
+
+
Report bugs at: https://github.com/yourusername/dots/issues
+
+
# AUTHORS
+
+
Kieran Klukas <crush@charm.land>
+32
modules/home/apps/bore/completions/bore.bash
···
+
# bash completion for bore
+
+
_bore_completion() {
+
local cur prev opts
+
COMPREPLY=()
+
cur="${COMP_WORDS[COMP_CWORD]}"
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
+
opts="--list --saved --label --save -l -s"
+
+
# Complete flags
+
if [[ ${cur} == -* ]]; then
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+
return 0
+
fi
+
+
# Complete label value after --label or -l
+
if [[ ${prev} == "--label" ]] || [[ ${prev} == "-l" ]]; then
+
# Could potentially read from bore.toml for label suggestions
+
return 0
+
fi
+
+
# Complete saved tunnel names as first argument
+
if [[ ${COMP_CWORD} -eq 1 ]] && [[ -f "bore.toml" ]]; then
+
local tunnels=$(grep '^\[' bore.toml | sed 's/^\[\(.*\)\]$/\1/')
+
COMPREPLY=( $(compgen -W "${tunnels}" -- ${cur}) )
+
return 0
+
fi
+
+
return 0
+
}
+
+
complete -F _bore_completion bore
+20
modules/home/apps/bore/completions/bore.fish
···
+
# fish completion for bore
+
+
# Helper function to get saved tunnel names
+
function __bore_saved_tunnels
+
if test -f bore.toml
+
grep '^\[' bore.toml | sed 's/^\[\(.*\)\]$/\1/'
+
end
+
end
+
+
# Complete flags
+
complete -c bore -s l -l list -d 'List active tunnels'
+
complete -c bore -s s -l saved -d 'List saved tunnels from bore.toml'
+
complete -c bore -l label -d 'Assign a label to the tunnel' -r
+
complete -c bore -l save -d 'Save tunnel configuration to bore.toml'
+
+
# Complete subdomain from saved tunnels (first argument)
+
complete -c bore -n '__fish_is_first_token' -a '(__bore_saved_tunnels)' -d 'Saved tunnel'
+
+
# Port is always a number (second argument)
+
complete -c bore -n 'test (count (commandline -opc)) -eq 2' -d 'Local port'
+40
modules/home/apps/bore/completions/bore.zsh
···
+
#compdef bore
+
+
_bore() {
+
local -a tunnels
+
local curcontext="$curcontext" state line
+
typeset -A opt_args
+
+
# Read saved tunnels from bore.toml if it exists
+
if [[ -f "bore.toml" ]]; then
+
tunnels=(${(f)"$(grep '^\[' bore.toml | sed 's/^\[\(.*\)\]$/\1/')"})
+
fi
+
+
_arguments -C \
+
'1: :->subdomain' \
+
'2: :->port' \
+
'--list[List active tunnels]' \
+
'-l[List active tunnels]' \
+
'--saved[List saved tunnels from bore.toml]' \
+
'-s[List saved tunnels from bore.toml]' \
+
'--label[Assign a label to the tunnel]:label:' \
+
'--save[Save tunnel configuration to bore.toml]' \
+
&& return 0
+
+
case $state in
+
subdomain)
+
if [[ ${#tunnels[@]} -gt 0 ]]; then
+
_describe 'saved tunnels' tunnels
+
else
+
_message 'subdomain (e.g., myapp)'
+
fi
+
;;
+
port)
+
_message 'local port (e.g., 8000)'
+
;;
+
esac
+
+
return 0
+
}
+
+
_bore "$@"
+355
modules/home/apps/bore/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
cfg = config.atelier.bore;
+
+
boreScript = pkgs.writeShellScript "bore" ''
+
CONFIG_FILE="bore.toml"
+
+
# Check for flags
+
if [ "$1" = "--list" ] || [ "$1" = "-l" ]; then
+
${pkgs.gum}/bin/gum style --bold --foreground 212 "Active tunnels"
+
echo
+
+
tunnels=$(${pkgs.curl}/bin/curl -s https://${cfg.domain}/api/proxy/http)
+
+
if ! echo "$tunnels" | ${pkgs.jq}/bin/jq -e '.proxies | length > 0' >/dev/null 2>&1; then
+
${pkgs.gum}/bin/gum style --foreground 117 "No active tunnels"
+
exit 0
+
fi
+
+
# Filter only online tunnels with valid conf
+
echo "$tunnels" | ${pkgs.jq}/bin/jq -r '.proxies[] | select(.status == "online" and .conf != null) | "\(.name) → https://\(.conf.subdomain).${cfg.domain}"' | while read -r line; do
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ $line"
+
done
+
exit 0
+
fi
+
+
if [ "$1" = "--saved" ] || [ "$1" = "-s" ]; then
+
if [ ! -f "$CONFIG_FILE" ]; then
+
${pkgs.gum}/bin/gum style --foreground 117 "No bore.toml found in current directory"
+
exit 0
+
fi
+
+
${pkgs.gum}/bin/gum style --bold --foreground 212 "Saved tunnels in bore.toml"
+
echo
+
+
# Parse TOML and show tunnels
+
while IFS= read -r line; do
+
if [[ "$line" =~ ^\[([^]]+)\] ]]; then
+
current_tunnel="''${BASH_REMATCH[1]}"
+
elif [[ "$line" =~ ^port[[:space:]]*=[[:space:]]*([0-9]+) ]]; then
+
port="''${BASH_REMATCH[1]}"
+
elif [[ "$line" =~ ^label[[:space:]]*=[[:space:]]*\"([^\"]+)\" ]]; then
+
label="''${BASH_REMATCH[1]}"
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port [$label]"
+
label=""
+
elif [[ -z "$line" ]] && [[ -n "$current_tunnel" ]] && [[ -n "$port" ]]; then
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port"
+
current_tunnel=""
+
port=""
+
fi
+
done < "$CONFIG_FILE"
+
+
# Handle last entry if file doesn't end with blank line
+
if [[ -n "$current_tunnel" ]] && [[ -n "$port" ]]; then
+
if [[ -n "$label" ]]; then
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port [$label]"
+
else
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port"
+
fi
+
fi
+
exit 0
+
fi
+
+
# Get subdomain
+
if [ -n "$1" ]; then
+
subdomain="$1"
+
else
+
# Check if we have a bore.toml in current directory
+
if [ -f "$CONFIG_FILE" ]; then
+
# Count tunnels in TOML
+
tunnel_count=$(${pkgs.gnugrep}/bin/grep -c '^\[' "$CONFIG_FILE" 2>/dev/null || echo "0")
+
+
if [ "$tunnel_count" -gt 0 ]; then
+
${pkgs.gum}/bin/gum style --bold --foreground 212 "Creating bore tunnel"
+
echo
+
+
# Show choice between new or saved
+
choice=$(${pkgs.gum}/bin/gum choose "New tunnel" "Use saved tunnel")
+
+
if [ "$choice" = "Use saved tunnel" ]; then
+
# Extract tunnel names from TOML
+
saved_names=$(${pkgs.gnugrep}/bin/grep '^\[' "$CONFIG_FILE" | ${pkgs.gnused}/bin/sed 's/^\[\(.*\)\]$/\1/')
+
subdomain=$(echo "$saved_names" | ${pkgs.gum}/bin/gum choose)
+
+
if [ -z "$subdomain" ]; then
+
${pkgs.gum}/bin/gum style --foreground 196 "No tunnel selected"
+
exit 1
+
fi
+
+
# Parse TOML for this tunnel's config
+
in_section=false
+
while IFS= read -r line; do
+
if [[ "$line" =~ ^\[([^]]+)\] ]]; then
+
if [[ "''${BASH_REMATCH[1]}" = "$subdomain" ]]; then
+
in_section=true
+
else
+
in_section=false
+
fi
+
elif [[ "$in_section" = true ]]; then
+
if [[ "$line" =~ ^port[[:space:]]*=[[:space:]]*([0-9]+) ]]; then
+
port="''${BASH_REMATCH[1]}"
+
elif [[ "$line" =~ ^label[[:space:]]*=[[:space:]]*\"([^\"]+)\" ]]; then
+
label="''${BASH_REMATCH[1]}"
+
fi
+
fi
+
done < "$CONFIG_FILE"
+
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ Loaded from bore.toml: $subdomain → localhost:$port''${label:+ [$label]}"
+
else
+
# New tunnel
+
subdomain=$(${pkgs.gum}/bin/gum input --placeholder "myapp" --prompt "Subdomain: ")
+
if [ -z "$subdomain" ]; then
+
${pkgs.gum}/bin/gum style --foreground 196 "No subdomain provided"
+
exit 1
+
fi
+
fi
+
else
+
${pkgs.gum}/bin/gum style --bold --foreground 212 "Creating bore tunnel"
+
echo
+
subdomain=$(${pkgs.gum}/bin/gum input --placeholder "myapp" --prompt "Subdomain: ")
+
if [ -z "$subdomain" ]; then
+
${pkgs.gum}/bin/gum style --foreground 196 "No subdomain provided"
+
exit 1
+
fi
+
fi
+
else
+
${pkgs.gum}/bin/gum style --bold --foreground 212 "Creating bore tunnel"
+
echo
+
subdomain=$(${pkgs.gum}/bin/gum input --placeholder "myapp" --prompt "Subdomain: ")
+
if [ -z "$subdomain" ]; then
+
${pkgs.gum}/bin/gum style --foreground 196 "No subdomain provided"
+
exit 1
+
fi
+
fi
+
fi
+
+
# Validate subdomain
+
if ! echo "$subdomain" | ${pkgs.gnugrep}/bin/grep -qE '^[a-z0-9-]+$'; then
+
${pkgs.gum}/bin/gum style --foreground 196 "Invalid subdomain (use only lowercase letters, numbers, and hyphens)"
+
exit 1
+
fi
+
+
# Get port (skip if loaded from saved config)
+
if [ -z "$port" ]; then
+
if [ -n "$2" ]; then
+
port="$2"
+
else
+
port=$(${pkgs.gum}/bin/gum input --placeholder "8000" --prompt "Local port: ")
+
if [ -z "$port" ]; then
+
${pkgs.gum}/bin/gum style --foreground 196 "No port provided"
+
exit 1
+
fi
+
fi
+
fi
+
+
# Validate port
+
if ! echo "$port" | ${pkgs.gnugrep}/bin/grep -qE '^[0-9]+$'; then
+
${pkgs.gum}/bin/gum style --foreground 196 "Invalid port (must be a number)"
+
exit 1
+
fi
+
+
# Get optional label and save flag (skip if loaded from saved config)
+
save_config=false
+
if [ -z "$label" ]; then
+
shift 2 2>/dev/null || true
+
while [[ $# -gt 0 ]]; do
+
case "$1" in
+
--label|-l)
+
label="$2"
+
shift 2
+
;;
+
--save)
+
save_config=true
+
shift
+
;;
+
*)
+
shift
+
;;
+
esac
+
done
+
+
# Prompt for label if not provided via flag and not loaded from saved config
+
if [ -z "$label" ]; then
+
echo
+
# Allow multiple labels selection
+
labels=$(${pkgs.gum}/bin/gum choose --no-limit --header "Labels (select multiple):" "dev" "prod" "custom")
+
+
if [ -n "$labels" ]; then
+
# Check if custom was selected
+
if echo "$labels" | ${pkgs.gnugrep}/bin/grep -q "custom"; then
+
custom_label=$(${pkgs.gum}/bin/gum input --placeholder "my-label" --prompt "Custom label: ")
+
if [ -z "$custom_label" ]; then
+
${pkgs.gum}/bin/gum style --foreground 196 "No custom label provided"
+
exit 1
+
fi
+
# Replace 'custom' with the actual custom label
+
labels=$(echo "$labels" | ${pkgs.gnused}/bin/sed "s/custom/$custom_label/")
+
fi
+
# Join labels with comma
+
label=$(echo "$labels" | ${pkgs.coreutils}/bin/tr '\n' ',' | ${pkgs.gnused}/bin/sed 's/,$//')
+
fi
+
fi
+
fi
+
+
# Check if local port is accessible
+
if ! ${pkgs.netcat}/bin/nc -z 127.0.0.1 "$port" 2>/dev/null; then
+
${pkgs.gum}/bin/gum style --foreground 214 "! Warning: Nothing listening on localhost:$port"
+
fi
+
+
# Save configuration if requested
+
if [ "$save_config" = true ]; then
+
# Check if tunnel already exists in TOML
+
if [ -f "$CONFIG_FILE" ] && ${pkgs.gnugrep}/bin/grep -q "^\[$subdomain\]" "$CONFIG_FILE"; then
+
# Update existing entry
+
${pkgs.gnused}/bin/sed -i "/^\[$subdomain\]/,/^\[/{
+
s/^port[[:space:]]*=.*/port = $port/
+
''${label:+s/^label[[:space:]]*=.*/label = \"$label\"/}
+
}" "$CONFIG_FILE"
+
else
+
# Append new entry
+
{
+
echo ""
+
echo "[$subdomain]"
+
echo "port = $port"
+
if [ -n "$label" ]; then
+
echo "label = \"$label\""
+
fi
+
} >> "$CONFIG_FILE"
+
fi
+
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ Configuration saved to bore.toml"
+
echo
+
fi
+
+
# Create config file
+
config_file=$(${pkgs.coreutils}/bin/mktemp)
+
trap "${pkgs.coreutils}/bin/rm -f $config_file" EXIT
+
+
# Encode label into proxy name if provided (format: subdomain[label1,label2])
+
proxy_name="$subdomain"
+
if [ -n "$label" ]; then
+
proxy_name="''${subdomain}[''${label}]"
+
fi
+
+
${pkgs.coreutils}/bin/cat > $config_file <<EOF
+
serverAddr = "${cfg.serverAddr}"
+
serverPort = ${toString cfg.serverPort}
+
+
auth.method = "token"
+
auth.tokenSource.type = "file"
+
auth.tokenSource.file.path = "${cfg.authTokenFile}"
+
+
[[proxies]]
+
name = "$proxy_name"
+
type = "http"
+
localIP = "127.0.0.1"
+
localPort = $port
+
subdomain = "$subdomain"
+
EOF
+
+
# Start tunnel
+
public_url="https://$subdomain.${cfg.domain}"
+
echo
+
${pkgs.gum}/bin/gum style --foreground 35 "✓ Tunnel configured"
+
${pkgs.gum}/bin/gum style --foreground 117 " Local: localhost:$port"
+
${pkgs.gum}/bin/gum style --foreground 117 " Public: $public_url"
+
echo
+
${pkgs.gum}/bin/gum style --foreground 214 "Connecting to ${cfg.serverAddr}:${toString cfg.serverPort}..."
+
+
exec ${pkgs.frp}/bin/frpc -c $config_file
+
'';
+
+
bore = pkgs.stdenv.mkDerivation {
+
pname = "bore";
+
version = "1.0";
+
+
dontUnpack = true;
+
+
nativeBuildInputs = with pkgs; [ pandoc installShellFiles ];
+
+
manPageSrc = ./bore.1.md;
+
bashCompletionSrc = ./completions/bore.bash;
+
zshCompletionSrc = ./completions/bore.zsh;
+
fishCompletionSrc = ./completions/bore.fish;
+
+
buildPhase = ''
+
# Convert markdown man page to man format
+
${pkgs.pandoc}/bin/pandoc -s -t man $manPageSrc -o bore.1
+
'';
+
+
installPhase = ''
+
mkdir -p $out/bin
+
+
# Install binary
+
cp ${boreScript} $out/bin/bore
+
chmod +x $out/bin/bore
+
+
# Install man page
+
installManPage bore.1
+
+
# Install completions
+
installShellCompletion --bash --name bore $bashCompletionSrc
+
installShellCompletion --zsh --name _bore $zshCompletionSrc
+
installShellCompletion --fish --name bore.fish $fishCompletionSrc
+
'';
+
+
meta = with lib; {
+
description = "Secure tunneling service CLI";
+
homepage = "https://bore.dunkirk.sh";
+
license = licenses.mit;
+
maintainers = [ ];
+
};
+
};
+
in
+
{
+
options.atelier.bore = {
+
enable = lib.mkEnableOption "bore tunneling service";
+
+
serverAddr = lib.mkOption {
+
type = lib.types.str;
+
default = "bore.dunkirk.sh";
+
description = "bore server address";
+
};
+
+
serverPort = lib.mkOption {
+
type = lib.types.port;
+
default = 7000;
+
description = "bore server port";
+
};
+
+
domain = lib.mkOption {
+
type = lib.types.str;
+
default = "bore.dunkirk.sh";
+
description = "Domain for public tunnel URLs";
+
};
+
+
authTokenFile = lib.mkOption {
+
type = lib.types.nullOr lib.types.path;
+
default = null;
+
description = "Path to file containing authentication token";
+
};
+
};
+
+
config = lib.mkIf cfg.enable {
+
home.packages = [
+
pkgs.frp
+
bore
+
];
+
};
+
}
+16 -11
modules/home/apps/git.nix
···
config = lib.mkIf config.atelier.shell.git.enable {
programs.git = {
enable = true;
-
userName = "Kieran Klukas";
-
userEmail = "me@dunkirk.sh";
-
aliases = {
-
c = "commit";
-
p = "push";
-
ch = "checkout";
-
pushfwl = "push --force-with-lease --force-if-includes";
-
};
includes = [
{
path = pkgs.writeText "git-user-config" ''
···
condition = "gitdir:~/code/school/";
}
];
-
extraConfig = {
+
settings = {
+
user = {
+
name = "Kieran Klukas";
+
email = "me@dunkirk.sh";
+
signingKey = "~/.ssh/id_rsa.pub";
+
};
+
alias = {
+
c = "commit";
+
p = "push";
+
ch = "checkout";
+
pushfwl = "push --force-with-lease --force-if-includes";
+
};
branch.sort = "-committerdate";
pager.branch = false;
column.ui = "auto";
commit.gpgsign = true;
gpg.format = "ssh";
gpg.ssh.allowedSignersFile = "~/.ssh/allowedSigners";
-
user.signingKey = "~/.ssh/id_rsa.pub";
pull.rebase = true;
push.autoSetupRemote = true;
init.defaultBranch = "main";
};
-
delta.enable = true;
+
};
+
programs.delta = {
+
enable = true;
+
enableGitIntegration = true;
};
programs.gh.enable = true;
programs.lazygit = {
+1 -1
modules/home/apps/helix.nix
···
vscode-langservers-extracted
kotlin-language-server
harper
-
inputs.wakatime-ls.packages.${pkgs.system}.default
+
inputs.wakatime-ls.packages.${pkgs.stdenv.hostPlatform.system}.default
]
++ lib.optionals config.atelier.apps.helix.swift [
sourcekit-lsp
+1 -1
modules/home/apps/spotify.nix
···
config = lib.mkIf config.atelier.apps.spotify.enable {
programs.spicetify =
let
-
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
+
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.hostPlatform.system};
in
{
enable = true;
+183
modules/home/apps/ssh.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
inputs,
+
...
+
}:
+
with lib;
+
let
+
cfg = config.atelier.ssh;
+
in
+
{
+
options.atelier.ssh = {
+
enable = mkEnableOption "SSH configuration";
+
+
zmx = {
+
enable = mkEnableOption "zmx integration for persistent sessions";
+
hosts = mkOption {
+
type = types.listOf types.str;
+
default = [ ];
+
description = "List of host patterns to enable zmx auto-attach (e.g., 'd.*')";
+
};
+
};
+
+
extraConfig = mkOption {
+
type = types.lines;
+
default = "";
+
description = "Extra SSH configuration";
+
};
+
+
hosts = mkOption {
+
type = types.attrsOf (
+
types.submodule {
+
options = {
+
hostname = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "Hostname or IP address";
+
};
+
+
port = mkOption {
+
type = types.nullOr types.int;
+
default = null;
+
description = "SSH port";
+
};
+
+
user = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "Username for SSH connection";
+
};
+
+
identityFile = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "Path to SSH identity file";
+
};
+
+
forwardAgent = mkOption {
+
type = types.nullOr types.bool;
+
default = null;
+
description = "Enable SSH agent forwarding";
+
};
+
+
extraOptions = mkOption {
+
type = types.attrsOf types.str;
+
default = { };
+
description = "Additional SSH options for this host";
+
};
+
+
zmx = mkOption {
+
type = types.bool;
+
default = false;
+
description = "Enable zmx persistent sessions for this host";
+
};
+
};
+
}
+
);
+
default = { };
+
description = "SSH host configurations";
+
};
+
};
+
+
config = mkIf cfg.enable {
+
# zmx provides pre-built binaries that we download instead of building from source
+
# This avoids the zig2nix dependency which causes issues in CI
+
home.packages =
+
(optionals cfg.zmx.enable [
+
pkgs.zmx-binary
+
pkgs.autossh
+
]);
+
+
programs.ssh = {
+
enable = true;
+
enableDefaultConfig = false;
+
+
matchBlocks =
+
let
+
# Convert atelier.ssh.hosts to SSH matchBlocks
+
hostConfigs = mapAttrs (
+
name: hostCfg:
+
{
+
hostname = mkIf (hostCfg.hostname != null) hostCfg.hostname;
+
port = mkIf (hostCfg.port != null) hostCfg.port;
+
user = mkIf (hostCfg.user != null) hostCfg.user;
+
identityFile = mkIf (hostCfg.identityFile != null) hostCfg.identityFile;
+
forwardAgent = mkIf (hostCfg.forwardAgent != null) hostCfg.forwardAgent;
+
extraOptions = hostCfg.extraOptions // (
+
if hostCfg.zmx then
+
{
+
RemoteCommand = "export PATH=$HOME/.nix-profile/bin:$PATH; zmx attach %n";
+
RequestTTY = "yes";
+
ControlPath = "~/.ssh/cm-%r@%h:%p";
+
ControlMaster = "auto";
+
ControlPersist = "10m";
+
}
+
else
+
{ }
+
);
+
}
+
) cfg.hosts;
+
+
# Create zmx pattern hosts if enabled
+
zmxPatternHosts = if cfg.zmx.enable then
+
listToAttrs (
+
map (pattern:
+
let
+
patternHost = cfg.hosts.${pattern} or {};
+
in {
+
name = pattern;
+
value = {
+
hostname = mkIf (patternHost.hostname or null != null) patternHost.hostname;
+
port = mkIf (patternHost.port or null != null) patternHost.port;
+
user = mkIf (patternHost.user or null != null) patternHost.user;
+
extraOptions = {
+
RemoteCommand = "export PATH=$HOME/.nix-profile/bin:$PATH; zmx attach %k";
+
RequestTTY = "yes";
+
ControlPath = "~/.ssh/cm-%r@%h:%p";
+
ControlMaster = "auto";
+
ControlPersist = "10m";
+
};
+
};
+
}) cfg.zmx.hosts
+
)
+
else
+
{ };
+
+
# Default match block for extraConfig
+
defaultBlock = if cfg.extraConfig != "" then
+
{
+
"*" = { };
+
}
+
else
+
{ };
+
in
+
defaultBlock // hostConfigs // zmxPatternHosts;
+
+
extraConfig = cfg.extraConfig;
+
};
+
+
# Add shell aliases for easier zmx usage
+
programs.zsh.shellAliases = mkIf cfg.zmx.enable {
+
zmls = "zmx list";
+
zmk = "zmx kill";
+
zma = "zmx attach";
+
ash = "autossh -M 0 -q";
+
};
+
+
programs.bash.shellAliases = mkIf cfg.zmx.enable {
+
zmls = "zmx list";
+
zmk = "zmx kill";
+
zma = "zmx attach";
+
ash = "autossh -M 0 -q";
+
};
+
+
programs.fish.shellAliases = mkIf cfg.zmx.enable {
+
zmls = "zmx list";
+
zmk = "zmx kill";
+
zma = "zmx attach";
+
ash = "autossh -M 0 -q";
+
};
+
};
+
}
-85
modules/home/apps/vscode.nix
···
-
{
-
lib,
-
pkgs,
-
config,
-
inputs,
-
...
-
}:
-
{
-
options.atelier.apps.vscode.enable = lib.mkEnableOption "Enable VSCode config";
-
config = lib.mkIf config.atelier.apps.vscode.enable {
-
nixpkgs.overlays = [
-
inputs.nix-vscode-extensions.overlays.default
-
inputs.catppuccin-vsc.overlays.default
-
];
-
programs.vscode = {
-
enable = true;
-
package = pkgs.unstable.vscode;
-
profiles.default = {
-
extensions = with pkgs.vscode-marketplace; [
-
ms-vscode.live-server
-
formulahendry.auto-rename-tag
-
edwinkofler.vscode-assorted-languages
-
golang.go
-
eamodio.gitlens
-
yzhang.markdown-all-in-one
-
github.vscode-github-actions
-
yoavbls.pretty-ts-errors
-
esbenp.prettier-vscode
-
ms-vscode.vscode-serial-monitor
-
prisma.prisma
-
ms-azuretools.vscode-docker
-
astro-build.astro-vscode
-
github.copilot
-
github.copilot-chat
-
dotjoshjohnson.xml
-
mikestead.dotenv
-
bradlc.vscode-tailwindcss
-
mechatroner.rainbow-csv
-
wakatime.vscode-wakatime
-
paulober.pico-w-go
-
ms-python.python
-
karunamurti.tera
-
biomejs.biome
-
bschulte.love
-
yinfei.luahelper
-
tamasfe.even-better-toml
-
fill-labs.dependi
-
rust-lang.rust-analyzer
-
dustypomerleau.rust-syntax
-
catppuccin.catppuccin-vsc
-
inputs.frc-nix.packages.${pkgs.system}.vscode-wpilib
-
];
-
userSettings = {
-
"editor.semanticHighlighting.enabled" = true;
-
"terminal.integrated.minimumContrastRatio" = 1;
-
"window.titleBarStyle" = "custom";
-
"gopls" = {
-
"ui.semanticTokens" = true;
-
};
-
"workbench.colorTheme" = "Catppuccin Macchiato";
-
"workbench.iconTheme" = "catppuccin-macchiato";
-
"catppuccin.accentColor" = lib.mkForce "blue";
-
"editor.fontFamily" = "'FiraCode Nerd Font', 'monospace', monospace";
-
"git.autofetch" = true;
-
"git.confirmSync" = false;
-
"github.copilot.editor.enableAutoCompletions" = false;
-
"editor.formatOnSave" = true;
-
"editor.defaultFormatter" = "biomejs.biome";
-
"[go]" = {
-
"editor.defaultFormatter" = "golang.go";
-
};
-
"[yaml]" = {
-
"editor.defaultFormatter" = "esbenp.prettier-vscode";
-
};
-
"[lua]" = {
-
"editor.defaultFormatter" = "yinfei.luahelper";
-
};
-
"[html]" = {
-
"editor.defaultFormatter" = "esbenp.prettier-vscode";
-
};
-
};
-
};
-
};
-
};
-
}
-26
modules/home/system/nixpkgs.nix
···
-
{
-
lib,
-
pkgs,
-
config,
-
inputs,
-
...
-
}:
-
{
-
options.nixpkgs.enable = lib.mkEnableOption "Enable custom nixpkgs overlays/config";
-
config = lib.mkIf config.nixpkgs.enable {
-
nixpkgs = {
-
overlays = [
-
(final: prev: {
-
unstable = import inputs.nixpkgs-unstable {
-
system = pkgs.stdenv.hostPlatform.system;
-
config.allowUnfree = true;
-
};
-
})
-
];
-
config = {
-
allowUnfree = true;
-
allowUnfreePredicate = _: true;
-
};
-
};
-
};
-
}
+26
modules/home/system/nixpkgs.nix.disabled
···
+
{
+
lib,
+
pkgs,
+
config,
+
inputs,
+
...
+
}:
+
{
+
options.nixpkgs.enable = lib.mkEnableOption "Enable custom nixpkgs overlays/config";
+
config = lib.mkIf config.nixpkgs.enable {
+
nixpkgs = {
+
overlays = [
+
(final: prev: {
+
unstable = import inputs.nixpkgs-unstable {
+
inherit (pkgs.stdenv.hostPlatform) system;
+
config.allowUnfree = true;
+
};
+
})
+
];
+
config = {
+
allowUnfree = true;
+
allowUnfreePredicate = _: true;
+
};
+
};
+
};
+
}
+10 -3
modules/home/system/shell.nix
···
template = "{{ if .SSHSession }}{{.HostName}} {{ end }}";
}
{
+
type = "text";
+
style = "plain";
+
background = "transparent";
+
foreground = "green";
+
template = "{{ if .Env.ZMX_SESSION }}[{{ .Env.ZMX_SESSION }}] {{ end }}";
+
}
+
{
type = "path";
style = "plain";
background = "transparent";
···
style = "plain";
foreground_templates = [
"{{if gt .Code 0}}red{{end}}"
-
"{{if eq .Code 0}}magenta{{end}}"
+
"{{if eq .Code 0}}{{if .Env.SSH_CONNECTION}}cyan{{else}}magenta{{end}}{{end}}"
];
background = "transparent";
template = "❯";
···
transient_prompt = {
foreground_templates = [
"{{if gt .Code 0}}red{{end}}"
-
"{{if eq .Code 0}}magenta{{end}}"
+
"{{if eq .Code 0}}{{if .Env.SSH_CONNECTION}}cyan{{else}}magenta{{end}}{{end}}"
];
background = "transparent";
template = "❯ ";
···
now
ghostty-setup
pkgs.unstable.wakatime-cli
-
inputs.terminal-wakatime.packages.${pkgs.system}.default
+
inputs.terminal-wakatime.packages.${pkgs.stdenv.hostPlatform.system}.default
unzip
dog
dust
+162
modules/nixos/services/battleship-arena.nix
···
+
{ config, lib, pkgs, ... }:
+
+
with lib;
+
+
let
+
cfg = config.atelier.services.battleship-arena;
+
in
+
{
+
options.atelier.services.battleship-arena = {
+
enable = mkEnableOption "battleship-arena service";
+
+
domain = mkOption {
+
type = types.str;
+
default = "battleship.dunkirk.sh";
+
description = "Domain name for the web interface";
+
};
+
+
sshPort = mkOption {
+
type = types.port;
+
default = 2222;
+
description = "SSH port for battleship arena";
+
};
+
+
webPort = mkOption {
+
type = types.port;
+
default = 8081;
+
description = "Web interface port";
+
};
+
+
uploadDir = mkOption {
+
type = types.str;
+
default = "/var/lib/battleship-arena/submissions";
+
description = "Directory for uploaded submissions";
+
};
+
+
resultsDb = mkOption {
+
type = types.str;
+
default = "/var/lib/battleship-arena/results.db";
+
description = "Path to results database";
+
};
+
+
adminPasscode = mkOption {
+
type = types.str;
+
default = "battleship-admin-override";
+
description = "Admin passcode for batch uploads";
+
};
+
+
secretsFile = mkOption {
+
type = types.nullOr types.path;
+
default = null;
+
description = "Path to agenix secrets file containing BATTLESHIP_ADMIN_PASSCODE";
+
};
+
+
package = mkOption {
+
type = types.package;
+
description = "The battleship-arena package to use";
+
};
+
};
+
+
config = mkIf cfg.enable {
+
users.users.battleship-arena = {
+
isSystemUser = true;
+
group = "battleship-arena";
+
home = "/var/lib/battleship-arena";
+
createHome = true;
+
};
+
+
users.groups.battleship-arena = {};
+
+
systemd.services.battleship-arena = {
+
description = "Battleship Arena SSH/Web Service";
+
after = [ "network.target" ];
+
wantedBy = [ "multi-user.target" ];
+
+
environment = {
+
BATTLESHIP_HOST = "0.0.0.0";
+
BATTLESHIP_SSH_PORT = toString cfg.sshPort;
+
BATTLESHIP_WEB_PORT = toString cfg.webPort;
+
BATTLESHIP_UPLOAD_DIR = cfg.uploadDir;
+
BATTLESHIP_RESULTS_DB = cfg.resultsDb;
+
BATTLESHIP_ADMIN_PASSCODE = cfg.adminPasscode;
+
BATTLESHIP_EXTERNAL_URL = "https://${cfg.domain}";
+
BATTLESHIP_ENGINE_PATH = "/var/lib/battleship-arena/battleship-engine";
+
CPLUS_INCLUDE_PATH = "/var/lib/battleship-arena/battleship-engine/include";
+
};
+
+
path = [ pkgs.gcc pkgs.coreutils ];
+
+
serviceConfig = {
+
Type = "simple";
+
User = "battleship-arena";
+
Group = "battleship-arena";
+
WorkingDirectory = "/var/lib/battleship-arena";
+
ExecStart = "${cfg.package}/bin/battleship-arena";
+
Restart = "always";
+
RestartSec = "10s";
+
+
# Load secrets if provided
+
EnvironmentFile = mkIf (cfg.secretsFile != null) cfg.secretsFile;
+
+
# Security hardening
+
NoNewPrivileges = true;
+
PrivateTmp = true;
+
ProtectSystem = "strict";
+
ProtectHome = true;
+
ReadWritePaths = [ "/var/lib/battleship-arena" ];
+
};
+
+
preStart = ''
+
mkdir -p ${cfg.uploadDir}
+
mkdir -p $(dirname ${cfg.resultsDb})
+
chown -R battleship-arena:battleship-arena ${cfg.uploadDir}
+
chmod -R u+rwX ${cfg.uploadDir}
+
+
# Generate SSH host key if it doesn't exist
+
if [ ! -f /var/lib/battleship-arena/.ssh/battleship_arena ]; then
+
mkdir -p /var/lib/battleship-arena/.ssh
+
${pkgs.openssh}/bin/ssh-keygen -t ed25519 -f /var/lib/battleship-arena/.ssh/battleship_arena -N ""
+
chown -R battleship-arena:battleship-arena /var/lib/battleship-arena/.ssh
+
fi
+
+
# Copy battleship-engine to writable directory
+
chmod -R u+w /var/lib/battleship-arena/battleship-engine 2>/dev/null || true
+
rm -rf /var/lib/battleship-arena/battleship-engine
+
cp -r ${cfg.package}/share/battleship-arena/battleship-engine /var/lib/battleship-arena/
+
chown -R battleship-arena:battleship-arena /var/lib/battleship-arena/battleship-engine
+
chmod -R u+rwX /var/lib/battleship-arena/battleship-engine
+
'';
+
};
+
+
# Service to recalculate Glicko-2 ratings (manual trigger only)
+
# Ratings automatically recalculate after each round-robin
+
# Use: sudo systemctl start battleship-arena-recalculate
+
systemd.services.battleship-arena-recalculate = {
+
description = "Recalculate Battleship Arena Glicko-2 Ratings";
+
+
environment = {
+
BATTLESHIP_RESULTS_DB = cfg.resultsDb;
+
};
+
+
serviceConfig = {
+
Type = "oneshot";
+
User = "battleship-arena";
+
Group = "battleship-arena";
+
WorkingDirectory = "/var/lib/battleship-arena";
+
ExecStart = "${cfg.package}/bin/battleship-arena recalculate-ratings";
+
};
+
};
+
+
# Allow battleship-arena user to create transient systemd units for sandboxing
+
security.polkit.extraConfig = ''
+
polkit.addRule(function(action, subject) {
+
if (action.id == "org.freedesktop.systemd1.manage-units" &&
+
subject.user == "battleship-arena") {
+
return polkit.Result.YES;
+
}
+
});
+
'';
+
+
networking.firewall.allowedTCPPorts = [ cfg.sshPort ];
+
};
+
}
+97
modules/nixos/services/bore/404.html
···
+
<!DOCTYPE html>
+
<html lang="en">
+
+
<head>
+
<meta charset="UTF-8">
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
<title>404 - bore</title>
+
<link rel="icon"
+
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🚇</text></svg>">
+
<style>
+
* {
+
margin: 0;
+
padding: 0;
+
box-sizing: border-box;
+
}
+
+
body {
+
font-family: 'SF Mono', 'Monaco', monospace;
+
background: #0d1117;
+
color: #e6edf3;
+
min-height: 100vh;
+
display: flex;
+
align-items: center;
+
justify-content: center;
+
padding: 2rem;
+
}
+
+
.container {
+
text-align: center;
+
max-width: 600px;
+
}
+
+
.error-code {
+
font-size: 8rem;
+
font-weight: 700;
+
color: #8b949e;
+
line-height: 1;
+
margin-bottom: 1rem;
+
}
+
+
.emoji {
+
font-size: 4rem;
+
margin-bottom: 2rem;
+
opacity: 0.5;
+
}
+
+
h1 {
+
font-size: 2rem;
+
margin-bottom: 1rem;
+
color: #e6edf3;
+
}
+
+
p {
+
color: #8b949e;
+
font-size: 1rem;
+
margin-bottom: 2rem;
+
line-height: 1.6;
+
}
+
+
.countdown {
+
color: #14b8a6;
+
font-size: 1.2rem;
+
font-weight: 600;
+
font-variant-numeric: tabular-nums;
+
}
+
</style>
+
</head>
+
+
<body>
+
<div class="container">
+
<div class="emoji">🚇</div>
+
<div class="error-code">404</div>
+
<h1>wrong stop!</h1>
+
<p>this tunnel doesn't go anywhere. maybe it was never built, or perhaps it collapsed?</p>
+
<p>redirecting in <span class="countdown" id="countdown">5.000</span>s</p>
+
</div>
+
+
<script>
+
let timeLeft = 5000; // 5 seconds in milliseconds
+
const countdownEl = document.getElementById('countdown');
+
const startTime = Date.now();
+
+
const interval = setInterval(() => {
+
const elapsed = Date.now() - startTime;
+
timeLeft = Math.max(0, 5000 - elapsed);
+
+
countdownEl.textContent = (timeLeft / 1000).toFixed(3);
+
+
if (timeLeft <= 0) {
+
clearInterval(interval);
+
window.location.href = 'https://bore.dunkirk.sh';
+
}
+
}, 10); // Update every 10ms for smooth countdown
+
</script>
+
</body>
+
+
</html>
+32
modules/nixos/services/bore/README.md
···
+
# Bore
+
+
![screenshot](https://hc-cdn.hel1.your-objectstorage.com/s/v3/7652f29dacb8f76d_screenshot_2025-12-09_at_16.57.47.png)
+
+
Bore is a lightweight wrapper around `frp` which provides a dashboard and a nice `gum` based cli. If you would like to run this in your own nix flake then simplify vendor this folder and `./modules/home/bore` and import the folders into the appropriate home manager and nixos configurations.
+
+
```nix
+
atelier = {
+
bore = {
+
enable = true;
+
authTokenFile = osConfig.age.secrets.bore.path
+
};
+
}
+
```
+
+
and be sure to have a definition for your agenix secret in the osConfig as well:
+
+
```nix
+
age = {
+
identityPaths = [
+
"path/to/ssh/key"
+
];
+
secrets = {
+
bore = {
+
file = ./path/to/bore.age;
+
owner = "username";
+
};
+
};
+
}
+
```
+
+
The secret file is just a oneline file with the key in it. If you do end up deploying this feel free to email me and let me know! I would love to hear about your setup!
+169
modules/nixos/services/bore/bore.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
cfg = config.atelier.services.frps;
+
in
+
{
+
options.atelier.services.frps = {
+
enable = lib.mkEnableOption "frp server for tunneling services";
+
+
bindAddr = lib.mkOption {
+
type = lib.types.str;
+
default = "0.0.0.0";
+
description = "Address to bind frp server to";
+
};
+
+
bindPort = lib.mkOption {
+
type = lib.types.port;
+
default = 7000;
+
description = "Port for frp control connection";
+
};
+
+
vhostHTTPPort = lib.mkOption {
+
type = lib.types.port;
+
default = 7080;
+
description = "Port for HTTP virtual host traffic";
+
};
+
+
authToken = lib.mkOption {
+
type = lib.types.nullOr lib.types.str;
+
default = null;
+
description = "Authentication token for clients (deprecated: use authTokenFile)";
+
};
+
+
authTokenFile = lib.mkOption {
+
type = lib.types.nullOr lib.types.path;
+
default = null;
+
description = "Path to file containing authentication token";
+
};
+
+
domain = lib.mkOption {
+
type = lib.types.str;
+
example = "bore.dunkirk.sh";
+
description = "Base domain for subdomains (e.g., *.bore.dunkirk.sh)";
+
};
+
+
enableCaddy = lib.mkOption {
+
type = lib.types.bool;
+
default = true;
+
description = "Automatically configure Caddy reverse proxy for wildcard domain";
+
};
+
};
+
+
config = lib.mkIf cfg.enable {
+
assertions = [
+
{
+
assertion = cfg.authToken != null || cfg.authTokenFile != null;
+
message = "Either authToken or authTokenFile must be set for frps";
+
}
+
];
+
+
# Open firewall port for frp control connection
+
networking.firewall.allowedTCPPorts = [ cfg.bindPort ];
+
+
# frp server service
+
systemd.services.frps =
+
let
+
tokenConfig =
+
if cfg.authTokenFile != null then
+
''
+
auth.tokenSource.type = "file"
+
auth.tokenSource.file.path = "${cfg.authTokenFile}"
+
''
+
else
+
''auth.token = "${cfg.authToken}"'';
+
+
configFile = pkgs.writeText "frps.toml" ''
+
bindAddr = "${cfg.bindAddr}"
+
bindPort = ${toString cfg.bindPort}
+
vhostHTTPPort = ${toString cfg.vhostHTTPPort}
+
+
# Dashboard and Prometheus metrics
+
webServer.addr = "127.0.0.1"
+
webServer.port = 7400
+
enablePrometheus = true
+
+
# Authentication token - clients need this to connect
+
auth.method = "token"
+
${tokenConfig}
+
+
# Subdomain support for *.${cfg.domain}
+
subDomainHost = "${cfg.domain}"
+
+
# Custom 404 page
+
custom404Page = "${./404.html}"
+
+
# Logging
+
log.to = "console"
+
log.level = "info"
+
'';
+
in
+
{
+
description = "frp server for ${cfg.domain} tunneling";
+
after = [ "network.target" ];
+
wantedBy = [ "multi-user.target" ];
+
serviceConfig = {
+
Type = "simple";
+
Restart = "on-failure";
+
RestartSec = "5s";
+
ExecStart = "${pkgs.frp}/bin/frps -c ${configFile}";
+
};
+
};
+
+
# Automatically configure Caddy for wildcard domain
+
services.caddy = lib.mkIf cfg.enableCaddy {
+
# Dashboard for base domain
+
virtualHosts."${cfg.domain}" = {
+
extraConfig = ''
+
tls {
+
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
+
}
+
header {
+
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
+
}
+
+
# Proxy /api/* to frps dashboard
+
handle /api/* {
+
reverse_proxy localhost:7400
+
}
+
+
# Serve dashboard HTML
+
handle {
+
root * ${./.}
+
try_files dashboard.html
+
file_server
+
}
+
'';
+
};
+
+
# Wildcard subdomain proxy to frps
+
virtualHosts."*.${cfg.domain}" = {
+
extraConfig = ''
+
tls {
+
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
+
}
+
header {
+
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
+
}
+
reverse_proxy localhost:${toString cfg.vhostHTTPPort} {
+
header_up X-Forwarded-Proto {scheme}
+
header_up X-Forwarded-For {remote}
+
header_up Host {host}
+
}
+
handle_errors {
+
@404 expression {http.error.status_code} == 404
+
handle @404 {
+
root * ${./.}
+
rewrite * /404.html
+
file_server
+
}
+
}
+
'';
+
};
+
};
+
};
+
}
+13
modules/nixos/services/bore/bore.toml.example
···
+
# bore tunnel configuration
+
# Save this file as "bore.toml" in your project directory
+
+
[myapp]
+
port = 8000
+
+
[api]
+
port = 3000
+
label = "dev"
+
+
[frontend]
+
port = 5173
+
label = "local"
+626
modules/nixos/services/bore/dashboard.html
···
+
<!DOCTYPE html>
+
<html lang="en">
+
+
<head>
+
<meta charset="UTF-8">
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
<title>bore</title>
+
<meta name="description" content="bore - secure tunneling service for exposing local services to the internet">
+
<meta property="og:title" content="bore - tunnel dashboard">
+
<meta property="og:description" content="secure tunneling service powered by frp on bore.dunkirk.sh">
+
<meta property="og:type" content="website">
+
<meta property="og:url" content="https://bore.dunkirk.sh">
+
<meta name="twitter:card" content="summary">
+
<meta name="twitter:title" content="bore - tunnel dashboard">
+
<meta name="twitter:description" content="secure tunneling service powered by frp on bore.dunkirk.sh">
+
<link rel="icon"
+
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🚇</text></svg>">
+
<style>
+
* {
+
margin: 0;
+
padding: 0;
+
box-sizing: border-box;
+
}
+
+
body {
+
font-family: 'SF Mono', 'Monaco', monospace;
+
background: #0d1117;
+
color: #e6edf3;
+
padding: 2rem;
+
line-height: 1.5;
+
min-height: 100vh;
+
display: flex;
+
flex-direction: column;
+
}
+
+
body.loading .container {
+
opacity: 0;
+
}
+
+
.loading-bar {
+
position: fixed;
+
top: 0;
+
left: 0;
+
width: 100%;
+
height: 3px;
+
background: transparent;
+
z-index: 9999;
+
overflow: hidden;
+
}
+
+
.loading-bar::before {
+
content: '';
+
position: absolute;
+
top: 0;
+
left: 0;
+
width: 100%;
+
height: 100%;
+
background: linear-gradient(90deg, #14b8a6, #fb923c);
+
animation: loading 1.5s ease-in-out infinite;
+
}
+
+
body:not(.loading) .loading-bar {
+
display: none;
+
}
+
+
@keyframes loading {
+
0% {
+
transform: translateX(-100%);
+
}
+
50% {
+
transform: translateX(0%);
+
}
+
100% {
+
transform: translateX(100%);
+
}
+
}
+
+
.container {
+
max-width: 1200px;
+
margin: 0 auto;
+
flex: 1;
+
width: 100%;
+
opacity: 1;
+
transition: opacity 0.3s ease-in-out;
+
}
+
+
header {
+
margin-bottom: 3rem;
+
}
+
+
h1 {
+
font-size: 2.5rem;
+
background: linear-gradient(135deg, #14b8a6, #fb923c);
+
-webkit-background-clip: text;
+
-webkit-text-fill-color: transparent;
+
margin-bottom: 0.5rem;
+
}
+
+
.subtitle {
+
color: #8b949e;
+
font-size: 0.95rem;
+
}
+
+
.stats {
+
display: grid;
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+
gap: 1rem;
+
margin-bottom: 2rem;
+
}
+
+
.stat-card {
+
background: #161b22;
+
border: 1px solid #30363d;
+
border-radius: 0;
+
padding: 1.5rem;
+
}
+
+
.stat-label {
+
color: #8b949e;
+
font-size: 0.85rem;
+
margin-bottom: 0.5rem;
+
}
+
+
.stat-value {
+
font-size: 2rem;
+
font-weight: 600;
+
color: #14b8a6;
+
}
+
+
.stat-value.orange {
+
color: #fb923c;
+
}
+
+
.section {
+
background: #161b22;
+
border: 1px solid #30363d;
+
border-radius: 0;
+
padding: 1.5rem;
+
margin-bottom: 2rem;
+
}
+
+
h2 {
+
color: #14b8a6;
+
font-size: 1.2rem;
+
margin-bottom: 1.5rem;
+
display: flex;
+
align-items: center;
+
gap: 0.5rem;
+
}
+
+
.tunnel-list {
+
display: flex;
+
flex-direction: column;
+
gap: 1rem;
+
}
+
+
.tunnel {
+
background: #0d1117;
+
border: 1px solid #30363d;
+
border-radius: 0;
+
padding: 1rem;
+
display: grid;
+
grid-template-columns: 1fr auto;
+
gap: 1rem;
+
align-items: center;
+
}
+
+
.tunnel-icon {
+
display: none;
+
}
+
+
.tunnel-info {
+
flex: 1;
+
}
+
+
.tunnel-name {
+
color: #e6edf3;
+
font-weight: 600;
+
margin-bottom: 0.25rem;
+
display: flex;
+
align-items: center;
+
gap: 0.5rem;
+
}
+
+
.tunnel-label {
+
display: inline-block;
+
padding: 0.125rem 0.5rem;
+
font-size: 0.7rem;
+
font-weight: 500;
+
border-radius: 0;
+
margin-left: 0.25rem;
+
border: 1px solid;
+
}
+
+
.tunnel-url {
+
color: #8b949e;
+
font-size: 0.85rem;
+
}
+
+
.tunnel-url a {
+
color: #14b8a6;
+
text-decoration: none;
+
}
+
+
.tunnel-url a:hover {
+
text-decoration: underline;
+
}
+
+
.tunnel-status {
+
padding: 0.25rem 0.75rem;
+
border-radius: 0;
+
font-size: 0.8rem;
+
font-weight: 500;
+
}
+
+
.status-online {
+
background: rgba(20, 184, 166, 0.2);
+
color: #14b8a6;
+
border: 1px solid #14b8a6;
+
}
+
+
.empty-state {
+
text-align: center;
+
padding: 3rem 1rem;
+
color: #8b949e;
+
}
+
+
.empty-icon {
+
font-size: 3rem;
+
margin-bottom: 1rem;
+
opacity: 0.5;
+
}
+
+
code {
+
background: #0d1117;
+
padding: 0.2rem 0.5rem;
+
border-radius: 0;
+
color: #fb923c;
+
font-size: 0.9rem;
+
}
+
+
.usage {
+
background: #0d1117;
+
padding: 1rem;
+
border-radius: 0;
+
margin-top: 1rem;
+
}
+
+
.usage pre {
+
color: #8b949e;
+
font-size: 0.9rem;
+
overflow-x: auto;
+
}
+
+
.last-updated {
+
text-align: center;
+
color: #8b949e;
+
font-size: 0.8rem;
+
margin-top: 2rem;
+
padding: 2rem 0;
+
}
+
+
.last-updated a {
+
color: #14b8a6;
+
text-decoration: none;
+
}
+
+
.last-updated a:hover {
+
text-decoration: underline;
+
}
+
+
.offline-tunnels {
+
margin-top: 1.5rem;
+
padding-top: 1.5rem;
+
border-top: 1px solid #30363d;
+
}
+
+
.offline-tunnel {
+
padding: 0.5rem 0;
+
color: #8b949e;
+
font-size: 0.85rem;
+
display: flex;
+
justify-content: space-between;
+
align-items: center;
+
}
+
+
.offline-tunnel-name {
+
opacity: 0.6;
+
}
+
+
.offline-tunnel-stats {
+
font-size: 0.75rem;
+
opacity: 0.5;
+
}
+
</style>
+
</head>
+
+
<body class="loading">
+
<div class="loading-bar"></div>
+
<main class="container">
+
<header>
+
<h1>🚇 bore</h1>
+
<p class="subtitle">fancy tunnels @ terebithia</p>
+
</header>
+
+
<div class="stats">
+
<div class="stat-card">
+
<div class="stat-label">active tunnels</div>
+
<div class="stat-value" id="activeTunnels">—</div>
+
</div>
+
<div class="stat-card">
+
<div class="stat-label">active connections</div>
+
<div class="stat-value" id="totalConnections">—</div>
+
</div>
+
<div class="stat-card">
+
<div class="stat-label">server status</div>
+
<div class="stat-value orange" id="serverStatus">—</div>
+
</div>
+
<div class="stat-card">
+
<div class="stat-label">total upload</div>
+
<div class="stat-value" id="totalUpload">—</div>
+
</div>
+
<div class="stat-card">
+
<div class="stat-label">total download</div>
+
<div class="stat-value" id="totalDownload">—</div>
+
</div>
+
</div>
+
+
<section class="section">
+
<h2>~boreholes</h2>
+
<div class="tunnel-list" id="tunnelList">
+
<div class="empty-state">
+
<div class="empty-icon">🚇</div>
+
<p>no active tunnels</p>
+
</div>
+
</div>
+
</section>
+
</main>
+
+
<footer class="last-updated">
+
last updated: <span id="lastUpdated">never</span><br>
+
made with ♥︎ by <a href="https://dunkirk.sh" target="_blank">kieran klukas</a>
+
</footer>
+
+
<script>
+
let fetchFailCount = 0;
+
const MAX_FAIL_COUNT = 3;
+
let lastProxiesState = null;
+
+
// Predefined color palette for labels
+
const labelColors = [
+
{ color: '#a78bfa', bg: 'rgba(167, 139, 250, 0.2)' }, // purple
+
{ color: '#f472b6', bg: 'rgba(244, 114, 182, 0.2)' }, // pink
+
{ color: '#facc15', bg: 'rgba(250, 204, 21, 0.2)' }, // yellow
+
{ color: '#60a5fa', bg: 'rgba(96, 165, 250, 0.2)' }, // blue
+
{ color: '#f87171', bg: 'rgba(248, 113, 113, 0.2)' }, // red
+
{ color: '#38bdf8', bg: 'rgba(56, 189, 248, 0.2)' }, // sky
+
{ color: '#c084fc', bg: 'rgba(192, 132, 252, 0.2)' }, // violet
+
{ color: '#fb7185', bg: 'rgba(251, 113, 133, 0.2)' }, // rose
+
];
+
+
// Hash string to index
+
function stringToColorIndex(str) {
+
let hash = 0;
+
for (let i = 0; i < str.length; i++) {
+
hash = str.charCodeAt(i) + ((hash << 5) - hash);
+
}
+
return Math.abs(hash) % labelColors.length;
+
}
+
+
// Get label color and styles
+
function getLabelStyle(label) {
+
const trimmedLabel = label.trim();
+
if (trimmedLabel === 'prod') {
+
return {
+
color: '#22c55e',
+
bgColor: 'rgba(34, 197, 94, 0.2)',
+
borderColor: '#22c55e'
+
};
+
}
+
+
if (trimmedLabel === 'dev') {
+
return {
+
color: '#fb923c',
+
bgColor: 'rgba(251, 146, 60, 0.2)',
+
borderColor: '#fb923c'
+
};
+
}
+
+
const colorIndex = stringToColorIndex(trimmedLabel);
+
const colorScheme = labelColors[colorIndex];
+
return {
+
color: colorScheme.color,
+
bgColor: colorScheme.bg,
+
borderColor: colorScheme.color
+
};
+
}
+
+
async function fetchStats() {
+
try {
+
// Fetch server info
+
const serverResponse = await fetch('/api/serverinfo');
+
if (!serverResponse.ok) throw new Error('API unavailable');
+
const serverData = await serverResponse.json();
+
+
// Fetch HTTP proxies (tunnels)
+
const proxiesResponse = await fetch('/api/proxy/http');
+
const proxiesData = await proxiesResponse.json();
+
+
// Reset fail count on success
+
fetchFailCount = 0;
+
+
// Update stats
+
document.getElementById('activeTunnels').textContent = serverData.clientCounts || 0;
+
document.getElementById('serverStatus').textContent = 'online';
+
document.getElementById('totalConnections').textContent = serverData.curConns || 0;
+
document.getElementById('totalUpload').textContent = formatBytes(serverData.totalTrafficOut || 0);
+
document.getElementById('totalDownload').textContent = formatBytes(serverData.totalTrafficIn || 0);
+
+
// Update page title
+
const tunnelCount = serverData.clientCounts || 0;
+
const totalTraffic = formatBytes((serverData.totalTrafficIn || 0) + (serverData.totalTrafficOut || 0));
+
document.title = tunnelCount > 0
+
? `bore - ${tunnelCount} active • ${totalTraffic}`
+
: 'bore';
+
+
// Check if tunnel list structure changed
+
const proxies = proxiesData.proxies || [];
+
const currentState = JSON.stringify(proxies.map(p => ({ name: p.name, status: p.status })));
+
+
if (currentState !== lastProxiesState) {
+
// Structure changed, rebuild DOM
+
lastProxiesState = currentState;
+
renderTunnelList(proxies);
+
} else {
+
// Structure unchanged, just update data
+
updateTunnelData(proxies);
+
}
+
+
document.getElementById('lastUpdated').textContent = new Date().toLocaleTimeString();
+
+
// Remove loading class after first successful fetch
+
document.body.classList.remove('loading');
+
} catch (error) {
+
fetchFailCount++;
+
document.getElementById('serverStatus').textContent = 'offline';
+
console.error('Failed to fetch stats:', error);
+
+
// Reload page if failed multiple times (server might have updated)
+
if (fetchFailCount >= MAX_FAIL_COUNT) {
+
console.log('Multiple fetch failures detected, reloading page...');
+
window.location.reload();
+
}
+
}
+
}
+
+
function renderTunnelList(proxies) {
+
const tunnelList = document.getElementById('tunnelList');
+
const onlineTunnels = proxies.filter(p => p.status === 'online');
+
const offlineTunnels = proxies.filter(p => p.status !== 'online');
+
+
if (onlineTunnels.length === 0 && offlineTunnels.length === 0) {
+
tunnelList.innerHTML = `
+
<div class="empty-state">
+
<div class="empty-icon">🚇</div>
+
<p>no active tunnels</p>
+
</div>
+
`;
+
} else {
+
let html = '';
+
+
// Render online tunnels
+
if (onlineTunnels.length > 0) {
+
html += onlineTunnels.map(proxy => {
+
const subdomain = proxy.conf?.subdomain || 'unknown';
+
const url = `https://${subdomain}.bore.dunkirk.sh`;
+
+
// Parse labels from proxy name (format: subdomain[label1,label2])
+
const labelMatch = proxy.name.match(/\[([^\]]+)\]$/);
+
const labels = labelMatch ? labelMatch[1].split(',') : [];
+
const displayName = labels.length > 0 ? proxy.name.replace(/\[[^\]]+\]$/, '') : proxy.name;
+
+
const labelHtml = labels.map(label => {
+
const trimmedLabel = label.trim();
+
const style = getLabelStyle(trimmedLabel);
+
return `<span class="tunnel-label" style="color: ${style.color}; background: ${style.bgColor}; border-color: ${style.borderColor};">${trimmedLabel}</span>`;
+
}).join('');
+
+
return `
+
<div class="tunnel" data-tunnel="${proxy.name}">
+
<div class="tunnel-info">
+
<div class="tunnel-name">
+
${displayName || 'unnamed'}
+
${labelHtml}
+
</div>
+
<div class="tunnel-url">
+
<a href="${url}" target="_blank">${url}</a>
+
</div>
+
<div style="color: #8b949e; font-size: 0.75rem; margin-top: 0.25rem;">
+
started: <span data-start-time="${proxy.lastStartTime || ''}"></span> • traffic in: <span data-traffic-in="${proxy.name}">0 B</span> • out: <span data-traffic-out="${proxy.name}">0 B</span>
+
</div>
+
</div>
+
<div class="tunnel-status status-online">online</div>
+
</div>
+
`;
+
}).join('');
+
}
+
+
// Render offline tunnels
+
if (offlineTunnels.length > 0) {
+
html += '<div class="offline-tunnels">';
+
html += '<div style="color: #8b949e; font-size: 0.85rem; margin-bottom: 0.75rem;">recently disconnected</div>';
+
html += offlineTunnels.map(proxy => {
+
// Parse labels from proxy name (format: subdomain[label1,label2])
+
const labelMatch = proxy.name.match(/\[([^\]]+)\]$/);
+
const labels = labelMatch ? labelMatch[1].split(',').map(l => l.trim()) : [];
+
const displayName = labels.length > 0 ? proxy.name.replace(/\[[^\]]+\]$/, '') : proxy.name;
+
const labelStr = labels.length > 0 ? ` [${labels.join(', ')}]` : '';
+
+
if (!proxy.conf) {
+
return `
+
<div class="offline-tunnel" data-tunnel="${proxy.name}">
+
<span class="offline-tunnel-name">${displayName || 'unnamed'}${labelStr}</span>
+
<span class="offline-tunnel-stats">in: <span data-traffic-in="${proxy.name}">0 B</span> • out: <span data-traffic-out="${proxy.name}">0 B</span></span>
+
</div>
+
`;
+
}
+
+
const subdomain = proxy.conf.subdomain || 'unknown';
+
const url = `https://${subdomain}.bore.dunkirk.sh`;
+
return `
+
<div class="offline-tunnel" data-tunnel="${proxy.name}">
+
<span class="offline-tunnel-name">${displayName || 'unnamed'}${labelStr} → ${url}</span>
+
<span class="offline-tunnel-stats">in: <span data-traffic-in="${proxy.name}">0 B</span> • out: <span data-traffic-out="${proxy.name}">0 B</span></span>
+
</div>
+
`;
+
}).join('');
+
html += '</div>';
+
}
+
+
tunnelList.innerHTML = html;
+
+
// Update all relative times
+
updateRelativeTimes();
+
+
+
}
+
+
// Update data
+
updateTunnelData(proxies);
+
}
+
+
function updateTunnelData(proxies) {
+
proxies.forEach(proxy => {
+
const trafficInEl = document.querySelector(`[data-traffic-in="${proxy.name}"]`);
+
const trafficOutEl = document.querySelector(`[data-traffic-out="${proxy.name}"]`);
+
+
if (trafficInEl) trafficInEl.textContent = formatBytes(proxy.todayTrafficIn || 0);
+
if (trafficOutEl) trafficOutEl.textContent = formatBytes(proxy.todayTrafficOut || 0);
+
+
+
});
+
+
// Update relative times
+
updateRelativeTimes();
+
}
+
+
function formatBytes(bytes) {
+
if (bytes === 0) return '0 B';
+
const k = 1024;
+
const sizes = ['B', 'KB', 'MB', 'GB'];
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
+
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
+
}
+
+
function formatTime(timeStr) {
+
// Input format: "12-08 20:15:20" (MM-DD HH:MM:SS)
+
const [datePart, timePart] = timeStr.split(' ');
+
const [month, day] = datePart.split('-');
+
const [hour, minute, second] = timePart.split(':');
+
+
const now = new Date();
+
const inputDate = new Date(now.getFullYear(), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute), parseInt(second));
+
+
const diffInSeconds = (now.getTime() - inputDate.getTime()) / 1000;
+
const diffInMinutes = Math.round(diffInSeconds / 60);
+
const diffInHours = Math.round(diffInMinutes / 60);
+
+
if (diffInSeconds < 60) {
+
return 'just now';
+
} else if (diffInHours < 1) {
+
return diffInMinutes === 1 ? '1 minute ago' : `${diffInMinutes} minutes ago`;
+
} else if (now.toDateString() === inputDate.toDateString()) {
+
return 'today';
+
} else if (
+
new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1).toDateString() ===
+
inputDate.toDateString()
+
) {
+
return 'yesterday';
+
} else {
+
return inputDate.toLocaleTimeString([], {
+
month: 'numeric',
+
day: 'numeric',
+
hour: 'numeric',
+
minute: 'numeric',
+
});
+
}
+
}
+
+
function updateRelativeTimes() {
+
document.querySelectorAll('[data-start-time]').forEach(element => {
+
const timeStr = element.getAttribute('data-start-time');
+
element.textContent = formatTime(timeStr);
+
});
+
}
+
+
// Fetch immediately and then every 5 seconds
+
fetchStats();
+
setInterval(fetchStats, 5000);
+
+
// Update relative times every 10 seconds
+
setInterval(updateRelativeTimes, 10000);
+
</script>
+
</body>
+
+
</html>
+48
packages/zmx.nix
···
+
{ pkgs, lib, stdenv, fetchurl, autoPatchelfHook }:
+
+
stdenv.mkDerivation rec {
+
pname = "zmx";
+
version = "0.1.0";
+
+
src = fetchurl {
+
url = if stdenv.isLinux then
+
(if stdenv.isAarch64 then
+
"https://zmx.sh/a/zmx-${version}-linux-aarch64.tar.gz"
+
else
+
"https://zmx.sh/a/zmx-${version}-linux-x86_64.tar.gz")
+
else if stdenv.isDarwin then
+
(if stdenv.isAarch64 then
+
"https://zmx.sh/a/zmx-${version}-macos-aarch64.tar.gz"
+
else
+
"https://zmx.sh/a/zmx-${version}-macos-x86_64.tar.gz")
+
else throw "Unsupported platform";
+
+
hash = if stdenv.isLinux && stdenv.isAarch64 then
+
"sha256-sv83lR4DLJE+gsMtqCk6VCFdo5n4lhI0P1loxAf0iOg="
+
else if stdenv.isLinux then
+
"sha256-c+wCUcm7DEO55wXuHq0aP0Kn908jj1FM5Z+JQJnKE0M="
+
else if stdenv.isDarwin && stdenv.isAarch64 then
+
"sha256-dM6MFikdbpN+n8BK6fLbzyJfi88xetCWL9H5VfGB07o="
+
else
+
"sha256-B52NC8NEjVPDNSG11qPb0uRNExB66bllnK7ivXMJbHk=";
+
};
+
+
nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ];
+
+
sourceRoot = ".";
+
+
installPhase = ''
+
runHook preInstall
+
mkdir -p $out/bin
+
cp zmx $out/bin/
+
chmod +x $out/bin/zmx
+
runHook postInstall
+
'';
+
+
meta = with lib; {
+
description = "Session persistence for terminal processes";
+
homepage = "https://zmx.sh";
+
license = licenses.mit;
+
platforms = platforms.unix;
+
};
+
}
secrets/battleship-arena.age

This is a binary file and will not be displayed.

+13
secrets/frp-auth-token.age
···
+
age-encryption.org/v1
+
-> ssh-rsa DqcG0Q
+
O9AWztjhnwqJ/hh/jmHu0E+7DTK27ZB7A4eJBowY2hoMrEPabrGBPhZlLoTlSk6x
+
8GTzzdC4cU6jBBwJm3CrrVgxRlIBL23Vz0AWOKfyoFUraYZxDsoifeNAqQ/hgQ1Y
+
BntX55o5z5UhE7M1Dwa57haRnBD/2K2TRQR3BNrFGjHUhiiC4ovavULf3/Ac9trh
+
+umeYLBLK7pPQGhGytrVIIOmGdRq4ZzV8bfUsZyaJiVO5VACshsQWkx0Pj4szKXk
+
/gRerjo2P8yZJ7kg+aRn7cD6WdcpCMQZVbKgtIbe5BE15AzCdxprgQBz4N0Uthox
+
J53hLGvAOgHYdR8CHebymxBNMFdaYBPjBwhHyAlTi5TrPy5S9XtyBEg6h0mHeo+L
+
kSlUacifevkE4qZM5pVVf29YCvAPEC6VlQLAb3m4bppnpg2NBZJQo8iXNP88G53X
+
3axYCAufQttqcUe97yzcHYqXin8UXN8yJXjFNBXPtQ3ScVuSPWO+2V9pyDPRZhk8
+
+
--- 1JfGe2s3sQu5LP07sNvuBwqGUOiOQnrtQXp9+pE4ms8
+
(I ��Pfc�h,X��d�� ��x��O��p��p�F���'`�����u�
+6
secrets/secrets.nix
···
"emojibot.age".publicKeys = [
kierank
];
+
"battleship-arena.age".publicKeys = [
+
kierank
+
];
+
"frp-auth-token.age".publicKeys = [
+
kierank
+
];
}