Compare commits

..

354 Commits

Author SHA1 Message Date
59cfc0d02f improved unit tests 2025-12-06 21:29:51 -05:00
3914a1a7ab used TOKEN from conftest and updated coverage.run source 2025-12-06 21:17:44 -05:00
b5ac770003 reworked AGENTS.md 2025-12-06 20:58:29 -05:00
12e398514b added conftest.py 2025-12-06 20:43:54 -05:00
69f9ef8187 updated AGENTS.md 2025-12-06 20:41:33 -05:00
1b171fcd3e added format_code.md to .agent 2025-12-06 18:53:19 -05:00
16d938dc59 Merge branch 'main' into feature/adding-fix_eval_warnings.yml 2025-12-06 17:54:55 -05:00
7ffb7b4a37 adding AGENTS.md 2025-12-06 17:54:03 -05:00
c7fe44755f Merge branch 'main' into feature/adding-fix_eval_warnings.yml 2025-12-06 17:32:38 -05:00
bb9200860e adding fix_eval_warnings.yml 2025-12-06 17:31:08 -05:00
eb04f4a56d 'system' has been renamed to/replaced by 'stdenv.hostPlatform.system' 2025-12-06 12:45:55 -05:00
b91f7c34e1 'system' has been renamed to/replaced by 'stdenv.hostPlatform.system' 2025-12-06 12:37:22 -05:00
5b8e543226 added environment sensor 2025-12-06 12:33:10 -05:00
da48f62195 splint HA battery monitoring 2025-12-06 12:33:10 -05:00
60f2ab1039 testing google antigravity 2025-12-06 12:24:54 -05:00
c1de454005 ran treefmt 2025-11-28 09:16:46 -05:00
391e37b746 fixing git user settings 2025-11-28 09:16:46 -05:00
github-actions[bot]
27565173d4 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/0d05242?dir=pkgs/firefox-addons' (2025-11-20)
  → 'gitlab:rycee/nur-expressions/cefce78?dir=pkgs/firefox-addons' (2025-11-21)
• Updated input 'home-manager':
    'github:nix-community/home-manager/ea164b7' (2025-11-17)
  → 'github:nix-community/home-manager/d10a9b1' (2025-11-21)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/973aa8b' (2025-11-21)
  → 'github:nixos/nixpkgs/8a7cf7e' (2025-11-22)
2025-11-22 09:49:19 -05:00
0c0ed92cb4 fixing user git settings 2025-11-20 21:36:54 -05:00
github-actions[bot]
cc9996d6fa flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/d84c9ea?dir=pkgs/firefox-addons' (2025-11-14)
  → 'gitlab:rycee/nur-expressions/0d05242?dir=pkgs/firefox-addons' (2025-11-20)
• Updated input 'home-manager':
    'github:nix-community/home-manager/827f2a2' (2025-11-12)
  → 'github:nix-community/home-manager/ea164b7' (2025-11-17)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/c5ae371' (2025-11-12)
  → 'github:nixos/nixpkgs/89c2b23' (2025-11-17)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/20f91b6' (2025-11-15)
  → 'github:nixos/nixpkgs/973aa8b' (2025-11-21)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/a2bcd1c' (2025-11-13)
  → 'github:Mic92/sops-nix/877bb49' (2025-11-20)
2025-11-20 21:30:32 -05:00
102f36eb1b adding post quantum ssh KexAlgorithms 2025-11-16 08:22:41 -05:00
9ec988729b testing zfs_unstable and linuxPackages_6_17 2025-11-15 13:47:13 -05:00
4e3c25afb4 added draw io setting 2025-11-15 13:47:13 -05:00
0d482aca4b HA update 2025-11-15 13:47:13 -05:00
github-actions[bot]
c624781d84 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/5cca27f1bb30a26140d0cf60ab34daa45b4fa11f?dir=pkgs/firefox-addons&narHash=sha256-h%2BliPhhMw1yYvkDGLHzQJQShQs%2ByLjNgjfAyZX%2BsRrM%3D' (2025-10-17)
  → 'gitlab:rycee/nur-expressions/d84c9ea299c1e4629f0d0716799f5c57975021ce?dir=pkgs/firefox-addons&narHash=sha256-FjnOyxTNNt85ZNjtLqRnG23LKQyvilGzyrO0bLffMm8%3D' (2025-11-14)
• Updated input 'home-manager':
    'github:nix-community/home-manager/722792af097dff5790f1a66d271a47759f477755?narHash=sha256-mlDqR1Ntgs9uYYEAUR1IhamKBO0lxoNS4zGLzEZaY0A%3D' (2025-10-17)
  → 'github:nix-community/home-manager/827f2a23373a774a8805f84ca5344654c31f354b?narHash=sha256-RYHN8O/Aja59XDji6WSJZPkJpYVUfpSkyH%2BPEupBJqM%3D' (2025-11-12)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/9ed85f8afebf2b7478f25db0a98d0e782c0ed903?narHash=sha256-2GoxVaKWTHBxRoeUYSjv0AfSOx4qw5CWSFz2b%2BVolKU%3D' (2025-10-10)
  → 'github:nixos/nixos-hardware/899dc449bc6428b9ee6b3b8f771ca2b0ef945ab9?narHash=sha256-BWWnUUT01lPwCWUvS0p6Px5UOBFeXJ8jR%2BZdLX8IbrU%3D' (2025-11-11)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/544961dfcce86422ba200ed9a0b00dd4b1486ec5?narHash=sha256-EVAqOteLBFmd7pKkb0%2BFIUyzTF61VKi7YmvP1tw4nEw%3D' (2025-10-15)
  → 'github:nixos/nixpkgs/c5ae371f1a6a7fd27823bc500d9390b38c05fa55?narHash=sha256-4PqRErxfe%2B2toFJFgcRKZ0UI9NSIOJa%2B7RXVtBhy4KE%3D' (2025-11-12)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/d85429339c0bcf0428084fe1306c970aed364417?narHash=sha256-1296zQfPiLZNrLKzX1t%2BkunadeI/mH82hKze3voduEI%3D' (2025-10-18)
  → 'github:nixos/nixpkgs/20f91b6ba5eff456057e359946c3e832173b18df?narHash=sha256-jVuaLD1Yf2aHILt2EedLFhqJnQXAS8kIo3P4LbtYDyg%3D' (2025-11-15)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/ab8d56e85b8be14cff9d93735951e30c3e86a437?narHash=sha256-8mN3kqyqa2PKY0wwZ2UmMEYMcxvNTwLaOrrDsw6Qi4E%3D' (2025-10-13)
  → 'github:Mic92/sops-nix/a2bcd1c25c1d29e22756ccae094032ab4ada2268?narHash=sha256-A91a%2BK0Q9wfdPLwL06e/kbHeAWSzPYy2EGdTDsyfb%2Bs%3D' (2025-11-13)
2025-11-15 13:47:13 -05:00
f4996b71e4 updating to inputs.self 2025-11-11 00:11:30 -05:00
58a29214d3 testing "${self}/ in imports 2025-11-11 00:11:30 -05:00
c4171b56b5 fixed systemd.nix 2025-11-10 23:21:54 -05:00
d6d48516ea updated PYTHONPATH to "${self}/" 2025-11-10 23:21:54 -05:00
ae882ba578 flake lock update 2025-11-10 23:21:54 -05:00
100b8145e8 fixed PYTHONPATH 2025-11-10 23:21:54 -05:00
e99cd8e54a removed system_tools 2025-11-10 23:21:54 -05:00
de9348432c deleted temp_flake.lock 2025-11-10 23:21:54 -05:00
b1fa596f37 fix victron_modbuss gps setting 2025-11-10 12:02:14 -05:00
908bccb8dc fixed typo 2025-11-08 08:21:27 -05:00
b8cc9c5772 testing dev shell for python pytest 2025-11-08 08:21:27 -05:00
d62076a900 added psycopg to my_python 2025-11-08 08:21:27 -05:00
0c9bd40659 fixed mypy and ruff errors 2025-11-08 08:21:27 -05:00
f713b8d4fa added safe_insert 2025-11-08 08:21:27 -05:00
ddba7d1068 disabling use_x_forwarded_for for brain HA 2025-11-08 07:11:30 -05:00
41aad90140 updated python.defaultInterpreterPath 2025-11-01 18:00:38 -04:00
76cd6e1188 adding osu-lazer for 2025-11-01 18:00:38 -04:00
20ef02b0cc removed n8n 2025-11-01 00:06:00 -04:00
c0e9f3f937 updated the first post 2025-11-01 00:02:02 -04:00
9e0a2810f5 adding baseurl and updating index.md 2025-11-01 00:02:02 -04:00
5c488422a1 added jekyll-paginate 2025-11-01 00:02:02 -04:00
9d43704b64 added gemfile inxed.md and fixed typo 2025-11-01 00:02:02 -04:00
d5bc6e9c6e Delete CNAME 2025-11-01 00:02:02 -04:00
17cebe1a82 Create CNAME 2025-11-01 00:02:02 -04:00
f02a866b19 updated theme 2025-11-01 00:02:02 -04:00
65c2bed046 testing blog 2025-11-01 00:02:02 -04:00
26cf123357 fixed ruff errors 2025-10-31 22:37:54 -04:00
a7c0a58c9a playing with logging 2025-10-31 22:37:54 -04:00
e89fb9fae1 mixed a format 2025-10-31 22:37:54 -04:00
44feda70c1 removed trusted_proxies from home_assistant 2025-10-31 22:37:54 -04:00
1bfdbfd785 fixed all ruff error in python 2025-10-31 22:37:54 -04:00
6a09bc66b6 fixed most ruff error 2025-10-31 22:37:54 -04:00
65fca5c8a4 added ruff the treefmt 2025-10-31 22:37:54 -04:00
a6e2334999 fixed systemd tests 2025-10-31 22:37:54 -04:00
c5981e0e6c testing python -m pytest tests 2025-10-31 22:37:54 -04:00
825672a450 added tests 2025-10-31 22:37:54 -04:00
d2db0de371 added my_python pkgs 2025-10-31 22:37:54 -04:00
8142582e4a disabled kafka 2025-10-31 22:37:54 -04:00
3038e1c704 updated cSpell words 2025-10-31 22:37:54 -04:00
18de5bc12c got python default.nix working 2025-10-31 22:37:54 -04:00
4fa2141461 added common and paralleize 2025-10-31 22:37:54 -04:00
626bd70d67 added installer 2025-10-31 22:37:54 -04:00
8ed7eda020 added tools 2025-10-31 22:37:54 -04:00
e9ae9478bf added random 2025-10-31 22:37:54 -04:00
c1ce7e0ac4 added zfs 2025-10-31 22:37:54 -04:00
d040b06869 added system_tests 2025-10-31 22:37:54 -04:00
04c41c6ac0 fixed typo 2025-10-31 20:10:46 -04:00
298adcce87 added charger to modbuss 2025-10-31 20:10:46 -04:00
ef25153c84 setting up esphome 2025-10-31 20:10:46 -04:00
9416bbd00b added gps data to victron_modbuss.yaml 2025-10-28 21:15:07 -04:00
b8200af6d5 updated victron_modbuss = "!include 2025-10-26 08:34:32 -04:00
afb62b97d1 got usb decrypt working 2025-10-26 08:34:32 -04:00
cf75f3d75a added esp home 2025-10-26 08:34:32 -04:00
0f8a594545 updated haproxy.cfg 2025-10-26 08:34:32 -04:00
db37eb2f9e added victron_modbuss.yaml 2025-10-26 08:34:32 -04:00
534d9110e2 added bluetooth to brain 2025-10-26 08:34:32 -04:00
86a1cac42c added forecast_solar 2025-10-26 08:34:32 -04:00
d3452dfab5 removed eleises ssh config 2025-10-26 08:34:32 -04:00
acab92ac9c updated brain home assistant 2025-10-26 08:34:32 -04:00
github-actions[bot]
f22a9d107a flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/7ca23f73a8caea22efaa6a298e0c505057722e42?dir=pkgs/firefox-addons&narHash=sha256-5PQfBVloDHMnWiuK4ir%2BawRYCCWWVC/pb5FdtBiroDQ%3D' (2025-10-10)
  → 'gitlab:rycee/nur-expressions/5cca27f1bb30a26140d0cf60ab34daa45b4fa11f?dir=pkgs/firefox-addons&narHash=sha256-h%2BliPhhMw1yYvkDGLHzQJQShQs%2ByLjNgjfAyZX%2BsRrM%3D' (2025-10-17)
• Updated input 'home-manager':
    'github:nix-community/home-manager/d305eece827a3fe317a2d70138f53feccaf890a1?narHash=sha256-GKMwBaFRw/C1p1VtjDz4DyhyzjKUWyi1K50bh8lgA2E%3D' (2025-10-10)
  → 'github:nix-community/home-manager/722792af097dff5790f1a66d271a47759f477755?narHash=sha256-mlDqR1Ntgs9uYYEAUR1IhamKBO0lxoNS4zGLzEZaY0A%3D' (2025-10-17)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/0b4defa2584313f3b781240b29d61f6f9f7e0df3?narHash=sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw%3D' (2025-10-09)
  → 'github:nixos/nixpkgs/544961dfcce86422ba200ed9a0b00dd4b1486ec5?narHash=sha256-EVAqOteLBFmd7pKkb0%2BFIUyzTF61VKi7YmvP1tw4nEw%3D' (2025-10-15)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/fc430b0bdf9a58513b9f4607ef6f283f5c262e78?narHash=sha256-aQe1Yx9dsxVKQfAVI5dFHdQnFobnVMy6/wURXFoOKJ8%3D' (2025-10-11)
  → 'github:nixos/nixpkgs/d85429339c0bcf0428084fe1306c970aed364417?narHash=sha256-1296zQfPiLZNrLKzX1t%2BkunadeI/mH82hKze3voduEI%3D' (2025-10-18)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/6e5a38e08a2c31ae687504196a230ae00ea95133?narHash=sha256-UvzKi02LMFP74csFfwLPAZ0mrE7k6EiYaKecplyX9Qk%3D' (2025-10-05)
  → 'github:Mic92/sops-nix/ab8d56e85b8be14cff9d93735951e30c3e86a437?narHash=sha256-8mN3kqyqa2PKY0wwZ2UmMEYMcxvNTwLaOrrDsw6Qi4E%3D' (2025-10-13)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/db77c09c654e589fabb0d401c9bc48c1738e17e1?narHash=sha256-BmGGRq81ngdaosuYXDF6RYXdWLW7kd%2Bi7dy17WGTLio%3D' (2025-10-17)
  → 'github:RichieCahill/system_tools/a125c3e5c01cecbc3f2a842ffb1abb1210c35706?narHash=sha256-u/uciy9kpM/CBZKl05iAZRaOTwUHiuI0L/qbkk2mLUg%3D' (2025-10-18)
2025-10-17 22:05:18 -04:00
e5e0f883b0 updated system_tools 2025-10-17 18:20:27 -04:00
04bf6f2038 updated commands with typer 2025-10-17 18:20:27 -04:00
d35ba60c69 adding n8n 2025-10-17 12:38:12 -04:00
1e85635e89 updating ssh configs 2025-10-17 12:38:12 -04:00
6423192ee7 adding keyFile to brain 2025-10-17 12:29:46 -04:00
github-actions[bot]
a33aba3afc flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/df243385cb4a2263b4888687961ec1f2b5f641f3?dir=pkgs/firefox-addons&narHash=sha256-wy15H4AbfQpTWes4aoFaIxkvK6e9p0lyvypOsTMt5f0%3D' (2025-10-03)
  → 'gitlab:rycee/nur-expressions/7ca23f73a8caea22efaa6a298e0c505057722e42?dir=pkgs/firefox-addons&narHash=sha256-5PQfBVloDHMnWiuK4ir%2BawRYCCWWVC/pb5FdtBiroDQ%3D' (2025-10-10)
• Updated input 'home-manager':
    'github:nix-community/home-manager/edafd6da1936426708f1be0b1a4288007f16639a?narHash=sha256-0aXlKPxm2M%2BF5oywX2TTbY0e6h%2BtQ%2B6OYyx7UZn3A4A%3D' (2025-10-04)
  → 'github:nix-community/home-manager/d305eece827a3fe317a2d70138f53feccaf890a1?narHash=sha256-GKMwBaFRw/C1p1VtjDz4DyhyzjKUWyi1K50bh8lgA2E%3D' (2025-10-10)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/e087756cf4abbe1a34f3544c480fc1034d68742f?narHash=sha256-wPd5oGvBBpUEzMF0kWnXge0WITNsITx/aGI9qLHgJ4g%3D' (2025-09-30)
  → 'github:nixos/nixos-hardware/9ed85f8afebf2b7478f25db0a98d0e782c0ed903?narHash=sha256-2GoxVaKWTHBxRoeUYSjv0AfSOx4qw5CWSFz2b%2BVolKU%3D' (2025-10-10)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/7df7ff7d8e00218376575f0acdcc5d66741351ee?narHash=sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs%3D' (2025-10-02)
  → 'github:nixos/nixpkgs/0b4defa2584313f3b781240b29d61f6f9f7e0df3?narHash=sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw%3D' (2025-10-09)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/27ac93958969b5f3dccd654b402599cf3de633ac?narHash=sha256-hhM8SUI6kQMei5TImFdNQy9EDT8g2hAD161DUtbfAy0%3D' (2025-10-04)
  → 'github:nixos/nixpkgs/fc430b0bdf9a58513b9f4607ef6f283f5c262e78?narHash=sha256-aQe1Yx9dsxVKQfAVI5dFHdQnFobnVMy6/wURXFoOKJ8%3D' (2025-10-11)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/9fcfabe085281dd793589bdc770a2e577a3caa5d?narHash=sha256-f9QC2KKiNReZDG2yyKAtDZh0rSK2Xp1wkPzKbHeQVRU%3D' (2025-09-29)
  → 'github:Mic92/sops-nix/6e5a38e08a2c31ae687504196a230ae00ea95133?narHash=sha256-UvzKi02LMFP74csFfwLPAZ0mrE7k6EiYaKecplyX9Qk%3D' (2025-10-05)
2025-10-10 22:26:27 -04:00
github-actions[bot]
d4d481e4b2 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/58402e09ad48f9f509d9249b8704c1a4f390c434?dir=pkgs/firefox-addons&narHash=sha256-vWk2iw/i5c0RHc/zLVyB51UYvmbzPq3uB14NN7kaouE%3D' (2025-09-26)
  → 'gitlab:rycee/nur-expressions/df243385cb4a2263b4888687961ec1f2b5f641f3?dir=pkgs/firefox-addons&narHash=sha256-wy15H4AbfQpTWes4aoFaIxkvK6e9p0lyvypOsTMt5f0%3D' (2025-10-03)
• Updated input 'home-manager':
    'github:nix-community/home-manager/bc2afee55bc5d3b825287829d6592b9cc1405aad?narHash=sha256-ZqaRdd%2BKoR54dNJPtd7UX4O0X%2B02YItnTpQVu28lSVI%3D' (2025-09-26)
  → 'github:nix-community/home-manager/edafd6da1936426708f1be0b1a4288007f16639a?narHash=sha256-0aXlKPxm2M%2BF5oywX2TTbY0e6h%2BtQ%2B6OYyx7UZn3A4A%3D' (2025-10-04)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/170ff93c860b2a9868ed1e1102d4e52cb3d934e1?narHash=sha256-6CFdj7Xs616t1W4jLDH7IohAAvl5Dyib3qEv/Uqw1rk%3D' (2025-09-23)
  → 'github:nixos/nixos-hardware/e087756cf4abbe1a34f3544c480fc1034d68742f?narHash=sha256-wPd5oGvBBpUEzMF0kWnXge0WITNsITx/aGI9qLHgJ4g%3D' (2025-09-30)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/e643668fd71b949c53f8626614b21ff71a07379d?narHash=sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o%3D' (2025-09-24)
  → 'github:nixos/nixpkgs/7df7ff7d8e00218376575f0acdcc5d66741351ee?narHash=sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs%3D' (2025-10-02)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/a62c2e5c3808f706316d1477ea3f8d02128886af?narHash=sha256-rjkIdtpJ47tJ3AmTnQLWKhm51xTI1GgGh/pVN3rBZzQ%3D' (2025-09-27)
  → 'github:nixos/nixpkgs/27ac93958969b5f3dccd654b402599cf3de633ac?narHash=sha256-hhM8SUI6kQMei5TImFdNQy9EDT8g2hAD161DUtbfAy0%3D' (2025-10-04)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/e0fdaea3c31646e252a60b42d0ed8eafdb289762?narHash=sha256-L3N8zV6wsViXiD8i3WFyrvjDdz76g3tXKEdZ4FkgQ%2BY%3D' (2025-09-21)
  → 'github:Mic92/sops-nix/9fcfabe085281dd793589bdc770a2e577a3caa5d?narHash=sha256-f9QC2KKiNReZDG2yyKAtDZh0rSK2Xp1wkPzKbHeQVRU%3D' (2025-09-29)
2025-10-03 22:24:39 -04:00
f092348736 updated elises groups 2025-09-27 12:36:33 -04:00
e6c3ae0bee adding xcursorgen for elise 2025-09-27 12:29:04 -04:00
d1f4f21521 added zerotier to leviathan 2025-09-27 11:56:20 -04:00
00a5536208 updated brain ssh config 2025-09-27 11:56:20 -04:00
b554325b13 added brain to syncthing 2025-09-27 11:56:20 -04:00
357168695c updated brain ip 2025-09-27 11:56:20 -04:00
fc31447591 updated brain ip 2025-09-27 11:56:20 -04:00
eea620aa2f Removed users.mutableUsers = True from brain 2025-09-27 11:56:20 -04:00
82d463bfd6 fixed imports 2025-09-27 11:56:20 -04:00
ca8c9925ad added brain to the flake 2025-09-27 11:56:20 -04:00
45a31e6b4d updated networking 2025-09-27 11:56:20 -04:00
c4be520190 adding brain 2025-09-27 11:56:20 -04:00
28cd7f3f6f adding user for dov 2025-09-27 11:56:20 -04:00
github-actions[bot]
879885dc3b flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/7c0e1d343108cbaaf448353fadb62190246251a8?dir=pkgs/firefox-addons&narHash=sha256-PsQSN226ZZ4KnweNspxKTzF8ztdPOAT6%2BgpGkxnygpg%3D' (2025-09-19)
  → 'gitlab:rycee/nur-expressions/58402e09ad48f9f509d9249b8704c1a4f390c434?dir=pkgs/firefox-addons&narHash=sha256-vWk2iw/i5c0RHc/zLVyB51UYvmbzPq3uB14NN7kaouE%3D' (2025-09-26)
• Updated input 'home-manager':
    'github:nix-community/home-manager/55b1f5b7b191572257545413b98e37abab2fdb00?narHash=sha256-l60D1i0aaSqemy9dL7wP0ePMfcv/oZbeKpvUMY%2Bq0kQ%3D' (2025-09-19)
  → 'github:nix-community/home-manager/bc2afee55bc5d3b825287829d6592b9cc1405aad?narHash=sha256-ZqaRdd%2BKoR54dNJPtd7UX4O0X%2B02YItnTpQVu28lSVI%3D' (2025-09-26)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/67a709cfe5d0643dafd798b0b613ed579de8be05?narHash=sha256-w6cDExPBqbq7fTLo4dZ1ozDGeq3yV6dSN4n/sAaS6OM%3D' (2025-09-15)
  → 'github:nixos/nixos-hardware/170ff93c860b2a9868ed1e1102d4e52cb3d934e1?narHash=sha256-6CFdj7Xs616t1W4jLDH7IohAAvl5Dyib3qEv/Uqw1rk%3D' (2025-09-23)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/0147c2f1d54b30b5dd6d4a8c8542e8d7edf93b5d?narHash=sha256-7To75JlpekfUmdkUZewnT6MoBANS0XVypW6kjUOXQwc%3D' (2025-09-18)
  → 'github:nixos/nixpkgs/e643668fd71b949c53f8626614b21ff71a07379d?narHash=sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o%3D' (2025-09-24)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/319145a716f6547ff9cce8ddb32568726b24427b?narHash=sha256-4s7UlIKlZS7zC5545quIPh6YHkO491RRyNC5G2nqinQ%3D' (2025-09-20)
  → 'github:nixos/nixpkgs/a62c2e5c3808f706316d1477ea3f8d02128886af?narHash=sha256-rjkIdtpJ47tJ3AmTnQLWKhm51xTI1GgGh/pVN3rBZzQ%3D' (2025-09-27)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/f77d4cfa075c3de66fc9976b80e0c4fc69e2c139?narHash=sha256-HYnwlbY6RE5xVd5rh0bYw77pnD8lOgbT4mlrfjgNZ0c%3D' (2025-09-16)
  → 'github:Mic92/sops-nix/e0fdaea3c31646e252a60b42d0ed8eafdb289762?narHash=sha256-L3N8zV6wsViXiD8i3WFyrvjDdz76g3tXKEdZ4FkgQ%2BY%3D' (2025-09-21)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/d63c486fe3b76c24b2ed2fff33d6f54c847b50e8?narHash=sha256-6r45DD/tMN%2BhYgnMc2/c82Z0bb1A7FnI/nvU8kZf/Us%3D' (2025-09-15)
  → 'github:RichieCahill/system_tools/b79f5abdf9237b9c07c075a6f96a88071ae5ac8b?narHash=sha256-TCuxPVk4Cq9MazXED0APSJi12tOIyT8MgSO5hGJU1l0%3D' (2025-09-21)
2025-09-26 22:26:23 -04:00
5e03efa1e8 removed password 2025-09-26 22:03:12 -04:00
2ed08501fe adding user for dov 2025-09-26 22:03:12 -04:00
c36624cc55 added compression to jeeves ssh settings 2025-09-24 18:16:49 -04:00
f074344ac8 feature/updated Elises gui packages 2025-09-24 18:16:49 -04:00
github-actions[bot]
b773eb2db7 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/285da329ed3e03565cba6f92b7f21350831266e3?dir=pkgs/firefox-addons&narHash=sha256-Fsb3Tpo3QRlRAKvDCoMvWD99y%2BioY62kgU/cjMr203U%3D' (2025-09-18)
  → 'gitlab:rycee/nur-expressions/7c0e1d343108cbaaf448353fadb62190246251a8?dir=pkgs/firefox-addons&narHash=sha256-PsQSN226ZZ4KnweNspxKTzF8ztdPOAT6%2BgpGkxnygpg%3D' (2025-09-19)
• Updated input 'home-manager':
    'github:nix-community/home-manager/b5698ed57db7ee7da5e93df2e6bbada91c88f3ce?narHash=sha256-BG7GlXo5moXtrFSCqnkIb1Q00szOZXTj5Dx7NmWgves%3D' (2025-09-18)
  → 'github:nix-community/home-manager/55b1f5b7b191572257545413b98e37abab2fdb00?narHash=sha256-l60D1i0aaSqemy9dL7wP0ePMfcv/oZbeKpvUMY%2Bq0kQ%3D' (2025-09-19)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/8d4ddb19d03c65a36ad8d189d001dc32ffb0306b?narHash=sha256-qqIJ3yxPiB0ZQTT9//nFGQYn8X/PBoJbofA7hRKZnmE%3D' (2025-09-16)
  → 'github:nixos/nixpkgs/0147c2f1d54b30b5dd6d4a8c8542e8d7edf93b5d?narHash=sha256-7To75JlpekfUmdkUZewnT6MoBANS0XVypW6kjUOXQwc%3D' (2025-09-18)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/2ea7a78d192f539e8e70367c6de01e03fdd6f072?narHash=sha256-gzHfMSq3zKUdTfTZ7WMptrxS8yGwCC5wlXeK6OU9AXU%3D' (2025-09-18)
  → 'github:nixos/nixpkgs/319145a716f6547ff9cce8ddb32568726b24427b?narHash=sha256-4s7UlIKlZS7zC5545quIPh6YHkO491RRyNC5G2nqinQ%3D' (2025-09-20)
2025-09-19 22:26:47 -04:00
github-actions[bot]
6efcc9add1 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/789920825fc982a93a2bf91a714367fa8f7ea0a6?dir=pkgs/firefox-addons&narHash=sha256-VjtA%2BfqkraKHbGzjKJBPfDj%2BSXysXiR4SrghTr10HoY%3D' (2025-09-12)
  → 'gitlab:rycee/nur-expressions/285da329ed3e03565cba6f92b7f21350831266e3?dir=pkgs/firefox-addons&narHash=sha256-Fsb3Tpo3QRlRAKvDCoMvWD99y%2BioY62kgU/cjMr203U%3D' (2025-09-18)
• Updated input 'home-manager':
    'github:nix-community/home-manager/a3fcc92180c7462082cd849498369591dfb20855?narHash=sha256-UqHHGydF/q3jfYXCpvYLA0TWtvByOp1NwOKCUjhYmPs%3D' (2025-09-12)
  → 'github:nix-community/home-manager/b5698ed57db7ee7da5e93df2e6bbada91c88f3ce?narHash=sha256-BG7GlXo5moXtrFSCqnkIb1Q00szOZXTj5Dx7NmWgves%3D' (2025-09-18)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/11b2a10c7be726321bb854403fdeec391e798bf0?narHash=sha256-PtT7ix43ss8PONJ1VJw3f6t2yAoGH%2Bq462Sn8lrmWmk%3D' (2025-09-05)
  → 'github:nixos/nixos-hardware/67a709cfe5d0643dafd798b0b613ed579de8be05?narHash=sha256-w6cDExPBqbq7fTLo4dZ1ozDGeq3yV6dSN4n/sAaS6OM%3D' (2025-09-15)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/ab0f3607a6c7486ea22229b92ed2d355f1482ee0?narHash=sha256-zwE/e7CuPJUWKdvvTCB7iunV4E/%2BG0lKfv4kk/5Izdg%3D' (2025-09-10)
  → 'github:nixos/nixpkgs/8d4ddb19d03c65a36ad8d189d001dc32ffb0306b?narHash=sha256-qqIJ3yxPiB0ZQTT9//nFGQYn8X/PBoJbofA7hRKZnmE%3D' (2025-09-16)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/2ca437b4796d049192eb30576a50fef139038c09?narHash=sha256-VBS5%2BYKIT8Aj81ZW%2B8Bg9MuYoI6OqO6HSrwG4dpHpW4%3D' (2025-09-12)
  → 'github:nixos/nixpkgs/2ea7a78d192f539e8e70367c6de01e03fdd6f072?narHash=sha256-gzHfMSq3zKUdTfTZ7WMptrxS8yGwCC5wlXeK6OU9AXU%3D' (2025-09-18)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/0bf793823386187dff101ee2a9d4ed26de8bbf8c?narHash=sha256-S9F6bHUBh%2BCFEUalv/qxNImRapCxvSnOzWBUZgK1zDU%3D' (2025-09-10)
  → 'github:Mic92/sops-nix/f77d4cfa075c3de66fc9976b80e0c4fc69e2c139?narHash=sha256-HYnwlbY6RE5xVd5rh0bYw77pnD8lOgbT4mlrfjgNZ0c%3D' (2025-09-16)
2025-09-18 21:28:20 -04:00
bff561946f reviewed coderabbit 2025-09-15 08:55:55 -04:00
1ec05d13da updated system_tools 2025-09-15 08:55:55 -04:00
4686a85bcd added EnvironmentFile to snapshot_manager 2025-09-15 08:55:55 -04:00
3434b32fbe added signal_cli_rest_api 2025-09-15 08:55:55 -04:00
98d9efcde3 updated system_tools 2025-09-15 08:55:55 -04:00
github-actions[bot]
4286f39177 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/1b0f57c7a959cdfe8e68b98845ae8445cb0aa132?dir=pkgs/firefox-addons&narHash=sha256-K3%2BOooIM2hf8fauVMMY79C%2BCHHxbUkOyWfz8YpNxZcM%3D' (2025-09-05)
  → 'gitlab:rycee/nur-expressions/789920825fc982a93a2bf91a714367fa8f7ea0a6?dir=pkgs/firefox-addons&narHash=sha256-VjtA%2BfqkraKHbGzjKJBPfDj%2BSXysXiR4SrghTr10HoY%3D' (2025-09-12)
• Updated input 'home-manager':
    'github:nix-community/home-manager/f56bf065f9abedc7bc15e1f2454aa5c8edabaacf?narHash=sha256-a%2BNMGl5tcvm%2BhyfSG2DlVPa8nZLpsumuRj1FfcKb2mQ%3D' (2025-09-05)
  → 'github:nix-community/home-manager/a3fcc92180c7462082cd849498369591dfb20855?narHash=sha256-UqHHGydF/q3jfYXCpvYLA0TWtvByOp1NwOKCUjhYmPs%3D' (2025-09-12)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/d0fc30899600b9b3466ddb260fd83deb486c32f1?narHash=sha256-rw/PHa1cqiePdBxhF66V7R%2BWAP8WekQ0mCDG4CFqT8Y%3D' (2025-09-02)
  → 'github:nixos/nixpkgs/ab0f3607a6c7486ea22229b92ed2d355f1482ee0?narHash=sha256-zwE/e7CuPJUWKdvvTCB7iunV4E/%2BG0lKfv4kk/5Izdg%3D' (2025-09-10)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/d1537033b5e932eeb7c89165ead8c0f3b322ff31?narHash=sha256-%2BdcNz3EOCmZd2XCxeTcucoGNK8Onn4518yqhCr4x0w8%3D' (2025-09-06)
  → 'github:nixos/nixpkgs/2ca437b4796d049192eb30576a50fef139038c09?narHash=sha256-VBS5%2BYKIT8Aj81ZW%2B8Bg9MuYoI6OqO6HSrwG4dpHpW4%3D' (2025-09-12)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/3223c7a92724b5d804e9988c6b447a0d09017d48?narHash=sha256-t%2Bvoe2961vCgrzPFtZxha0/kmFSHFobzF00sT8p9h0U%3D' (2025-08-12)
  → 'github:Mic92/sops-nix/0bf793823386187dff101ee2a9d4ed26de8bbf8c?narHash=sha256-S9F6bHUBh%2BCFEUalv/qxNImRapCxvSnOzWBUZgK1zDU%3D' (2025-09-10)
2025-09-12 22:22:47 -04:00
0fe439ceaf updated HostName in programs.ssh.extraConfig 2025-09-12 00:15:54 -04:00
7a3c2026b3 updating programs ssh settings 2025-09-12 00:12:18 -04:00
0c9ce78c20 added testdisk 2025-09-10 22:06:54 -04:00
c10a76babc removed games.nix 2025-09-10 21:58:26 -04:00
113ca9c99a removed open-webui 2025-09-10 21:58:26 -04:00
29f51bf116 testing linuxPackages_6_16 2025-09-10 21:58:26 -04:00
9f3a2b2a4b testing continue-on-error: true and linuxPackages_6_17 2025-09-10 21:58:26 -04:00
github-actions[bot]
8a4d021541 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/56254103ed36317cf471da3c93ac13805c72a7fa?dir=pkgs/firefox-addons&narHash=sha256-RzTBJ5ERXrJk7JPIDp1vjUNMKka6tyg4RctIR3cxqsM%3D' (2025-08-22)
  → 'gitlab:rycee/nur-expressions/1b0f57c7a959cdfe8e68b98845ae8445cb0aa132?dir=pkgs/firefox-addons&narHash=sha256-K3%2BOooIM2hf8fauVMMY79C%2BCHHxbUkOyWfz8YpNxZcM%3D' (2025-09-05)
• Updated input 'home-manager':
    'github:nix-community/home-manager/6911d3e7f475f7b3558b4f5a6aba90fa86099baa?narHash=sha256-QdenO8f0PTg%2BtC6HuSvngKcbRZA5oZKmjUT%2BMXKOLQg%3D' (2025-08-21)
  → 'github:nix-community/home-manager/f56bf065f9abedc7bc15e1f2454aa5c8edabaacf?narHash=sha256-a%2BNMGl5tcvm%2BhyfSG2DlVPa8nZLpsumuRj1FfcKb2mQ%3D' (2025-09-05)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/3dac8a872557e0ca8c083cdcfc2f218d18e113b0?narHash=sha256-aJHFJWP9AuI8jUGzI77LYcSlkA9wJnOIg4ZqftwNGXA%3D' (2025-08-16)
  → 'github:nixos/nixos-hardware/11b2a10c7be726321bb854403fdeec391e798bf0?narHash=sha256-PtT7ix43ss8PONJ1VJw3f6t2yAoGH%2Bq462Sn8lrmWmk%3D' (2025-09-05)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/20075955deac2583bb12f07151c2df830ef346b4?narHash=sha256-HMwfAJBdrr8wXAkbGhtcby1zGFvs%2BStOp19xNsbqdOg%3D' (2025-08-19)
  → 'github:nixos/nixpkgs/d0fc30899600b9b3466ddb260fd83deb486c32f1?narHash=sha256-rw/PHa1cqiePdBxhF66V7R%2BWAP8WekQ0mCDG4CFqT8Y%3D' (2025-09-02)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/db18278efcff292f5c3f41c52fc89f5d69227155?narHash=sha256-eK6b2F%2BQlBPQjrkhuf/1msR5Z2guESncBw%2BfuwNPVOA%3D' (2025-08-22)
  → 'github:nixos/nixpkgs/d1537033b5e932eeb7c89165ead8c0f3b322ff31?narHash=sha256-%2BdcNz3EOCmZd2XCxeTcucoGNK8Onn4518yqhCr4x0w8%3D' (2025-09-06)
2025-09-10 21:58:26 -04:00
5225bf1732 removed gpt-oss:120b 2025-09-02 21:34:06 -04:00
7a5dea1c36 updated vscode setting dir 2025-09-01 14:10:43 -04:00
0956ea6f58 updated git users 2025-09-01 14:10:43 -04:00
5d643e0cd1 updated secrets.yaml 2025-09-01 14:10:43 -04:00
ed3805a89e added notes to sops.yaml 2025-09-01 14:10:43 -04:00
ce8de13734 added leviathan to sops.yaml 2025-09-01 14:10:43 -04:00
68b7a2f80d added leviathan to flake.nix 2025-09-01 14:10:43 -04:00
62c3aa69fe added leviathan and elise 2025-09-01 14:10:43 -04:00
470be2b761 updated llms to local host only 2025-09-01 13:01:46 -04:00
e1c5bd0f84 updated loadModels and colsed open-webui firewall 2025-09-01 13:01:46 -04:00
786b275f7c adding olama group to richie 2025-09-01 13:01:46 -04:00
324721ff8d adding zerotier network to jeeves 2025-09-01 13:01:46 -04:00
7137435703 updating jeeves llm setting 2025-09-01 13:01:46 -04:00
a7b336a7de adding llms to rhapsody-in-green 2025-09-01 13:01:46 -04:00
529b03525b added kafka and ollama data sets 2025-08-23 10:43:56 -04:00
d0364bdaad fixed typo 2025-08-23 10:43:56 -04:00
45ddf8bc54 adding kafka and ollama 2025-08-23 10:43:56 -04:00
github-actions[bot]
6913c7046e flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/e6c2e889b34f5f623a7749a46e2aa5ea6e7256a0?dir=pkgs/firefox-addons&narHash=sha256-KVPjWo/RVQBQe6N03cNbSVM/xNCv2506wE4A8wL73sk%3D' (2025-08-15)
  → 'gitlab:rycee/nur-expressions/56254103ed36317cf471da3c93ac13805c72a7fa?dir=pkgs/firefox-addons&narHash=sha256-RzTBJ5ERXrJk7JPIDp1vjUNMKka6tyg4RctIR3cxqsM%3D' (2025-08-22)
• Updated input 'home-manager':
    'github:nix-community/home-manager/11626a4383b458f8dc5ea3237eaa04e8ab1912f3?narHash=sha256-soZegto0xXzG2zYlu/zjknDHv0Z7tRS5EQs%2BZ/VRTBg%3D' (2025-08-15)
  → 'github:nix-community/home-manager/6911d3e7f475f7b3558b4f5a6aba90fa86099baa?narHash=sha256-QdenO8f0PTg%2BtC6HuSvngKcbRZA5oZKmjUT%2BMXKOLQg%3D' (2025-08-21)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/26ed7a0d4b8741fe1ef1ee6fa64453ca056ce113?narHash=sha256-dz303vGuzWjzOPOaYkS9xSW%2BB93PSAJxvBd6CambXVA%3D' (2025-08-07)
  → 'github:nixos/nixos-hardware/3dac8a872557e0ca8c083cdcfc2f218d18e113b0?narHash=sha256-aJHFJWP9AuI8jUGzI77LYcSlkA9wJnOIg4ZqftwNGXA%3D' (2025-08-16)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/fbcf476f790d8a217c3eab4e12033dc4a0f6d23c?narHash=sha256-wNO3%2BKs2jZJ4nTHMuks%2BcxAiVBGNuEBXsT29Bz6HASo%3D' (2025-08-14)
  → 'github:nixos/nixpkgs/20075955deac2583bb12f07151c2df830ef346b4?narHash=sha256-HMwfAJBdrr8wXAkbGhtcby1zGFvs%2BStOp19xNsbqdOg%3D' (2025-08-19)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/25bb95af3131646b807ffc4421c4c4a40dfa89c8?narHash=sha256-lNEV%2Bi4epKQTbEduUb5rsxf36onD6KTdzMB5WnEECiU%3D' (2025-08-16)
  → 'github:nixos/nixpkgs/db18278efcff292f5c3f41c52fc89f5d69227155?narHash=sha256-eK6b2F%2BQlBPQjrkhuf/1msR5Z2guESncBw%2BfuwNPVOA%3D' (2025-08-22)
2025-08-22 22:30:34 -04:00
c4d2b0b8d4 added lib.mkDefault tpo global environment 2025-08-17 10:35:37 -04:00
27e939459b updated postgresql settings 2025-08-17 10:35:37 -04:00
501a838be9 updated matts user 2025-08-17 10:35:37 -04:00
2325249687 added c library's for numpy 2025-08-17 10:35:37 -04:00
github-actions[bot]
45951f6525 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/b657cfddb78408e9b53b4a8aaeaac71fc7ea182e?dir=pkgs/firefox-addons&narHash=sha256-FE908x/ihUlr5yn1f%2BPTMyOjcwotGUodzn7Ej6zZf5U%3D' (2025-07-29)
  → 'gitlab:rycee/nur-expressions/e6c2e889b34f5f623a7749a46e2aa5ea6e7256a0?dir=pkgs/firefox-addons&narHash=sha256-KVPjWo/RVQBQe6N03cNbSVM/xNCv2506wE4A8wL73sk%3D' (2025-08-15)
• Updated input 'home-manager':
    'github:nix-community/home-manager/e102920c1becb114645c6f92fe14edc0b05cc229?narHash=sha256-kVHCrTWEe8B1thAhFag1bk4QPY0ZP45V9vPbrwPHoNo%3D' (2025-08-01)
  → 'github:nix-community/home-manager/11626a4383b458f8dc5ea3237eaa04e8ab1912f3?narHash=sha256-soZegto0xXzG2zYlu/zjknDHv0Z7tRS5EQs%2BZ/VRTBg%3D' (2025-08-15)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/cc66fddc6cb04ab479a1bb062f4d4da27c936a22?narHash=sha256-nFxE8lk9JvGelxClCmwuJYftbHqwnc01dRN4DVLUroM%3D' (2025-07-21)
  → 'github:nixos/nixos-hardware/26ed7a0d4b8741fe1ef1ee6fa64453ca056ce113?narHash=sha256-dz303vGuzWjzOPOaYkS9xSW%2BB93PSAJxvBd6CambXVA%3D' (2025-08-07)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/94def634a20494ee057c76998843c015909d6311?narHash=sha256-K2ViRJfdVGE8tpJejs8Qpvvejks1%2BA4GQej/lBk5y7I%3D' (2025-07-31)
  → 'github:nixos/nixpkgs/fbcf476f790d8a217c3eab4e12033dc4a0f6d23c?narHash=sha256-wNO3%2BKs2jZJ4nTHMuks%2BcxAiVBGNuEBXsT29Bz6HASo%3D' (2025-08-14)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/3683d033f7994c92834f45f166275738dcdd959d?narHash=sha256-bklCdnAaAerEacvmy%2BHkltNR9QE/M4Ygy%2Bm0L2C6LJI%3D' (2025-08-01)
  → 'github:nixos/nixpkgs/25bb95af3131646b807ffc4421c4c4a40dfa89c8?narHash=sha256-lNEV%2Bi4epKQTbEduUb5rsxf36onD6KTdzMB5WnEECiU%3D' (2025-08-16)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/2c8def626f54708a9c38a5861866660395bb3461?narHash=sha256-GllP7cmQu7zLZTs9z0J2gIL42IZHa9CBEXwBY9szT0U%3D' (2025-07-15)
  → 'github:Mic92/sops-nix/3223c7a92724b5d804e9988c6b447a0d09017d48?narHash=sha256-t%2Bvoe2961vCgrzPFtZxha0/kmFSHFobzF00sT8p9h0U%3D' (2025-08-12)
2025-08-15 22:33:26 -04:00
fd56fa66f0 updated authorizedKeys and added math_password 2025-08-06 21:51:09 -04:00
1314298c0b treefmt 2025-08-06 21:43:19 -04:00
f0eee80c2d adding math user 2025-08-06 21:43:19 -04:00
c20b6d1da2 adding nodejs 2025-08-06 21:43:19 -04:00
34a59f966d testing nix-serve-ng 2025-08-01 22:38:47 -04:00
a677046330 updated flake lock 2025-08-01 20:44:30 -04:00
111afa1c6b enabling datagrip 2025-08-01 20:44:30 -04:00
c5f2805e74 ran treefmt 2025-08-01 20:41:59 -04:00
9a61d06f08 added encryptionPasswordFile to david server sync thing connection 2025-08-01 20:41:59 -04:00
559ca7a45e adding update the jeeves 2025-07-28 12:47:17 -04:00
03b636eb3a disabled jetbrains.datagrip 2025-07-28 12:41:26 -04:00
a7f5d3c71d removed ladybird 2025-07-28 12:41:26 -04:00
github-actions[bot]
3bbf8dc7a6 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/369dccacc0a8214600773b3bbbf68d98a19b74e8?dir=pkgs/firefox-addons&narHash=sha256-TVWYBcNpeQ3fEloryVP9N2yJnC3vuPpoZF1RqFFWFt0%3D' (2025-07-18)
  → 'gitlab:rycee/nur-expressions/553afee4efb5a7dea03cf654deafacd8fa1004f9?dir=pkgs/firefox-addons&narHash=sha256-45s1L4h/6t3M%2B/ppqow1OFUgfk9jZHsR4jxNgxIWWmM%3D' (2025-07-25)
• Updated input 'home-manager':
    'github:nix-community/home-manager/d0300c8808e41da81d6edfc202f3d3833c157daf?narHash=sha256-irfg7lnfEpJY%2B3Cffkluzp2MTVw1Uq9QGxFp6qadcXI%3D' (2025-07-18)
  → 'github:nix-community/home-manager/a1817d1c0e5eabe7dfdfe4caa46c94d9d8f3fdb6?narHash=sha256-hOUWU5L62G9sm8NxdiLWlLIJZz9H52VuFiDllHdwmVA%3D' (2025-07-25)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/d1bfa8f6ccfb5c383e1eba609c1eb67ca24ed153?narHash=sha256-P8J72psdc/rWliIvp8jUpoQ6qRDlVzgSDDlgkaXQ0Fw%3D' (2025-07-16)
  → 'github:nixos/nixos-hardware/cc66fddc6cb04ab479a1bb062f4d4da27c936a22?narHash=sha256-nFxE8lk9JvGelxClCmwuJYftbHqwnc01dRN4DVLUroM%3D' (2025-07-21)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/6e987485eb2c77e5dcc5af4e3c70843711ef9251?narHash=sha256-RKwfXA4OZROjBTQAl9WOZQFm7L8Bo93FQwSJpAiSRvo%3D' (2025-07-16)
  → 'github:nixos/nixpkgs/fc02ee70efb805d3b2865908a13ddd4474557ecf?narHash=sha256-i%2BCQV2rPmP8wHxj0aq4siYyohHwVlsh40kV89f3nw1s%3D' (2025-07-23)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/cda03d762aa4d6930f41c2a60b946e0f8a743630?narHash=sha256-ppPL0jXpeeFtyP9I01o807u3iVADQ3YkqpN2lUZk4LY%3D' (2025-07-19)
  → 'github:nixos/nixpkgs/ce6b0611ca70423d97fab2a3f53f61f1fa4ff0a4?narHash=sha256-Iy/9c6DaxCY9ECCLgpoo%2BuwY1K5YTmJLU7fSg7JeALk%3D' (2025-07-26)
2025-07-25 22:37:36 -04:00
github-actions[bot]
1cd4084ec8 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/9885400dbd82f9b2970b30e18f233404416f7cca?dir=pkgs/firefox-addons&narHash=sha256-vL26J2f9uXvwBNkfwYH1v75VwN22ZLhBcyZeenJwnCU%3D' (2025-07-11)
  → 'gitlab:rycee/nur-expressions/369dccacc0a8214600773b3bbbf68d98a19b74e8?dir=pkgs/firefox-addons&narHash=sha256-TVWYBcNpeQ3fEloryVP9N2yJnC3vuPpoZF1RqFFWFt0%3D' (2025-07-18)
• Updated input 'home-manager':
    'github:nix-community/home-manager/3976e0507edc9a5f332cb2be93fa20e646d22374?narHash=sha256-YhnBM3oknReSFTAuc2SMwekwjl9nDd5PUhcar4DsefM%3D' (2025-07-11)
  → 'github:nix-community/home-manager/d0300c8808e41da81d6edfc202f3d3833c157daf?narHash=sha256-irfg7lnfEpJY%2B3Cffkluzp2MTVw1Uq9QGxFp6qadcXI%3D' (2025-07-18)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/7ced9122cff2163c6a0212b8d1ec8c33a1660806?narHash=sha256-gATnkOe37eeVwKKYCsL%2BOnS2gU4MmLuZFzzWCtaKLI8%3D' (2025-07-09)
  → 'github:nixos/nixos-hardware/d1bfa8f6ccfb5c383e1eba609c1eb67ca24ed153?narHash=sha256-P8J72psdc/rWliIvp8jUpoQ6qRDlVzgSDDlgkaXQ0Fw%3D' (2025-07-16)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/9807714d6944a957c2e036f84b0ff8caf9930bc0?narHash=sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X%2BxgOL0%3D' (2025-07-08)
  → 'github:nixos/nixpkgs/6e987485eb2c77e5dcc5af4e3c70843711ef9251?narHash=sha256-RKwfXA4OZROjBTQAl9WOZQFm7L8Bo93FQwSJpAiSRvo%3D' (2025-07-16)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/bcef7b39781011d4332b54f59e989d4d4c22d643?narHash=sha256-yTQSi9WAqiGKLbCj3aO96QBp5F9u6hmL454uiKDCDrU%3D' (2025-07-11)
  → 'github:nixos/nixpkgs/cda03d762aa4d6930f41c2a60b946e0f8a743630?narHash=sha256-ppPL0jXpeeFtyP9I01o807u3iVADQ3YkqpN2lUZk4LY%3D' (2025-07-19)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/3633fc4acf03f43b260244d94c71e9e14a2f6e0d?narHash=sha256-KrDPXobG7DFKTOteqdSVeL1bMVitDcy7otpVZWDE6MA%3D' (2025-07-04)
  → 'github:Mic92/sops-nix/2c8def626f54708a9c38a5861866660395bb3461?narHash=sha256-GllP7cmQu7zLZTs9z0J2gIL42IZHa9CBEXwBY9szT0U%3D' (2025-07-15)
2025-07-18 22:36:18 -04:00
github-actions[bot]
e65b4b696a flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/0c5b037915083a27a260b063b127b31443827bae?dir=pkgs/firefox-addons&narHash=sha256-bAKNekZcZd4QnBO/RUxjQAgaz67bYwFXWfQENA45Scg%3D' (2025-07-04)
  → 'gitlab:rycee/nur-expressions/9885400dbd82f9b2970b30e18f233404416f7cca?dir=pkgs/firefox-addons&narHash=sha256-vL26J2f9uXvwBNkfwYH1v75VwN22ZLhBcyZeenJwnCU%3D' (2025-07-11)
• Updated input 'home-manager':
    'github:nix-community/home-manager/7d9e3c35f0d46f82bac791d76260f15f53d83529?narHash=sha256-7HiC6w4ROEbMmKtj5pilnLOJej9HkkfU9wEd5QSTyNo%3D' (2025-07-04)
  → 'github:nix-community/home-manager/3976e0507edc9a5f332cb2be93fa20e646d22374?narHash=sha256-YhnBM3oknReSFTAuc2SMwekwjl9nDd5PUhcar4DsefM%3D' (2025-07-11)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/497ae1357f1ac97f1aea31a4cb74ad0d534ef41f?narHash=sha256-136MeWtckSHTN9Z2WRNRdZ8oRP3vyx3L8UxeBYE%2BJ9w%3D' (2025-07-02)
  → 'github:nixos/nixos-hardware/7ced9122cff2163c6a0212b8d1ec8c33a1660806?narHash=sha256-gATnkOe37eeVwKKYCsL%2BOnS2gU4MmLuZFzzWCtaKLI8%3D' (2025-07-09)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3016b4b15d13f3089db8a41ef937b13a9e33a8df?narHash=sha256-P/SQmKDu06x8yv7i0s8bvnnuJYkxVGBWLWHaU%2Btt4YY%3D' (2025-06-30)
  → 'github:nixos/nixpkgs/9807714d6944a957c2e036f84b0ff8caf9930bc0?narHash=sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X%2BxgOL0%3D' (2025-07-08)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/b441e40fcd70ff4368df31a7d5dfcc79e3596504?narHash=sha256-XnlCDd58iYO%2BaUBQIyxFOfkoFRDCq9ajaZFaaGwHc3Y%3D' (2025-07-05)
  → 'github:nixos/nixpkgs/bcef7b39781011d4332b54f59e989d4d4c22d643?narHash=sha256-yTQSi9WAqiGKLbCj3aO96QBp5F9u6hmL454uiKDCDrU%3D' (2025-07-11)
2025-07-11 22:39:14 -04:00
github-actions[bot]
20a4a8c2fc flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/8c101ae6d55115c7d4f12bffa932f30416dfd070?dir=pkgs/firefox-addons&narHash=sha256-kGbUMc4hww2Fe6DdCFy8Qnlspc4dLepa1L9SLh0LORg%3D' (2025-06-27)
  → 'gitlab:rycee/nur-expressions/0c5b037915083a27a260b063b127b31443827bae?dir=pkgs/firefox-addons&narHash=sha256-bAKNekZcZd4QnBO/RUxjQAgaz67bYwFXWfQENA45Scg%3D' (2025-07-04)
• Updated input 'home-manager':
    'github:nix-community/home-manager/080e8b48b0318b38143d5865de9334f46d51fce3?narHash=sha256-BZXgag7I0rnL/HMHAsBz3tQrfKAibpY2vovexl2lS%2BY%3D' (2025-06-26)
  → 'github:nix-community/home-manager/7d9e3c35f0d46f82bac791d76260f15f53d83529?narHash=sha256-7HiC6w4ROEbMmKtj5pilnLOJej9HkkfU9wEd5QSTyNo%3D' (2025-07-04)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/98236410ea0fe204d0447149537a924fb71a6d4f?narHash=sha256-2m1ceZjbmgrJCZ2PuQZaK4in3gcg3o6rZ7WK6dr5vAA%3D' (2025-06-25)
  → 'github:nixos/nixos-hardware/497ae1357f1ac97f1aea31a4cb74ad0d534ef41f?narHash=sha256-136MeWtckSHTN9Z2WRNRdZ8oRP3vyx3L8UxeBYE%2BJ9w%3D' (2025-07-02)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/30a61f056ac492e3b7cdcb69c1e6abdcf00e39cf?narHash=sha256-/CG%2Bw0o0oJ5itVklOoLbdn2dGB0wbZVOoDm4np6w09A%3D' (2025-06-24)
  → 'github:nixos/nixpkgs/3016b4b15d13f3089db8a41ef937b13a9e33a8df?narHash=sha256-P/SQmKDu06x8yv7i0s8bvnnuJYkxVGBWLWHaU%2Btt4YY%3D' (2025-06-30)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/c0874d923d0fd19d73d95a02820acd27ae11e320?narHash=sha256-FQQyEt6/Q3FNeCkY9Gu1JeKBLzRQnZL%2BWYkjc53shLM%3D' (2025-06-27)
  → 'github:nixos/nixpkgs/b441e40fcd70ff4368df31a7d5dfcc79e3596504?narHash=sha256-XnlCDd58iYO%2BaUBQIyxFOfkoFRDCq9ajaZFaaGwHc3Y%3D' (2025-07-05)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/77c423a03b9b2b79709ea2cb63336312e78b72e2?narHash=sha256-Rr7Pooz9zQbhdVxux16h7URa6mA80Pb/G07T4lHvh0M%3D' (2025-06-17)
  → 'github:Mic92/sops-nix/3633fc4acf03f43b260244d94c71e9e14a2f6e0d?narHash=sha256-KrDPXobG7DFKTOteqdSVeL1bMVitDcy7otpVZWDE6MA%3D' (2025-07-04)
2025-07-04 22:33:05 -04:00
f4348c2ab5 update desktop.nix kernelPackages to linuxPackages_6_15 2025-07-02 08:21:41 -04:00
6eab8497ba adding uv to my programs 2025-06-30 20:13:06 -04:00
github-actions[bot]
da5cdb8f05 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/26d54102450b4e23d56d4319ef0722f155b5b37c?dir=pkgs/firefox-addons&narHash=sha256-W%2BPwT19YbzRH8YawEeV3jBb5dp8CbfwWZ4uFQkGwZbA%3D' (2025-06-21)
  → 'gitlab:rycee/nur-expressions/8c101ae6d55115c7d4f12bffa932f30416dfd070?dir=pkgs/firefox-addons&narHash=sha256-kGbUMc4hww2Fe6DdCFy8Qnlspc4dLepa1L9SLh0LORg%3D' (2025-06-27)
• Updated input 'home-manager':
    'github:nix-community/home-manager/863842639722dd12ae9e37ca83bcb61a63b36f6c?narHash=sha256-Mj5t4yX05/rXnRqJkpoLZTWqgStB88Mr/fegTRqyiWc%3D' (2025-06-19)
  → 'github:nix-community/home-manager/080e8b48b0318b38143d5865de9334f46d51fce3?narHash=sha256-BZXgag7I0rnL/HMHAsBz3tQrfKAibpY2vovexl2lS%2BY%3D' (2025-06-26)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/1552a9f4513f3f0ceedcf90320e48d3d47165712?narHash=sha256-vnzzBDbCGvInmfn2ijC4HsIY/3W1CWbwS/YQoFgdgPg%3D' (2025-06-20)
  → 'github:nixos/nixos-hardware/98236410ea0fe204d0447149537a924fb71a6d4f?narHash=sha256-2m1ceZjbmgrJCZ2PuQZaK4in3gcg3o6rZ7WK6dr5vAA%3D' (2025-06-25)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/08f22084e6085d19bcfb4be30d1ca76ecb96fe54?narHash=sha256-XE/lFNhz5lsriMm/yjXkvSZz5DfvKJLUjsS6pP8EC50%3D' (2025-06-19)
  → 'github:nixos/nixpkgs/30a61f056ac492e3b7cdcb69c1e6abdcf00e39cf?narHash=sha256-/CG%2Bw0o0oJ5itVklOoLbdn2dGB0wbZVOoDm4np6w09A%3D' (2025-06-24)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/b5b8d1f94bd353640131a6a38d2b01d0bfc13012?narHash=sha256-NT8CNfGLNBI%2BuwjNC8HnHv0O6K1P1Nb%2B/g2eg%2Bu0gnE%3D' (2025-06-22)
  → 'github:nixos/nixpkgs/c0874d923d0fd19d73d95a02820acd27ae11e320?narHash=sha256-FQQyEt6/Q3FNeCkY9Gu1JeKBLzRQnZL%2BWYkjc53shLM%3D' (2025-06-27)
2025-06-27 22:33:15 -04:00
8aa9eea322 testing --rebase 2025-06-22 21:33:21 -04:00
febe7c7e53 test 2025-06-22 21:33:21 -04:00
b1ca58b2f4 adding Checkout repository 2025-06-22 21:33:21 -04:00
github-actions[bot]
7ad4ccd5ca flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/a00ce73b626ed274fbfe9f51627861e140b08f6d?dir=pkgs/firefox-addons&narHash=sha256-b3y7V7db0VwLGtpcLRmT1Aa9dpAKoHQdem55UhgB/fw%3D' (2025-06-18)
  → 'gitlab:rycee/nur-expressions/26d54102450b4e23d56d4319ef0722f155b5b37c?dir=pkgs/firefox-addons&narHash=sha256-W%2BPwT19YbzRH8YawEeV3jBb5dp8CbfwWZ4uFQkGwZbA%3D' (2025-06-21)
• Updated input 'home-manager':
    'github:nix-community/home-manager/0f355844e54e4c70906b1ef5cc35a0047d666c04?narHash=sha256-upC/GIlsIgtdtWRGd1obzdXWYQptNkfzZeyAFWgsgf0%3D' (2025-06-18)
  → 'github:nix-community/home-manager/863842639722dd12ae9e37ca83bcb61a63b36f6c?narHash=sha256-Mj5t4yX05/rXnRqJkpoLZTWqgStB88Mr/fegTRqyiWc%3D' (2025-06-19)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/61837d2a33ccc1582c5fabb7bf9130d39fee59ad?narHash=sha256-ynqbgIYrg7P1fAKYqe8I/PMiLABBcNDYG9YaAP/d/C4%3D' (2025-06-16)
  → 'github:nixos/nixos-hardware/1552a9f4513f3f0ceedcf90320e48d3d47165712?narHash=sha256-vnzzBDbCGvInmfn2ijC4HsIY/3W1CWbwS/YQoFgdgPg%3D' (2025-06-20)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/9e83b64f727c88a7711a2c463a7b16eedb69a84c?narHash=sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI%3D' (2025-06-17)
  → 'github:nixos/nixpkgs/08f22084e6085d19bcfb4be30d1ca76ecb96fe54?narHash=sha256-XE/lFNhz5lsriMm/yjXkvSZz5DfvKJLUjsS6pP8EC50%3D' (2025-06-19)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/ba92ab5dc0759a8740003ca34b5c1b888f4766d4?narHash=sha256-JW40%2BzIiDS%2BrZavb9IYdIN40/GmErO2%2B0%2BA66rM6/b8%3D' (2025-06-19)
  → 'github:nixos/nixpkgs/b5b8d1f94bd353640131a6a38d2b01d0bfc13012?narHash=sha256-NT8CNfGLNBI%2BuwjNC8HnHv0O6K1P1Nb%2B/g2eg%2Bu0gnE%3D' (2025-06-22)
2025-06-22 21:11:00 -04:00
c936501afb bugfix fixing problems in merge_flake_lock_update 2025-06-22 20:48:10 -04:00
239d7833f6 small update 2025-06-22 20:44:28 -04:00
8fb6ae41b9 added gh pr list 2025-06-22 20:44:28 -04:00
80e0b03463 testing merge_flake_lock_update 2025-06-22 20:44:28 -04:00
747e2700ed updated update-flake-lock to be weakly 2025-06-21 23:57:18 -04:00
472f11e5b6 updated to --rebase 2025-06-21 22:20:13 -04:00
d75493997e testing auto-merge 2025-06-21 22:20:13 -04:00
d711983ac7 update desktop.nix kernelPackages to linuxPackages_6_14 2025-06-20 21:34:29 -04:00
1aabb2b112 removing wyoming 2025-06-19 15:17:54 -04:00
github-actions[bot]
8c09b8a78f flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/fe13e6abfe72b39ad8381595c3c404849330c3cb?dir=pkgs/firefox-addons&narHash=sha256-bN4tccrmczfR4PUuepHpxNNmWG3cLZTFIt4BaD8YyvA%3D' (2025-06-09)
  → 'gitlab:rycee/nur-expressions/a00ce73b626ed274fbfe9f51627861e140b08f6d?dir=pkgs/firefox-addons&narHash=sha256-b3y7V7db0VwLGtpcLRmT1Aa9dpAKoHQdem55UhgB/fw%3D' (2025-06-18)
• Updated input 'home-manager':
    'github:nix-community/home-manager/1df816c407d3a5090c8496c9b00170af7891f021?narHash=sha256-V1BgwiX8NjbRreU6LC2EzmuqFSQAHhoSeNlYJyZ40NE%3D' (2025-06-09)
  → 'github:nix-community/home-manager/0f355844e54e4c70906b1ef5cc35a0047d666c04?narHash=sha256-upC/GIlsIgtdtWRGd1obzdXWYQptNkfzZeyAFWgsgf0%3D' (2025-06-18)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/4602f7e1d3f197b3cb540d5accf5669121629628?narHash=sha256-W5GKQHgunda/OP9sbKENBZhMBDNu2QahoIPwnsF6CeM%3D' (2025-06-06)
  → 'github:nixos/nixos-hardware/61837d2a33ccc1582c5fabb7bf9130d39fee59ad?narHash=sha256-ynqbgIYrg7P1fAKYqe8I/PMiLABBcNDYG9YaAP/d/C4%3D' (2025-06-16)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3e3afe5174c561dee0df6f2c2b2236990146329f?narHash=sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU%3D' (2025-06-07)
  → 'github:nixos/nixpkgs/9e83b64f727c88a7711a2c463a7b16eedb69a84c?narHash=sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI%3D' (2025-06-17)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/8b64795ee08f70b73d4eeac16af0869f92b18284?narHash=sha256-G3nP/Eaymj55jV9p/xjeRmMTUICICGTNFpJaXDAoNtQ%3D' (2025-06-09)
  → 'github:nixos/nixpkgs/ba92ab5dc0759a8740003ca34b5c1b888f4766d4?narHash=sha256-JW40%2BzIiDS%2BrZavb9IYdIN40/GmErO2%2B0%2BA66rM6/b8%3D' (2025-06-19)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/8d215e1c981be3aa37e47aeabd4e61bb069548fd?narHash=sha256-lAblXm0VwifYCJ/ILPXJwlz0qNY07DDYdLD%2B9H%2BWc8o%3D' (2025-05-18)
  → 'github:Mic92/sops-nix/77c423a03b9b2b79709ea2cb63336312e78b72e2?narHash=sha256-Rr7Pooz9zQbhdVxux16h7URa6mA80Pb/G07T4lHvh0M%3D' (2025-06-17)
2025-06-19 00:27:57 -04:00
0fe99d9d4e updated shellAliases 2025-06-11 22:50:43 -04:00
148722be43 disabled sudo 2025-06-11 22:50:43 -04:00
be2421e3dc testing sudo-rs 2025-06-11 22:50:43 -04:00
2eb6c43b49 fixed formatting 2025-06-11 22:47:44 -04:00
897e06f622 added local for gcw and setup setup gcw acces for megan 2025-06-11 22:47:44 -04:00
4e99c54c12 worked with megan 2025-06-11 22:47:44 -04:00
3abd04ec5e added meg and gcw to postgres 2025-06-11 22:47:44 -04:00
a6a0fd0727 added gcw user 2025-06-11 22:47:44 -04:00
f23d381895 added user for megan 2025-06-11 22:47:44 -04:00
65335d1d38 adding great_cloud_of_witnesses.nix 2025-06-11 22:47:44 -04:00
github-actions[bot]
7b318e038a flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/493bb7da63143e3144c964d2b8e34e78dfe02a4b?dir=pkgs/firefox-addons&narHash=sha256-mk4nReFlqtGToFfZngNZ58FYud/svkmRp%2BTHBsfqhcw%3D' (2025-05-30)
  → 'gitlab:rycee/nur-expressions/fe13e6abfe72b39ad8381595c3c404849330c3cb?dir=pkgs/firefox-addons&narHash=sha256-bN4tccrmczfR4PUuepHpxNNmWG3cLZTFIt4BaD8YyvA%3D' (2025-06-09)
• Updated input 'home-manager':
    'github:nix-community/home-manager/7c60ea029602851cdeb2f3246e991fcc117195bc?narHash=sha256-5mhG43yYEEpLxEp6e683A8YiW4JHmWihF7XECjMM6Ns%3D' (2025-05-30)
  → 'github:nix-community/home-manager/1df816c407d3a5090c8496c9b00170af7891f021?narHash=sha256-V1BgwiX8NjbRreU6LC2EzmuqFSQAHhoSeNlYJyZ40NE%3D' (2025-06-09)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/daa628a725ab4948e0e2b795e8fb6f4c3e289a7a?narHash=sha256-pZH4bqbOd8S%2Bsi6UcfjHovWDiWKiIGRNRMpmRWaDIms%3D' (2025-05-30)
  → 'github:nixos/nixos-hardware/4602f7e1d3f197b3cb540d5accf5669121629628?narHash=sha256-W5GKQHgunda/OP9sbKENBZhMBDNu2QahoIPwnsF6CeM%3D' (2025-06-06)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/96ec055edbe5ee227f28cdbc3f1ddf1df5965102?narHash=sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg%3D' (2025-05-28)
  → 'github:nixos/nixpkgs/3e3afe5174c561dee0df6f2c2b2236990146329f?narHash=sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU%3D' (2025-06-07)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/c936d57413b770679543a3aa85791f299b931a7b?narHash=sha256-SLAhuAJv0hYwRSHdbdTX9JFNl5c3I0NpQP8CY2xta6s%3D' (2025-05-31)
  → 'github:nixos/nixpkgs/8b64795ee08f70b73d4eeac16af0869f92b18284?narHash=sha256-G3nP/Eaymj55jV9p/xjeRmMTUICICGTNFpJaXDAoNtQ%3D' (2025-06-09)
2025-06-09 19:17:53 -04:00
2fe3ad1f68 ran treefmt 2025-06-08 15:06:01 -04:00
fa27adb4fe removed cache.tmmworkshop.com from nix.nix and flake.nix 2025-06-08 15:06:01 -04:00
ac7aec4efd update i[ address 2025-06-08 15:06:01 -04:00
87bebda02e removing duckdns 2025-06-03 18:06:17 -04:00
43276a693a updated defaultLocale to en_US.UTF-8 2025-05-31 09:09:12 -04:00
84504c68b7 removed supportedLocales 2025-05-31 09:09:12 -04:00
github-actions[bot]
45267b5c59 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/d4b3ffe3e719e42b175ccdef13598516f0a8025d?dir=pkgs/firefox-addons&narHash=sha256-d6SvA0gTHDrOqt4tZRVD0Gm5G4w6jAFJ6lis79PjSPw%3D' (2025-05-12)
  → 'gitlab:rycee/nur-expressions/493bb7da63143e3144c964d2b8e34e78dfe02a4b?dir=pkgs/firefox-addons&narHash=sha256-mk4nReFlqtGToFfZngNZ58FYud/svkmRp%2BTHBsfqhcw%3D' (2025-05-30)
• Updated input 'home-manager':
    'github:nix-community/home-manager/f0a7db5ec1d369721e770a45e4d19f8e48186a69?narHash=sha256-VnR33UmH0KzvTuVg%2B6oYkDVpnPuHanQisNUXytCRBPQ%3D' (2025-05-12)
  → 'github:nix-community/home-manager/7c60ea029602851cdeb2f3246e991fcc117195bc?narHash=sha256-5mhG43yYEEpLxEp6e683A8YiW4JHmWihF7XECjMM6Ns%3D' (2025-05-30)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/d1d68fe8b00248caaa5b3bbe4984c12b47e0867d?narHash=sha256-dMx20S2molwqJxbmMB4pGjNfgp5H1IOHNa1Eby6xL%2B0%3D' (2025-05-12)
  → 'github:nixos/nixos-hardware/daa628a725ab4948e0e2b795e8fb6f4c3e289a7a?narHash=sha256-pZH4bqbOd8S%2Bsi6UcfjHovWDiWKiIGRNRMpmRWaDIms%3D' (2025-05-30)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/d89fc19e405cb2d55ce7cc114356846a0ee5e956?narHash=sha256-3e%2BAVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ%3D' (2025-05-10)
  → 'github:nixos/nixpkgs/96ec055edbe5ee227f28cdbc3f1ddf1df5965102?narHash=sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg%3D' (2025-05-28)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/bee20293bce36bd20f2ed6627a60db76eaa7e9b4?narHash=sha256-WJ55VutSzEjVjq9jYpUvJp6fRB8ncgVzFpWoAwfvppg%3D' (2025-05-13)
  → 'github:nixos/nixpkgs/c936d57413b770679543a3aa85791f299b931a7b?narHash=sha256-SLAhuAJv0hYwRSHdbdTX9JFNl5c3I0NpQP8CY2xta6s%3D' (2025-05-31)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/e93ee1d900ad264d65e9701a5c6f895683433386?narHash=sha256-PxrrSFLaC7YuItShxmYbMgSuFFuwxBB%2Bqsl9BZUnRvg%3D' (2025-05-05)
  → 'github:Mic92/sops-nix/8d215e1c981be3aa37e47aeabd4e61bb069548fd?narHash=sha256-lAblXm0VwifYCJ/ILPXJwlz0qNY07DDYdLD%2B9H%2BWc8o%3D' (2025-05-18)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/c9979e045bca52ec85a0dc560b238f3e5ae2f01c?narHash=sha256-PM7dz99nb6dDiw/3naRGB/dUl5U7dJVspR9uevhW3xo%3D' (2025-03-10)
  → 'github:RichieCahill/system_tools/68ab5d1c17ac3fe2487f73dbbb4848bd2291139e?narHash=sha256-woyaUwmZurfNTXBEFM6M7ueSd/Udixs%2B4DUInhL835c%3D' (2025-05-17)
• Removed input 'system_tools/flake-utils'
• Removed input 'system_tools/flake-utils/systems'
• Removed input 'system_tools/poetry2nix'
• Removed input 'system_tools/poetry2nix/flake-utils'
• Removed input 'system_tools/poetry2nix/nix-github-actions'
• Removed input 'system_tools/poetry2nix/nix-github-actions/nixpkgs'
• Removed input 'system_tools/poetry2nix/nixpkgs'
• Removed input 'system_tools/poetry2nix/systems'
• Removed input 'system_tools/poetry2nix/treefmt-nix'
• Removed input 'system_tools/poetry2nix/treefmt-nix/nixpkgs'
• Added input 'system_tools/pyproject-build-systems':
    'github:pyproject-nix/build-system-pkgs/7dba6dbc73120e15b558754c26024f6c93015dd7?narHash=sha256-nysSwVVjG4hKoOjhjvE6U5lIKA8sEr1d1QzEfZsannU%3D' (2025-04-14)
• Added input 'system_tools/pyproject-build-systems/nixpkgs':
    follows 'system_tools/nixpkgs'
• Added input 'system_tools/pyproject-build-systems/pyproject-nix':
    follows 'system_tools/pyproject-nix'
• Added input 'system_tools/pyproject-build-systems/uv2nix':
    follows 'system_tools/uv2nix'
• Added input 'system_tools/pyproject-nix':
    'github:pyproject-nix/pyproject.nix/e09c10c24ebb955125fda449939bfba664c467fd?narHash=sha256-QxdHGNpbicIrw5t6U3x%2BZxeY/7IEJ6lYbvsjXmcxFIM%3D' (2025-05-06)
• Added input 'system_tools/pyproject-nix/nixpkgs':
    follows 'system_tools/nixpkgs'
• Added input 'system_tools/uv2nix':
    'github:pyproject-nix/uv2nix/582024dc64663e9f88d467c2f7f7b20d278349de?narHash=sha256-W8BFXk5R0TuJcjIhcGoMpSOaIufGXpizK0pm%2BuTqynA%3D' (2025-05-17)
• Added input 'system_tools/uv2nix/nixpkgs':
    follows 'system_tools/nixpkgs'
• Added input 'system_tools/uv2nix/pyproject-nix':
    follows 'system_tools/pyproject-nix'
2025-05-30 22:44:24 -04:00
github-actions[bot]
bd964a8390 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/0388c30f59e860307b2ef0ba93f38d2e525a153e?dir=pkgs/firefox-addons&narHash=sha256-vX5uq4wv7FeNeeFtsTPXQ9n2hd92NFXI%2Bu9sg1K8OhA%3D' (2025-04-27)
  → 'gitlab:rycee/nur-expressions/d4b3ffe3e719e42b175ccdef13598516f0a8025d?dir=pkgs/firefox-addons&narHash=sha256-d6SvA0gTHDrOqt4tZRVD0Gm5G4w6jAFJ6lis79PjSPw%3D' (2025-05-12)
• Updated input 'home-manager':
    'github:nix-community/home-manager/5f217e5a319f6c186283b530f8c975e66c028433?narHash=sha256-osgPX/SzIpkR50vev/rqoTEAVkEcOWXoQXmbzsaI4KU%3D' (2025-04-30)
  → 'github:nix-community/home-manager/f0a7db5ec1d369721e770a45e4d19f8e48186a69?narHash=sha256-VnR33UmH0KzvTuVg%2B6oYkDVpnPuHanQisNUXytCRBPQ%3D' (2025-05-12)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/72081c9fbbef63765ae82bff9727ea79cc86bd5b?narHash=sha256-mmV2oPhQN%2BYF2wmnJzXX8tqgYmUYXUj3uUUBSTmYN5o%3D' (2025-04-29)
  → 'github:nixos/nixos-hardware/d1d68fe8b00248caaa5b3bbe4984c12b47e0867d?narHash=sha256-dMx20S2molwqJxbmMB4pGjNfgp5H1IOHNa1Eby6xL%2B0%3D' (2025-05-12)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/46e634be05ce9dc6d4db8e664515ba10b78151ae?narHash=sha256-y3h3NLnzRSiUkYpnfvnS669zWZLoqqI6NprtLQ%2B5dck%3D' (2025-04-29)
  → 'github:nixos/nixpkgs/d89fc19e405cb2d55ce7cc114356846a0ee5e956?narHash=sha256-3e%2BAVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ%3D' (2025-05-10)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/268ec3b4f1976d689f80b5b18da885420d258b0a?narHash=sha256-xZkR328WwOXlqI%2BKfksGTwyzQpRICmR4wUrxk6pbWqg%3D' (2025-05-01)
  → 'github:nixos/nixpkgs/bee20293bce36bd20f2ed6627a60db76eaa7e9b4?narHash=sha256-WJ55VutSzEjVjq9jYpUvJp6fRB8ncgVzFpWoAwfvppg%3D' (2025-05-13)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/5e3e92b16d6fdf9923425a8d4df7496b2434f39c?narHash=sha256-ePyTpKEJTgX0gvgNQWd7tQYQ3glIkbqcW778RpHlqgA%3D' (2025-04-22)
  → 'github:Mic92/sops-nix/e93ee1d900ad264d65e9701a5c6f895683433386?narHash=sha256-PxrrSFLaC7YuItShxmYbMgSuFFuwxBB%2Bqsl9BZUnRvg%3D' (2025-05-05)
2025-05-13 18:27:42 -04:00
github-actions[bot]
86e90440c4 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/89b9fcf0f026688036283f5716677817a7cec061?dir=pkgs/firefox-addons&narHash=sha256-Ch8OueK%2BUNc4lEkUbL9K9xgBXEKVEsB7GrNZm6jO46s%3D' (2025-04-13)
  → 'gitlab:rycee/nur-expressions/0388c30f59e860307b2ef0ba93f38d2e525a153e?dir=pkgs/firefox-addons&narHash=sha256-vX5uq4wv7FeNeeFtsTPXQ9n2hd92NFXI%2Bu9sg1K8OhA%3D' (2025-04-27)
• Updated input 'home-manager':
    'github:nix-community/home-manager/cfa196c705a896372319249d757085876ab62448?narHash=sha256-g07PYyZCIHVDLzRo8fllZRES7Nf9R8%2BxZwNJ7t0gt5s%3D' (2025-04-13)
  → 'github:nix-community/home-manager/5f217e5a319f6c186283b530f8c975e66c028433?narHash=sha256-osgPX/SzIpkR50vev/rqoTEAVkEcOWXoQXmbzsaI4KU%3D' (2025-04-30)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/1fe3cc2bc5d2dc9c81cb4e63d2f67c1543340df1?narHash=sha256-OuLhysErPHl53BBifhesrRumJNhrlSgQDfYOTXfgIMg%3D' (2025-04-11)
  → 'github:nixos/nixos-hardware/72081c9fbbef63765ae82bff9727ea79cc86bd5b?narHash=sha256-mmV2oPhQN%2BYF2wmnJzXX8tqgYmUYXUj3uUUBSTmYN5o%3D' (2025-04-29)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/2631b0b7abcea6e640ce31cd78ea58910d31e650?narHash=sha256-LWqduOgLHCFxiTNYi3Uj5Lgz0SR%2BXhw3kr/3Xd0GPTM%3D' (2025-04-12)
  → 'github:nixos/nixpkgs/46e634be05ce9dc6d4db8e664515ba10b78151ae?narHash=sha256-y3h3NLnzRSiUkYpnfvnS669zWZLoqqI6NprtLQ%2B5dck%3D' (2025-04-29)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/fe24d8526fe90e49fd04bd36e18722a1894ea41f?narHash=sha256-2rcE3NDqQVYjdrUHFFgJSJG7ATUkJzAFaBz8ybTp2fU%3D' (2025-04-13)
  → 'github:nixos/nixpkgs/268ec3b4f1976d689f80b5b18da885420d258b0a?narHash=sha256-xZkR328WwOXlqI%2BKfksGTwyzQpRICmR4wUrxk6pbWqg%3D' (2025-05-01)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/7e147a1ae90f0d4a374938cdc3df3cdaecb9d388?narHash=sha256-lv52pnfiRGp5%2BxkZEgWr56DWiRgkMFXpiGba3eJ3krE%3D' (2025-04-13)
  → 'github:Mic92/sops-nix/5e3e92b16d6fdf9923425a8d4df7496b2434f39c?narHash=sha256-ePyTpKEJTgX0gvgNQWd7tQYQ3glIkbqcW778RpHlqgA%3D' (2025-04-22)
2025-04-30 20:23:43 -04:00
github-actions[bot]
2b743fa1b8 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/f8861a4b09a181dd88f6626d0202d9225ae85d65?dir=pkgs/firefox-addons&narHash=sha256-tlJY7MfAena/yi3lmd7y7vQGpLma4Q1BLtO4dvzF/Vs%3D' (2025-03-27)
  → 'gitlab:rycee/nur-expressions/89b9fcf0f026688036283f5716677817a7cec061?dir=pkgs/firefox-addons&narHash=sha256-Ch8OueK%2BUNc4lEkUbL9K9xgBXEKVEsB7GrNZm6jO46s%3D' (2025-04-13)
• Removed input 'firefox-addons/flake-utils'
• Updated input 'home-manager':
    'github:nix-community/home-manager/b431496538b0e294fbe44a1441b24ae8195c63f0?narHash=sha256-G7866vbO5jgqMcYJzgbxej40O6mBGQMGt6gM0himjoA%3D' (2025-03-29)
  → 'github:nix-community/home-manager/cfa196c705a896372319249d757085876ab62448?narHash=sha256-g07PYyZCIHVDLzRo8fllZRES7Nf9R8%2BxZwNJ7t0gt5s%3D' (2025-04-13)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/0ed819e708af17bfc4bbc63ee080ef308a24aa42?narHash=sha256-I09SrXIO0UdyBFfh0fxDq5WnCDg8XKmZ1HQbaXzMA1k%3D' (2025-03-28)
  → 'github:nixos/nixos-hardware/1fe3cc2bc5d2dc9c81cb4e63d2f67c1543340df1?narHash=sha256-OuLhysErPHl53BBifhesrRumJNhrlSgQDfYOTXfgIMg%3D' (2025-04-11)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/5e5402ecbcb27af32284d4a62553c019a3a49ea6?narHash=sha256-gWd4urRoLRe8GLVC/3rYRae1h%2BxfQzt09xOfb0PaHSk%3D' (2025-03-27)
  → 'github:nixos/nixpkgs/2631b0b7abcea6e640ce31cd78ea58910d31e650?narHash=sha256-LWqduOgLHCFxiTNYi3Uj5Lgz0SR%2BXhw3kr/3Xd0GPTM%3D' (2025-04-12)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/a2cd41ef5ba904d58f230740f06567ff9506e368?narHash=sha256-UTEKMh3sbRHVr6ZYIoM7NWQjfrjIGTVOoV2Q4LkLvSk%3D' (2025-03-30)
  → 'github:nixos/nixpkgs/fe24d8526fe90e49fd04bd36e18722a1894ea41f?narHash=sha256-2rcE3NDqQVYjdrUHFFgJSJG7ATUkJzAFaBz8ybTp2fU%3D' (2025-04-13)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/67566fe68a8bed2a7b1175fdfb0697ed22ae8852?narHash=sha256-ZGlpUDsuBdeZeTNgoMv%2Baw0ByXT2J3wkYw9kJwkAS4M%3D' (2025-03-23)
  → 'github:Mic92/sops-nix/7e147a1ae90f0d4a374938cdc3df3cdaecb9d388?narHash=sha256-lv52pnfiRGp5%2BxkZEgWr56DWiRgkMFXpiGba3eJ3krE%3D' (2025-04-13)
2025-04-13 17:30:00 -04:00
eb69646603 treefmt 2025-04-05 14:16:41 -04:00
ccfde41209 enabled powertop by default 2025-04-05 14:16:41 -04:00
eb90251671 testing scsiLinkPolicy 2025-04-05 14:16:41 -04:00
a5ccedbb5d shrank storage pool 2025-04-05 14:16:41 -04:00
7dbf67a2d3 updated then vars names 2025-04-05 14:16:41 -04:00
c349af60ce fixed evaluation warnings 2025-04-05 14:16:41 -04:00
3fcc3447b1 fixed evaluation warnings 2025-04-05 14:16:41 -04:00
fc166e9c1a added json formatter 2025-04-05 14:16:41 -04:00
e902608c6c treefmt 2025-04-05 14:16:41 -04:00
59a794169e created function for setting up encrypted drives 2025-04-05 14:16:41 -04:00
fa618f8849 fixed mistake 2025-04-05 14:16:41 -04:00
84e469897e deleted uptime_kuma.nix 2025-04-05 14:16:41 -04:00
4694d75a62 added scratch pool 2025-04-05 14:16:41 -04:00
ca2081bf93 added usb decrypt 2025-04-05 14:16:41 -04:00
fa3f14785c removed torrenting pool 2025-04-05 14:16:41 -04:00
aa2836c452 removed qbit 2025-04-05 14:16:41 -04:00
5b750043ce testing powertop 2025-04-05 14:16:41 -04:00
da721a32f3 treefmt 2025-04-05 14:16:41 -04:00
fd172638ec testing powerManagement setting for rhapsody-in-green 2025-04-05 14:16:41 -04:00
9dd32c7c06 adding cpuFreqGovernor ondemand 2025-04-05 14:16:41 -04:00
github-actions[bot]
96ce4ccb4a flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/d74460da63a8c08a69a1f143b04f2ab1a6b2f5c2?dir=pkgs/firefox-addons&narHash=sha256-dAhrL%2BgEjNN5U/Sosy7IrX0Y0qPA0U7Gp9TBhqEliNU%3D' (2025-03-23)
  → 'gitlab:rycee/nur-expressions/f8861a4b09a181dd88f6626d0202d9225ae85d65?dir=pkgs/firefox-addons&narHash=sha256-tlJY7MfAena/yi3lmd7y7vQGpLma4Q1BLtO4dvzF/Vs%3D' (2025-03-27)
• Updated input 'home-manager':
    'github:nix-community/home-manager/869f2ec2add75ce2a70a6dbbf585b8399abec625?narHash=sha256-F3xBdOs5m0SE6Gq3jz%2BJxDOPvsLs22vbGfD05uF6xEc%3D' (2025-03-25)
  → 'github:nix-community/home-manager/b431496538b0e294fbe44a1441b24ae8195c63f0?narHash=sha256-G7866vbO5jgqMcYJzgbxej40O6mBGQMGt6gM0himjoA%3D' (2025-03-29)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/ecaa2d911e77c265c2a5bac8b583c40b0f151726?narHash=sha256-zvQ4GsCJT6MTOzPKLmlFyM%2Blxo0JGQ0cSFaZSACmWfY%3D' (2025-03-24)
  → 'github:nixos/nixos-hardware/0ed819e708af17bfc4bbc63ee080ef308a24aa42?narHash=sha256-I09SrXIO0UdyBFfh0fxDq5WnCDg8XKmZ1HQbaXzMA1k%3D' (2025-03-28)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/1e5b653dff12029333a6546c11e108ede13052eb?narHash=sha256-G5n%2BFOXLXcRx%2B3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w%3D' (2025-03-22)
  → 'github:nixos/nixpkgs/5e5402ecbcb27af32284d4a62553c019a3a49ea6?narHash=sha256-gWd4urRoLRe8GLVC/3rYRae1h%2BxfQzt09xOfb0PaHSk%3D' (2025-03-27)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/7b9e9c8d6f8a418fc83b6391313a6570b166daf5?narHash=sha256-W5TB0q9zGPiOZvGFpZTl0V0pSWh54EVEhyaNcroa1Pk%3D' (2025-03-25)
  → 'github:nixos/nixpkgs/a2cd41ef5ba904d58f230740f06567ff9506e368?narHash=sha256-UTEKMh3sbRHVr6ZYIoM7NWQjfrjIGTVOoV2Q4LkLvSk%3D' (2025-03-30)
2025-03-30 15:35:49 -04:00
github-actions[bot]
f448da92c7 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/4021f5dad2a46ff78c1bf82ee45c1656e12164f2?dir=pkgs/firefox-addons&narHash=sha256-5ahYCLPnBcZX7vlmXzn%2Bm0LDRgYiMDglU6UnH/HngPo%3D' (2025-03-14)
  → 'gitlab:rycee/nur-expressions/d74460da63a8c08a69a1f143b04f2ab1a6b2f5c2?dir=pkgs/firefox-addons&narHash=sha256-dAhrL%2BgEjNN5U/Sosy7IrX0Y0qPA0U7Gp9TBhqEliNU%3D' (2025-03-23)
• Updated input 'home-manager':
    'github:nix-community/home-manager/4e12151c9e014e2449e0beca2c0e9534b96a26b4?narHash=sha256-2lbURKclgKqBNm7hVRtWh0A7NrdsibD0EaWhahUVhhY%3D' (2025-03-14)
  → 'github:nix-community/home-manager/869f2ec2add75ce2a70a6dbbf585b8399abec625?narHash=sha256-F3xBdOs5m0SE6Gq3jz%2BJxDOPvsLs22vbGfD05uF6xEc%3D' (2025-03-25)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/e1f12151258b12c567f456d8248e4694e9390613?narHash=sha256-f0BVt1/cvA0DQ/q3rB%2BHY4g4tKksd03ZkzI4xehC2Ew%3D' (2025-03-12)
  → 'github:nixos/nixos-hardware/ecaa2d911e77c265c2a5bac8b583c40b0f151726?narHash=sha256-zvQ4GsCJT6MTOzPKLmlFyM%2Blxo0JGQ0cSFaZSACmWfY%3D' (2025-03-24)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/6607cf789e541e7873d40d3a8f7815ea92204f32?narHash=sha256-cPfs8qMccim2RBgtKGF%2Bx9IBCduRvd/N5F4nYpU0TVE%3D' (2025-03-13)
  → 'github:nixos/nixpkgs/1e5b653dff12029333a6546c11e108ede13052eb?narHash=sha256-G5n%2BFOXLXcRx%2B3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w%3D' (2025-03-22)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/0bf41acf4849eeae4e4ea6f5e3e9449a2532b44a?narHash=sha256-N/X9mRbXQiFOEBXSArrsP9cBH3BrwUIfiZkVoegOn4I%3D' (2025-03-14)
  → 'github:nixos/nixpkgs/7b9e9c8d6f8a418fc83b6391313a6570b166daf5?narHash=sha256-W5TB0q9zGPiOZvGFpZTl0V0pSWh54EVEhyaNcroa1Pk%3D' (2025-03-25)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/d016ce0365b87d848a57c12ffcfdc71da7a2b55f?narHash=sha256-ynOgXAyToeE1UdLNfrUn/hL7MN0OpIS2BtNdLjpjPf0%3D' (2025-03-13)
  → 'github:Mic92/sops-nix/67566fe68a8bed2a7b1175fdfb0697ed22ae8852?narHash=sha256-ZGlpUDsuBdeZeTNgoMv%2Baw0ByXT2J3wkYw9kJwkAS4M%3D' (2025-03-23)
2025-03-25 11:48:29 -04:00
8d14e85a5e removed open-webui 2025-03-25 11:42:48 -04:00
171dcb6273 testing nixpkgs.config.cudaSupport 2025-03-25 11:42:48 -04:00
8576cb2113 updated phone id 2025-03-23 19:06:29 -04:00
d0077f00f5 added mypy setting 2025-03-23 19:06:29 -04:00
0ea628ddb7 treefmt 2025-03-23 19:06:29 -04:00
4feba720fc added openwakeword 2025-03-23 19:06:29 -04:00
81ffea08e3 moved home_assistant data to postgres 2025-03-23 19:06:29 -04:00
61db4659dd user updates 2025-03-23 19:06:29 -04:00
0a50d94af4 added whisper and piper to home-assistant 2025-03-23 19:06:29 -04:00
27c59192c8 linux 6.13 2025-03-14 22:32:19 -04:00
github-actions[bot]
5a1078fec0 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/0b95936d94ea2a3ce66538f299351cf0b491aa15?dir=pkgs/firefox-addons&narHash=sha256-f314Ke28BGoVh4TK8FCzlPZgOl%2BoV7PvLyPF%2B%2Bln9M4%3D' (2025-03-07)
  → 'gitlab:rycee/nur-expressions/4021f5dad2a46ff78c1bf82ee45c1656e12164f2?dir=pkgs/firefox-addons&narHash=sha256-5ahYCLPnBcZX7vlmXzn%2Bm0LDRgYiMDglU6UnH/HngPo%3D' (2025-03-14)
• Updated input 'home-manager':
    'github:nix-community/home-manager/95711f926676018d279ba09fe7530d03b5d5b3e2?narHash=sha256-ytDmwV93lZ1f6jswJkxEQz5cBlwje/2rH/yUZDADZNs%3D' (2025-03-07)
  → 'github:nix-community/home-manager/4e12151c9e014e2449e0beca2c0e9534b96a26b4?narHash=sha256-2lbURKclgKqBNm7hVRtWh0A7NrdsibD0EaWhahUVhhY%3D' (2025-03-14)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/b48cc4dab0f9711af296fc367b6108cf7b8ccb16?narHash=sha256-RUAdT8dZ6k/486vnu3tiNRrNW6%2BQ8uSD2Mq7gTX4jlo%3D' (2025-03-07)
  → 'github:nixos/nixos-hardware/e1f12151258b12c567f456d8248e4694e9390613?narHash=sha256-f0BVt1/cvA0DQ/q3rB%2BHY4g4tKksd03ZkzI4xehC2Ew%3D' (2025-03-12)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/10069ef4cf863633f57238f179a0297de84bd8d3?narHash=sha256-Q6pMP4a9ed636qilcYX8XUguvKl/0/LGXhHcRI91p0U%3D' (2025-03-06)
  → 'github:nixos/nixpkgs/6607cf789e541e7873d40d3a8f7815ea92204f32?narHash=sha256-cPfs8qMccim2RBgtKGF%2Bx9IBCduRvd/N5F4nYpU0TVE%3D' (2025-03-13)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/cb26667f94d3d1163ba0e0e1b9cf9881290a7731?narHash=sha256-21gJ2ZcpqQmMrrYAH7IzbKWZn3MVxQNTCx9DV7OJWG4%3D' (2025-03-07)
  → 'github:nixos/nixpkgs/0bf41acf4849eeae4e4ea6f5e3e9449a2532b44a?narHash=sha256-N/X9mRbXQiFOEBXSArrsP9cBH3BrwUIfiZkVoegOn4I%3D' (2025-03-14)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/3f2412536eeece783f0d0ad3861417f347219f4d?narHash=sha256-9lfmSZLz6eq9Ygr6cCmvQiiBEaPb54pUBcjvbEMPORc%3D' (2025-03-03)
  → 'github:Mic92/sops-nix/d016ce0365b87d848a57c12ffcfdc71da7a2b55f?narHash=sha256-ynOgXAyToeE1UdLNfrUn/hL7MN0OpIS2BtNdLjpjPf0%3D' (2025-03-13)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/b36dd59fedeba140175590bfcab2ba22049dfc93?narHash=sha256-uzT5hQstNHJvdPPqdSiznxPXL3qCaKQ%2BDmMnx6IpIYk%3D' (2025-02-16)
  → 'github:RichieCahill/system_tools/c9979e045bca52ec85a0dc560b238f3e5ae2f01c?narHash=sha256-PM7dz99nb6dDiw/3naRGB/dUl5U7dJVspR9uevhW3xo%3D' (2025-03-10)
2025-03-14 22:16:28 -04:00
39ed05a73a updating open-webui host 2025-03-14 21:43:47 -04:00
github-actions[bot]
68202fdd15 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/9a8a0914000e4453c99a4c12e9862a0a40075851?dir=pkgs/firefox-addons&narHash=sha256-Gpvn9Z%2BZgKPyb6qaAbahLbo6ZVj7VuLzSCmHZRvsACA%3D' (2025-02-22)
  → 'gitlab:rycee/nur-expressions/0b95936d94ea2a3ce66538f299351cf0b491aa15?dir=pkgs/firefox-addons&narHash=sha256-f314Ke28BGoVh4TK8FCzlPZgOl%2BoV7PvLyPF%2B%2Bln9M4%3D' (2025-03-07)
• Updated input 'home-manager':
    'github:nix-community/home-manager/6be185eb76295e7562f5bf2da42afe374b8beb15?narHash=sha256-GKe3vrIWcei4gSTckEzHr5Zf/g9NSofmsAnbkNYU%2BlM%3D' (2025-02-26)
  → 'github:nix-community/home-manager/95711f926676018d279ba09fe7530d03b5d5b3e2?narHash=sha256-ytDmwV93lZ1f6jswJkxEQz5cBlwje/2rH/yUZDADZNs%3D' (2025-03-07)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/d58f642ddb23320965b27beb0beba7236e9117b5?narHash=sha256-pGk/aA0EBvI6o4DeuZsr05Ig/r4uMlSaf5EWUZEWM10%3D' (2025-02-24)
  → 'github:nixos/nixos-hardware/b48cc4dab0f9711af296fc367b6108cf7b8ccb16?narHash=sha256-RUAdT8dZ6k/486vnu3tiNRrNW6%2BQ8uSD2Mq7gTX4jlo%3D' (2025-03-07)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/0196c0175e9191c474c26ab5548db27ef5d34b05?narHash=sha256-WGaHVAjcrv%2BCun7zPlI41SerRtfknGQap281%2BAakSAw%3D' (2025-02-24)
  → 'github:nixos/nixpkgs/10069ef4cf863633f57238f179a0297de84bd8d3?narHash=sha256-Q6pMP4a9ed636qilcYX8XUguvKl/0/LGXhHcRI91p0U%3D' (2025-03-06)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/45ea1fa0de33802bcc9ca41075eac2c05a15eaab?narHash=sha256-HWWeQPGrD%2BiR2f3/OIFHnWZ62d7CafL5BHgL5EITxGE%3D' (2025-02-26)
  → 'github:nixos/nixpkgs/cb26667f94d3d1163ba0e0e1b9cf9881290a7731?narHash=sha256-21gJ2ZcpqQmMrrYAH7IzbKWZn3MVxQNTCx9DV7OJWG4%3D' (2025-03-07)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/07af005bb7d60c7f118d9d9f5530485da5d1e975?narHash=sha256-7JAGezJ0Dn5qIyA2%2BT4Dt/xQgAbhCglh6lzCekTVMeU%3D' (2025-02-11)
  → 'github:Mic92/sops-nix/3f2412536eeece783f0d0ad3861417f347219f4d?narHash=sha256-9lfmSZLz6eq9Ygr6cCmvQiiBEaPb54pUBcjvbEMPORc%3D' (2025-03-03)
2025-03-07 22:14:11 -05:00
9a64d9cbfb small improvements 2025-03-07 20:57:43 -05:00
1d0d46d22d adding transmission 2025-03-07 20:57:43 -05:00
1d1bfae8ee made syncthing overrideFolders false on jeeves 2025-02-26 21:04:27 -05:00
github-actions[bot]
8d6328ce57 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/f61927ae7c2b28ee9d426114a06f185f4dea4301?dir=pkgs/firefox-addons&narHash=sha256-E%2BxGh25fyBLNo2FYxP4uHkTh4yh1C0AIyYpcVdW3CL0%3D' (2025-02-12)
  → 'gitlab:rycee/nur-expressions/9a8a0914000e4453c99a4c12e9862a0a40075851?dir=pkgs/firefox-addons&narHash=sha256-Gpvn9Z%2BZgKPyb6qaAbahLbo6ZVj7VuLzSCmHZRvsACA%3D' (2025-02-22)
• Updated input 'home-manager':
    'github:nix-community/home-manager/15b59d4191b993ebdfcb1f61b834fced217882ba?narHash=sha256-4gvobxITgcrNGfwsVG5a46QzQCX89btIYw23p0ilbcc%3D' (2025-02-12)
  → 'github:nix-community/home-manager/6be185eb76295e7562f5bf2da42afe374b8beb15?narHash=sha256-GKe3vrIWcei4gSTckEzHr5Zf/g9NSofmsAnbkNYU%2BlM%3D' (2025-02-26)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/2eccff41bab80839b1d25b303b53d339fbb07087?narHash=sha256-5yRlg48XmpcX5b5HesdGMOte%2BYuCy9rzQkJz%2Bimcu6I%3D' (2025-02-06)
  → 'github:nixos/nixos-hardware/d58f642ddb23320965b27beb0beba7236e9117b5?narHash=sha256-pGk/aA0EBvI6o4DeuZsr05Ig/r4uMlSaf5EWUZEWM10%3D' (2025-02-24)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/64e75cd44acf21c7933d61d7721e812eac1b5a0a?narHash=sha256-26L8VAu3/1YRxS8MHgBOyOM8xALdo6N0I04PgorE7UM%3D' (2025-02-10)
  → 'github:nixos/nixpkgs/0196c0175e9191c474c26ab5548db27ef5d34b05?narHash=sha256-WGaHVAjcrv%2BCun7zPlI41SerRtfknGQap281%2BAakSAw%3D' (2025-02-24)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/154a2c1abcea99a98f8b9344dfaba019a28162bd?narHash=sha256-5U1YLh8bENPGtC6j6493qs3lK0PrzZw4omMvJUFOhEI%3D' (2025-02-12)
  → 'github:nixos/nixpkgs/45ea1fa0de33802bcc9ca41075eac2c05a15eaab?narHash=sha256-HWWeQPGrD%2BiR2f3/OIFHnWZ62d7CafL5BHgL5EITxGE%3D' (2025-02-26)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/7cff86220ce86a1083466e2fc8b947551ab577a3?narHash=sha256-RE%2B6AgQ/Q/yFBYDPlN%2BjSrhEKtZLBF8xlIsz2T78K68%3D' (2025-02-01)
  → 'github:RichieCahill/system_tools/b36dd59fedeba140175590bfcab2ba22049dfc93?narHash=sha256-uzT5hQstNHJvdPPqdSiznxPXL3qCaKQ%2BDmMnx6IpIYk%3D' (2025-02-16)
2025-02-26 20:57:02 -05:00
02db3d2eb5 added ollama user 2025-02-23 10:27:13 -05:00
bdf9d267e8 moved models 2025-02-23 10:27:13 -05:00
4db29ae280 added models dataset 2025-02-23 10:27:13 -05:00
1b97fa7dda gaming simplify vscode 2025-02-21 14:12:04 -05:00
9248337e55 adding vscode to gaming user 2025-02-21 13:37:30 -05:00
f77c341e2b adding fallbackToPassword to bob 2025-02-17 13:02:24 -05:00
f7f0d02ef9 moved nvidia.nix to common/optional 2025-02-12 21:20:39 -05:00
e723ab9e86 added word tod spell check 2025-02-12 21:20:39 -05:00
5182bf18bc removed un unused ssh config entry 2025-02-12 21:20:39 -05:00
11883f981e improving spell check 2025-02-12 21:20:39 -05:00
6d41287eec removed some open firewall ports 2025-02-12 19:56:18 -05:00
433c52309b set up duel stack for haproxy 2025-02-12 19:56:18 -05:00
e1bbadfcba removed a trailing space 2025-02-12 17:32:15 -05:00
868f782523 removing cosmic 2025-02-12 17:32:15 -05:00
434c80adac add daily build to refresh cache 2025-02-11 21:46:50 -05:00
6c15bbe0a3 adding nixfmt to spell check 2025-02-11 20:42:16 -05:00
cbdefc0c52 remove reference for ioit vlan from home-assistant 2025-02-11 20:40:57 -05:00
3fc9d9d614 fixed names in treefmt.yml 2025-02-08 18:13:31 -05:00
aa4a11c0c3 set up treefmt action 2025-02-08 18:13:31 -05:00
300aa1f032 ran nix fmt . 2025-02-08 18:13:31 -05:00
c12bd0c7ca set up treefmt 2025-02-08 18:13:31 -05:00
f43a34f37c setting up postgres 2025-02-08 17:38:52 -05:00
33c2718d40 removed duplicate zerotierone entry 2025-02-06 19:02:02 -05:00
78500e6122 removed vlans 2025-02-06 19:02:02 -05:00
9459d4797e testing cosmic 2025-02-06 19:02:02 -05:00
bfbcb70327 added git lfs support 2025-02-04 21:37:27 -05:00
b95e553093 added chromium to users 2025-02-04 21:37:27 -05:00
8668603404 adding llms to bob 2025-02-04 21:37:27 -05:00
60c3e3db20 moved cloud_flare_tunnel to a service 2025-02-04 21:28:10 -05:00
d3aa49f9e4 moved haproxy to a service 2025-02-04 21:28:10 -05:00
f691015920 deleted photoprism.nix 2025-02-04 21:28:10 -05:00
81ab03f3f1 moved audiobookshelf to a service 2025-02-04 21:28:10 -05:00
ba1170720c moved filebrowser to a service 2025-02-04 21:28:10 -05:00
4316c8a52e moved validate_system.toml to services dir 2025-02-04 21:28:10 -05:00
a036467131 fixed mistake 2025-02-04 21:28:10 -05:00
62c26b351c added duckdns.nix 2025-02-04 21:28:10 -05:00
cd5ad0dcae added runners dir 2025-02-04 21:28:10 -05:00
fa38cc6321 added services import to jeeves default 2025-02-04 21:28:10 -05:00
e8d971340b made nix_serve.nix 2025-02-04 21:28:10 -05:00
30f2af87be moved systemd.nix 2025-02-04 21:28:10 -05:00
8522b77285 moved home_assistant.nix 2025-02-04 21:28:10 -05:00
f1a48819a5 moved jellyfin.nix 2025-02-04 21:28:10 -05:00
eff58f08ad added services dir 2025-02-04 21:28:10 -05:00
a24c4fd756 moved audiobookshelf volumes 2025-02-01 15:31:04 -05:00
f10ab4a9af updated startup_validation to have a config file 2025-02-01 15:31:04 -05:00
7cc831a2d0 added version to audiobookshelf filebrowser haproxy cloudflared apache2 and uptime-kuma 2025-02-01 15:31:04 -05:00
91690734ba removed grafana and postgres 2025-02-01 15:31:04 -05:00
github-actions[bot]
b97e81e96e flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/9a96d7b0485be4654b6f2237efeccb1144d1ba54?dir=pkgs/firefox-addons&narHash=sha256-YDDKpj1j9MqGZgrugfu8mQWjpiy4r7fZ1FMJL58NasM%3D' (2025-01-25)
  → 'gitlab:rycee/nur-expressions/dc86c8feffa328d9050e039a1286e175af6d76d8?dir=pkgs/firefox-addons&narHash=sha256-ppR81tMrcQk/wHm8MmKtp3mrtYmMTgF2lxLLXYwRsOM%3D' (2025-02-01)
• Updated input 'home-manager':
    'github:nix-community/home-manager/daf04c5950b676f47a794300657f1d3d14c1a120?narHash=sha256-5HGG09bh/Yx0JA8wtBMAzt0HMCL1bYZ93x4IqzVExio%3D' (2025-01-24)
  → 'github:nix-community/home-manager/8544cd092047a7e92d0dce011108a563de7fc0f2?narHash=sha256-ZlLTnqIQQ8OE6AtT%2BfluB642j2R9tnvxHHtpnmLjSxQ%3D' (2025-02-01)
• Updated input 'nixos-cosmic':
    'github:lilyinstarlight/nixos-cosmic/e277b9162637a85f45c4564d687729797f560637?narHash=sha256-5/8KyhEtPLXqmE5CygvMSZZUw8wHcq/bFh1ckTtDDcA%3D' (2025-01-25)
  → 'github:lilyinstarlight/nixos-cosmic/51b9cce097da369550f45ac07879274dc8be81e4?narHash=sha256-y9st4Y0p5ry%2B6QdlIGeqxAA6rbEIOO1uXdAc5jxV2Bc%3D' (2025-01-31)
• Updated input 'nixos-cosmic/nixpkgs-stable':
    'github:NixOS/nixpkgs/035f8c0853c2977b24ffc4d0a42c74f00b182cd8?narHash=sha256-YnHJJ19wqmibLQdUeq9xzE6CjrMA568KN/lFPuSVs4I%3D' (2025-01-23)
  → 'github:NixOS/nixpkgs/59e618d90c065f55ae48446f307e8c09565d5ab0?narHash=sha256-B/7Y1v4y%2BmsFFBW1JAdFjNvVthvNdJKiN6EGRPnqfno%3D' (2025-01-29)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/dfad538f751a5aa5d4436d9781ab27a6128ec9d4?narHash=sha256-ZEbOJ9iT72iwqXsiEMbEa8wWjyFvRA9Ugx8utmYbpz4%3D' (2025-01-24)
  → 'github:nixos/nixos-hardware/34b64e4e1ddb14e3ffc7db8d4a781396dbbab773?narHash=sha256-6HI58PKjddsC0RA0gBQlt6ox47oH//jLUHwx05RO8g0%3D' (2025-02-01)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/825479c345a7f806485b7f00dbe3abb50641b083?narHash=sha256-nU6AezEX4EuahTO1YopzueAXfjFfmCHylYEFCagduHU%3D' (2025-01-24)
  → 'github:nixos/nixpkgs/9d3ae807ebd2981d593cddd0080856873139aa40?narHash=sha256-NGqpVVxNAHwIicXpgaVqJEJWeyqzoQJ9oc8lnK9%2BWC4%3D' (2025-01-29)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/8504e3c64d7ad6943f9e684cc3fe83ad443a009b?narHash=sha256-RFDB7DV2TTh/2dX2X8IRUOeKTxUiFmnHg82IV2OEZf0%3D' (2025-01-26)
  → 'github:nixos/nixpkgs/102a39bfee444533e6b4e8611d7e92aa39b7bec1?narHash=sha256-Q4vhtbLYWBUnjWD4iQb003Lt%2BN5PuURDad1BngGKdUs%3D' (2025-02-01)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/015d461c16678fc02a2f405eb453abb509d4e1d4?narHash=sha256-j9IdflJwRtqo9WpM0OfAZml47eBblUHGNQTe62OUqTw%3D' (2025-01-20)
  → 'github:Mic92/sops-nix/4c1251904d8a08c86ac6bc0d72cc09975e89aef7?narHash=sha256-wkwYJc8cKmmQWUloyS9KwttBnja2ONRuJQDEsmef320%3D' (2025-01-31)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/a643f2e67492901e3975aeab603f4a71f54e645d?narHash=sha256-agiofvmeAjAzQxs3HXe0ruKwgws0PECBjc8HlTkgDlc%3D' (2025-01-20)
  → 'github:RichieCahill/system_tools/a697bd3df11ba40afd40d6324a39859c91b7bb78?narHash=sha256-wC8hJvhdFdrEtzc7HMWyXNtQbS3CVyOjUUpEHtxOlJg%3D' (2025-01-31)
2025-02-01 10:37:51 -05:00
0d680dc68d adding internal-ioit-vlan 2025-01-31 17:31:17 -05:00
81867eb312 testing GH_TOKEN_FOR_UPDATES 2025-01-26 13:46:23 -05:00
00852c019d moving hardware.bluetooth to optional/desktop.nix 2025-01-26 12:58:32 -05:00
github-actions[bot]
b53f4ec8d8 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/f3bffded7ab861654ab3be7c1e974eafe72c52b0?dir=pkgs/firefox-addons&narHash=sha256-lroOTrqUw443CfegVkfNAfE57uIsF4fjUvlUjVnB3kY%3D' (2025-01-23)
  → 'gitlab:rycee/nur-expressions/9a96d7b0485be4654b6f2237efeccb1144d1ba54?dir=pkgs/firefox-addons&narHash=sha256-YDDKpj1j9MqGZgrugfu8mQWjpiy4r7fZ1FMJL58NasM%3D' (2025-01-25)
• Updated input 'home-manager':
    'github:nix-community/home-manager/7b9ece1bf3c8780cde9b975b28c2d9ccd7e9cdb9?narHash=sha256-v9WQ3c4ctwPMfdBZMZxpdM9xXev4uChce4BxOpvsu0E%3D' (2025-01-23)
  → 'github:nix-community/home-manager/daf04c5950b676f47a794300657f1d3d14c1a120?narHash=sha256-5HGG09bh/Yx0JA8wtBMAzt0HMCL1bYZ93x4IqzVExio%3D' (2025-01-24)
• Updated input 'nixos-cosmic':
    'github:lilyinstarlight/nixos-cosmic/4152cf7f0caab4821f009ee132f8ff016f537630?narHash=sha256-6rDozHAgJmdsUrIggrIxcjSq8lQeFuh9WjyqhhLEqDE%3D' (2025-01-23)
  → 'github:lilyinstarlight/nixos-cosmic/e277b9162637a85f45c4564d687729797f560637?narHash=sha256-5/8KyhEtPLXqmE5CygvMSZZUw8wHcq/bFh1ckTtDDcA%3D' (2025-01-25)
• Updated input 'nixos-cosmic/nixpkgs-stable':
    'github:NixOS/nixpkgs/47addd76727f42d351590c905d9d1905ca895b82?narHash=sha256-6qY0pk2QmUtBT9Mywdvif0i/CLVgpCjMUn6g9vB%2Bf3M%3D' (2025-01-22)
  → 'github:NixOS/nixpkgs/035f8c0853c2977b24ffc4d0a42c74f00b182cd8?narHash=sha256-YnHJJ19wqmibLQdUeq9xzE6CjrMA568KN/lFPuSVs4I%3D' (2025-01-23)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/9368027715d8dde4b84c79c374948b5306fdd2db?narHash=sha256-qM/y6Dtpu9Wmf5HqeZajQdn%2BcS0aljdYQQQnrvx%2BLJE%3D' (2025-01-23)
  → 'github:nixos/nixos-hardware/dfad538f751a5aa5d4436d9781ab27a6128ec9d4?narHash=sha256-ZEbOJ9iT72iwqXsiEMbEa8wWjyFvRA9Ugx8utmYbpz4%3D' (2025-01-24)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab?narHash=sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk%3D' (2025-01-21)
  → 'github:nixos/nixpkgs/825479c345a7f806485b7f00dbe3abb50641b083?narHash=sha256-nU6AezEX4EuahTO1YopzueAXfjFfmCHylYEFCagduHU%3D' (2025-01-24)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/2d99c7f729083f488efb1228e2129443f6fa6ebc?narHash=sha256-P9gfexAOEd51nAgz3TtgGy1YEFgoQPk18QZQklrVlT0%3D' (2025-01-23)
  → 'github:nixos/nixpkgs/8504e3c64d7ad6943f9e684cc3fe83ad443a009b?narHash=sha256-RFDB7DV2TTh/2dX2X8IRUOeKTxUiFmnHg82IV2OEZf0%3D' (2025-01-26)
2025-01-26 12:58:32 -05:00
64a4223560 adding nix-builders 2025-01-23 23:47:00 -05:00
88d3d6311f adding rokuecp 2025-01-23 23:46:51 -05:00
github-actions[bot]
bccc569650 flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/a66d5a22e3659544f41970472bd944a7824eb572?dir=pkgs/firefox-addons&narHash=sha256-wXKdOKufzA4cUoHrKWOaPSyCjGEuPHWB7EOjPZKw5uQ%3D' (2025-01-19)
  → 'gitlab:rycee/nur-expressions/f3bffded7ab861654ab3be7c1e974eafe72c52b0?dir=pkgs/firefox-addons&narHash=sha256-lroOTrqUw443CfegVkfNAfE57uIsF4fjUvlUjVnB3kY%3D' (2025-01-23)
• Updated input 'home-manager':
    'github:nix-community/home-manager/f8ef4541bb8a54a8b52f19b52912119e689529b3?narHash=sha256-0NBrY2A7buujKmeCbieopOMSbLxTu8TFcTLqAbTnQDw%3D' (2025-01-19)
  → 'github:nix-community/home-manager/7b9ece1bf3c8780cde9b975b28c2d9ccd7e9cdb9?narHash=sha256-v9WQ3c4ctwPMfdBZMZxpdM9xXev4uChce4BxOpvsu0E%3D' (2025-01-23)
• Updated input 'nixos-cosmic':
    'github:lilyinstarlight/nixos-cosmic/6ec08f11bbf0e936ad82f1bb532f3757f8b5e3c2?narHash=sha256-0QcnnQZ/il9UPVmhJtDqjPDCCcW5vTCz7QaLu%2BrlrRQ%3D' (2025-01-19)
  → 'github:lilyinstarlight/nixos-cosmic/4152cf7f0caab4821f009ee132f8ff016f537630?narHash=sha256-6rDozHAgJmdsUrIggrIxcjSq8lQeFuh9WjyqhhLEqDE%3D' (2025-01-23)
• Updated input 'nixos-cosmic/nixpkgs-stable':
    'github:NixOS/nixpkgs/6a3ae7a5a12fb8cac2d59d7df7cbd95f9b2f0566?narHash=sha256-s40Kk/OulP3J/1JvC3VT16U4r/Xw6Qdi7SRw3LYkPWs%3D' (2025-01-18)
  → 'github:NixOS/nixpkgs/47addd76727f42d351590c905d9d1905ca895b82?narHash=sha256-6qY0pk2QmUtBT9Mywdvif0i/CLVgpCjMUn6g9vB%2Bf3M%3D' (2025-01-22)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/cb3173dc5c746fa95bca1f035a7e4d2b588894ac?narHash=sha256-%2BX9KAryvDsIE7lQ0FdfiD1u33nOVgsgufedqspf77N4%3D' (2025-01-19)
  → 'github:nixos/nixos-hardware/9368027715d8dde4b84c79c374948b5306fdd2db?narHash=sha256-qM/y6Dtpu9Wmf5HqeZajQdn%2BcS0aljdYQQQnrvx%2BLJE%3D' (2025-01-23)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/5df43628fdf08d642be8ba5b3625a6c70731c19c?narHash=sha256-Tbk1MZbtV2s5aG%2BiM99U8FqwxU/YNArMcWAv6clcsBc%3D' (2025-01-16)
  → 'github:nixos/nixpkgs/9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab?narHash=sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk%3D' (2025-01-21)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/bba244a0bb9073202711ac5c88d02fd95cd80b0a?narHash=sha256-j/4dg6A76JEz7yoS4%2B69NeK3spEGNyJ32w1LfBOpYQE%3D' (2025-01-20)
  → 'github:nixos/nixpkgs/2d99c7f729083f488efb1228e2129443f6fa6ebc?narHash=sha256-P9gfexAOEd51nAgz3TtgGy1YEFgoQPk18QZQklrVlT0%3D' (2025-01-23)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/4c4fb93f18b9072c6fa1986221f9a3d7bf1fe4b6?narHash=sha256-GXUE9%2BFgxoZU8v0p6ilBJ8NH7k8nKmZjp/7dmMrCv3o%3D' (2025-01-17)
  → 'github:Mic92/sops-nix/015d461c16678fc02a2f405eb453abb509d4e1d4?narHash=sha256-j9IdflJwRtqo9WpM0OfAZml47eBblUHGNQTe62OUqTw%3D' (2025-01-20)
2025-01-23 23:45:02 -05:00
633a48af7b added shell = pkgs.bash 2025-01-23 22:47:43 -05:00
799794ebe5 added nix setting to nix_builder containers 2025-01-23 22:47:43 -05:00
7b07266c44 removed ping test 2025-01-23 22:47:43 -05:00
60ce45a08d increase ssh login level 2025-01-23 22:47:43 -05:00
12b6c1e279 removed ping test 2025-01-23 22:47:43 -05:00
12b4fe92da adding ping to extraPackages 2025-01-23 22:47:43 -05:00
d076183777 added openssh to extraPackages 2025-01-23 22:47:43 -05:00
7a454ca740 testing connection 2025-01-23 22:47:43 -05:00
8dd892a88f added openssh to extraPackages 2025-01-23 22:47:43 -05:00
7f3bb43d39 testing ssh config 2025-01-23 22:47:43 -05:00
793d06683e added -vv to NIX_SSHOPTS 2025-01-23 22:47:43 -05:00
bb1d92252f added -o UserKnownHostsFile=/dev/null 2025-01-23 22:47:43 -05:00
f7a95f32cd added -o StrictHostKeyChecking=no 2025-01-23 22:47:43 -05:00
ea24fb9865 fixed ip address 2025-01-23 22:47:43 -05:00
c39f8c4a7e added copy step to build_systems action 2025-01-23 22:47:43 -05:00
d7fd0796ea created nix_builder module 2025-01-23 22:47:43 -05:00
01d2bd04b2 created base containers for nix builder 2025-01-23 22:47:43 -05:00
040a44b608 updated homeassistant unit_system to us_customary 2025-01-19 22:02:06 -05:00
github-actions[bot]
a3a132b41c flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/9b53b108b417e6d3fef7743c4034df582fbd9a7e?dir=pkgs/firefox-addons&narHash=sha256-6VB1uVPqyaXTTori47ESnvAlQ1nHR4XwRybBHxWpL3E%3D' (2025-01-16)
  → 'gitlab:rycee/nur-expressions/a66d5a22e3659544f41970472bd944a7824eb572?dir=pkgs/firefox-addons&narHash=sha256-wXKdOKufzA4cUoHrKWOaPSyCjGEuPHWB7EOjPZKw5uQ%3D' (2025-01-19)
• Updated input 'home-manager':
    'github:nix-community/home-manager/12851ae7467bad8ef422b20806ab4d6d81e12d29?narHash=sha256-u1gk5I1an975FOAMMdS6oBKnSIsZza5ZKhaeBZAskVo%3D' (2025-01-17)
  → 'github:nix-community/home-manager/f8ef4541bb8a54a8b52f19b52912119e689529b3?narHash=sha256-0NBrY2A7buujKmeCbieopOMSbLxTu8TFcTLqAbTnQDw%3D' (2025-01-19)
• Updated input 'nixos-cosmic':
    'github:lilyinstarlight/nixos-cosmic/c92ead1ab77f8be697a44ca855d06c5957ee2a62?narHash=sha256-P9n4HP0XPlXTViw7g3lBRX3Eix0sgcnhanV0ddB08SA%3D' (2025-01-16)
  → 'github:lilyinstarlight/nixos-cosmic/6ec08f11bbf0e936ad82f1bb532f3757f8b5e3c2?narHash=sha256-0QcnnQZ/il9UPVmhJtDqjPDCCcW5vTCz7QaLu%2BrlrRQ%3D' (2025-01-19)
• Updated input 'nixos-cosmic/nixpkgs-stable':
    'github:NixOS/nixpkgs/9c6b49aeac36e2ed73a8c472f1546f6d9cf1addc?narHash=sha256-i/UJ5I7HoqmFMwZEH6vAvBxOrjjOJNU739lnZnhUln8%3D' (2025-01-14)
  → 'github:NixOS/nixpkgs/6a3ae7a5a12fb8cac2d59d7df7cbd95f9b2f0566?narHash=sha256-s40Kk/OulP3J/1JvC3VT16U4r/Xw6Qdi7SRw3LYkPWs%3D' (2025-01-18)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/b678606690027913f3434dea3864e712b862dde5?narHash=sha256-oMr3PVIQ8XPDI8/x6BHxsWEPBRU98Pam6KGVwUh8MPk%3D' (2025-01-15)
  → 'github:nixos/nixos-hardware/cb3173dc5c746fa95bca1f035a7e4d2b588894ac?narHash=sha256-%2BX9KAryvDsIE7lQ0FdfiD1u33nOVgsgufedqspf77N4%3D' (2025-01-19)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/eb62e6aa39ea67e0b8018ba8ea077efe65807dc8?narHash=sha256-uQ%2BNQ0/xYU0N1CnXsa2zghgNaOPxWpMJXSUJJ9W7140%3D' (2025-01-14)
  → 'github:nixos/nixpkgs/5df43628fdf08d642be8ba5b3625a6c70731c19c?narHash=sha256-Tbk1MZbtV2s5aG%2BiM99U8FqwxU/YNArMcWAv6clcsBc%3D' (2025-01-16)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/0993fc268872148cebcd1fac8660a8b8ced49542?narHash=sha256-hCddtSuk6m6XROmdOC0te0j2sLeUr28QIzNRk0qF1as%3D' (2025-01-17)
  → 'github:nixos/nixpkgs/bba244a0bb9073202711ac5c88d02fd95cd80b0a?narHash=sha256-j/4dg6A76JEz7yoS4%2B69NeK3spEGNyJ32w1LfBOpYQE%3D' (2025-01-20)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/553c7cb22fed19fd60eb310423fdc93045c51ba8?narHash=sha256-wlgdf/n7bJMLBheqt1jmPoxJFrUP6FByKQFXuM9YvIk%3D' (2025-01-13)
  → 'github:Mic92/sops-nix/4c4fb93f18b9072c6fa1986221f9a3d7bf1fe4b6?narHash=sha256-GXUE9%2BFgxoZU8v0p6ilBJ8NH7k8nKmZjp/7dmMrCv3o%3D' (2025-01-17)
• Updated input 'system_tools':
    'github:RichieCahill/system_tools/bc357d8fabd83c1423611829091e5b1d86dd913c?narHash=sha256-B13faNyBbA3MeI7Jp6pFVbp58rI2Rx5Uvd83csW2p48%3D' (2024-12-01)
  → 'github:RichieCahill/system_tools/a643f2e67492901e3975aeab603f4a71f54e645d?narHash=sha256-agiofvmeAjAzQxs3HXe0ruKwgws0PECBjc8HlTkgDlc%3D' (2025-01-20)
• Updated input 'system_tools/poetry2nix':
    'github:nix-community/poetry2nix/f554d27c1544d9c56e5f1f8e2b8aff399803674e?narHash=sha256-F7N1mxH1VrkVNHR3JGNMRvp9%2B98KYO4b832KS8Gl2xI%3D' (2024-11-10)
  → 'github:nix-community/poetry2nix/75d0515332b7ca269f6d7abfd2c44c47a7cbca7b?narHash=sha256-eiCqmKl0BIRiYk5/ZhZozwn4/7Km9CWTbc15Cv%2BVX5k%3D' (2025-01-14)
2025-01-19 22:02:06 -05:00
c0a97c6ed8 removed unnecessary nesting 2025-01-19 16:40:53 -05:00
83dad24351 moved davids-server.id to jeeves/syncthing.nix 2025-01-19 16:40:53 -05:00
1a1cc41265 removed bob_temp 2025-01-19 16:40:53 -05:00
0457265bd7 added firewall rule for syncthing webui 2025-01-19 16:40:53 -05:00
3c2476336b added encrypted folders to davids-server 2025-01-19 16:40:53 -05:00
27ec9d9204 added davids-server to devices 2025-01-19 16:40:53 -05:00
0f094bfacb added update.nix to bob 2025-01-19 14:41:24 -05:00
14a312dd0f formatted nixpkgs settings 2025-01-19 14:41:24 -05:00
c87e653ad7 moved zfs services to global/default.nix 2025-01-19 14:41:24 -05:00
e88fc08d91 moved security.rtkit.enable = true; to optional/desktop.nix
https://nixos.wiki/wiki/PipeWire
2025-01-19 14:41:24 -05:00
2e26035693 removing plex 2025-01-19 13:29:40 -05:00
f877b15d35 added jellyfin-media-player to bob 2025-01-18 17:07:00 -05:00
7736c36eee added new line 2025-01-18 17:07:00 -05:00
78159e1d90 removed useragent.override 2025-01-18 17:07:00 -05:00
a39d3f0c51 setup jellyfin to home_assistant and haproxy 2025-01-18 17:07:00 -05:00
7995d383ca added jellyfin.nix 2025-01-18 17:07:00 -05:00
a7e8494d8a zfs 2.3 update 2025-01-17 18:56:22 -05:00
github-actions[bot]
17599aea9d flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/7f8746a7ef2d15b8fb4acc63cb0d7e3a407739bf?dir=pkgs/firefox-addons&narHash=sha256-RBTk5KavYsPZ56m9C2evS4pDkEu3%2BNdxY6mFNbo8DH8%3D' (2025-01-11)
  → 'gitlab:rycee/nur-expressions/9b53b108b417e6d3fef7743c4034df582fbd9a7e?dir=pkgs/firefox-addons&narHash=sha256-6VB1uVPqyaXTTori47ESnvAlQ1nHR4XwRybBHxWpL3E%3D' (2025-01-16)
• Updated input 'home-manager':
    'github:nix-community/home-manager/2532b500c3ed2b8940e831039dcec5a5ea093afc?narHash=sha256-ZOaGwa%2BWnB7Zn3YXimqjmIugAnHePdXCmNu%2BAHkq808%3D' (2025-01-10)
  → 'github:nix-community/home-manager/12851ae7467bad8ef422b20806ab4d6d81e12d29?narHash=sha256-u1gk5I1an975FOAMMdS6oBKnSIsZza5ZKhaeBZAskVo%3D' (2025-01-17)
• Updated input 'nixos-cosmic':
    'github:lilyinstarlight/nixos-cosmic/a934c861065b6b1aca9a859c45631336e0e8560c?narHash=sha256-h6hi94y9bTl9DQV4keGpYAfJhnH50rxxEdQlGL7QENw%3D' (2025-01-11)
  → 'github:lilyinstarlight/nixos-cosmic/c92ead1ab77f8be697a44ca855d06c5957ee2a62?narHash=sha256-P9n4HP0XPlXTViw7g3lBRX3Eix0sgcnhanV0ddB08SA%3D' (2025-01-16)
• Updated input 'nixos-cosmic/nixpkgs-stable':
    'github:NixOS/nixpkgs/3f0a8ac25fb674611b98089ca3a5dd6480175751?narHash=sha256-JO%2BlFN2HsCwSLMUWXHeOad6QUxOuwe9UOAF/iSl1J4I%3D' (2025-01-06)
  → 'github:NixOS/nixpkgs/9c6b49aeac36e2ed73a8c472f1546f6d9cf1addc?narHash=sha256-i/UJ5I7HoqmFMwZEH6vAvBxOrjjOJNU739lnZnhUln8%3D' (2025-01-14)
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/8870dcaff63dfc6647fb10648b827e9d40b0a337?narHash=sha256-OL7leZ6KBhcDF3nEKe4aZVfIm6xQpb1Kb%2BmxySIP93o%3D' (2025-01-09)
  → 'github:nixos/nixos-hardware/b678606690027913f3434dea3864e712b862dde5?narHash=sha256-oMr3PVIQ8XPDI8/x6BHxsWEPBRU98Pam6KGVwUh8MPk%3D' (2025-01-15)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/bffc22eb12172e6db3c5dde9e3e5628f8e3e7912?narHash=sha256-8YVQ9ZbSfuUk2bUf2KRj60NRraLPKPS0Q4QFTbc%2Bc2c%3D' (2025-01-08)
  → 'github:nixos/nixpkgs/eb62e6aa39ea67e0b8018ba8ea077efe65807dc8?narHash=sha256-uQ%2BNQ0/xYU0N1CnXsa2zghgNaOPxWpMJXSUJJ9W7140%3D' (2025-01-14)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/b1877784f6a133d4b2b1a36e77ecf1d50684ebb4?narHash=sha256-/IbHbC5dKe/hT2Buv4eKcWijoGRB1mUwU3hErUbD9gw%3D' (2025-01-11)
  → 'github:nixos/nixpkgs/0993fc268872148cebcd1fac8660a8b8ced49542?narHash=sha256-hCddtSuk6m6XROmdOC0te0j2sLeUr28QIzNRk0qF1as%3D' (2025-01-17)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/f214c1b76c347a4e9c8fb68c73d4293a6820d125?narHash=sha256-4P99yL8vGehwzytkpP87eklBePt6aqeEC5JFsIzhfUs%3D' (2025-01-10)
  → 'github:Mic92/sops-nix/553c7cb22fed19fd60eb310423fdc93045c51ba8?narHash=sha256-wlgdf/n7bJMLBheqt1jmPoxJFrUP6FByKQFXuM9YvIk%3D' (2025-01-13)
2025-01-16 22:56:55 -05:00
ae5981dcfa reformatted richie default.nix 2025-01-16 22:40:43 -05:00
1770cb87d3 removed bob authorizedKey 2025-01-16 22:40:43 -05:00
61b548e11c changed the defaultSession to plasma 2025-01-16 22:40:43 -05:00
76da8cd379 add reservations to to zfs datasets
This reduce the risk of out of space error
2025-01-16 22:40:43 -05:00
0e4cb002c8 set up esphome 2025-01-14 23:49:54 -05:00
ce27dcfa39 added home-manager backupFileExtension 2025-01-11 14:10:52 -05:00
github-actions[bot]
6dae76c51e flake.lock: Update
Flake lock file updates:

• Updated input 'firefox-addons':
    'gitlab:rycee/nur-expressions/0ad9cf75bae6a9290e9c83cef19f60595f189979?dir=pkgs/firefox-addons&narHash=sha256-WXbwHw%2BJeIOo3KvGDjrfsuwj8JWBUkFFxmlm07w9i7Q%3D' (2025-01-07)
  → 'gitlab:rycee/nur-expressions/7f8746a7ef2d15b8fb4acc63cb0d7e3a407739bf?dir=pkgs/firefox-addons&narHash=sha256-RBTk5KavYsPZ56m9C2evS4pDkEu3%2BNdxY6mFNbo8DH8%3D' (2025-01-11)
• Updated input 'home-manager':
    'github:nix-community/home-manager/5c4302313d9207f7ec0886d68f8ff4a3c71209a1?narHash=sha256-kPDXF6cIPsVqSK08XF5EC6KM7BdMnM9vtJDzsnf%2BlLU%3D' (2025-01-07)
  → 'github:nix-community/home-manager/2532b500c3ed2b8940e831039dcec5a5ea093afc?narHash=sha256-ZOaGwa%2BWnB7Zn3YXimqjmIugAnHePdXCmNu%2BAHkq808%3D' (2025-01-10)
• Updated input 'nixos-cosmic':
    'github:lilyinstarlight/nixos-cosmic/0830abeebf3b2d1bae44652ffb2c89cf0d56ddaa?narHash=sha256-Pi70vbASZ1O9cR8RO5d2hBiNjIJBKKLoABl4sxWyOgg%3D' (2025-01-07)
  → 'github:lilyinstarlight/nixos-cosmic/a934c861065b6b1aca9a859c45631336e0e8560c?narHash=sha256-h6hi94y9bTl9DQV4keGpYAfJhnH50rxxEdQlGL7QENw%3D' (2025-01-11)
• Updated input 'nixos-cosmic/nixpkgs-stable':
    'github:NixOS/nixpkgs/cbd8ec4de4469333c82ff40d057350c30e9f7d36?narHash=sha256-DjkQPnkAfd7eB522PwnkGhOMuT9QVCZspDpJJYyOj60%3D' (2025-01-05)
  → 'github:NixOS/nixpkgs/3f0a8ac25fb674611b98089ca3a5dd6480175751?narHash=sha256-JO%2BlFN2HsCwSLMUWXHeOad6QUxOuwe9UOAF/iSl1J4I%3D' (2025-01-06)
• Removed input 'nixos-cosmic/rust-overlay'
• Removed input 'nixos-cosmic/rust-overlay/nixpkgs'
• Updated input 'nixos-hardware':
    'github:nixos/nixos-hardware/4f339f6be2b61662f957c2ee9eda0fa597d8a6d6?narHash=sha256-BG1FfTexFwNty5VhYjaQLMR6CMPfI3QRcaZrFQYu2EM%3D' (2025-01-07)
  → 'github:nixos/nixos-hardware/8870dcaff63dfc6647fb10648b827e9d40b0a337?narHash=sha256-OL7leZ6KBhcDF3nEKe4aZVfIm6xQpb1Kb%2BmxySIP93o%3D' (2025-01-09)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/8f3e1f807051e32d8c95cd12b9b421623850a34d?narHash=sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs%2BrI%3D' (2025-01-04)
  → 'github:nixos/nixpkgs/bffc22eb12172e6db3c5dde9e3e5628f8e3e7912?narHash=sha256-8YVQ9ZbSfuUk2bUf2KRj60NRraLPKPS0Q4QFTbc%2Bc2c%3D' (2025-01-08)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/ed6183b173fe27e1d7dceef1ddca2aa64d07aad4?narHash=sha256-6Epm0TQkXt0DcS3akYSeT0PzYMpgkZf0V14%2B5UGe6oE%3D' (2025-01-08)
  → 'github:nixos/nixpkgs/b1877784f6a133d4b2b1a36e77ecf1d50684ebb4?narHash=sha256-/IbHbC5dKe/hT2Buv4eKcWijoGRB1mUwU3hErUbD9gw%3D' (2025-01-11)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/c9c88f08e3ee495e888b8d7c8624a0b2519cb773?narHash=sha256-eSjkBwBdQk%2BTZWFlLbclF2rAh4JxbGg8az4w/Lfe7f4%3D' (2025-01-06)
  → 'github:Mic92/sops-nix/f214c1b76c347a4e9c8fb68c73d4293a6820d125?narHash=sha256-4P99yL8vGehwzytkpP87eklBePt6aqeEC5JFsIzhfUs%3D' (2025-01-10)
2025-01-11 13:33:16 -05:00
92a87c01d3 adding to spell check 2025-01-11 13:31:56 -05:00
bca98cfadb adding unifi support 2025-01-11 13:31:56 -05:00
91ebec054c fixed evaluation warning 2025-01-10 23:08:32 -05:00
6ae6bc0dd6 deleted build.sh 2025-01-10 23:03:25 -05:00
0a1e517468 deleting muninn 2025-01-10 23:03:25 -05:00
f852d9b9fb added games.nix to bob 2025-01-10 23:03:25 -05:00
7ad195ff24 added syncthing dir to gitignore 2025-01-10 23:03:25 -05:00
4cadc374b1 setup displayManager autoLogin 2025-01-10 23:03:25 -05:00
56456ab375 moved dotfiles out of projects 2025-01-10 23:03:25 -05:00
17b19967e8 updated syncthing dirs 2025-01-10 23:03:25 -05:00
9ff57ba6f3 setup auto decrypt 2025-01-10 23:03:25 -05:00
573031e4c9 added gaming user to bob 2025-01-10 23:03:25 -05:00
6e2703f852 added extraConfig to git settings 2025-01-08 22:36:37 -05:00
203 changed files with 7289 additions and 1535 deletions

View File

@@ -0,0 +1,9 @@
---
description: Format code using treefmt
---
// turbo
1. Run treefmt
```bash
treefmt
```

View File

@@ -1,9 +1,11 @@
name: build_jeeves
name: build_systems
on:
workflow_dispatch:
pull_request:
push:
branches: [main]
schedule:
- cron: "0 22 * * *"
jobs:
build:
@@ -13,11 +15,14 @@ jobs:
matrix:
system:
- "bob"
- "brain"
- "jeeves"
- "muninn"
- "leviathan"
- "rhapsody-in-green"
- "router"
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Build default package
run: "nixos-rebuild build --flake ./#${{ matrix.system }}"
- name: copy to nix-cache
run: nix copy --to ssh://jeeves .#nixosConfigurations.${{ matrix.system }}.config.system.build.toplevel

48
.github/workflows/fix_eval_warnings.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: Fix Evaluation Warnings
on:
workflow_run:
workflows: ["build_systems"]
types:
- completed
permissions:
contents: write
pull-requests: write
actions: read
jobs:
analyze-and-fix:
runs-on: self-hosted
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download logs
env:
GH_TOKEN: ${{ github.token }}
RUN_ID: ${{ github.event.workflow_run.id }}
run: |
gh run view $RUN_ID --log > build.log
- name: Run Fix Script
env:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_REPOSITORY: ${{ github.repository }}
RUN_ID: ${{ github.event.workflow_run.id }}
PYTHONPATH: .
run: |
python3 python/tools/fix_eval_warnings.py build.log
- name: Create Pull Request
if: hashFiles('fix_suggestions.md') != ''
uses: peter-evans/create-pull-request@v6
with:
token: ${{ github.token }}
commit-message: "fix: automated evaluation warning fixes"
title: "fix: automated evaluation warning fixes"
body-path: fix_suggestions.md
branch: "auto-fix-eval-warnings-${{ github.event.workflow_run.id }}"
base: main
labels: "automated-fix"

View File

@@ -0,0 +1,29 @@
name: merge_flake_lock_update
on:
workflow_dispatch:
schedule:
- cron: "0 2 * * 6"
jobs:
merge:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: merge_flake_lock_update
run: |
pr_number=$(gh pr list --state open --author RichieCahill --label flake_lock_update --json number --jq '.[0].number')
echo "pr_number=$pr_number" >> $GITHUB_ENV
if [ -n "$pr_number" ]; then
gh pr merge "$pr_number" --rebase
else
echo "No open PR found with label flake_lock_update"
fi
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_FOR_UPDATES }}

19
.github/workflows/pytest.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: pytest
on:
push:
branches:
- main
pull_request:
branches:
- main
merge_group:
jobs:
pytest:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- name: Run tests
run: nix develop .#devShells.x86_64-linux.default -c pytest tests

15
.github/workflows/treefmt.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: treefmt
on:
workflow_dispatch:
pull_request:
push:
branches: [main]
jobs:
treefmt:
name: nix fmt
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- name: runs treefmt
run: "treefmt --ci"

View File

@@ -2,7 +2,7 @@ name: update-flake-lock
on:
workflow_dispatch:
schedule:
- cron: "0 0 * * *"
- cron: "0 0 * * 6"
jobs:
lockfile:
@@ -15,7 +15,9 @@ jobs:
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@main
with:
token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
pr-title: "Update flake.lock"
pr-labels: |
dependencies
automated
flake_lock_update

4
.gitignore vendored
View File

@@ -162,3 +162,7 @@ cython_debug/
#.idea/
test.*
# syncthing
.stfolder
fix_suggestions.md

View File

@@ -1,10 +1,14 @@
# Generate AGE keys from SSH keys with:
# ssh-keygen -A
# nix-shell -p ssh-to-age --run 'cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age'
keys:
- &admin_richie age1u8zj599elqqvcmhxn8zuwrufsz8w8w366d3ayrljjejljt2q45kq8mxw9c
- &admin_richie age1u8zj599elqqvcmhxn8zuwrufsz8w8w366d3ayrljjejljt2q45kq8mxw9c # cspell:disable-line
- &system_bob age1q47vup0tjhulkg7d6xwmdsgrw64h4ax3la3evzqpxyy4adsmk9fs56qz3y
- &system_jeeves age13lmqgc3jvkyah5e3vcwmj4s5wsc2akctcga0lpc0x8v8du3fxprqp4ldkv
- &system_router age1xzxryqq63x65yuza9lmmkud7crjjxpnkdew070yhx6xn7xe4tdws5twxsv
- &system_rhapsody age1ufnewppysaq2wwcl4ugngjz8pfzc5a35yg7luq0qmuqvctajcycs5lf6k4
- &system_bob age1q47vup0tjhulkg7d6xwmdsgrw64h4ax3la3evzqpxyy4adsmk9fs56qz3y # cspell:disable-line
- &system_brain age1jhf7vm0005j60mjq63696frrmjhpy8kpc2d66mw044lqap5mjv4snmwvwm # cspell:disable-line
- &system_jeeves age13lmqgc3jvkyah5e3vcwmj4s5wsc2akctcga0lpc0x8v8du3fxprqp4ldkv # cspell:disable-line
- &system_leviathan age1l272y8udvg60z7edgje42fu49uwt4x2gxn5zvywssnv9h2krms8s094m4k # cspell:disable-line
- &system_rhapsody age1ufnewppysaq2wwcl4ugngjz8pfzc5a35yg7luq0qmuqvctajcycs5lf6k4 # cspell:disable-line
creation_rules:
- path_regex: users/secrets\.yaml$
@@ -12,6 +16,7 @@ creation_rules:
- age:
- *admin_richie
- *system_bob
- *system_brain
- *system_jeeves
- *system_router
- *system_leviathan
- *system_rhapsody

77
.vscode/settings.json vendored
View File

@@ -2,11 +2,15 @@
"cSpell.words": [
"aboutwelcome",
"acltype",
"addopts",
"addstr",
"advplyr",
"ahci",
"aioesphomeapi",
"aiounifi",
"alsa",
"apiclient",
"apscheduler",
"archlinux",
"ashift",
"asrouter",
@@ -17,11 +21,14 @@
"auditd",
"autofetch",
"autologin",
"automations",
"autopull",
"autotrim",
"autoupdate",
"azuretools",
"bantime",
"bazarr",
"bgwriter",
"binhex",
"bitwarden",
"blkdiscard",
@@ -32,20 +39,27 @@
"captivedetect",
"cgroupdriver",
"charliermarsh",
"Checkpointing",
"cloudflared",
"codellama",
"codezombiech",
"compactmode",
"Compat",
"contentblocking",
"cookiebanners",
"createdb",
"createrole",
"crlite",
"cryptsetup",
"cuda",
"darkreader",
"datagrip",
"datareporting",
"davidanson",
"dconf",
"dearrow",
"debugpy",
"deepseek",
"dialout",
"diffie",
"direnv",
@@ -53,12 +67,16 @@
"dnodesize",
"dotfiles",
"drawio",
"duckdns",
"eamodio",
"ehci",
"emerg",
"endlessh",
"errorlens",
"esbenp",
"esphome",
"extest",
"fadvise",
"fastforwardteam",
"FASTFOX",
"ffmpegthumbnailer",
@@ -70,6 +88,7 @@
"fmask",
"fontconfig",
"formfill",
"forwardfor",
"foxundermoon",
"FULLSCREEN",
"fwupd",
@@ -94,23 +113,28 @@
"HPKP",
"hplip",
"htmlaboutaddons",
"httpchk",
"hurlenko",
"hwloc",
"ignorelist",
"INITDB",
"iocharset",
"ioit",
"iperf",
"isal",
"jellyfin",
"jnoortheen",
"jsbc",
"kagi",
"kuma",
"lazer",
"levelname",
"libglvnd",
"libmysqlclient",
"libsodium",
"libssh",
"libvirtd",
"llms",
"localtime",
"louislam",
"lsnew",
@@ -118,18 +142,24 @@
"lynis",
"mangohud",
"markdownlint",
"maxconn",
"maxpages",
"maxretry",
"maxtime",
"mechatroner",
"mediainfo",
"mixtral",
"mklabel",
"mkpart",
"modbus",
"modbuss",
"modesetting",
"mountpoint",
"mountpoints",
"mousewheel",
"mqtt",
"mtxr",
"muninn",
"mypy",
"ncdu",
"nemo",
"neofetch",
@@ -139,22 +169,30 @@
"Networkd",
"networkmanager",
"newtabpage",
"nixfmt",
"nixos",
"nixpkgs",
"nmap",
"noauto",
"nodev",
"noecho",
"nonsponsored",
"Noto",
"nprt",
"nvme",
"OCSP",
"oderwat",
"ollama",
"ondemand",
"oneshot",
"openwakeword",
"optimise",
"optoutstudies",
"overalljails",
"overscroll",
"overseerr",
"paho",
"partitionwise",
"pbmode",
"pciutils",
"pcscd",
@@ -162,16 +200,17 @@
"peerconnection",
"PESKYFOX",
"PGID",
"photoprism",
"pipewire",
"pkgs",
"plugdev",
"poppler",
"posixacl",
"powertop",
"primarycache",
"prismlauncher",
"privatebrowsing",
"PRIVOXY",
"protontricks",
"prowlarr",
"proxychains",
"prusa",
@@ -179,8 +218,15 @@
"PUID",
"pulseaudio",
"punycode",
"pychromecast",
"pydocstyle",
"pyfakefs",
"pylance",
"pylint",
"pymetno",
"pymodbus",
"pyownet",
"pytest",
"qbit",
"qbittorrent",
"qbittorrentvpn",
@@ -188,12 +234,16 @@
"quicksuggest",
"radarr",
"readahead",
"receiveencrypted",
"recordsize",
"Redistributable",
"referer",
"REFERERS",
"relatime",
"Rhosts",
"ripgrep",
"roboto",
"rokuecp",
"routable",
"rspace",
"rtkit",
@@ -202,6 +252,7 @@
"schemeless",
"scrollback",
"SECUREFOX",
"sessionmaker",
"sessionstore",
"shellcheck",
"signon",
@@ -213,8 +264,10 @@
"socialtracking",
"sonarr",
"sponsorblock",
"sqlalchemy",
"sqltools",
"ssdp",
"SSHOPTS",
"stdenv",
"subresource",
"substituters",
@@ -222,19 +275,25 @@
"sysstat",
"tabmanager",
"tamasfe",
"TCPIP",
"testdisk",
"tiktok",
"timonwong",
"titlebar",
"tmmworkshop",
"Tmpfs",
"topsites",
"topstories",
"torrenting",
"treefmt",
"twimg",
"typer",
"uaccess",
"ublock",
"uiprotect",
"uitour",
"unrar",
"unsubmitted",
"uptimekuma",
"urlbar",
"urlclassifier",
"usbhid",
@@ -243,15 +302,20 @@
"usernamehw",
"userprefs",
"vfat",
"victron",
"virt",
"virtualisation",
"vpnpromourl",
"wakeonlan",
"webchannel",
"WEBRTC",
"WEBUI",
"wireplumber",
"wireshark",
"Workqueues",
"xattr",
"xcursorgen",
"xdist",
"xhci",
"yazi",
"yubikey",
@@ -263,5 +327,10 @@
"zoxide",
"zram",
"zstd"
]
],
"python-envs.defaultEnvManager": "ms-python.python:system",
"python-envs.pythonProjects": [],
"python.testing.pytestArgs": ["tests"],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
}

12
AGENTS.md Normal file
View File

@@ -0,0 +1,12 @@
## Dev environment tips
- use treefmt to format all files
- keep new code consistent with the existing style
### Python
- make code `ruff` compliant
- use pytest to test python code tests should be put in `tests` directory
- dont use global state
- use google style docstrings
- use typer over argparse

View File

@@ -1,6 +0,0 @@
#!/bin/sh
nixos-rebuild build --flake /home/richie/projects/dotfiles#bob
nixos-rebuild build --flake /home/richie/projects/dotfiles#jeeves
nixos-rebuild build --flake /home/richie/projects/dotfiles#muninn
nixos-rebuild build --flake /home/richie/projects/dotfiles#rhapsody-in-green

View File

@@ -23,7 +23,7 @@
boot = {
tmp.useTmpfs = true;
kernelPackages = lib.mkDefault pkgs.linuxPackages_6_12;
zfs.package = lib.mkDefault pkgs.zfs;
zfs.package = lib.mkDefault pkgs.zfs_2_3;
};
hardware.enableRedistributableFirmware = true;
@@ -31,21 +31,42 @@
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = {inherit inputs outputs;};
extraSpecialArgs = { inherit inputs outputs; };
backupFileExtension = "backup";
};
nixpkgs = {
overlays = builtins.attrValues outputs.overlays;
config = {
allowUnfree = true;
config.allowUnfree = true;
};
services = {
# firmware update
fwupd.enable = true;
snapshot_manager = {
enable = lib.mkDefault true;
PYTHONPATH = "${inputs.self}/";
};
zfs = {
trim.enable = lib.mkDefault true;
autoScrub.enable = lib.mkDefault true;
};
};
services.fwupd.enable = true;
powerManagement.powertop.enable = lib.mkDefault true;
programs.zsh.enable = true;
security.auditd.enable = lib.mkDefault true;
security = {
auditd.enable = lib.mkDefault true;
sudo-rs = {
enable = true;
execWheelOnly = true;
};
sudo.enable = false;
};
users.mutableUsers = lib.mkDefault false;

View File

@@ -1,4 +1,10 @@
{ lib, pkgs, ... }:
let
libPath = pkgs.lib.makeLibraryPath [
pkgs.zlib
pkgs.stdenv.cc.cc.lib
];
in
{
programs.nix-ld = {
enable = lib.mkDefault true;
@@ -15,6 +21,7 @@
libxml2
openssl
stdenv.cc.cc
stdenv.cc.cc.lib
systemd
util-linux
xz
@@ -23,4 +30,9 @@
zstd
];
};
environment = {
sessionVariables.LD_LIBRARY_PATH = lib.mkDefault libPath;
variables.LD_LIBRARY_PATH = lib.mkDefault libPath;
};
}

View File

@@ -4,8 +4,7 @@
console.keyMap = lib.mkDefault "us";
i18n = {
defaultLocale = lib.mkDefault "en_US.utf8";
supportedLocales = lib.mkDefault [ "en_US.UTF-8/UTF-8" ];
defaultLocale = lib.mkDefault "en_US.UTF-8";
extraLocaleSettings = lib.mkDefault {
LC_ADDRESS = "en_US.UTF-8";
LC_IDENTIFICATION = "en_US.UTF-8";

View File

@@ -2,9 +2,11 @@
inputs,
lib,
...
}: let
}:
let
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
in {
in
{
nix = {
settings = {
trusted-users = [
@@ -13,17 +15,14 @@ in {
];
trusted-substituters = [
"https://cache.nixos.org"
"https://cache.tmmworkshop.com"
"https://nix-community.cachix.org"
];
substituters = [
"https://cache.nixos.org/?priority=2&want-mass-query=true"
"https://cache.tmmworkshop.com/?priority=2&want-mass-query=true"
"https://nix-community.cachix.org/?priority=10&want-mass-query=true"
];
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"cache.tmmworkshop.com:jHffkpgbmEdstQPoihJPYW9TQe6jnQbWR2LqkNGV3iA="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
auto-optimise-store = lib.mkDefault true;
@@ -37,7 +36,7 @@ in {
};
# Add each flake input as a registry and nix_path
registry = lib.mapAttrs (_: flake: {inherit flake;}) flakeInputs;
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
};
}

View File

@@ -2,6 +2,6 @@
{
environment.systemPackages = with pkgs; [
git
python313
my_python
];
}

View File

@@ -1,37 +1,57 @@
{ inputs, pkgs, lib, config, ... }:
{
pkgs,
lib,
config,
...
}:
let
cfg = config.services.snapshot_manager;
in
{
options = {
services.snapshot_manager = {
enable = lib.mkOption {
default = true;
example = true;
description = "Whether to enable k3s-net.";
type = lib.types.bool;
};
enable = lib.mkEnableOption "ZFS snapshot manager";
path = lib.mkOption {
type = lib.types.path;
description = "Path that needs to be updated via git pull";
default = ./snapshot_config.toml;
description = "Path to the snapshot_manager TOML config.";
};
PYTHONPATH = lib.mkOption {
type = lib.types.str;
description = ''
the PYTHONPATH to use for the snapshot_manager service.
'';
};
EnvironmentFile = lib.mkOption {
type = lib.types.nullOr (lib.types.coercedTo lib.types.path toString lib.types.str);
default = null;
description = ''
Single environment file for the service (e.g. /etc/snapshot-manager/env).
Use a leading "-" to ignore if missing (systemd feature).
'';
};
};
};
config = lib.mkIf cfg.enable {
systemd = {
services."snapshot_manager" = {
services.snapshot_manager = {
description = "ZFS Snapshot Manager";
requires = [ "zfs-import.target" ];
after = [ "zfs-import.target" ];
path = [ pkgs.zfs ];
environment = {
PYTHONPATH = cfg.PYTHONPATH;
};
serviceConfig = {
Type = "oneshot";
ExecStart = "${inputs.system_tools.packages.x86_64-linux.default}/bin/snapshot_manager --config-file='${cfg.path}'";
ExecStart = "${pkgs.my_python}/bin/python -m python.tools.snapshot_manager ${lib.escapeShellArg cfg.path}";
}
// lib.optionalAttrs (cfg.EnvironmentFile != null) {
EnvironmentFile = cfg.EnvironmentFile;
};
};
timers."snapshot_manager" = {
timers.snapshot_manager = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnBootSec = "15m";

View File

@@ -37,6 +37,8 @@
TcpKeepAlive = "no";
X11Forwarding = lib.mkDefault false;
KexAlgorithms = [
"sntrup761x25519-sha512@openssh.com"
"mlkem768x25519-sha256"
"curve25519-sha256@libssh.org"
"diffie-hellman-group-exchange-sha256"
];

View File

@@ -1,10 +1,18 @@
{ pkgs, ... }:
{
boot = {
kernelPackages = pkgs.linuxPackages_6_12;
zfs.package = pkgs.zfs;
kernelPackages = pkgs.linuxPackages_6_17;
zfs.package = pkgs.zfs_unstable;
};
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
};
# rtkit is optional but recommended for pipewire
security.rtkit.enable = true;
services = {
displayManager.sddm = {
enable = true;
@@ -21,6 +29,8 @@
};
};
pulseaudio.enable = false;
pipewire = {
enable = true;
alsa.enable = true;

View File

@@ -1,5 +1,7 @@
{ config, ... }:
{
nixpkgs.config.cudaSupport = true;
services.xserver.videoDrivers = [ "nvidia" ];
hardware = {
nvidia = {

View File

@@ -2,6 +2,9 @@
{
services.printing = {
enable = true;
drivers = with pkgs; [ gutenprint hplip ];
drivers = with pkgs; [
gutenprint
hplip
];
};
}

View File

@@ -10,6 +10,9 @@
authorizedKeys = config.users.users.richie.openssh.authorizedKeys.keys;
};
};
availableKernelModules = [ "igb" ];
availableKernelModules = [
"igb"
"r8152"
];
};
}

View File

@@ -1,6 +1,9 @@
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [mangohud steam-run];
environment.systemPackages = with pkgs; [
mangohud
steam-run
];
hardware.steam-hardware.enable = true;
programs = {
@@ -11,7 +14,7 @@
remotePlay.openFirewall = true;
localNetworkGameTransfers.openFirewall = true;
protontricks.enable = true;
extraCompatPackages = with pkgs; [proton-ge-bin];
extraCompatPackages = with pkgs; [ proton-ge-bin ];
extest.enable = true;
};
gamescope = {

View File

@@ -1,19 +1,19 @@
{ lib, ... }:
{
services.syncthing = {
enable = true;
user = "richie";
overrideDevices = true;
overrideFolders = true;
overrideFolders = lib.mkDefault true;
dataDir = "/home/richie/Syncthing";
configDir = "/home/richie/.config/syncthing";
settings = {
devices = {
phone.id = "LTGPLAE-M4ZDJTM-TZ3DJGY-SLLAVWF-CQDVEVS-RGCS75T-GAPZYK3-KUM6LA5"; # cspell:disable-line
jeeves.id = "ICRHXZW-ECYJCUZ-I4CZ64R-3XRK7CG-LL2HAAK-FGOHD22-BQA4AI6-5OAL6AG"; # cspell:disable-line
ipad.id = "KI76T3X-SFUGV2L-VSNYTKR-TSIUV5L-SHWD3HE-GQRGRCN-GY4UFMD-CW6Z6AX"; # cspell:disable-line
settings.devices = {
bob.id = "CJIAPEJ-VO74RR4-F75VU6M-QNZAMYG-FYUJG7Y-6AT62HJ-355PRPL-PJFETAZ"; # cspell:disable-line
brain.id = "SSCGIPI-IV3VYKB-TRNIJE3-COV4T2H-CDBER7F-I2CGHYA-NWOEUDU-3T5QAAN"; # cspell:disable-line
ipad.id = "KI76T3X-SFUGV2L-VSNYTKR-TSIUV5L-SHWD3HE-GQRGRCN-GY4UFMD-CW6Z6AX"; # cspell:disable-line
jeeves.id = "ICRHXZW-ECYJCUZ-I4CZ64R-3XRK7CG-LL2HAAK-FGOHD22-BQA4AI6-5OAL6AG"; # cspell:disable-line
phone.id = "TBRULKD-7DZPGGZ-F6LLB7J-MSO54AY-7KLPBIN-QOFK6PX-W2HBEWI-PHM2CQI"; # cspell:disable-line
rhapsody-in-green.id = "ASL3KC4-3XEN6PA-7BQBRKE-A7JXLI6-DJT43BY-Q4WPOER-7UALUAZ-VTPQ6Q4"; # cspell:disable-line
};
};
};
}

View File

@@ -0,0 +1,7 @@
{
nix.settings = {
trusted-substituters = [ "http://cache.tmmworkshop.com" ];
substituters = [ "http://cache.tmmworkshop.com/?priority=1&want-mass-query=true" ];
trusted-public-keys = [ "cache.tmmworkshop.com:jHffkpgbmEdstQPoihJPYW9TQe6jnQbWR2LqkNGV3iA=" ];
};
}

View File

@@ -1,32 +1,11 @@
{ lib, pkgs, ... }:
{
systemd = {
services."autopull@dotfiles" = {
requires = [ "multi-user.target" ];
after = [ "multi-user.target" ];
description = "Pull the latest data for dotfiles";
serviceConfig = {
Type = "oneshot";
User = "root";
WorkingDirectory = /root/dotfiles;
ExecStart = "${pkgs.git}/bin/git pull --all --prune";
};
};
timers."autopull@dotfiles" = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnBootSec = "1h";
OnUnitActiveSec = "1h";
Unit = "autopull@dotfiles.service";
};
};
};
system.autoUpgrade = {
enable = lib.mkDefault true;
enable = true;
flags = [ "--accept-flake-config" ];
randomizedDelaySec = "1h";
persistent = true;
flake = "github:RAD-Development/nix-dotfiles";
flake = "github:RichieCahill/dotfiles";
allowReboot = true;
dates = "Sat *-*-* 06:00:00";
};
}

4
docs/Gemfile Normal file
View File

@@ -0,0 +1,4 @@
source "https://rubygems.org"
# The github-pages gem pins all compatible versions of Jekyll and its plugins
gem "github-pages", group: :jekyll_plugins

23
docs/_config.yml Normal file
View File

@@ -0,0 +1,23 @@
title: "Richie Cahill"
description: "ALL THE CHAOS THAT I CANT DO AT WORK"
baseurl: "/dotfiles"
url: "https://richiecahill.github.io"
remote_theme: pages-themes/hacker@v0.2.0
plugins:
- jekyll-feed
- jekyll-remote-theme
- jekyll-seo-tag
- jekyll-sitemap
- jekyll-paginate
paginate: 5
paginate_path: "/page:num"
author:
name: "Richie Cahill"
email: "richie@tmmworkshop.com"
social_links:
github: "RichieCahill"
website: "https://tmmworkshop.com"

View File

@@ -0,0 +1,13 @@
# The MONOREPO experiment
Im testing a [MONOREPO](https://en.wikipedia.org/wiki/Monorepo) because Phil said this was a bad idea. To that i say hold my beer.
In all seriousness, I Think that for a small dev team/solo dev. The simplicity is worth higher barer to entry. One of my most annoying processes was updating my system tools. I had to build my update in a feature branch and then merge it into my main branch. then go to my dotfiles create a feature branch update the system tools merge it into main.
It will be starting with my Nix Dotfiles Python tools and now my blog.
I will be reaching ot to phil on 2030-10-31 and 2035-10-31 to give him updates on the progress.
Known Issues:
- the python tests are running on the current derivation not the one the derivation im updating to.

17
docs/index.md Normal file
View File

@@ -0,0 +1,17 @@
---
layout: default
title: "Welcome"
---
Welcome to my build logs, notes, and experiments.
You can read my latest posts below
<ul>
{% for post in site.posts %}
<li>
<a href="{{ post.url | relative_url }}">{{ post.title }}</a>
<small>— {{ post.date | date: "%Y-%m-%d" }}</small>
</li>
{% endfor %}
</ul>

3
esphome/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
# esphome
/.esphome/
/secrets.yaml

132
esphome/battery0.yml Normal file
View File

@@ -0,0 +1,132 @@
esphome:
name: batteries
friendly_name: batteries
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_key
external_components:
- source: github://syssi/esphome-jk-bms@main
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: on
captive_portal:
esp32_ble_tracker:
scan_parameters:
interval: 1100ms
window: 1100ms
active: true
ble_client:
- mac_address: "C8:47:80:29:0F:DB"
id: jk_ble0
jk_bms_ble:
- ble_client_id: jk_ble0
protocol_version: JK02_32S
throttle: 1s
id: jk_bms0
button:
- platform: jk_bms_ble
retrieve_settings:
name: "JK0 retrieve settings"
retrieve_device_info:
name: "JK0 retrieve device info"
sensor:
- platform: jk_bms_ble
jk_bms_ble_id: jk_bms0
total_voltage:
name: "JK0 Total Voltage"
state_of_charge:
name: "JK0 SoC"
charging_power:
name: "JK0 charging power"
discharging_power:
name: "JK0 discharging power"
temperature_sensor_1:
name: "JK0 Temp 1"
temperature_sensor_2:
name: "JK0 Temp 2"
balancing:
name: "JK0 balancing"
total_runtime:
name: "JK0 total runtime"
balancing_current:
name: "JK0 balancing current"
delta_cell_voltage:
name: "JK0 cell delta voltage"
average_cell_voltage:
name: "JK0 cell average voltage"
cell_voltage_1:
name: "JK0 cell voltage 1"
cell_voltage_2:
name: "JK0 cell voltage 2"
cell_voltage_3:
name: "JK0 cell voltage 3"
cell_voltage_4:
name: "JK0 cell voltage 4"
cell_voltage_5:
name: "JK0 cell voltage 5"
cell_voltage_6:
name: "JK0 cell voltage 6"
cell_voltage_7:
name: "JK0 cell voltage 7"
cell_voltage_8:
name: "JK0 cell voltage 8"
cell_resistance_1:
name: "JK0 cell resistance 1"
cell_resistance_2:
name: "JK0 cell resistance 2"
cell_resistance_3:
name: "JK0 cell resistance 3"
cell_resistance_4:
name: "JK0 cell resistance 4"
cell_resistance_5:
name: "JK0 cell resistance 5"
cell_resistance_6:
name: "JK0 cell resistance 6"
cell_resistance_7:
name: "JK0 cell resistance 7"
cell_resistance_8:
name: "JK0 cell resistance 8"
total_charging_cycle_capacity:
name: "JK0 total charging cycle capacity"
text_sensor:
- platform: jk_bms_ble
jk_bms_ble_id: jk_bms0
errors:
name: "JK0 Errors"
switch:
- platform: jk_bms_ble
jk_bms_ble_id: jk_bms0
charging:
name: "JK0 Charging"
discharging:
name: "JK0 Discharging"
balancer:
name: "JK0 Balancing"
- platform: ble_client
ble_client_id: jk_ble0
name: "JK0 enable bluetooth connection"
id: ble_client_switch0

132
esphome/battery1.yml Normal file
View File

@@ -0,0 +1,132 @@
esphome:
name: battery1
friendly_name: battery1
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_key
external_components:
- source: github://syssi/esphome-jk-bms@main
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: on
captive_portal:
esp32_ble_tracker:
scan_parameters:
interval: 1100ms
window: 1100ms
active: true
ble_client:
- mac_address: "C8:47:80:37:9D:DD"
id: jk_ble1
jk_bms_ble:
- ble_client_id: jk_ble1
protocol_version: JK02_32S
throttle: 1s
id: jk_bms1
button:
- platform: jk_bms_ble
retrieve_settings:
name: "JK1 retrieve settings"
retrieve_device_info:
name: "JK1 retrieve device info"
sensor:
- platform: jk_bms_ble
jk_bms_ble_id: jk_bms1
total_voltage:
name: "JK1 Total Voltage"
state_of_charge:
name: "JK1 SoC"
charging_power:
name: "JK1 charging power"
discharging_power:
name: "JK1 discharging power"
temperature_sensor_1:
name: "JK1 Temp 1"
temperature_sensor_2:
name: "JK1 Temp 2"
balancing:
name: "JK1 balancing"
total_runtime:
name: "JK1 total runtime"
balancing_current:
name: "JK1 balancing current"
delta_cell_voltage:
name: "JK1 cell delta voltage"
average_cell_voltage:
name: "JK1 cell average voltage"
cell_voltage_1:
name: "JK1 cell voltage 1"
cell_voltage_2:
name: "JK1 cell voltage 2"
cell_voltage_3:
name: "JK1 cell voltage 3"
cell_voltage_4:
name: "JK1 cell voltage 4"
cell_voltage_5:
name: "JK1 cell voltage 5"
cell_voltage_6:
name: "JK1 cell voltage 6"
cell_voltage_7:
name: "JK1 cell voltage 7"
cell_voltage_8:
name: "JK1 cell voltage 8"
cell_resistance_1:
name: "JK1 cell resistance 1"
cell_resistance_2:
name: "JK1 cell resistance 2"
cell_resistance_3:
name: "JK1 cell resistance 3"
cell_resistance_4:
name: "JK1 cell resistance 4"
cell_resistance_5:
name: "JK1 cell resistance 5"
cell_resistance_6:
name: "JK1 cell resistance 6"
cell_resistance_7:
name: "JK1 cell resistance 7"
cell_resistance_8:
name: "JK1 cell resistance 8"
total_charging_cycle_capacity:
name: "JK1 total charging cycle capacity"
text_sensor:
- platform: jk_bms_ble
jk_bms_ble_id: jk_bms1
errors:
name: "JK1 Errors"
switch:
- platform: jk_bms_ble
jk_bms_ble_id: jk_bms1
charging:
name: "JK1 Charging"
discharging:
name: "JK1 Discharging"
balancer:
name: "JK1 Balancing"
- platform: ble_client
ble_client_id: jk_ble1
name: "JK1 enable bluetooth connection"
id: ble_client_switch0

48
esphome/environment.yml Normal file
View File

@@ -0,0 +1,48 @@
esphome:
name: "environment"
friendly_name: "environment"
esp32:
board: esp32dev
framework:
type: arduino
i2c:
sda: GPIO21
scl: GPIO22
scan: True
id: bus_a
sensor:
- platform: aht10
i2c_id: bus_a
address: 0x38
variant: AHT20
temperature:
name: "environment Temperature"
id: aht10_temperature
humidity:
name: "environment Humidity"
id: aht10_humidity
update_interval: 5s
web_server:
port: 80
logger:
level: DEBUG
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: on
captive_portal:

1
file_sizes.txt.new Normal file

File diff suppressed because one or more lines are too long

275
flake.lock generated
View File

@@ -2,18 +2,17 @@
"nodes": {
"firefox-addons": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"dir": "pkgs/firefox-addons",
"lastModified": 1736279099,
"narHash": "sha256-WXbwHw+JeIOo3KvGDjrfsuwj8JWBUkFFxmlm07w9i7Q=",
"lastModified": 1763697825,
"narHash": "sha256-AgCCcVPOi1tuzuW5/StlwqBjRWSX62oL97qWuxrq5UA=",
"owner": "rycee",
"repo": "nur-expressions",
"rev": "0ad9cf75bae6a9290e9c83cef19f60595f189979",
"rev": "cefce78793603231be226fa77e7ad58e0e4899b8",
"type": "gitlab"
},
"original": {
@@ -23,55 +22,6 @@
"type": "gitlab"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1717312683,
"narHash": "sha256-FrlieJH50AuvagamEvWMIE6D2OAnERuDboFDYAED/dE=",
"owner": "nix-community",
"repo": "flake-compat",
"rev": "38fd3954cf65ce6faf3d0d45cd26059e059f07ea",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "flake-compat",
"type": "github"
}
},
"flake-utils": {
"locked": {
"lastModified": 1629284811,
"narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "c5d161cc0af116a2e17f54316f0bf43f0819785c",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems"
},
"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"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
@@ -79,11 +29,11 @@
]
},
"locked": {
"lastModified": 1736277415,
"narHash": "sha256-kPDXF6cIPsVqSK08XF5EC6KM7BdMnM9vtJDzsnf+lLU=",
"lastModified": 1763748372,
"narHash": "sha256-AUc78Qv3sWir0hvbmfXoZ7Jzq9VVL97l+sP9Jgms+JU=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "5c4302313d9207f7ec0886d68f8ff4a3c71209a1",
"rev": "d10a9b16b2a3ee28433f3d1c603f4e9f1fecb8e1",
"type": "github"
},
"original": {
@@ -92,58 +42,13 @@
"type": "github"
}
},
"nix-github-actions": {
"inputs": {
"nixpkgs": [
"system_tools",
"poetry2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1729742964,
"narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=",
"owner": "nix-community",
"repo": "nix-github-actions",
"rev": "e04df33f62cdcf93d73e9a04142464753a16db67",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nix-github-actions",
"type": "github"
}
},
"nixos-cosmic": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable",
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1736214624,
"narHash": "sha256-Pi70vbASZ1O9cR8RO5d2hBiNjIJBKKLoABl4sxWyOgg=",
"owner": "lilyinstarlight",
"repo": "nixos-cosmic",
"rev": "0830abeebf3b2d1bae44652ffb2c89cf0d56ddaa",
"type": "github"
},
"original": {
"owner": "lilyinstarlight",
"repo": "nixos-cosmic",
"type": "github"
}
},
"nixos-hardware": {
"locked": {
"lastModified": 1736283893,
"narHash": "sha256-BG1FfTexFwNty5VhYjaQLMR6CMPfI3QRcaZrFQYu2EM=",
"lastModified": 1762847253,
"narHash": "sha256-BWWnUUT01lPwCWUvS0p6Px5UOBFeXJ8jR+ZdLX8IbrU=",
"owner": "nixos",
"repo": "nixos-hardware",
"rev": "4f339f6be2b61662f957c2ee9eda0fa597d8a6d6",
"rev": "899dc449bc6428b9ee6b3b8f771ca2b0ef945ab9",
"type": "github"
},
"original": {
@@ -155,11 +60,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1736012469,
"narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=",
"lastModified": 1763421233,
"narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d",
"rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648",
"type": "github"
},
"original": {
@@ -171,11 +76,11 @@
},
"nixpkgs-master": {
"locked": {
"lastModified": 1736294919,
"narHash": "sha256-6Epm0TQkXt0DcS3akYSeT0PzYMpgkZf0V14+5UGe6oE=",
"lastModified": 1763774007,
"narHash": "sha256-PPeHfKA11P09kBkBD5pS3tIAFjnG5muHQnODQGTY87g=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "ed6183b173fe27e1d7dceef1ddca2aa64d07aad4",
"rev": "8a7cf7e9e18384533d9ecd0bfbcf475ac1dc497e",
"type": "github"
},
"original": {
@@ -186,22 +91,6 @@
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1736061677,
"narHash": "sha256-DjkQPnkAfd7eB522PwnkGhOMuT9QVCZspDpJJYyOj60=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "cbd8ec4de4469333c82ff40d057350c30e9f7d36",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable_2": {
"locked": {
"lastModified": 1735563628,
"narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=",
@@ -217,67 +106,16 @@
"type": "github"
}
},
"poetry2nix": {
"inputs": {
"flake-utils": [
"system_tools",
"flake-utils"
],
"nix-github-actions": "nix-github-actions",
"nixpkgs": [
"system_tools",
"nixpkgs"
],
"systems": "systems_2",
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1731205797,
"narHash": "sha256-F7N1mxH1VrkVNHR3JGNMRvp9+98KYO4b832KS8Gl2xI=",
"owner": "nix-community",
"repo": "poetry2nix",
"rev": "f554d27c1544d9c56e5f1f8e2b8aff399803674e",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "poetry2nix",
"type": "github"
}
},
"root": {
"inputs": {
"firefox-addons": "firefox-addons",
"home-manager": "home-manager",
"nixos-cosmic": "nixos-cosmic",
"nixos-hardware": "nixos-hardware",
"nixpkgs": "nixpkgs",
"nixpkgs-master": "nixpkgs-master",
"nixpkgs-stable": "nixpkgs-stable_2",
"nixpkgs-stable": "nixpkgs-stable",
"sops-nix": "sops-nix",
"system_tools": "system_tools",
"systems": "systems_3"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"nixos-cosmic",
"nixpkgs"
]
},
"locked": {
"lastModified": 1736130662,
"narHash": "sha256-z+WGez9oTR2OsiUWE5ZhIpETqM1ogrv6Xcd24WFi6KQ=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "2f5d4d9cd31cc02c36e51cb2e21c4b25c4f78c52",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
"systems": "systems"
}
},
"sops-nix": {
@@ -287,11 +125,11 @@
]
},
"locked": {
"lastModified": 1736203741,
"narHash": "sha256-eSjkBwBdQk+TZWFlLbclF2rAh4JxbGg8az4w/Lfe7f4=",
"lastModified": 1763607916,
"narHash": "sha256-VefBA1JWRXM929mBAFohFUtQJLUnEwZ2vmYUNkFnSjE=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "c9c88f08e3ee495e888b8d7c8624a0b2519cb773",
"rev": "877bb495a6f8faf0d89fc10bd142c4b7ed2bcc0b",
"type": "github"
},
"original": {
@@ -300,58 +138,7 @@
"type": "github"
}
},
"system_tools": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": [
"nixpkgs"
],
"poetry2nix": "poetry2nix"
},
"locked": {
"lastModified": 1733083480,
"narHash": "sha256-B13faNyBbA3MeI7Jp6pFVbp58rI2Rx5Uvd83csW2p48=",
"owner": "RichieCahill",
"repo": "system_tools",
"rev": "bc357d8fabd83c1423611829091e5b1d86dd913c",
"type": "github"
},
"original": {
"owner": "RichieCahill",
"repo": "system_tools",
"type": "github"
}
},
"systems": {
"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,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"id": "systems",
"type": "indirect"
}
},
"systems_3": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
@@ -365,28 +152,6 @@
"repo": "default-linux",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"system_tools",
"poetry2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1730120726,
"narHash": "sha256-LqHYIxMrl/1p3/kvm2ir925tZ8DkI0KA10djk8wecSk=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "9ef337e492a5555d8e17a51c911ff1f02635be15",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",

View File

@@ -4,14 +4,12 @@
nixConfig = {
extra-substituters = [
"https://cache.nixos.org/?priority=2&want-mass-query=true"
"https://cache.tmmworkshop.com/?priority=2&want-mass-query=true"
"https://nix-community.cachix.org/?priority=10&want-mass-query=true"
];
extra-trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"cache.tmmworkshop.com:jHffkpgbmEdstQPoihJPYW9TQe6jnQbWR2LqkNGV3iA="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cache-nix-dot:Od9KN34LXc6Lu7y1ozzV1kIXZa8coClozgth/SYE7dU="
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" # cspell:disable-line
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" # cspell:disable-line
"cache-nix-dot:Od9KN34LXc6Lu7y1ozzV1kIXZa8coClozgth/SYE7dU=" # cspell:disable-line
];
};
@@ -33,31 +31,22 @@
inputs.nixpkgs.follows = "nixpkgs";
};
system_tools = {
url = "github:RichieCahill/system_tools";
inputs.nixpkgs.follows = "nixpkgs";
};
nixos-cosmic = {
url = "github:lilyinstarlight/nixos-cosmic";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = {
outputs =
{
self,
nixpkgs,
home-manager,
systems,
nixos-cosmic,
sops-nix,
...
} @ inputs: let
}@inputs:
let
inherit (self) outputs;
lib = nixpkgs.lib // home-manager.lib;
forEachSystem = f: lib.genAttrs (import systems) (system: f pkgsFor.${system});
@@ -65,44 +54,48 @@
system:
import nixpkgs {
inherit system;
overlays = builtins.attrValues outputs.overlays;
config.allowUnfree = true;
}
);
in {
in
{
inherit lib;
overlays = import ./overlays {inherit inputs outputs;};
overlays = import ./overlays { inherit inputs outputs; };
devShells = forEachSystem (pkgs: import ./shell.nix {inherit pkgs;});
formatter = forEachSystem (pkgs: pkgs.alejandra);
devShells = forEachSystem (pkgs: import ./shell.nix { inherit pkgs; });
formatter = forEachSystem (pkgs: pkgs.treefmt);
nixosConfigurations = {
bob = lib.nixosSystem {
modules = [
./systems/bob
];
specialArgs = {inherit inputs outputs;};
specialArgs = { inherit inputs outputs; };
};
brain = lib.nixosSystem {
modules = [
./systems/brain
];
specialArgs = { inherit inputs outputs; };
};
jeeves = lib.nixosSystem {
modules = [
./systems/jeeves
];
specialArgs = {inherit inputs outputs;};
specialArgs = { inherit inputs outputs; };
};
rhapsody-in-green = lib.nixosSystem {
modules = [
./systems/rhapsody-in-green
];
specialArgs = {inherit inputs outputs;};
specialArgs = { inherit inputs outputs; };
};
muninn = lib.nixosSystem {
leviathan = lib.nixosSystem {
modules = [
./systems/muninn
./systems/leviathan
];
specialArgs = {inherit inputs outputs;};
};
router = lib.nixosSystem {
modules = [./systems/router];
specialArgs = {inherit inputs outputs;};
specialArgs = { inherit inputs outputs; };
};
};
};

View File

@@ -1,16 +1,39 @@
{inputs, ...}: {
{ inputs, ... }:
{
# When applied, the stable nixpkgs set (declared in the flake inputs) will be accessible through 'pkgs.stable'
stable = final: _prev: {
stable = import inputs.nixpkgs-stable {
system = final.system;
system = final.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
};
# When applied, the master nixpkgs set (declared in the flake inputs) will be accessible through 'pkgs.master'
master = final: _prev: {
master = import inputs.nixpkgs-master {
system = final.system;
system = final.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
};
python-env = final: _prev: {
my_python = final.python313.withPackages (
ps: with ps; [
apprise
apscheduler
mypy
polars
psycopg
pyfakefs
pytest
pytest-cov
pytest-mock
pytest-xdist
requests
ruff
sqlalchemy
typer
types-requests
]
);
};
}

73
pyproject.toml Normal file
View File

@@ -0,0 +1,73 @@
[project]
name = "system_tools"
version = "0.1.0"
description = ""
authors = [{ name = "Richie Cahill", email = "richie@tmmworkshop.com" }]
requires-python = "~=3.13.0"
readme = "README.md"
license = "MIT"
# these dependencies are a best effort and aren't guaranteed to work
dependencies = ["apprise", "apscheduler", "polars", "requests", "typer"]
[dependency-groups]
dev = [
"mypy",
"pyfakefs",
"pytest-cov",
"pytest-mock",
"pytest-xdist",
"pytest",
"ruff",
"types-requests",
]
[tool.ruff]
target-version = "py313"
line-length = 120
lint.select = ["ALL"]
lint.ignore = [
"G004", # (PERM) This is a performers nit
"COM812", # (TEMP) conflicts when used with the formatter
"ISC001", # (TEMP) conflicts when used with the formatter
"S603", # (PERM) This is known to cause a false positive
]
[tool.ruff.lint.per-file-ignores]
"tests/**" = [
"S101", # (perm) pytest needs asserts
]
"python/random/**" = [
"T201", # (perm) I don't care about print statements dir
]
"python/testing/**" = [
"T201", # (perm) I don't care about print statements dir
"ERA001", # (perm) I don't care about print statements dir
]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.lint.flake8-builtins]
builtins-ignorelist = ["id"]
[tool.ruff.lint.pylint]
max-args = 9
[tool.coverage.run]
source = ["python"]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"raise NotImplementedError",
"if __name__ == \"__main__\":",
]
[tool.pytest.ini_options]
addopts = "-n auto -ra"
# --cov=system_tools --cov-report=term-missing --cov-report=xml --cov-report=html --cov-branch

1
python/__init__.py Normal file
View File

@@ -0,0 +1 @@
"""Server Tools."""

72
python/common.py Normal file
View File

@@ -0,0 +1,72 @@
"""common."""
from __future__ import annotations
import logging
import sys
from datetime import UTC, datetime
from os import getenv
from subprocess import PIPE, Popen
from apprise import Apprise
logger = logging.getLogger(__name__)
def configure_logger(level: str = "INFO") -> None:
"""Configure the logger.
Args:
level (str, optional): The logging level. Defaults to "INFO".
"""
logging.basicConfig(
level=level,
datefmt="%Y-%m-%dT%H:%M:%S%z",
format="%(asctime)s %(levelname)s %(filename)s:%(lineno)d - %(message)s",
handlers=[logging.StreamHandler(sys.stdout)],
)
def bash_wrapper(command: str) -> tuple[str, int]:
"""Execute a bash command and capture the output.
Args:
command (str): The bash command to be executed.
Returns:
Tuple[str, int]: A tuple containing the output of the command (stdout) as a string,
the error output (stderr) as a string (optional), and the return code as an integer.
"""
# This is a acceptable risk
process = Popen(command.split(), stdout=PIPE, stderr=PIPE)
output, error = process.communicate()
if error:
logger.error(f"{error=}")
return error.decode(), process.returncode
return output.decode(), process.returncode
def signal_alert(body: str, title: str = "") -> None:
"""Send a signal alert.
Args:
body (str): The body of the alert.
title (str, optional): The title of the alert. Defaults to "".
"""
apprise_client = Apprise()
from_phone = getenv("SIGNAL_ALERT_FROM_PHONE")
to_phone = getenv("SIGNAL_ALERT_TO_PHONE")
if not from_phone or not to_phone:
logger.info("SIGNAL_ALERT_FROM_PHONE or SIGNAL_ALERT_TO_PHONE not set")
return
apprise_client.add(f"signal://localhost:8989/{from_phone}/{to_phone}")
apprise_client.notify(title=title, body=body)
def utcnow() -> datetime:
"""Get the current UTC time."""
return datetime.now(tz=UTC)

59
python/database.py Normal file
View File

@@ -0,0 +1,59 @@
"""database."""
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from sqlalchemy import inspect
from sqlalchemy.exc import NoInspectionAvailable
if TYPE_CHECKING:
from collections.abc import Sequence
from sqlalchemy.orm import Session
logger = logging.getLogger(__name__)
def safe_insert(orm_objects: Sequence[object], session: Session) -> list[tuple[Exception, object]]:
"""Safer insert at allows for partial rollbacks.
Args:
orm_objects (Sequence[object]): Tables to insert.
session (Session): Database session.
"""
if unmapped := [orm_object for orm_object in orm_objects if not _is_mapped_instance(orm_object)]:
error = f"safe_insert expects ORM-mapped instances {unmapped}"
raise TypeError(error)
return _safe_insert(orm_objects, session)
def _safe_insert(objects: Sequence[object], session: Session) -> list[tuple[Exception, object]]:
exceptions: list[tuple[Exception, object]] = []
try:
session.add_all(objects)
session.commit()
except Exception as error:
session.rollback()
objects_len = len(objects)
if objects_len == 1:
logger.exception(objects)
return [(error, objects[0])]
middle = objects_len // 2
exceptions.extend(_safe_insert(objects=objects[:middle], session=session))
exceptions.extend(_safe_insert(objects=objects[middle:], session=session))
return exceptions
def _is_mapped_instance(obj: object) -> bool:
"""Return True if `obj` is a SQLAlchemy ORM-mapped instance."""
try:
inspect(obj) # raises NoInspectionAvailable if not mapped
except NoInspectionAvailable:
return False
else:
return True

View File

@@ -0,0 +1 @@
"""installer."""

View File

@@ -0,0 +1,308 @@
"""Install NixOS on a ZFS pool."""
from __future__ import annotations
import curses
import logging
import sys
from os import getenv
from pathlib import Path
from random import getrandbits
from subprocess import PIPE, Popen, run
from time import sleep
from typing import TYPE_CHECKING
from python.common import configure_logger
from python.installer.tui import draw_menu
if TYPE_CHECKING:
from collections.abc import Sequence
logger = logging.getLogger(__name__)
def bash_wrapper(command: str) -> str:
"""Execute a bash command and capture the output.
Args:
command (str): The bash command to be executed.
Returns:
Tuple[str, int]: A tuple containing the output of the command (stdout) as a string,
the error output (stderr) as a string (optional), and the return code as an integer.
"""
logger.debug(f"running {command=}")
# This is a acceptable risk
process = Popen(command.split(), stdout=PIPE, stderr=PIPE)
output, _ = process.communicate()
if process.returncode != 0:
error = f"Failed to run command {command=} return code {process.returncode=}"
raise RuntimeError(error)
return output.decode()
def partition_disk(disk: str, swap_size: int, reserve: int = 0) -> None:
"""Partition a disk.
Args:
disk (str): The disk to partition.
swap_size (int): The size of the swap partition in GB.
minimum value is 1.
reserve (int, optional): The size of the reserve partition in GB. Defaults to 0.
minimum value is 0.
"""
logger.info(f"partitioning {disk=}")
swap_size = max(swap_size, 1)
reserve = max(reserve, 0)
bash_wrapper(f"blkdiscard -f {disk}")
if reserve > 0:
msg = f"Creating swap partition on {disk=} with size {swap_size=}GiB and reserve {reserve=}GiB"
logger.info(msg)
swap_start = swap_size + reserve
swap_partition = f"mkpart swap -{swap_start}GiB -{reserve}GiB "
else:
logger.info(f"Creating swap partition on {disk=} with size {swap_size=}GiB")
swap_start = swap_size
swap_partition = f"mkpart swap -{swap_start}GiB 100% "
logger.debug(f"{swap_partition=}")
create_partitions = (
f"parted --script --align=optimal {disk} -- "
"mklabel gpt "
"mkpart EFI 1MiB 4GiB "
f"mkpart root_pool 4GiB -{swap_start}GiB "
f"{swap_partition}"
"set 1 esp on"
)
bash_wrapper(create_partitions)
logger.info(f"{disk=} successfully partitioned")
def create_zfs_pool(pool_disks: Sequence[str], mnt_dir: str) -> None:
"""Create a ZFS pool.
Args:
pool_disks (Sequence[str]): A tuple of disks to use for the pool.
mnt_dir (str): The mount directory.
"""
if len(pool_disks) <= 0:
error = "disks must be a tuple of at least length 1"
raise ValueError(error)
zpool_create = (
"zpool create "
"-o ashift=12 "
"-o autotrim=on "
f"-R {mnt_dir} "
"-O acltype=posixacl "
"-O canmount=off "
"-O dnodesize=auto "
"-O normalization=formD "
"-O relatime=on "
"-O xattr=sa "
"-O mountpoint=legacy "
"-O compression=zstd "
"-O atime=off "
"root_pool "
)
if len(pool_disks) == 1:
zpool_create += pool_disks[0]
else:
zpool_create += "mirror "
zpool_create += " ".join(pool_disks)
bash_wrapper(zpool_create)
zpools = bash_wrapper("zpool list -o name")
if "root_pool" not in zpools.splitlines():
logger.critical("Failed to create root_pool")
sys.exit(1)
def create_zfs_datasets() -> None:
"""Create ZFS datasets."""
bash_wrapper("zfs create -o canmount=noauto -o reservation=10G root_pool/root")
bash_wrapper("zfs create root_pool/home")
bash_wrapper("zfs create root_pool/var -o reservation=1G")
bash_wrapper("zfs create -o compression=zstd-9 -o reservation=10G root_pool/nix")
datasets = bash_wrapper("zfs list -o name")
expected_datasets = {
"root_pool/root",
"root_pool/home",
"root_pool/var",
"root_pool/nix",
}
missing_datasets = expected_datasets.difference(datasets.splitlines())
if missing_datasets:
logger.critical(f"Failed to create pools {missing_datasets}")
sys.exit(1)
def get_cpu_manufacturer() -> str:
"""Get the CPU manufacturer."""
output = bash_wrapper("cat /proc/cpuinfo")
id_vendor = {"AuthenticAMD": "amd", "GenuineIntel": "intel"}
for line in output.splitlines():
if "vendor_id" in line:
return id_vendor[line.split(": ")[1].strip()]
error = "Failed to get CPU manufacturer"
raise RuntimeError(error)
def get_boot_drive_id(disk: str) -> str:
"""Get the boot drive ID."""
output = bash_wrapper(f"lsblk -o UUID {disk}-part1")
return output.splitlines()[1]
def create_nix_hardware_file(mnt_dir: str, disks: Sequence[str], encrypt: str | None) -> None:
"""Create a NixOS hardware file."""
cpu_manufacturer = get_cpu_manufacturer()
devices = ""
if encrypt:
disk = disks[0]
devices = (
f' luks.devices."luks-root-pool-{disk.split("/")[-1]}-part2"'
"= {\n"
f' device = "{disk}-part2";\n'
" bypassWorkqueues = true;\n"
" allowDiscards = true;\n"
" };\n"
)
host_id = format(getrandbits(32), "08x")
nix_hardware = (
"{ config, lib, modulesPath, ... }:\n"
"{\n"
' imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];\n\n'
" boot = {\n"
" initrd = {\n"
' availableKernelModules = [ \n "ahci"\n "ehci_pci"\n "nvme"\n "sd_mod"\n'
' "usb_storage"\n "usbhid"\n "xhci_pci"\n ];\n'
" kernelModules = [ ];\n"
f" {devices}"
" };\n"
f' kernelModules = [ "kvm-{cpu_manufacturer}" ];\n'
" extraModulePackages = [ ];\n"
" };\n\n"
" fileSystems = {\n"
' "/" = lib.mkDefault {\n device = "root_pool/root";\n fsType = "zfs";\n };\n\n'
' "/home" = {\n device = "root_pool/home";\n fsType = "zfs";\n };\n\n'
' "/var" = {\n device = "root_pool/var";\n fsType = "zfs";\n };\n\n'
' "/nix" = {\n device = "root_pool/nix";\n fsType = "zfs";\n };\n\n'
' "/boot" = {\n'
f' device = "/dev/disk/by-uuid/{get_boot_drive_id(disks[0])}";\n'
' fsType = "vfat";\n options = [\n "fmask=0077"\n'
' "dmask=0077"\n ];\n };\n };\n\n'
" swapDevices = [ ];\n\n"
" networking.useDHCP = lib.mkDefault true;\n\n"
' nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";\n'
f" hardware.cpu.{cpu_manufacturer}.updateMicrocode = "
"lib.mkDefault config.hardware.enableRedistributableFirmware;\n"
f' networking.hostId = "{host_id}";\n'
"}\n"
)
Path(f"{mnt_dir}/etc/nixos/hardware-configuration.nix").write_text(nix_hardware)
def install_nixos(mnt_dir: str, disks: Sequence[str], encrypt: str | None) -> None:
"""Install NixOS."""
bash_wrapper(f"mount -o X-mount.mkdir -t zfs root_pool/root {mnt_dir}")
bash_wrapper(f"mount -o X-mount.mkdir -t zfs root_pool/home {mnt_dir}/home")
bash_wrapper(f"mount -o X-mount.mkdir -t zfs root_pool/var {mnt_dir}/var")
bash_wrapper(f"mount -o X-mount.mkdir -t zfs root_pool/nix {mnt_dir}/nix")
for disk in disks:
bash_wrapper(f"mkfs.vfat -n EFI {disk}-part1")
# set up mirroring afterwards if more than one disk
boot_partition = (
f"mount -t vfat -o fmask=0077,dmask=0077,iocharset=iso8859-1,X-mount.mkdir {disks[0]}-part1 {mnt_dir}/boot"
)
bash_wrapper(boot_partition)
bash_wrapper(f"nixos-generate-config --root {mnt_dir}")
create_nix_hardware_file(mnt_dir, disks, encrypt)
run(("nixos-install", "--root", mnt_dir), check=True)
def installer(
disks: Sequence[str],
swap_size: int,
reserve: int,
encrypt_key: str | None,
) -> None:
"""Main."""
logger.info("Starting installation")
for disk in disks:
partition_disk(disk, swap_size, reserve)
test = Popen(("printf", f"'{encrypt_key}'"), stdout=PIPE)
if encrypt_key:
sleep(1)
for command in (
f"cryptsetup luksFormat --type luks2 {disk}-part2 -",
f"cryptsetup luksOpen {disk}-part2 luks-root-pool-{disk.split('/')[-1]}-part2 -",
):
run(command, check=True, stdin=test.stdout)
mnt_dir = "/tmp/nix_install" # noqa: S108
Path(mnt_dir).mkdir(parents=True, exist_ok=True)
if encrypt_key:
pool_disks = [f"/dev/mapper/luks-root-pool-{disk.split('/')[-1]}-part2" for disk in disks]
else:
pool_disks = [f"{disk}-part2" for disk in disks]
create_zfs_pool(pool_disks, mnt_dir)
create_zfs_datasets()
install_nixos(mnt_dir, disks, encrypt_key)
logger.info("Installation complete")
def main() -> None:
"""Main."""
configure_logger("DEBUG")
state = curses.wrapper(draw_menu)
encrypt_key = getenv("ENCRYPT_KEY")
logger.info("installing_nixos")
logger.info(f"disks: {state.selected_device_ids}")
logger.info(f"swap_size: {state.swap_size}")
logger.info(f"reserve: {state.reserve_size}")
logger.info(f"encrypted: {bool(encrypt_key)}")
sleep(3)
installer(
disks=state.get_selected_devices(),
swap_size=state.swap_size,
reserve=state.reserve_size,
encrypt_key=encrypt_key,
)
if __name__ == "__main__":
main()

498
python/installer/tui.py Normal file
View File

@@ -0,0 +1,498 @@
"""TUI module."""
from __future__ import annotations
import curses
import logging
from collections import defaultdict
from subprocess import PIPE, Popen
logger = logging.getLogger(__name__)
def bash_wrapper(command: str) -> str:
"""Execute a bash command and capture the output.
Args:
command (str): The bash command to be executed.
Returns:
Tuple[str, int]: A tuple containing the output of the command (stdout) as a string,
the error output (stderr) as a string (optional), and the return code as an integer.
"""
logger.debug(f"running {command=}")
# This is a acceptable risk
process = Popen(command.split(), stdout=PIPE, stderr=PIPE)
output, _ = process.communicate()
if process.returncode != 0:
error = f"Failed to run command {command=} return code {process.returncode=}"
raise RuntimeError(error)
return output.decode()
class Cursor:
"""Cursor class."""
def __init__(self) -> None:
"""Initialize the Cursor class."""
self.x_position = 0
self.y_position = 0
self.height = 0
self.width = 0
def set_height(self, height: int) -> None:
"""Set height."""
self.height = height
def set_width(self, width: int) -> None:
"""Set width."""
self.width = width
def x_bounce_check(self, cursor: int) -> int:
"""X bounce check."""
cursor = max(0, cursor)
return min(self.width - 1, cursor)
def y_bounce_check(self, cursor: int) -> int:
"""Y bounce check."""
cursor = max(0, cursor)
return min(self.height - 1, cursor)
def set_x(self, x: int) -> None:
"""Set x."""
self.x_position = self.x_bounce_check(x)
def set_y(self, y: int) -> None:
"""Set y."""
self.y_position = self.y_bounce_check(y)
def get_x(self) -> int:
"""Get x."""
return self.x_position
def get_y(self) -> int:
"""Get y."""
return self.y_position
def move_up(self) -> None:
"""Move up."""
self.set_y(self.y_position - 1)
def move_down(self) -> None:
"""Move down."""
self.set_y(self.y_position + 1)
def move_left(self) -> None:
"""Move left."""
self.set_x(self.x_position - 1)
def move_right(self) -> None:
"""Move right."""
self.set_x(self.x_position + 1)
def navigation(self, key: int) -> None:
"""Navigation.
Args:
key (int): The key.
"""
action = {
curses.KEY_DOWN: self.move_down,
curses.KEY_UP: self.move_up,
curses.KEY_RIGHT: self.move_right,
curses.KEY_LEFT: self.move_left,
}
action.get(key, lambda: None)()
class State:
"""State class to store the state of the program."""
def __init__(self) -> None:
"""Initialize the State class."""
self.key = 0
self.cursor = Cursor()
self.swap_size = 0
self.show_swap_input = False
self.reserve_size = 0
self.show_reserve_input = False
self.selected_device_ids: set[str] = set()
def get_selected_devices(self) -> tuple[str, ...]:
"""Get selected devices."""
return tuple(self.selected_device_ids)
def get_device(raw_device: str) -> dict[str, str]:
"""Get a device.
Args:
raw_device (str): The raw device.
Returns:
dict[str, str]: The device.
"""
raw_device_components = raw_device.split(" ")
return {thing.split("=")[0].lower(): thing.split("=")[1].strip('"') for thing in raw_device_components}
def get_devices() -> list[dict[str, str]]:
"""Get a list of devices."""
# --bytes
raw_devices = bash_wrapper("lsblk --paths --pairs").splitlines()
return [get_device(raw_device) for raw_device in raw_devices]
def set_color() -> None:
"""Set the color."""
curses.start_color()
curses.use_default_colors()
for i in range(curses.COLORS):
curses.init_pair(i + 1, i, -1)
def debug_menu(std_screen: curses.window, key: int) -> None:
"""Debug menu.
Args:
std_screen (curses.window): The curses window.
key (int): The key.
"""
height, width = std_screen.getmaxyx()
std_screen.addstr(height - 4, 0, f"Width: {width}, Height: {height}", curses.color_pair(5))
key_pressed = f"Last key pressed: {key}"[: width - 1]
if key == 0:
key_pressed = "No key press detected..."[: width - 1]
std_screen.addstr(height - 3, 0, key_pressed)
for i in range(8):
std_screen.addstr(height - 2, i * 3, f"{i}██", curses.color_pair(i))
def get_text_input(std_screen: curses.window, prompt: str, y: int, x: int) -> str:
"""Get text input.
Args:
std_screen (curses.window): The curses window.
prompt (str): The prompt.
y (int): The y position.
x (int): The x position.
Returns:
str: The input string.
"""
esc_key = 27
curses.echo()
std_screen.addstr(y, x, prompt)
input_str = ""
while True:
key = std_screen.getch()
if key == ord("\n"):
break
if key == esc_key:
input_str = ""
break
if key in (curses.KEY_BACKSPACE, ord("\b"), 127):
input_str = input_str[:-1]
std_screen.addstr(y, x + len(prompt), input_str + " ")
else:
input_str += chr(key)
std_screen.refresh()
curses.noecho()
return input_str
def swap_size_input(
std_screen: curses.window,
state: State,
swap_offset: int,
) -> State:
"""Reserve size input.
Args:
std_screen (curses.window): The curses window.
state (State): The state object.
swap_offset (int): The swap offset.
Returns:
State: The updated state object.
"""
swap_size_text = "Swap size (GB): "
std_screen.addstr(swap_offset, 0, f"{swap_size_text}{state.swap_size}")
if state.key == ord("\n") and state.cursor.get_y() == swap_offset:
state.show_swap_input = True
if state.show_swap_input:
swap_size_str = get_text_input(std_screen, swap_size_text, swap_offset, 0)
try:
state.swap_size = int(swap_size_str)
state.show_swap_input = False
except ValueError:
std_screen.addstr(swap_offset, 0, "Invalid input. Press any key to continue.")
std_screen.getch()
state.show_swap_input = False
return state
def reserve_size_input(
std_screen: curses.window,
state: State,
reserve_offset: int,
) -> State:
"""Reserve size input.
Args:
std_screen (curses.window): The curses window.
state (State): The state object.
reserve_offset (int): The reserve offset.
Returns:
State: The updated state object.
"""
reserve_size_text = "reserve size (GB): "
std_screen.addstr(reserve_offset, 0, f"{reserve_size_text}{state.reserve_size}")
if state.key == ord("\n") and state.cursor.get_y() == reserve_offset:
state.show_reserve_input = True
if state.show_reserve_input:
reserve_size_str = get_text_input(std_screen, reserve_size_text, reserve_offset, 0)
try:
state.reserve_size = int(reserve_size_str)
state.show_reserve_input = False
except ValueError:
std_screen.addstr(reserve_offset, 0, "Invalid input. Press any key to continue.")
std_screen.getch()
state.show_reserve_input = False
return state
def status_bar(
std_screen: curses.window,
cursor: Cursor,
width: int,
height: int,
) -> None:
"""Draw the status bar.
Args:
std_screen (curses.window): The curses window.
cursor (Cursor): The cursor.
width (int): The width.
height (int): The height.
"""
std_screen.attron(curses.A_REVERSE)
std_screen.attron(curses.color_pair(3))
status_bar = f"Press 'q' to exit | STATUS BAR | Pos: {cursor.get_x()}, {cursor.get_y()}"
std_screen.addstr(height - 1, 0, status_bar)
std_screen.addstr(height - 1, len(status_bar), " " * (width - len(status_bar) - 1))
std_screen.attroff(curses.color_pair(3))
std_screen.attroff(curses.A_REVERSE)
def get_device_id_mapping() -> dict[str, set[str]]:
"""Get a list of device ids.
Returns:
list[str]: the list of device ids
"""
device_ids = bash_wrapper("find /dev/disk/by-id -type l").splitlines()
device_id_mapping: dict[str, set[str]] = defaultdict(set)
for device_id in device_ids:
device = bash_wrapper(f"readlink -f {device_id}").strip()
device_id_mapping[device].add(device_id)
return device_id_mapping
def calculate_device_menu_padding(devices: list[dict[str, str]], column: str, padding: int = 0) -> int:
"""Calculate the device menu padding.
Args:
devices (list[dict[str, str]]): The devices.
column (str): The column.
padding (int, optional): The padding. Defaults to 0.
Returns:
int: The calculated padding.
"""
return max(len(device[column]) for device in devices) + padding
def draw_device_ids(
state: State,
row_number: int,
menu_start_x: int,
std_screen: curses.window,
menu_width: list[int],
device_ids: set[str],
) -> tuple[State, int]:
"""Draw device IDs.
Args:
state (State): The state object.
row_number (int): The row number.
menu_start_x (int): The menu start x.
std_screen (curses.window): The curses window.
menu_width (list[int]): The menu width.
device_ids (set[str]): The device IDs.
Returns:
tuple[State, int]: The updated state object and the row number.
"""
for device_id in sorted(device_ids):
row_number = row_number + 1
if row_number == state.cursor.get_y() and state.cursor.get_x() in menu_width:
std_screen.attron(curses.A_BOLD)
if state.key == ord(" "):
if device_id not in state.selected_device_ids:
state.selected_device_ids.add(device_id)
else:
state.selected_device_ids.remove(device_id)
if device_id in state.selected_device_ids:
std_screen.attron(curses.color_pair(7))
std_screen.addstr(row_number, menu_start_x, f" {device_id}")
std_screen.attroff(curses.color_pair(7))
std_screen.attroff(curses.A_BOLD)
return state, row_number
def draw_device_menu(
std_screen: curses.window,
devices: list[dict[str, str]],
device_id_mapping: dict[str, set[str]],
state: State,
menu_start_y: int = 0,
menu_start_x: int = 0,
) -> tuple[State, int]:
"""Draw the device menu and handle user input.
Args:
std_screen (curses.window): the curses window to draw on
devices (list[dict[str, str]]): the list of devices to draw
device_id_mapping (dict[str, set[str]]): the list of device ids to draw
state (State): the state object to update
menu_start_y (int, optional): the y position to start drawing the menu. Defaults to 0.
menu_start_x (int, optional): the x position to start drawing the menu. Defaults to 0.
Returns:
State: the updated state object
"""
padding = 2
name_padding = calculate_device_menu_padding(devices, "name", padding)
size_padding = calculate_device_menu_padding(devices, "size", padding)
type_padding = calculate_device_menu_padding(devices, "type", padding)
mountpoints_padding = calculate_device_menu_padding(devices, "mountpoints", padding)
device_header = (
f"{'Name':{name_padding}}{'Size':{size_padding}}{'Type':{type_padding}}{'Mountpoints':{mountpoints_padding}}"
)
menu_width = list(range(menu_start_x, len(device_header) + menu_start_x))
std_screen.addstr(menu_start_y, menu_start_x, device_header, curses.color_pair(5))
devises_list_start = menu_start_y + 1
row_number = devises_list_start
for device in devices:
row_number = row_number + 1
device_name = device["name"]
device_row = (
f"{device_name:{name_padding}}"
f"{device['size']:{size_padding}}"
f"{device['type']:{type_padding}}"
f"{device['mountpoints']:{mountpoints_padding}}"
)
std_screen.addstr(row_number, menu_start_x, device_row)
state, row_number = draw_device_ids(
state=state,
row_number=row_number,
menu_start_x=menu_start_x,
std_screen=std_screen,
menu_width=menu_width,
device_ids=device_id_mapping[device_name],
)
return state, row_number
def draw_menu(std_screen: curses.window) -> State:
"""Draw the menu and handle user input.
Args:
std_screen (curses.window): the curses window to draw on
Returns:
State: the state object
"""
# Clear and refresh the screen for a blank canvas
std_screen.clear()
std_screen.refresh()
set_color()
state = State()
devices = get_devices()
device_id_mapping = get_device_id_mapping()
# Loop where k is the last character pressed
while state.key != ord("q"):
std_screen.clear()
height, width = std_screen.getmaxyx()
state.cursor.set_height(height)
state.cursor.set_width(width)
state.cursor.navigation(state.key)
state, device_menu_size = draw_device_menu(
std_screen=std_screen,
state=state,
devices=devices,
device_id_mapping=device_id_mapping,
)
swap_offset = device_menu_size + 2
swap_size_input(
std_screen=std_screen,
state=state,
swap_offset=swap_offset,
)
reserve_size_input(
std_screen=std_screen,
state=state,
reserve_offset=swap_offset + 1,
)
status_bar(std_screen, state.cursor, width, height)
debug_menu(std_screen, state.key)
std_screen.move(state.cursor.get_y(), state.cursor.get_x())
std_screen.refresh()
state.key = std_screen.getch()
return state

155
python/parallelize.py Normal file
View File

@@ -0,0 +1,155 @@
"""Thing."""
from __future__ import annotations
import logging
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from dataclasses import dataclass
from multiprocessing import cpu_count
from typing import TYPE_CHECKING, Any, Literal, TypeVar
if TYPE_CHECKING:
from collections.abc import Callable, Mapping, Sequence
logger = logging.getLogger(__name__)
R = TypeVar("R")
modes = Literal["normal", "early_error"]
@dataclass
class ExecutorResults[R]:
"""Dataclass to store the results and exceptions of the parallel execution."""
results: list[R]
exceptions: list[BaseException]
def __repr__(self) -> str:
"""Return a string representation of the object."""
return f"results={self.results} exceptions={self.exceptions}"
def _parallelize_base[R](
executor_type: type[ThreadPoolExecutor | ProcessPoolExecutor],
func: Callable[..., R],
kwargs_list: Sequence[Mapping[str, Any]],
max_workers: int | None,
progress_tracker: int | None,
mode: modes,
) -> ExecutorResults:
total_work = len(kwargs_list)
with executor_type(max_workers=max_workers) as executor:
futures = [executor.submit(func, **kwarg) for kwarg in kwargs_list]
results = []
exceptions = []
for index, future in enumerate(futures, 1):
if exception := future.exception():
logger.error(f"{future} raised {exception.__class__.__name__}")
exceptions.append(exception)
if mode == "early_error":
executor.shutdown(wait=False)
raise exception
continue
results.append(future.result())
if progress_tracker and index % progress_tracker == 0:
logger.info(f"Progress: {index}/{total_work}")
return ExecutorResults(results, exceptions)
def parallelize_thread[R](
func: Callable[..., R],
kwargs_list: Sequence[Mapping[str, Any]],
max_workers: int | None = None,
progress_tracker: int | None = None,
mode: modes = "normal",
) -> ExecutorResults:
"""Generic function to run a function with multiple arguments in threads.
Args:
func (Callable[..., R]): Function to run in threads.
kwargs_list (Sequence[Mapping[str, Any]]): List of dictionaries with the arguments for the function.
max_workers (int, optional): Number of workers to use. Defaults to 8.
progress_tracker (int, optional): Number of tasks to complete before logging progress.
mode (modes, optional): Mode to use. Defaults to "normal".
Returns:
tuple[list[R], list[Exception]]: List with the results and a list with the exceptions.
"""
return _parallelize_base(
executor_type=ThreadPoolExecutor,
func=func,
kwargs_list=kwargs_list,
max_workers=max_workers,
progress_tracker=progress_tracker,
mode=mode,
)
def parallelize_process[R](
func: Callable[..., R],
kwargs_list: Sequence[Mapping[str, Any]],
max_workers: int | None = None,
progress_tracker: int | None = None,
mode: modes = "normal",
) -> ExecutorResults:
"""Generic function to run a function with multiple arguments in process.
Args:
func (Callable[..., R]): Function to run in process.
kwargs_list (Sequence[Mapping[str, Any]]): List of dictionaries with the arguments for the function.
max_workers (int, optional): Number of workers to use. Defaults to 4.
progress_tracker (int, optional): Number of tasks to complete before logging progress.
mode (modes, optional): Mode to use. Defaults to "normal".
Returns:
tuple[list[R], list[Exception]]: List with the results and a list with the exceptions.
"""
if max_workers and max_workers > cpu_count():
error = f"max_workers must be less than or equal to {cpu_count()}"
raise RuntimeError(error)
return process_executor_unchecked(
func=func,
kwargs_list=kwargs_list,
max_workers=max_workers,
progress_tracker=progress_tracker,
mode=mode,
)
def process_executor_unchecked[R](
func: Callable[..., R],
kwargs_list: Sequence[Mapping[str, Any]],
max_workers: int | None,
progress_tracker: int | None,
mode: modes = "normal",
) -> ExecutorResults:
"""Generic function to run a function with multiple arguments in parallel.
Note: this function does not check if the number of workers is greater than the number of CPUs.
This can cause the system to become unresponsive.
Args:
func (Callable[..., R]): Function to run in parallel.
kwargs_list (Sequence[Mapping[str, Any]]): List of dictionaries with the arguments for the function.
max_workers (int, optional): Number of workers to use. Defaults to 8.
progress_tracker (int, optional): Number of tasks to complete before logging progress.
mode (modes, optional): Mode to use. Defaults to "normal".
Returns:
tuple[list[R], list[Exception]]: List with the results and a list with the exceptions.
"""
return _parallelize_base(
executor_type=ProcessPoolExecutor,
func=func,
kwargs_list=kwargs_list,
max_workers=max_workers,
progress_tracker=progress_tracker,
mode=mode,
)

View File

@@ -0,0 +1 @@
"""init."""

View File

@@ -0,0 +1,40 @@
"""capasitor."""
def calculate_capacitor_capacity(voltage: float, farads: float) -> float:
"""Calculate capacitor capacity."""
joules = (farads * voltage**2) // 2
return joules // 3600
def calculate_pack_capacity(cells: int, cell_voltage: float, farads: float) -> float:
"""Calculate pack capacity."""
return calculate_capacitor_capacity(cells * cell_voltage, farads / cells)
def calculate_pack_capacity2(cells: int, cell_voltage: float, farads: float, cell_cost: float) -> tuple[float, float]:
"""Calculate pack capacity."""
capacitor_capacity = calculate_capacitor_capacity(cells * cell_voltage, farads / cells)
return capacitor_capacity, cell_cost * cells
def main() -> None:
"""Main."""
watt_hours = calculate_pack_capacity(cells=10, cell_voltage=2.7, farads=500)
print(f"{watt_hours=}")
print(f"{watt_hours*16=}")
watt_hours = calculate_pack_capacity(cells=1, cell_voltage=2.7, farads=5000)
print(f"{watt_hours=}")
watt_hours, cost = calculate_pack_capacity2(
cells=10,
cell_voltage=2.7,
farads=3000,
cell_cost=11.60,
)
print(f"{watt_hours=}")
print(f"{cost=}")
if __name__ == "__main__":
main()

25
python/random/thing.py Normal file
View File

@@ -0,0 +1,25 @@
"""thing."""
def caculat_batry_specs(
cell_amp_hour: int,
cell_voltage: float,
cells_per_pack: int,
packs: int,
) -> tuple[float, float]:
"""Caculat battry specs."""
pack_voltage = cell_voltage * cells_per_pack
pack_watt_hours = pack_voltage * cell_amp_hour
battry_capacity = pack_watt_hours * packs
return (
battry_capacity,
pack_voltage,
)
battry_capacity, pack_voltage = caculat_batry_specs(300, 3.2, 8, 2)
print(f"{battry_capacity=} {pack_voltage=}")
cost = 1700
print(f"$/kWh {cost / battry_capacity}")

View File

@@ -0,0 +1,196 @@
"""voltage_drop."""
import math
from enum import Enum
class TemperatureUnit(Enum):
"""Temperature unit."""
CELSIUS = "c"
FAHRENHEIT = "f"
KELVIN = "k"
class Temperature:
"""Temperature."""
def __init__(
self,
temperature: float,
unit: TemperatureUnit = TemperatureUnit.CELSIUS,
) -> None:
"""__init__."""
unit_modifier = {
TemperatureUnit.CELSIUS: 1,
TemperatureUnit.FAHRENHEIT: 0.5556,
TemperatureUnit.KELVIN: 1.8,
}
self.temperature = temperature * unit_modifier[unit]
def __float__(self) -> float:
"""Return the temperature in degrees Celsius."""
return self.temperature
class LengthUnit(Enum):
"""Length unit."""
METERS = "m"
FEET = "ft"
INCHES = "in"
class Length:
"""Length."""
def __init__(self, length: float, unit: LengthUnit) -> None:
"""__init__."""
self.meters = self._convert_to_meters(length, unit)
def _convert_to_meters(self, length: float, unit: LengthUnit) -> float:
thing = {
LengthUnit.METERS: 1,
LengthUnit.FEET: 0.3048,
LengthUnit.INCHES: 0.0254,
}
test = thing.get(unit)
if test:
return length * test
error = f"Unsupported unit: {unit}"
raise ValueError(error)
def __float__(self) -> float:
"""Return the length in meters."""
return self.meters
def feet(self) -> float:
"""Return the length in feet."""
return self.meters * 3.2808
class MaterialType(Enum):
"""Material type."""
COPPER = "copper"
ALUMINUM = "aluminum"
CCA = "cca"
SILVER = "silver"
GOLD = "gold"
def get_material_resistivity(
material: MaterialType,
temperature: Temperature | None = None,
) -> float:
"""Get the resistivity of a material."""
if not temperature:
temperature = Temperature(20.0)
material_info = {
MaterialType.COPPER: (1.724e-8, 0.00393),
MaterialType.ALUMINUM: (2.908e-8, 0.00403),
MaterialType.CCA: (2.577e-8, 0.00397),
MaterialType.SILVER: (1.632e-8, 0.00380),
MaterialType.GOLD: (2.503e-8, 0.00340),
}
base_resistivity, temp_coefficient = material_info[material]
return base_resistivity * (1 + temp_coefficient * float(temperature))
def calculate_awg_diameter_mm(gauge: int) -> float:
"""Calculate wire diameter in millimeters for a given AWG gauge."""
return round(0.127 * 92 ** ((36 - gauge) / 39), 3)
def calculate_wire_area_m2(gauge: int) -> float:
"""Calculate the area of a wire in square meters.
Args:
gauge (int): The AWG (American Wire Gauge) number of the wire
Returns:
float: The area of the wire in square meters
"""
return math.pi * (calculate_awg_diameter_mm(gauge) / 2000) ** 2
def calculate_resistance_per_meter(gauge: int) -> float:
"""Calculate the resistance per meter of a wire.
Args:
gauge (int): The AWG (American Wire Gauge) number of the wire
Returns:
float: The resistance per meter of the wire
"""
return get_material_resistivity(MaterialType.COPPER) / calculate_wire_area_m2(gauge)
def voltage_drop(
gauge: int,
material: MaterialType,
length: Length,
current_a: float,
) -> float:
"""Calculate the voltage drop of a wire.
Args:
gauge (int): The AWG (American Wire Gauge) number of the wire
material (MaterialType): The type of conductor material (e.g., copper, aluminum)
length (Length): The length of the wire in meters
current_a (float): The current flowing through the wire in amperes
Returns:
float: The voltage drop of the wire in volts
"""
resistivity = get_material_resistivity(material)
resistance_per_meter = resistivity / calculate_wire_area_m2(gauge)
total_resistance = resistance_per_meter * float(length) * 2 # round-trip
return total_resistance * current_a
print(
voltage_drop(
gauge=10,
material=MaterialType.CCA,
length=Length(length=20, unit=LengthUnit.FEET),
current_a=20,
)
)
def max_wire_length(
gauge: int,
material: MaterialType,
current_amps: float,
voltage_drop: float = 0.3,
temperature: Temperature | None = None,
) -> Length:
"""Calculate the maximum allowable wire length based on voltage drop criteria.
Args:
gauge (int): The AWG (American Wire Gauge) number of the wire
material (MaterialType): The type of conductor material (e.g., copper, aluminum)
current_amps (float): The current flowing through the wire in amperes
voltage_drop (float, optional): Maximum allowable voltage drop as a decimal (default 0.1 or 10%)
temperature (Temperature | None, optional): The temperature of the wire. Defaults to None.
Returns:
float: Maximum wire length in meters that maintains the specified voltage drop
"""
if not temperature:
temperature = Temperature(100.0, unit=TemperatureUnit.FAHRENHEIT)
resistivity = get_material_resistivity(material, temperature)
resistance_per_meter = resistivity / calculate_wire_area_m2(gauge)
# V = IR, solve for length where V is the allowed voltage drop
return Length(
voltage_drop / (current_amps * resistance_per_meter),
LengthUnit.METERS,
)
print(max_wire_length(gauge=10, material=MaterialType.CCA, current_amps=20).feet())
print(max_wire_length(gauge=10, material=MaterialType.CCA, current_amps=10).feet())
print(max_wire_length(gauge=10, material=MaterialType.CCA, current_amps=5).feet())

View File

@@ -0,0 +1 @@
"""system_tests."""

View File

@@ -0,0 +1,99 @@
"""Validate Jeeves."""
from __future__ import annotations
import logging
from copy import copy
from re import search
from time import sleep
from typing import TYPE_CHECKING
from python.common import bash_wrapper
from python.zfs import Zpool
if TYPE_CHECKING:
from collections.abc import Sequence
logger = logging.getLogger(__name__)
def zpool_tests(pool_names: Sequence[str], zpool_capacity_threshold: int = 90) -> list[str] | None:
"""Check the zpool health and capacity.
Args:
pool_names (Sequence[str]): A list of pool names to test.
zpool_capacity_threshold (int, optional): The threshold for the zpool capacity. Defaults to 90.
Returns:
list[str] | None: A list of errors if any.
"""
logger.info("Testing zpool")
errors: list[str] = []
for pool_name in pool_names:
pool = Zpool(pool_name)
if pool.health != "ONLINE":
errors.append(f"{pool.name} is {pool.health}")
if pool.capacity >= zpool_capacity_threshold:
errors.append(f"{pool.name} is low on space")
upgrade_status, _ = bash_wrapper("zpool upgrade")
if not search(r"Every feature flags pool has all supported and requested features enabled.", upgrade_status):
errors.append("ZPool out of date run `sudo zpool upgrade -a`")
return errors
def systemd_tests(
service_names: Sequence[str],
max_retries: int = 30,
retry_delay_secs: int = 1,
retryable_statuses: Sequence[str] | None = None,
valid_statuses: Sequence[str] | None = None,
) -> list[str] | None:
"""Tests a systemd services.
Args:
service_names (Sequence[str]): A list of service names to test.
max_retries (int, optional): The maximum number of retries. Defaults to 30.
minimum value is 1.
retry_delay_secs (int, optional): The delay between retries in seconds. Defaults to 1.
minimum value is 1.
retryable_statuses (Sequence[str] | None, optional): A list of retryable statuses. Defaults to None.
valid_statuses (Sequence[str] | None, optional): A list of valid statuses. Defaults to None.
Returns:
list[str] | None: A list of errors if any.
"""
logger.info("Testing systemd service")
max_retries = max(max_retries, 1)
retry_delay_secs = max(retry_delay_secs, 1)
last_try = max_retries - 1
if retryable_statuses is None:
retryable_statuses = ("inactive\n", "activating\n")
if valid_statuses is None:
valid_statuses = ("active\n",)
service_names_set = set(service_names)
errors: set[str] = set()
for retry in range(max_retries):
if not service_names_set:
break
logger.info(f"Testing systemd service in {retry + 1} of {max_retries}")
service_names_to_test = copy(service_names_set)
for service_name in service_names_to_test:
service_status, _ = bash_wrapper(f"systemctl is-active {service_name}")
if service_status in valid_statuses:
service_names_set.remove(service_name)
continue
if service_status in retryable_statuses and retry < last_try:
continue
errors.add(f"{service_name} is {service_status.strip()}")
sleep(retry_delay_secs)
return list(errors)

View File

@@ -0,0 +1,66 @@
"""Validate {server_name}."""
import logging
import sys
import tomllib
from os import environ
from pathlib import Path
from socket import gethostname
import typer
from python.common import configure_logger, signal_alert
from python.system_tests.components import systemd_tests, zpool_tests
logger = logging.getLogger(__name__)
def load_config_data(config_file: Path) -> dict[str, list[str]]:
"""Load a TOML configuration file.
Args:
config_file (Path): The path to the configuration file.
Returns:
dict: The configuration data.
"""
return tomllib.loads(config_file.read_text())
def main(config_file: Path) -> None:
"""Main."""
configure_logger(level=environ.get("LOG_LEVEL", "INFO"))
server_name = gethostname()
logger.info(f"Starting {server_name} validation")
config_data = load_config_data(config_file)
errors: list[str] = []
try:
if config_data.get("zpools") and (zpool_errors := zpool_tests(config_data["zpools"])):
errors.extend(zpool_errors)
if config_data.get("services") and (systemd_errors := systemd_tests(config_data["services"])):
errors.extend(systemd_errors)
except Exception as error:
logger.exception(f"{server_name} validation failed")
errors.append(f"{server_name} validation failed: {error}")
if errors:
logger.error(f"{server_name} validation failed: \n{'\n'.join(errors)}")
signal_alert(f"{server_name} validation failed {errors}")
sys.exit(1)
logger.info(f"{server_name} validation passed")
def cli() -> None:
"""CLI."""
typer.run(main)
if __name__ == "__main__":
cli()

View File

@@ -0,0 +1 @@
"""init."""

View File

@@ -0,0 +1 @@
"""init."""

View File

@@ -0,0 +1,11 @@
"""Bar."""
import logging
logger = logging.getLogger(__name__)
def bar() -> None:
"""Bar."""
logger.debug(f"bar {__name__}")
logger.debug("bar")

View File

@@ -0,0 +1,20 @@
"""configure_logger."""
import logging
import sys
def configure_logger(level: str = "INFO", test: str | None = None) -> None:
"""Configure the logger.
Args:
level (str, optional): The logging level. Defaults to "INFO".
test (str | None, optional): The test name. Defaults to None.
"""
logging.basicConfig(
level=level,
datefmt="%Y-%m-%dT%H:%M:%S%z",
format="%(asctime)s %(levelname)s %(filename)s:%(lineno)d - %(message)s" # this is nesiseary
f" {test}",
handlers=[logging.StreamHandler(sys.stdout)],
)

View File

@@ -0,0 +1,17 @@
"""foo."""
import logging
from python.testing.logging.bar import bar
from python.testing.logging.configure_logger import configure_logger
logger = logging.getLogger(__name__)
def foo() -> None:
"""Foo."""
configure_logger("DEBUG", "FOO")
logger.debug(f"foo {__name__}")
logger.debug("foo")
bar()

View File

@@ -0,0 +1,33 @@
"""main."""
import logging
from python.testing.logging.bar import bar
from python.testing.logging.configure_logger import configure_logger
from python.testing.logging.foo import foo
logger = logging.getLogger(__name__)
def main() -> None:
"""Main."""
configure_logger("DEBUG")
# handler = logging.StreamHandler()
# Create and attach a formatter
# formatter = logging.Formatter(
# "%(asctime)s %(levelname)s %(filename)s:%(lineno)d - %(message)s FOO"
# )
# handler.setFormatter(formatter)
# Attach handler to logger
# foo_logger = logging.getLogger("python.testing.logging.foo")
# foo_logger.addHandler(handler)
# foo_logger.propagate = True
logger.debug("main")
foo()
bar()
if __name__ == "__main__":
main()

1
python/tools/__init__.py Normal file
View File

@@ -0,0 +1 @@
"""Server Tools."""

161
python/tools/fix_eval_warnings.py Executable file
View File

@@ -0,0 +1,161 @@
#!/usr/bin/env python3
"""fix_eval_warnings."""
from __future__ import annotations
import logging
import os
from dataclasses import dataclass
from pathlib import Path
import requests
import typer
from python.common import configure_logger
logger = logging.getLogger(__name__)
@dataclass
class Config:
"""Configuration for the script.
Attributes:
github_token (str): GitHub token for API authentication.
model_name (str): The name of the LLM model to use. Defaults to "gpt-4o".
api_base (str): The base URL for the GitHub Models API.
Defaults to "https://models.inference.ai.azure.com".
"""
github_token: str
model_name: str = "gpt-4o"
api_base: str = "https://models.inference.ai.azure.com"
def get_log_content(run_id: str) -> None:
"""Fetch the logs for a specific workflow run.
Args:
run_id (str): The run ID.
"""
logger.info(f"Fetching logs for run ID: {run_id}")
# List artifacts to find logs (or use jobs API)
# For simplicity, we might need to use 'gh' cli in the workflow to download logs
# But let's try to read from a file if passed as argument, which is easier for the workflow
def parse_warnings(log_file_path: Path) -> list[str]:
"""Parse the log file for evaluation warnings.
Args:
log_file_path (Path): The path to the log file.
Returns:
list[str]: A list of warning messages.
"""
warnings = []
with log_file_path.open(encoding="utf-8", errors="ignore") as f:
warnings.extend(line.strip() for line in f if "evaluation warning:" in line)
return warnings
def generate_fix(warning_msg: str, config: Config) -> str | None:
"""Call GitHub Models to generate a fix for the warning.
Args:
warning_msg (str): The warning message.
config (Config): The configuration object.
Returns:
Optional[str]: The suggested fix or None.
"""
logger.info(f"Generating fix for: {warning_msg}")
prompt = f"""
I encountered the following Nix evaluation warning:
`{warning_msg}`
Please explain what this warning means and suggest how to fix it in the Nix code.
If possible, provide the exact code change in a diff format or a clear description of what to change.
"""
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {config.github_token}"}
payload = {
"messages": [
{"role": "system", "content": "You are an expert NixOS and Nix language developer."},
{"role": "user", "content": prompt},
],
"model": config.model_name,
"temperature": 0.1,
}
try:
response = requests.post(f"{config.api_base}/chat/completions", headers=headers, json=payload, timeout=30)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"] # type: ignore[no-any-return]
except Exception:
logger.exception("Error calling LLM")
return None
def main(
log_file: Path = typer.Argument(..., help="Path to the build log file"), # noqa: B008
model_name: str = typer.Option("gpt-4o", envvar="MODEL_NAME", help="LLM Model Name"),
) -> None:
"""Detect evaluation warnings in logs and suggest fixes using GitHub Models.
Args:
log_file (Path): Path to the build log file containing evaluation warnings.
model_name (str): The name of the LLM model to use for generating fixes.
Defaults to "gpt-4o", can be overridden by MODEL_NAME environment variable.
"""
configure_logger()
github_token = os.environ.get("GITHUB_TOKEN")
if not github_token:
logger.warning("GITHUB_TOKEN not set. LLM calls will fail.")
config = Config(github_token=github_token or "", model_name=model_name)
if not log_file.exists():
logger.error(f"Log file not found: {log_file}")
raise typer.Exit(code=1)
warnings = parse_warnings(log_file)
if not warnings:
logger.info("No evaluation warnings found.")
raise typer.Exit(code=0)
logger.info(f"Found {len(warnings)} warnings.")
# Process unique warnings to save tokens
unique_warnings = list(set(warnings))
fixes = []
for warning in unique_warnings:
if not config.github_token:
logger.warning("Skipping LLM call due to missing GITHUB_TOKEN")
continue
fix = generate_fix(warning, config)
if fix:
fixes.append(f"## Warning\n`{warning}`\n\n## Suggested Fix\n{fix}\n")
# Output fixes to a markdown file for the PR body
if fixes:
with Path("fix_suggestions.md").open("w") as f:
f.write("# Automated Fix Suggestions\n\n")
f.write("\n---\n".join(fixes))
logger.info("Fix suggestions written to fix_suggestions.md")
else:
logger.info("No fixes generated.")
app = typer.Typer()
app.command()(main)
if __name__ == "__main__":
app()

View File

@@ -0,0 +1,144 @@
"""snapshot_manager."""
from __future__ import annotations
import logging
import sys
import tomllib
from functools import cache
from pathlib import Path # noqa: TC003 This is required for the typer CLI
from re import compile as re_compile
from re import search
import typer
from python.common import configure_logger, signal_alert, utcnow
from python.zfs import Dataset, get_datasets
logger = logging.getLogger(__name__)
def main(config_file: Path) -> None:
"""Main."""
configure_logger(level="DEBUG")
logger.info("Starting snapshot_manager")
try:
time_stamp = get_time_stamp()
for dataset in get_datasets():
status = dataset.create_snapshot(time_stamp)
logger.debug(f"{status=}")
if status != "snapshot created":
msg = f"{dataset.name} failed to create snapshot {time_stamp}"
logger.error(msg)
signal_alert(msg)
continue
get_snapshots_to_delete(dataset, get_count_lookup(config_file, dataset.name))
except Exception:
logger.exception("snapshot_manager failed")
signal_alert("snapshot_manager failed")
sys.exit(1)
else:
logger.info("snapshot_manager completed")
def get_count_lookup(config_file: Path, dataset_name: str) -> dict[str, int]:
"""Get the count lookup.
Args:
config_file (Path): The path to the configuration file.
dataset_name (str): The name of the dataset.
Returns:
dict[str, int]: The count lookup.
"""
config_data = load_config_data(config_file)
return config_data.get(dataset_name, get_default_config(config_data))
def get_default_config(config_data: dict[str, dict[str, int]]) -> dict[str, int]:
"""Get the default configuration.
Args:
config_data (dict[str, dict[str, int]]): The configuration data.
Returns:
dict[str, int]: The default configuration.
"""
return config_data.get(
"default",
{"15_min": 4, "hourly": 12, "daily": 0, "monthly": 0},
)
@cache
def load_config_data(config_file: Path) -> dict[str, dict[str, int]]:
"""Load a TOML configuration file.
Args:
config_file (Path): The path to the configuration file.
Returns:
dict: The configuration data.
"""
return tomllib.loads(config_file.read_text())
def get_snapshots_to_delete(
dataset: Dataset,
count_lookup: dict[str, int],
) -> None:
"""Get snapshots to delete.
Args:
dataset (Dataset): the dataset
count_lookup (dict[str, int]): the count lookup
"""
snapshots = dataset.get_snapshots()
if not snapshots:
logger.info(f"{dataset.name} has no snapshots")
return
filters = (
("15_min", re_compile(r"auto_\d{10}(?:15|30|45)")),
("hourly", re_compile(r"auto_\d{8}(?!00)\d{2}00")),
("daily", re_compile(r"auto_\d{6}(?!01)\d{2}0000")),
("monthly", re_compile(r"auto_\d{6}010000")),
)
for filter_name, snapshot_filter in filters:
logger.debug(f"{filter_name=}\n{snapshot_filter=}")
filtered_snapshots = sorted(snapshot.name for snapshot in snapshots if search(snapshot_filter, snapshot.name))
logger.debug(f"{filtered_snapshots=}")
snapshots_wanted = count_lookup[filter_name]
snapshots_being_deleted = filtered_snapshots[:-snapshots_wanted] if snapshots_wanted > 0 else filtered_snapshots
logger.info(f"{snapshots_being_deleted} are being deleted")
for snapshot in snapshots_being_deleted:
if error := dataset.delete_snapshot(snapshot):
error_message = f"{dataset.name}@{snapshot} failed to delete: {error}"
signal_alert(error_message)
logger.error(error_message)
def get_time_stamp() -> str:
"""Get the time stamp."""
now = utcnow()
nearest_15_min = now.replace(minute=(now.minute - (now.minute % 15)))
return nearest_15_min.strftime("auto_%Y%m%d%H%M")
def cli() -> None:
"""CLI."""
typer.run(main)
if __name__ == "__main__":
cli()

11
python/zfs/__init__.py Normal file
View File

@@ -0,0 +1,11 @@
"""init."""
from python.zfs.dataset import Dataset, Snapshot, get_datasets
from python.zfs.zpool import Zpool
__all__ = [
"Dataset",
"Snapshot",
"Zpool",
"get_datasets",
]

214
python/zfs/dataset.py Normal file
View File

@@ -0,0 +1,214 @@
"""dataset."""
from __future__ import annotations
import json
import logging
from datetime import UTC, datetime
from typing import Any
from python.common import bash_wrapper
logger = logging.getLogger(__name__)
def _zfs_list(zfs_list: str) -> dict[str, Any]:
"""Check the version of zfs."""
raw_zfs_list_data, _ = bash_wrapper(zfs_list)
zfs_list_data = json.loads(raw_zfs_list_data)
vers_major = zfs_list_data["output_version"]["vers_major"]
vers_minor = zfs_list_data["output_version"]["vers_minor"]
command = zfs_list_data["output_version"]["command"]
if vers_major != 0 or vers_minor != 1 or command != "zfs list":
error = f"Datasets are not in the correct format {vers_major=} {vers_minor=} {command=}"
raise RuntimeError(error)
return zfs_list_data
class Snapshot:
"""Snapshot."""
def __init__(self, snapshot_data: dict[str, Any]) -> None:
"""__init__."""
properties = snapshot_data["properties"]
self.createtxg = int(snapshot_data["createtxg"])
self.creation = datetime.fromtimestamp(int(properties["creation"]["value"]), tz=UTC)
self.defer_destroy = properties["defer_destroy"]["value"]
self.guid = int(properties["guid"]["value"])
self.name = snapshot_data["name"].split("@")[1]
self.objsetid = int(properties["objsetid"]["value"])
self.referenced = int(properties["referenced"]["value"])
self.used = int(properties["used"]["value"])
self.userrefs = int(properties["userrefs"]["value"])
self.version = int(properties["version"]["value"])
self.written = int(properties["written"]["value"])
def __repr__(self) -> str:
"""__repr__."""
return f"name={self.name} used={self.used} refer={self.referenced}"
class Dataset:
"""Dataset."""
def __init__(self, name: str) -> None:
"""__init__."""
dataset_data = _zfs_list(f"zfs list {name} -pHj -o all")
properties = dataset_data["datasets"][name]["properties"]
self.aclinherit = properties["aclinherit"]["value"]
self.aclmode = properties["aclmode"]["value"]
self.acltype = properties["acltype"]["value"]
self.available = int(properties["available"]["value"])
self.canmount = properties["canmount"]["value"]
self.checksum = properties["checksum"]["value"]
self.clones = properties["clones"]["value"]
self.compression = properties["compression"]["value"]
self.copies = int(properties["copies"]["value"])
self.createtxg = int(properties["createtxg"]["value"])
self.creation = datetime.fromtimestamp(int(properties["creation"]["value"]), tz=UTC)
self.dedup = properties["dedup"]["value"]
self.devices = properties["devices"]["value"]
self.encryption = properties["encryption"]["value"]
self.exec = properties["exec"]["value"]
self.filesystem_limit = properties["filesystem_limit"]["value"]
self.guid = int(properties["guid"]["value"])
self.keystatus = properties["keystatus"]["value"]
self.logbias = properties["logbias"]["value"]
self.mlslabel = properties["mlslabel"]["value"]
self.mounted = properties["mounted"]["value"]
self.mountpoint = properties["mountpoint"]["value"]
self.name = name
self.quota = int(properties["quota"]["value"])
self.readonly = properties["readonly"]["value"]
self.recordsize = int(properties["recordsize"]["value"])
self.redundant_metadata = properties["redundant_metadata"]["value"]
self.referenced = int(properties["referenced"]["value"])
self.refquota = int(properties["refquota"]["value"])
self.refreservation = int(properties["refreservation"]["value"])
self.reservation = int(properties["reservation"]["value"])
self.setuid = properties["setuid"]["value"]
self.sharenfs = properties["sharenfs"]["value"]
self.snapdir = properties["snapdir"]["value"]
self.snapshot_limit = properties["snapshot_limit"]["value"]
self.sync = properties["sync"]["value"]
self.used = int(properties["used"]["value"])
self.usedbychildren = int(properties["usedbychildren"]["value"])
self.usedbydataset = int(properties["usedbydataset"]["value"])
self.usedbysnapshots = int(properties["usedbysnapshots"]["value"])
self.version = int(properties["version"]["value"])
self.volmode = properties["volmode"]["value"]
self.volsize = properties["volsize"]["value"]
self.vscan = properties["vscan"]["value"]
self.written = int(properties["written"]["value"])
self.xattr = properties["xattr"]["value"]
def get_snapshots(self) -> list[Snapshot] | None:
"""Get all snapshots from zfs and process then is test dicts of sets."""
snapshots_data = _zfs_list(f"zfs list -t snapshot -pHj {self.name} -o all")
return [Snapshot(properties) for properties in snapshots_data["datasets"].values()]
def create_snapshot(self, snapshot_name: str) -> str:
"""Creates a zfs snapshot.
Args:
snapshot_name (str): a snapshot name
"""
logger.debug(f"Creating {self.name}@{snapshot_name}")
_, return_code = bash_wrapper(f"zfs snapshot {self.name}@{snapshot_name}")
if return_code == 0:
return "snapshot created"
if snapshots := self.get_snapshots():
snapshot_names = {snapshot.name for snapshot in snapshots}
if snapshot_name in snapshot_names:
return f"Snapshot {snapshot_name} already exists for {self.name}"
return f"Failed to create snapshot {snapshot_name} for {self.name}"
def delete_snapshot(self, snapshot_name: str) -> str | None:
"""Deletes a zfs snapshot.
Args:
snapshot_name (str): a snapshot name
"""
logger.debug(f"deleting {self.name}@{snapshot_name}")
msg, return_code = bash_wrapper(f"zfs destroy {self.name}@{snapshot_name}")
if return_code != 0:
if msg.startswith(f"cannot destroy '{self.name}@{snapshot_name}': snapshot has dependent clones"):
return "snapshot has dependent clones"
error = f"Failed to delete snapshot {snapshot_name=} for {self.name}"
raise RuntimeError(error)
return None
def __repr__(self) -> str:
"""__repr__."""
return (
f"{self.aclinherit=}\n"
f"{self.aclmode=}\n"
f"{self.acltype=}\n"
f"{self.available=}\n"
f"{self.canmount=}\n"
f"{self.checksum=}\n"
f"{self.clones=}\n"
f"{self.compression=}\n"
f"{self.copies=}\n"
f"{self.createtxg=}\n"
f"{self.creation=}\n"
f"{self.dedup=}\n"
f"{self.devices=}\n"
f"{self.encryption=}\n"
f"{self.exec=}\n"
f"{self.filesystem_limit=}\n"
f"{self.guid=}\n"
f"{self.keystatus=}\n"
f"{self.logbias=}\n"
f"{self.mlslabel=}\n"
f"{self.mounted=}\n"
f"{self.mountpoint=}\n"
f"{self.name=}\n"
f"{self.quota=}\n"
f"{self.readonly=}\n"
f"{self.recordsize=}\n"
f"{self.redundant_metadata=}\n"
f"{self.referenced=}\n"
f"{self.refquota=}\n"
f"{self.refreservation=}\n"
f"{self.reservation=}\n"
f"{self.setuid=}\n"
f"{self.sharenfs=}\n"
f"{self.snapdir=}\n"
f"{self.snapshot_limit=}\n"
f"{self.sync=}\n"
f"{self.used=}\n"
f"{self.usedbychildren=}\n"
f"{self.usedbydataset=}\n"
f"{self.usedbysnapshots=}\n"
f"{self.version=}\n"
f"{self.volmode=}\n"
f"{self.volsize=}\n"
f"{self.vscan=}\n"
f"{self.written=}\n"
f"{self.xattr=}\n"
)
def get_datasets() -> list[Dataset]:
"""Get zfs list.
Returns:
list[Dataset]: A list of zfs datasets.
"""
logger.info("Getting zfs list")
dataset_names, _ = bash_wrapper("zfs list -Hp -t filesystem -o name")
cleaned_datasets = dataset_names.strip().split("\n")
return [Dataset(dataset_name) for dataset_name in cleaned_datasets if "/" in dataset_name]

86
python/zfs/zpool.py Normal file
View File

@@ -0,0 +1,86 @@
"""test."""
from __future__ import annotations
import json
from typing import Any
from python.common import bash_wrapper
def _zpool_list(zfs_list: str) -> dict[str, Any]:
"""Check the version of zfs."""
raw_zfs_list_data, _ = bash_wrapper(zfs_list)
zfs_list_data = json.loads(raw_zfs_list_data)
vers_major = zfs_list_data["output_version"]["vers_major"]
vers_minor = zfs_list_data["output_version"]["vers_minor"]
command = zfs_list_data["output_version"]["command"]
if vers_major != 0 or vers_minor != 1 or command != "zpool list":
error = f"Datasets are not in the correct format {vers_major=} {vers_minor=} {command=}"
raise RuntimeError(error)
return zfs_list_data
class Zpool:
"""Zpool."""
def __init__(
self,
name: str,
) -> None:
"""__init__."""
zpool_data = _zpool_list(f"zpool list {name} -pHj -o all")
properties = zpool_data["pools"][name]["properties"]
self.name = name
self.allocated = int(properties["allocated"]["value"])
self.altroot = properties["altroot"]["value"]
self.ashift = int(properties["ashift"]["value"])
self.autoexpand = properties["autoexpand"]["value"]
self.autoreplace = properties["autoreplace"]["value"]
self.autotrim = properties["autotrim"]["value"]
self.capacity = int(properties["capacity"]["value"])
self.comment = properties["comment"]["value"]
self.dedupratio = properties["dedupratio"]["value"]
self.delegation = properties["delegation"]["value"]
self.expandsize = properties["expandsize"]["value"]
self.failmode = properties["failmode"]["value"]
self.fragmentation = int(properties["fragmentation"]["value"])
self.free = properties["free"]["value"]
self.freeing = int(properties["freeing"]["value"])
self.guid = int(properties["guid"]["value"])
self.health = properties["health"]["value"]
self.leaked = int(properties["leaked"]["value"])
self.readonly = properties["readonly"]["value"]
self.size = int(properties["size"]["value"])
def __repr__(self) -> str:
"""__repr__."""
return (
f"{self.name=}\n"
f"{self.allocated=}\n"
f"{self.altroot=}\n"
f"{self.ashift=}\n"
f"{self.autoexpand=}\n"
f"{self.autoreplace=}\n"
f"{self.autotrim=}\n"
f"{self.capacity=}\n"
f"{self.comment=}\n"
f"{self.dedupratio=}\n"
f"{self.delegation=}\n"
f"{self.expandsize=}\n"
f"{self.failmode=}\n"
f"{self.fragmentation=}\n"
f"{self.freeing=}\n"
f"{self.guid=}\n"
f"{self.health=}\n"
f"{self.leaked=}\n"
f"{self.readonly=}\n"
f"{self.size=}"
)

View File

@@ -1,10 +1,15 @@
{pkgs ? import <nixpkgs> {}, ...}: {
{
pkgs ? import <nixpkgs> { },
...
}:
{
default = pkgs.mkShell {
NIX_CONFIG = "extra-experimental-features = nix-command flakes ca-derivations";
nativeBuildInputs = with pkgs; [
nix
home-manager
git
my_python
ssh-to-age
gnupg

View File

@@ -1,18 +1,22 @@
{ inputs, ... }:
{
imports = [
../../users/richie
../../common/global
../../common/optional/desktop.nix
../../common/optional/docker.nix
../../common/optional/scanner.nix
../../common/optional/steam.nix
../../common/optional/syncthing_base.nix
../../common/optional/systemd-boot.nix
../../common/optional/yubikey.nix
../../common/optional/zerotier.nix
"${inputs.self}/users/richie"
"${inputs.self}/users/gaming"
"${inputs.self}/common/global"
"${inputs.self}/common/optional/desktop.nix"
"${inputs.self}/common/optional/docker.nix"
"${inputs.self}/common/optional/scanner.nix"
"${inputs.self}/common/optional/steam.nix"
"${inputs.self}/common/optional/syncthing_base.nix"
"${inputs.self}/common/optional/systemd-boot.nix"
"${inputs.self}/common/optional/update.nix"
"${inputs.self}/common/optional/yubikey.nix"
"${inputs.self}/common/optional/zerotier.nix"
"${inputs.self}/common/optional/nvidia.nix"
./hardware.nix
./nvidia.nix
./syncthing.nix
./llms.nix
];
networking = {
@@ -22,26 +26,19 @@
networkmanager.enable = true;
};
hardware = {
pulseaudio.enable = false;
bluetooth = {
enable = true;
powerOnBoot = true;
};
};
security.rtkit.enable = true;
services = {
displayManager = {
enable = true;
autoLogin = {
user = "gaming";
enable = true;
};
defaultSession = "plasma";
};
openssh.ports = [ 262 ];
snapshot_manager.enable = true;
zfs = {
trim.enable = true;
autoScrub.enable = true;
};
snapshot_manager.path = ./snapshot_config.toml;
};
system.stateVersion = "24.05";

View File

@@ -26,6 +26,9 @@
device = "/dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_1TB_S73JNJ0X114418B-part2";
bypassWorkqueues = true;
allowDiscards = true;
keyFileSize = 4096;
keyFile = "/dev/disk/by-id/usb-Samsung_Flash_Drive_FIT_0374620080067131-0:0";
fallbackToPassword = true;
};
};
kernelModules = [ "kvm-amd" ];
@@ -48,6 +51,11 @@
fsType = "zfs";
};
"/zfs/models" = {
device = "root_pool/models";
fsType = "zfs";
};
"/boot" = {
device = "/dev/disk/by-uuid/609D-FF29";
fsType = "vfat";

28
systems/bob/llms.nix Normal file
View File

@@ -0,0 +1,28 @@
{
services = {
ollama = {
user = "ollama";
enable = true;
loadModels = [
"codellama:7b"
"deepseek-r1:8b"
"deepseek-r1:14b"
"deepseek-r1:32b"
"llama3.2:3b"
"llama2-uncensored:7b"
"mistral-nemo:12b"
"dolphin-mixtral:8x7b"
"qwq:32b"
"Qihoo360-Light-R1-32B"
];
models = "/zfs/models";
acceleration = "cuda";
openFirewall = true;
};
# open-webui = {
# enable = true;
# openFirewall = true;
# host = "0.0.0.0";
# };
};
}

View File

@@ -0,0 +1,29 @@
["default"]
15_min = 8
hourly = 24
daily = 0
monthly = 0
["root_pool/home"]
15_min = 8
hourly = 12
daily = 1
monthly = 0
["root_pool/root"]
15_min = 8
hourly = 24
daily = 0
monthly = 0
["root_pool/nix"]
15_min = 4
hourly = 0
daily = 0
monthly = 0
["root_pool/models"]
15_min = 4
hourly = 24
daily = 0
monthly = 0

View File

@@ -1,9 +1,9 @@
{
services.syncthing.settings.folders = {
"notes" = {
id = "l62ul-lpweo"; # cspell:disable-line
path = "/home/richie/notes";
"dotfiles" = {
path = "/home/richie/dotfiles";
devices = [
"brain"
"jeeves"
"rhapsody-in-green"
];
@@ -13,8 +13,9 @@
id = "4ckma-gtshs"; # cspell:disable-line
path = "/home/richie/important";
devices = [
"phone"
"brain"
"jeeves"
"phone"
"rhapsody-in-green"
];
fsWatcherEnabled = true;
@@ -30,29 +31,5 @@
];
fsWatcherEnabled = true;
};
"projects" = {
id = "vyma6-lqqrz"; # cspell:disable-line
path = "/home/richie/projects";
devices = [
"jeeves"
"rhapsody-in-green"
];
fsWatcherEnabled = true;
};
"temp" = {
id = "bob_temp";
path = "/home/richie/temp";
devices = [
"jeeves"
];
fsWatcherEnabled = true;
};
"vault" = {
path = "/home/richie/vault";
devices = [
"rhapsody-in-green"
];
fsWatcherEnabled = true;
};
};
}

39
systems/brain/default.nix Normal file
View File

@@ -0,0 +1,39 @@
{ inputs, ... }:
{
imports = [
"${inputs.self}/users/richie"
"${inputs.self}/common/global"
"${inputs.self}/common/optional/docker.nix"
"${inputs.self}/common/optional/ssh_decrypt.nix"
"${inputs.self}/common/optional/syncthing_base.nix"
"${inputs.self}/common/optional/systemd-boot.nix"
"${inputs.self}/common/optional/update.nix"
"${inputs.self}/common/optional/zerotier.nix"
./docker
./hardware.nix
./programs.nix
./services
./syncthing.nix
inputs.nixos-hardware.nixosModules.framework-11th-gen-intel
];
networking = {
hostName = "brain";
hostId = "93a06c6e";
firewall.enable = true;
networkmanager.enable = true;
};
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
};
services = {
openssh.ports = [ 129 ];
smartd.enable = true;
};
system.stateVersion = "25.05";
}

View File

@@ -0,0 +1,11 @@
{ lib, ... }:
{
imports =
let
files = builtins.attrNames (builtins.readDir ./.);
nixFiles = builtins.filter (name: lib.hasSuffix ".nix" name && name != "default.nix") files;
in
map (file: ./. + "/${file}") nixFiles;
virtualisation.oci-containers.backend = "docker";
}

View File

@@ -0,0 +1,3 @@
# docker_networks
docker network create -d bridge web

View File

@@ -1,4 +1,9 @@
{ config, lib, modulesPath, ... }:
{
config,
lib,
modulesPath,
...
}:
{
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
@@ -9,18 +14,19 @@
"ehci_pci"
"nvme"
"sd_mod"
"uas"
"usb_storage"
"usbhid"
"xhci_pci"
];
kernelModules = [ ];
luks.devices."luks-root-pool-wwn-0x500a0751e6c3c01c-part2"= {
device = "/dev/disk/by-id/wwn-0x500a0751e6c3c01c-part2";
luks.devices."luks-root-pool-nvme-Samsung_SSD_990_PRO_2TB_S7KHNJ0Y121613P-part2" = {
device = "/dev/disk/by-id/nvme-Samsung_SSD_990_PRO_2TB_S7KHNJ0Y121613P-part2";
bypassWorkqueues = true;
allowDiscards = true;
fallbackToPassword = true;
keyFileSize = 4096;
keyFile = "/dev/disk/by-id/usb-Samsung_Flash_Drive_FIT_0374220080010715-0:0";
keyFile = "/dev/disk/by-id/usb-USB_SanDisk_3.2Gen1_03021630090925173333-0:0";
fallbackToPassword = true;
};
};
kernelModules = [ "kvm-intel" ];
@@ -60,8 +66,6 @@
swapDevices = [ ];
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -0,0 +1,7 @@
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
filebot
docker-compose
];
}

View File

@@ -0,0 +1,9 @@
{ lib, ... }:
{
imports =
let
files = builtins.attrNames (builtins.readDir ./.);
nixFiles = builtins.filter (name: lib.hasSuffix ".nix" name && name != "default.nix") files;
in
map (file: ./. + "/${file}") nixFiles;
}

View File

@@ -0,0 +1,82 @@
{
users = {
users.hass = {
isSystemUser = true;
group = "hass";
};
groups.hass = { };
};
services = {
home-assistant = {
enable = true;
openFirewall = true;
config = {
http = {
server_port = 8123;
server_host = [
"192.168.90.35"
"192.168.95.35"
"127.0.0.1"
];
};
homeassistant = {
time_zone = "America/New_York";
unit_system = "us_customary";
temperature_unit = "F";
packages = {
victron_modbuss = "!include ${./home_assistant/victron_modbuss.yaml}";
battery_sensors = "!include ${./home_assistant/battery_sensors.yaml}";
};
};
recorder = {
db_url = "postgresql://@/hass";
auto_purge = true;
purge_keep_days = 3650;
db_retry_wait = 15;
};
assist_pipeline = { };
backup = { };
bluetooth = { };
config = { };
dhcp = { };
energy = { };
history = { };
homeassistant_alerts = { };
image_upload = { };
logbook = { };
media_source = { };
mobile_app = { };
ssdp = { };
sun = { };
webhook = { };
cloud = { };
zeroconf = { };
automation = "!include automations.yaml";
script = "!include scripts.yaml";
scene = "!include scenes.yaml";
group = "!include groups.yaml";
};
extraPackages =
python3Packages: with python3Packages; [
aioesphomeapi # for esphome
bleak-esphome # for esphome
esphome-dashboard-api # for esphome
forecast-solar # for solar forecast
gtts # not sure what wants this
jellyfin-apiclient-python # for jellyfin
paho-mqtt # for mqtt
psycopg2 # for postgresql
py-improv-ble-client # for esphome
pymodbus # for modbus
pyopenweathermap # for weather
];
extraComponents = [ "isal" ];
};
esphome = {
enable = true;
openFirewall = true;
address = "192.168.90.35";
};
};
}

View File

@@ -0,0 +1,61 @@
sensor:
# Battery 0
- platform: integration
source: sensor.batteries_jk0_charging_power
name: "JK0 energy in"
unique_id: jk0_energy_in_kwh
unit_prefix: k
method: trapezoidal
round: 3
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.batteries_jk0_charging_power
name: "JK0 energy out"
unique_id: jk0_energy_out_kwh
unit_prefix: k
method: trapezoidal
round: 3
max_sub_interval:
minutes: 5
# Battery 1
- platform: integration
source: sensor.battery1_jk1_charging_power
name: "JK1 energy in"
unique_id: jk1_energy_in_kwh
unit_prefix: k
method: trapezoidal
round: 3
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.battery1_jk1_discharge_power
name: "JK1 energy out"
unique_id: jk1_energy_out_kwh
unit_prefix: k
method: trapezoidal
round: 3
max_sub_interval:
minutes: 5
utility_meter:
# Battery 0
jk0_energy_in_daily:
source: sensor.jk0_energy_in
name: "JK0 Energy In Daily"
cycle: daily
jk0_energy_out_daily:
source: sensor.jk0_energy_out
name: "JK0 Energy Out Daily"
cycle: daily
# Battery 1
jk1_energy_in_daily:
source: sensor.jk1_energy_in
name: "JK1 Energy In Daily"
cycle: daily
jk1_energy_out_daily:
source: sensor.jk1_energy_out
name: "JK1 Energy Out Daily"
cycle: daily

View File

@@ -0,0 +1,347 @@
modbus:
- name: victron_gx
type: tcp
host: 192.168.103.30
port: 502
timeout: 3
delay: 2
sensors:
# ---- SOLAR CHARGER (Unit ID 226) ----
- name: Solar Voltage
slave: 226
address: 776
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: Solar Amperage
slave: 226
address: 777
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
- name: Solar Wattage
slave: 226
address: 789
input_type: holding
data_type: uint16
scale: 0.1
unit_of_measurement: "W"
device_class: power
state_class: measurement
- name: Solar Yield Today
slave: 226
address: 784
input_type: holding
data_type: uint16
scale: 0.1
precision: 3
unit_of_measurement: "kWh"
device_class: energy
state_class: total
# DC system
- name: DC Voltage
slave: 100
address: 840
input_type: holding
data_type: uint16
scale: 0.1
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
unique_id: dc_voltage
- name: DC Wattage
slave: 100
address: 860
input_type: holding
data_type: int16
scale: 1
precision: 0
unit_of_measurement: "W"
device_class: power
state_class: measurement
unique_id: dc_wattage
# GPS
- name: GPS Latitude
slave: 1
address: 2800
input_type: holding
data_type: int32
scale: 0.0000001
precision: 7
state_class: measurement
unique_id: gps_latitude
- name: GPS Longitude
slave: 1
address: 2802
input_type: holding
data_type: int32
scale: 0.0000001
precision: 7
state_class: measurement
unique_id: gps_longitude
- name: GPS Course
slave: 1
address: 2804
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "°"
state_class: measurement
unique_id: gps_course
- name: GPS Speed
slave: 1
address: 2805
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "m/s"
state_class: measurement
unique_id: gps_speed
- name: GPS Fix
slave: 1
address: 2806
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: gps_fix
- name: GPS Satellites
slave: 1
address: 2807
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: gps_satellites
- name: GPS Altitude
slave: 1
address: 2808
input_type: holding
data_type: int32
scale: 0.16
precision: 1
unit_of_measurement: "m"
state_class: measurement
unique_id: gps_altitude
# ---- CHARGER (Unit ID 223) ----
- name: Charger Output 1 Voltage
slave: 223
address: 2307
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
unique_id: charger_output_1_voltage
- name: Charger Output 1 Current
slave: 223
address: 2308
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
unique_id: charger_output_1_current
- name: Charger Output 1 Temperature
slave: 223
address: 2309
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
unique_id: charger_output_1_temperature
- name: Charger AC Current
slave: 223
address: 2314
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
unique_id: charger_ac_current
- name: Charger AC Current Limit
slave: 223
address: 2316
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
unique_id: charger_ac_current_limit
- name: Charger On Off Raw
slave: 223
address: 2317
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_on_off_raw
- name: Charger Charge State Raw
slave: 223
address: 2318
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_charge_state_raw
- name: Charger Error Code
slave: 223
address: 2319
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_error_code
- name: Charger Relay State
slave: 223
address: 2320
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_relay_state
- name: Charger Low Voltage Alarm
slave: 223
address: 2321
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_low_voltage_alarm
- name: Charger High Voltage Alarm
slave: 223
address: 2322
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: charger_high_voltage_alarm
template:
- sensor:
- name: Charger On Off
state: >-
{% set v = states('sensor.charger_on_off_raw')|int %}
{{ {0:'Off',1:'On',2:'Error',3:'Unavailable'}.get(v, 'Unknown') }}
- name: Charger Charge State
state: >-
{% set v = states('sensor.charger_charge_state_raw')|int %}
{{ {
0:'Off',1:'Low Power',2:'Fault',3:'Bulk',4:'Absorption',5:'Float',
6:'Storage',7:'Equalize/Manual',8:'External Control'
}.get(v,'Unknown') }}
- name: "Charger DC Wattage"
unique_id: charger_dc_wattage
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >-
{% set v = states('sensor.charger_output_1_voltage')|float(0) %}
{% set a = states('sensor.charger_output_1_current')|float(0) %}
{{ (v * a) | round(1) }}
- binary_sensor:
- name: Charger Low Voltage Alarm Active
state: "{{ states('sensor.charger_low_voltage_alarm')|int == 2 }}"
- name: Charger High Voltage Alarm Active
state: "{{ states('sensor.charger_high_voltage_alarm')|int == 2 }}"
sensor:
- platform: integration
source: sensor.dc_wattage
name: DC System Energy
unit_prefix: k
round: 2
method: trapezoidal
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.solar_wattage
name: Solar Yield
unit_prefix: k
round: 2
method: trapezoidal
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.charger_dc_wattage
name: DC Charger Energy
unit_prefix: k
round: 2
method: trapezoidal
max_sub_interval:
minutes: 5
utility_meter:
dc_load_energy_daily:
source: sensor.dc_system_energy
cycle: daily
dc_load_energy_monthly:
source: sensor.dc_system_energy
cycle: monthly
solar_yield_daily:
source: sensor.solar_yield
cycle: daily
solar_yield_monthly:
source: sensor.solar_yield
cycle: monthly
charger_dc_wattage_daily:
source: sensor.dc_charger_energy
cycle: daily
charger_dc_wattage_monthly:
source: sensor.dc_charger_energy
cycle: monthly

View File

@@ -0,0 +1,6 @@
{
services.jellyfin = {
enable = true;
openFirewall = true;
};
}

View File

@@ -0,0 +1,151 @@
{ pkgs, ... }:
{
networking.firewall.allowedTCPPorts = [ 5432 ];
services.postgresql = {
enable = true;
package = pkgs.postgresql_17_jit;
enableTCPIP = true;
enableJIT = true;
authentication = pkgs.lib.mkOverride 10 ''
# admins
local all postgres trust
host all postgres 127.0.0.1/32 trust
host all postgres ::1/128 trust
local all richie trust
host all richie 127.0.0.1/32 trust
host all richie ::1/128 trust
host all richie 192.168.90.1/24 trust
host all richie 192.168.99.1/24 trust
#type database DBuser origin-address auth-method
local hass hass trust
# ipv4
host hass hass 192.168.90.1/24 trust
host hass hass 127.0.0.1/32 trust
# ipv6
host hass hass ::1/128 trust
'';
identMap = ''
# ArbitraryMapName systemUser DBUser
superuser_map root postgres
superuser_map postgres postgres
# Let other names login as themselves
superuser_map richie postgres
superuser_map hass hass
'';
ensureUsers = [
{
name = "postgres";
ensureClauses = {
superuser = true;
login = true;
createrole = true;
createdb = true;
replication = true;
};
}
{
name = "richie";
ensureDBOwnership = true;
ensureClauses = {
superuser = true;
login = true;
createrole = true;
createdb = true;
replication = true;
};
}
{
name = "hass";
ensureDBOwnership = true;
ensureClauses = {
login = true;
createrole = true;
createdb = true;
replication = true;
};
}
];
ensureDatabases = [
"hass"
"richie"
];
# Thank you NotAShelf
# https://github.com/NotAShelf/nyx/blob/d407b4d6e5ab7f60350af61a3d73a62a5e9ac660/modules/core/roles/server/system/services/databases/postgresql.nix#L74
settings = {
# Connectivity;
max_connections = 100;
superuser_reserved_connections = 3;
# Memory Settings;
shared_buffers = "1024 MB";
work_mem = "32 MB";
maintenance_work_mem = "320 MB";
huge_pages = "off";
effective_cache_size = "2 GB";
effective_io_concurrency = 100; # concurrent IO only really activated if OS supports posix_fadvise function;
random_page_cost = 1.25; # speed of random disk access relative to sequential access (1.0);
# Monitoring;
shared_preload_libraries = "pg_stat_statements,auto_explain"; # per statement resource usage stats & log explain statements for slow queries
track_io_timing = "on"; # measure exact block IO times;
track_functions = "pl"; # track execution times of pl-language procedures if any;
# Replication;
wal_level = "replica"; # consider using at least "replica";
max_wal_senders = 0;
synchronous_commit = "on";
# Checkpointing: ;
checkpoint_timeout = "15 min";
checkpoint_completion_target = 0.9;
max_wal_size = "1024 MB";
min_wal_size = "512 MB";
# WAL writing;
wal_compression = "on";
wal_buffers = -1; # auto-tuned by Postgres till maximum of segment size (16MB by default);
wal_writer_delay = "200ms";
wal_writer_flush_after = "1MB";
# Background writer;
bgwriter_delay = "200ms";
bgwriter_lru_maxpages = 100;
bgwriter_lru_multiplier = 2.0;
bgwriter_flush_after = 0;
# Parallel queries: ;
max_worker_processes = 6;
max_parallel_workers_per_gather = 3;
max_parallel_maintenance_workers = 3;
max_parallel_workers = 6;
parallel_leader_participation = "on";
# Advanced features ;
enable_partitionwise_join = "on";
enable_partitionwise_aggregate = "on";
jit = "on";
jit_above_cost = 100000;
jit_inline_above_cost = 150000;
jit_optimize_above_cost = 500000;
# log slow queries
log_min_duration_statement = 100;
"auto_explain.log_min_duration" = 100;
# logging configuration
log_connections = true;
log_statement = "ddl";
logging_collector = true;
log_disconnections = true;
log_rotation_age = "14d";
};
};
}

View File

@@ -0,0 +1,30 @@
{
networking.firewall.allowedTCPPorts = [ 8384 ];
services.syncthing = {
overrideFolders = false;
guiAddress = "192.168.90.35:8384";
settings = {
"dotfiles" = {
path = "/home/richie/dotfiles";
devices = [
"bob"
"jeeves"
"rhapsody-in-green"
];
fsWatcherEnabled = true;
};
"important" = {
id = "4ckma-gtshs"; # cspell:disable-line
path = "/home/richie/important";
devices = [
"bob"
"jeeves"
"phone"
"rhapsody-in-green"
];
fsWatcherEnabled = true;
};
};
};
}

View File

@@ -1,58 +1,39 @@
{ inputs, ... }:
let
vars = import ./vars.nix;
in
{
imports = [
../../users/richie
../../common/global
../../common/optional/docker.nix
../../common/optional/ssh_decrypt.nix
../../common/optional/syncthing_base.nix
../../common/optional/zerotier.nix
"${inputs.self}/users/richie"
"${inputs.self}/users/math"
"${inputs.self}/users/dov"
"${inputs.self}/common/global"
"${inputs.self}/common/optional/docker.nix"
"${inputs.self}/common/optional/ssh_decrypt.nix"
"${inputs.self}/common/optional/syncthing_base.nix"
"${inputs.self}/common/optional/update.nix"
"${inputs.self}/common/optional/zerotier.nix"
./docker
./services
./hardware.nix
./home_assistant.nix
./networking.nix
./nvidia.nix
./programs.nix
./runner.nix
./services.nix
./runners
./syncthing.nix
];
boot.zfs.extraPools = [
"media"
"storage"
"torrenting"
];
services = {
openssh.ports = [ 629 ];
nix-serve = {
enable = true;
secretKeyFile = "${vars.storage_secrets}/services/nix-cache/cache-priv-key.pem";
openFirewall = true;
};
plex = {
enable = true;
dataDir = vars.media_plex;
openFirewall = true;
};
smartd.enable = true;
snapshot_manager = {
enable = true;
path = ./snapshot_config.toml;
EnvironmentFile = "${vars.secrets}/services/snapshot_manager";
};
sysstat.enable = true;
zfs = {
trim.enable = true;
autoScrub.enable = true;
};
zerotierone.joinNetworks = [ "a09acf02330d37b9" ];
};
system.stateVersion = "24.05";

View File

@@ -1,19 +0,0 @@
let
vars = import ../vars.nix;
in
{
virtualisation.oci-containers.containers.audiobookshelf = {
image = "ghcr.io/advplyr/audiobookshelf:latest";
volumes = [
"${vars.media_docker_configs}/audiobookshelf:/config"
"${vars.media_docker_configs}/audiobookshelf:/metadata"
"${vars.storage_library}/audiobooks:/audiobooks"
"${vars.storage_library}/books:/books"
];
environment = {
TZ = "America/New_York";
};
extraOptions = [ "--network=web" ];
autoStart = true;
};
}

View File

@@ -1,15 +0,0 @@
let
vars = import ../vars.nix;
in
{
virtualisation.oci-containers.containers.filebrowser = {
image = "hurlenko/filebrowser:latest";
extraOptions = [ "--network=web" ];
volumes = [
"/zfs:/data"
"${vars.media_docker_configs}/filebrowser:/config"
];
autoStart = true;
user = "1000:users";
};
}

View File

@@ -1,12 +0,0 @@
let
vars = import ../vars.nix;
in
{
virtualisation.oci-containers.containers.grafana = {
image = "grafana/grafana-enterprise:latest";
volumes = [ "${vars.media_docker_configs}/grafana:/var/lib/grafana" ];
user = "600:600";
extraOptions = [ "--network=web" ];
autoStart = true;
};
}

View File

@@ -0,0 +1,60 @@
{
config,
pkgs,
...
}:
let
vars = import ../vars.nix;
in
{
# environment.systemPackages = with pkgs; [ php.withExtensions ({ all, ... }: [ all.pdo_pgsql ]) ];
services.httpd = {
enable = true;
adminAddr = "webmaster@localhost";
enablePHP = true;
phpPackage = pkgs.php.withExtensions (
{ enabled, all }:
enabled
++ [
all.pdo
all.pdo_pgsql
]
);
extraModules = [ "rewrite" ];
virtualHosts.great_cloud_of_witnesses = {
hostName = "localhost";
listen = [
{
ip = "*";
port = 8092;
}
];
documentRoot = "${vars.services}/great_cloud_of_witnesses";
extraConfig = ''
<Directory "${vars.services}/great_cloud_of_witnesses">
AllowOverride All
Require all granted
</Directory>
'';
};
};
sops.secrets.gcw_password = {
sopsFile = ../../../users/secrets.yaml;
neededForUsers = true;
};
users = {
users.gcw = {
isSystemUser = true;
hashedPasswordFile = config.sops.secrets.gcw_password.path;
group = "gcw";
};
groups.gcw = { };
};
}

View File

@@ -1,53 +0,0 @@
let
vars = import ../vars.nix;
in
{
virtualisation.oci-containers.containers.photoprism = {
image = "photoprism/photoprism:latest";
volumes = [
"${vars.media_docker_configs}/photoprism:/photoprism/storage"
"${vars.storage_photos}/originals:/photoprism/originals"
"${vars.storage_photos}/import:/photoprism/import"
];
environment = {
PHOTOPRISM_ADMIN_USER="admin";
PHOTOPRISM_AUTH_MODE="password";
PHOTOPRISM_DISABLE_TLS="false";
PHOTOPRISM_DEFAULT_TLS="true";
PHOTOPRISM_ORIGINALS_LIMIT="30000";
PHOTOPRISM_HTTP_COMPRESSION="gzip";
PHOTOPRISM_LOG_LEVEL="info";
PHOTOPRISM_READONLY="false";
PHOTOPRISM_EXPERIMENTAL="false";
PHOTOPRISM_DISABLE_CHOWN="false";
PHOTOPRISM_DISABLE_WEBDAV="false";
PHOTOPRISM_DISABLE_SETTINGS="false";
PHOTOPRISM_DISABLE_TENSORFLOW="false";
PHOTOPRISM_DISABLE_FACES="false";
PHOTOPRISM_DISABLE_CLASSIFICATION="false";
PHOTOPRISM_DISABLE_VECTORS="false";
PHOTOPRISM_DISABLE_RAW="false";
PHOTOPRISM_RAW_PRESETS="false";
PHOTOPRISM_SIDECAR_YAML="true";
PHOTOPRISM_BACKUP_ALBUMS="true";
PHOTOPRISM_BACKUP_DATABASE="true";
PHOTOPRISM_BACKUP_SCHEDULE="daily";
PHOTOPRISM_INDEX_SCHEDULE="";
PHOTOPRISM_AUTO_INDEX="300";
PHOTOPRISM_AUTO_IMPORT= "-1";
PHOTOPRISM_DETECT_NSFW="false";
PHOTOPRISM_UPLOAD_NSFW="true";
PHOTOPRISM_DATABASE_DRIVER="sqlite";
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App";
PHOTOPRISM_SITE_DESCRIPTION="";
PHOTOPRISM_SITE_AUTHOR="";
PHOTOPRISM_UID="600";
PHOTOPRISM_GID="600";
# PHOTOPRISM_UMASK: 0000
};
environmentFiles = ["${vars.storage_secrets}/docker/photoprism"];
autoStart = true;
extraOptions = [ "--network=web" ];
};
}

View File

@@ -1,32 +0,0 @@
let
vars = import ../vars.nix;
in
{
users = {
users.postgres = {
isSystemUser = true;
group = "postgres";
uid = 999;
};
groups.postgres = {
gid = 999;
};
};
virtualisation.oci-containers.containers = {
postgres = {
image = "postgres:17";
ports = [ "5432:5432" ];
volumes = [ "${vars.media_database}/postgres:/var/lib/postgresql/data" ];
environment = {
POSTGRES_USER = "admin";
POSTGRES_DB = "archive";
POSTGRES_INITDB_ARGS = "--auth-host=scram-sha-256";
};
environmentFiles = [ "${vars.storage_secrets}/docker/postgres" ];
autoStart = true;
user = "postgres:postgres";
};
};
}

View File

@@ -1,29 +0,0 @@
let
vars = import ../vars.nix;
in
{
networking.firewall = {
allowedTCPPorts = [ 6881 8082 29432 ];
allowedUDPPorts = [ 6881 29432 ];
};
virtualisation.oci-containers.containers.qbit = {
image = "ghcr.io/linuxserver/qbittorrent:5.0.2";
ports = [
"6881:6881"
"6881:6881/udp"
"8082:8082"
"29432:29432"
];
volumes = [
"${vars.media_docker_configs}/qbit:/config"
"${vars.torrenting_qbit}:/data"
];
environment = {
PUID = "600";
PGID = "100";
TZ = "America/New_York";
WEBUI_PORT = "8082";
};
autoStart = true;
};
}

View File

@@ -3,7 +3,11 @@ let
in
{
networking.firewall = {
allowedTCPPorts = [ 6882 8081 8118 ];
allowedTCPPorts = [
6882
8081
8118
];
allowedUDPPorts = [ 6882 ];
};
virtualisation.oci-containers.containers.qbitvpn = {
@@ -17,8 +21,9 @@ in
"8118:8118"
];
volumes = [
"${vars.media_docker_configs}/qbitvpn:/config"
"${vars.torrenting_qbitvpn}:/data"
"${vars.docker_configs}/qbitvpn:/config"
"${vars.qbitvpn}:/data"
"${vars.qbitvpn_scratch}:/data/incomplete"
"/etc/localtime:/etc/localtime:ro"
];
environment = {
@@ -36,7 +41,7 @@ in
DELUGE_DAEMON_LOG_LEVEL = "debug";
DELUGE_WEB_LOG_LEVEL = "debug";
};
environmentFiles = ["${vars.storage_secrets}/docker/qbitvpn"];
environmentFiles = [ "${vars.secrets}/docker/qbitvpn" ];
autoStart = true;
};
}

View File

@@ -1,39 +0,0 @@
let
vars = import ../vars.nix;
in
{
virtualisation.oci-containers.containers = {
haproxy = {
image = "haproxy:latest";
user = "600:600";
environment = {
TZ = "Etc/EST";
};
volumes = [
"${vars.storage_secrets}/docker/cloudflare.pem:/etc/ssl/certs/cloudflare.pem"
"${./haproxy.cfg}:/usr/local/etc/haproxy/haproxy.cfg"
];
dependsOn = [
"audiobookshelf"
"filebrowser"
"grafana"
"photoprism"
"uptime_kuma"
];
extraOptions = [ "--network=web" ];
autoStart = true;
};
cloud_flare_tunnel = {
image = "cloudflare/cloudflared:latest";
user = "600:600";
cmd = [
"tunnel"
"run"
];
environmentFiles = ["${vars.storage_secrets}/docker/cloud_flare_tunnel"];
dependsOn = [ "haproxy" ];
extraOptions = [ "--network=web" ];
autoStart = true;
};
};
}

View File

@@ -3,10 +3,11 @@ let
in
{
virtualisation.oci-containers.containers.share = {
image = "ubuntu/apache2:latest";
image = "ubuntu/apache2:2.4-22.04_beta";
ports = [ "8091:80" ];
volumes = [
"${../../../common/docker_templates}/file_server/sites/:/etc/apache2/sites-enabled/"
"${vars.media_share}:/data"
"${vars.share}:/data"
];
extraOptions = [ "--network=web" ];
autoStart = true;

View File

@@ -0,0 +1,21 @@
let
vars = import ../vars.nix;
in
{
networking.firewall.allowedTCPPorts = [
8989
];
virtualisation.oci-containers.containers.signal_cli_rest_api = {
image = "bbernhard/signal-cli-rest-api:latest";
ports = [
"8989:8080"
];
volumes = [
"${vars.docker_configs}/signal-cli-config:/home/.local/share/signal-cli"
];
environment = {
MODE = "json-rpc";
};
autoStart = true;
};
}

View File

@@ -1,16 +0,0 @@
let
vars = import ../vars.nix;
in
{
virtualisation.oci-containers.containers = {
uptime_kuma = {
image = "louislam/uptime-kuma:latest";
volumes = [
"${vars.media_docker_configs}/uptime_kuma:/app/data"
"/var/run/docker.sock:/var/run/docker.sock"
];
extraOptions = [ "--network=web" ];
autoStart = true;
};
};
}

View File

@@ -1,6 +1,26 @@
{ config, lib, modulesPath, ... }:
{
imports =[ (modulesPath + "/installer/scan/not-detected.nix") ];
config,
lib,
modulesPath,
...
}:
let
makeLuksDevice = device: {
inherit device;
keyFileSize = 4096;
keyFile = "/dev/disk/by-id/usb-XIAO_USB_Drive_24587CE29074-0:0";
fallbackToPassword = true;
};
makeLuksSSD =
device:
(makeLuksDevice device)
// {
bypassWorkqueues = true;
allowDiscards = true;
};
in
{
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
boot = {
loader = {
@@ -36,77 +56,51 @@
luks.devices = {
# cspell:disable
# Root pool
"luks-root-pool-wwn-0x55cd2e4150f01519-part2" = {
device = "/dev/disk/by-id/wwn-0x55cd2e4150f01519-part2";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-root-pool-wwn-0x55cd2e4150f01556-part2" = {
device = "/dev/disk/by-id/wwn-0x55cd2e4150f01556-part2";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-root-pool-wwn-0x55cd2e4150f01519-part2" =
makeLuksSSD "/dev/disk/by-id/wwn-0x55cd2e4150f01519-part2";
"luks-root-pool-wwn-0x55cd2e4150f01556-part2" =
makeLuksSSD "/dev/disk/by-id/wwn-0x55cd2e4150f01556-part2";
# Media pool
"luks-media_pool-nvme-INTEL_SSDPEK1A118GA_BTOC14120V2J118B-part1" = {
device = "/dev/disk/by-id/nvme-INTEL_SSDPEK1A118GA_BTOC14120V2J118B-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-media_pool-nvme-INTEL_SSDPEK1A118GA_BTOC14120WAG118B-part1" = {
device = "/dev/disk/by-id/nvme-INTEL_SSDPEK1A118GA_BTOC14120WAG118B-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-media_pool-nvme-INTEL_SSDPE2ME012T4_CVMD5130000G1P2HGN-part1" = {
device = "/dev/disk/by-id/nvme-INTEL_SSDPE2ME012T4_CVMD5130000G1P2HGN-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-media_pool-nvme-INTEL_SSDPE2ME012T4_CVMD5130000U1P2HGN-part1" = {
device = "/dev/disk/by-id/nvme-INTEL_SSDPE2ME012T4_CVMD5130000U1P2HGN-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-media_pool-nvme-INTEL_SSDPEK1A118GA_BTOC14120V2J118B-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-INTEL_SSDPEK1A118GA_BTOC14120V2J118B-part1";
"luks-media_pool-nvme-INTEL_SSDPEK1A118GA_BTOC14120WAG118B-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-INTEL_SSDPEK1A118GA_BTOC14120WAG118B-part1";
"luks-media_pool-nvme-INTEL_SSDPE2ME012T4_CVMD5130000G1P2HGN-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-INTEL_SSDPE2ME012T4_CVMD5130000G1P2HGN-part1";
"luks-media_pool-nvme-INTEL_SSDPE2ME012T4_CVMD5130000U1P2HGN-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-INTEL_SSDPE2ME012T4_CVMD5130000U1P2HGN-part1";
# Scratch pool
"luks-scratch-pool-ata-CT480BX500SSD1_2314E6C3C01C-part1" =
makeLuksSSD "/dev/disk/by-id/ata-CT480BX500SSD1_2314E6C3C01C-part1";
"luks-scratch-pool-ata-CT480BX500SSD1_2314E6C3C01E-part1" =
makeLuksSSD "/dev/disk/by-id/ata-CT480BX500SSD1_2314E6C3C01E-part1";
# Storage pool
"luks-storage_pool-nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834822N-part1" = {
device = "/dev/disk/by-id/nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834822N-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-storage_pool-nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834817F-part1" = {
device = "/dev/disk/by-id/nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834817F-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-storage_pool-nvme-INTEL_MEMPEK1W016GA_PHBT828104DF016D-part1" = {
device = "/dev/disk/by-id/nvme-INTEL_MEMPEK1W016GA_PHBT828104DF016D-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-storage_pool-nvme-INTEL_MEMPEK1W016GA_PHBT828105A8016D-part1" = {
device = "/dev/disk/by-id/nvme-INTEL_MEMPEK1W016GA_PHBT828105A8016D-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-storage_pool-wwn-0x5000cca23bc438dd-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bc438dd-part1";
"luks-storage_pool-wwn-0x5000cca23bd035f5-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bd035f5-part1";
"luks-storage_pool-wwn-0x5000cca23bd00ad6-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bd00ad6-part1";
"luks-storage_pool-wwn-0x5000cca23bcf313e-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bcf313e-part1";
"luks-storage_pool-wwn-0x5000cca23bcdf3b8-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bcdf3b8-part1";
"luks-storage_pool-wwn-0x5000cca23bd02746-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bd02746-part1";
"luks-storage_pool-wwn-0x5000cca23bcf9f89-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bcf9f89-part1";
"luks-storage_pool-wwn-0x5000cca23bd00ae9-part1".device = "/dev/disk/by-id/wwn-0x5000cca23bd00ae9-part1";
# Torrenting pool
"luks-torrenting_pool-wwn-0x500a0751e6c3c01e-part1" = {
device = "/dev/disk/by-id/wwn-0x500a0751e6c3c01e-part1";
bypassWorkqueues = true;
allowDiscards = true;
};
"luks-torrenting_pool-wwn-0x5000cca264f080a3-part1".device = "/dev/disk/by-id/wwn-0x5000cca264f080a3-part1";
"luks-torrenting_pool-wwn-0x5000cca298c33ae5-part1".device = "/dev/disk/by-id/wwn-0x5000cca298c33ae5-part1";
# cspell:enable
"luks-storage_pool-nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834822N-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834822N-part1";
"luks-storage_pool-nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834817F-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-Samsung_SSD_970_EVO_Plus_2TB_S6S2NS0T834817F-part1";
"luks-storage_pool-nvme-INTEL_MEMPEK1W016GA_PHBT828104DF016D-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-INTEL_MEMPEK1W016GA_PHBT828104DF016D-part1";
"luks-storage_pool-nvme-INTEL_MEMPEK1W016GA_PHBT828105A8016D-part1" =
makeLuksSSD "/dev/disk/by-id/nvme-INTEL_MEMPEK1W016GA_PHBT828105A8016D-part1";
"luks-storage_pool-wwn-0x5000cca23bc438dd-part1" =
makeLuksDevice "/dev/disk/by-id/wwn-0x5000cca23bc438dd-part1";
"luks-storage_pool-wwn-0x5000cca23bd035f5-part1" =
makeLuksDevice "/dev/disk/by-id/wwn-0x5000cca23bd035f5-part1";
"luks-storage_pool-wwn-0x5000cca23bd00ad6-part1" =
makeLuksDevice "/dev/disk/by-id/wwn-0x5000cca23bd00ad6-part1";
};
};
zfs.extraPools = [
"media"
"scratch"
"storage"
];
kernelModules = [ "kvm-amd" ];
extraModulePackages = [ ];
};
@@ -122,8 +116,8 @@
fsType = "zfs";
};
"/nix" =
{ device = "root_pool/nix";
"/nix" = {
device = "root_pool/nix";
fsType = "zfs";
};

View File

@@ -1,57 +0,0 @@
let
vars = import ./vars.nix;
in
{
services.home-assistant = {
enable = true;
openFirewall = true;
configDir = vars.media_home_assistant;
config = {
http = {
server_port = 8123;
server_host = [
"192.168.95.14"
"192.168.90.40"
"192.168.98.4"
];
use_x_forwarded_for = true;
trusted_proxies = "172.18.0.0/24";
};
homeassistant = {
time_zone = "America/New_York";
unit_system = "imperial";
temperature_unit = "F";
};
assist_pipeline = { };
backup = { };
bluetooth = { };
config = { };
dhcp = { };
energy = { };
history = { };
homeassistant_alerts = { };
image_upload = { };
logbook = { };
media_source = { };
mobile_app = { };
ssdp = { };
sun = { };
webhook = { };
zeroconf = { };
automation = "!include automations.yaml";
script = "!include scripts.yaml";
scene = "!include scenes.yaml";
group = "!include groups.yaml";
};
extraPackages =
python3Packages: with python3Packages; [
psycopg2
gtts
aioesphomeapi
esphome-dashboard-api
bleak-esphome
pymetno
];
extraComponents = [ "isal" ];
};
}

View File

@@ -7,25 +7,12 @@
};
systemd.network = {
enable = true;
netdevs = {
"20-ioit-vlan" = {
netdevConfig = {
Kind = "vlan";
Name = "ioit-vlan";
};
vlanConfig.Id = 20;
};
};
networks = {
"10-1GB_Primary" = {
matchConfig.Name = "enp98s0f0";
address = [ "192.168.95.14/24" ];
routes = [{ Gateway = "192.168.95.1"; }];
vlan = [ "ioit-vlan" ];
address = [ "192.168.99.14/24" ];
routes = [ { Gateway = "192.168.99.1"; } ];
linkConfig.RequiredForOnline = "routable";
};
"10-1GB_Secondary" = {
@@ -41,15 +28,6 @@
matchConfig.Name = "enp97s0f1np1";
DHCP = "yes";
};
"40-ioit-vlan" = {
matchConfig.Name = "ioit-vlan";
DHCP = "yes";
};
};
};
services.zerotierone = {
enable = true;
joinNetworks = [ "e4da7455b2ae64ca" ];
};
}

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