Compare commits
298 Commits
historic/f
...
staging/ni
Author | SHA1 | Date | |
---|---|---|---|
dac245e032 | |||
e7edafcfec | |||
00af6104be | |||
40c9517dc6 | |||
c2915e29d4 | |||
b6edf768b9 | |||
27be182eb7 | |||
ddf1be7410 | |||
ad819e4cc0 | |||
6407f156b2 | |||
2f2c666b0b | |||
8760621440 | |||
0596b02f22 | |||
a5841192a2 | |||
f085c1d691 | |||
396d094520 | |||
6d419b8279 | |||
bf3e0ad790 | |||
0c07e03ad6 | |||
12f3fc333d | |||
4d96a1ed45 | |||
9aedb133bb | |||
5a15b76b61 | |||
5c17de6e83 | |||
8db4498ae8 | |||
001a5fc252 | |||
6f64e5d469 | |||
b1e9d8db80 | |||
5b39baf2db | |||
4e8ca1a30d | |||
1db3a29dac | |||
61ba1802ee | |||
059c4e9964 | |||
a09736e60b | |||
bdfdcfd164 | |||
7579d4b2c5 | |||
e90a8b7b6e | |||
50cec94164 | |||
5bb31aa5da | |||
2aef1c30bd | |||
471ef03289 | |||
bdcdba6a6d | |||
bf64948cc1 | |||
4331df28d2 | |||
2a148c1543 | |||
adf72fc9d4 | |||
96a66abcd5 | |||
8f40bdc9c0 | |||
3e782a5e73 | |||
f1b47e5de9 | |||
3c6c466d87 | |||
16bf03d8be | |||
ca1594a354 | |||
2e120f613f | |||
2c6f667a7e | |||
8e7586b902 | |||
7a0eed4ec3 | |||
ca1015d579 | |||
f89837f3aa | |||
2a1d6e1faa | |||
7918403d1b | |||
3fb76e720f | |||
a899cf6c9f | |||
40b26fc57e | |||
1be7119b73 | |||
4b41aa3718 | |||
71d6fe44a1 | |||
c5c1378f59 | |||
8fc57c4249 | |||
39eb1e3d07 | |||
e386406bc1 | |||
0cf4c3ff80 | |||
06e699a72b | |||
0c32f807e6 | |||
f6d3c102fa | |||
3e1a2243c7 | |||
4fe6f2aab3 | |||
dc1cd7a9a5 | |||
ead9fd87d7 | |||
4ac5c5f469 | |||
f3151320a3 | |||
403b177a80 | |||
f714235717 | |||
3ec01ba971 | |||
a51f8d45b3 | |||
cd375a9a05 | |||
0486c7f787 | |||
190571e565 | |||
94c31c4e8e | |||
e13af1c1c8 | |||
77587389c4 | |||
70d2d97525 | |||
65ed2afb23 | |||
b2419da057 | |||
243d38333d | |||
7ad75cacb9 | |||
6e9cd15517 | |||
9d052a62b4 | |||
862667648c | |||
2591314fdb | |||
dcd622bc1d | |||
e5cdcc4500 | |||
cb4ca7d26a | |||
9f5d1c0111 | |||
6fe29529b2 | |||
eae8ef11c8 | |||
edf21e6837 | |||
0ecc08b49d | |||
6eb8191514 | |||
3c6da51f84 | |||
6c10c14a32 | |||
8ae4be341a | |||
c94ed9d519 | |||
99373dcd83 | |||
98739bb061 | |||
46dabcd33f | |||
68d72eab16 | |||
f933581b0c | |||
1a639b320d | |||
c9ac005548 | |||
9a73293bd4 | |||
99e2ac1dbb | |||
a56b31cdac | |||
df9716e244 | |||
45f3d5a117 | |||
97a1b5732b | |||
59e4c84800 | |||
16e84cae9d | |||
d725dfb7f1 | |||
79b6c119ee | |||
be1d8c5d97 | |||
454e02c8ec | |||
3b37286e65 | |||
77388f35f6 | |||
a6c91db11b | |||
a96d0e9630 | |||
43f39674d6 | |||
d7fd7d7368 | |||
386c712a23 | |||
9d09a323be | |||
9beb6b52e5 | |||
f96f2ec960 | |||
fd080393f8 | |||
408cfc08a1 | |||
d34a03e060 | |||
8230389b21 | |||
6a735cc0bc | |||
fbc79d2527 | |||
76963d6aaf | |||
7f74951fb3 | |||
d698c7ca70 | |||
8e865999f8 | |||
f7b5423338 | |||
1ec3e1fb1c | |||
8346d21d42 | |||
3ed8e0cb44 | |||
583fcbce6e | |||
4a7513ba23 | |||
b51b01ff02 | |||
f9ceb7d8fd | |||
1a1bef5948 | |||
0625eb1bf8 | |||
b722a4bcc8 | |||
c744b976d0 | |||
8352d3aa8f | |||
dfebedbd6c | |||
3caa072d00 | |||
4ee31d075a | |||
d973cb939c | |||
78ab7b0b80 | |||
2fcb0ebfd0 | |||
7445adbea0 | |||
706cf3bac2 | |||
4b722a6c30 | |||
8350386ea8 | |||
0ee0b3c3bb | |||
8ce1fae67b | |||
f27202056e | |||
7f38cd7535 | |||
b56507d4c2 | |||
aab2a9cd26 | |||
b7c2dfea19 | |||
f1709c0355 | |||
7a67f3ed0f | |||
91054159d3 | |||
0eedcd0114 | |||
9305566330 | |||
0abbd006fc | |||
9d31a462a8 | |||
1c8659d145 | |||
503f097272 | |||
a55e8847ec | |||
2937cbc67a | |||
c92e67bda1 | |||
652e4ca93b | |||
07d3f60f26 | |||
cb20b4a56b | |||
0da3edfa52 | |||
9477160a2d | |||
b77bde5417 | |||
d2a3bec605 | |||
b519de1d6f | |||
1c867c5160 | |||
f8ab8b290e | |||
c8a8fe73ca | |||
03d7cf65a4 | |||
8ddfa91125 | |||
415a2e1a67 | |||
f4a1ede7d4 | |||
478002766e | |||
290a15e517 | |||
e923636181 | |||
017aa335b1 | |||
58b219546b | |||
499078e0f8 | |||
82d3e9686d | |||
02df87fc51 | |||
33ff993981 | |||
976f48268d | |||
ec26f11db4 | |||
15755a8a71 | |||
02067db774 | |||
e69734250e | |||
f78a02700f | |||
d776c4618a | |||
50812e5678 | |||
86293377d7 | |||
14922a40b2 | |||
e6a6d35adf | |||
5777e1a6e4 | |||
635a4b958b | |||
99c4fedbdc | |||
e70e8e144b | |||
aad572a058 | |||
4a886b9e9b | |||
ce60270821 | |||
8929311732 | |||
fdec1817c4 | |||
6cbeccf51f | |||
7491114915 | |||
5715795d1f | |||
bffe39b6b5 | |||
8b2a7d5fb4 | |||
251297b62e | |||
0e70f516b7 | |||
8ecdaa0a64 | |||
af5c0d0648 | |||
87ec775ddb | |||
71028911e3 | |||
5de54acd90 | |||
d54d1b9295 | |||
b740af17cd | |||
40e7d8a689 | |||
2f16e802d8 | |||
b048b47d54 | |||
bcfd8e1725 | |||
e0a6f8ea4a | |||
80f3d0472b | |||
b6685c9e6c | |||
0c2d8af448 | |||
7ce0c34f43 | |||
f2e8be3bd1 | |||
9b2e7b02cc | |||
1b3e0b95be | |||
f78968c73a | |||
d5d755a4b2 | |||
e08281c380 | |||
afb006f6ec | |||
a76cf03232 | |||
9c24f24306 | |||
736999eea6 | |||
979ed38506 | |||
46285852d0 | |||
0e756d5064 | |||
a52ead5aec | |||
c0377ff1a0 | |||
062ef20d05 | |||
a0861edc5f | |||
eae075acb5 | |||
ef2ba01141 | |||
2756e15bab | |||
940aac3a22 | |||
5f24e029af | |||
98b542332b | |||
70b62e9f76 | |||
7c81df00df | |||
f288f34d1e | |||
854977c3aa | |||
3653776399 | |||
e4bff9b5ef | |||
ec22c128e0 | |||
77cc560052 | |||
c1f3fc502d | |||
4d3248d315 | |||
45a1c07210 | |||
a1a711190f | |||
ee9a2b320d | |||
870afec07e |
103
flake.lock
generated
103
flake.lock
generated
@@ -2,11 +2,11 @@
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"lastModified": 1678901627,
|
||||
"narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -18,11 +18,11 @@
|
||||
"mobile-nixos": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1674880620,
|
||||
"narHash": "sha256-JMALuC7xcoH/T66sKTVLuItHfOJBCWsNKpE49Qrvs80=",
|
||||
"lastModified": 1680563603,
|
||||
"narHash": "sha256-gxSci3NTlzgkAOhaC93Q4lReX/Pjd7++imD85JOAlps=",
|
||||
"owner": "nixos",
|
||||
"repo": "mobile-nixos",
|
||||
"rev": "7478a9ffad737486951186b66f6c5535dc5802e2",
|
||||
"rev": "4aa0afd84005b79be4d5361b56a60df9e9bd4ea3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -31,46 +31,46 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-serve": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1678202930,
|
||||
"narHash": "sha256-SF82/tTnagdazlETJLzXD9kjZ6lyk38agdLbmMx1UZE=",
|
||||
"owner": "edolstra",
|
||||
"repo": "nix-serve",
|
||||
"rev": "3b6d30016d910a43e0e16f94170440a3e0b8fa8d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "nix-serve",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs-unpatched"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1,
|
||||
"narHash": "sha256-arp7Uy7ct5ryTcmSY032eN7hr33i7D2XvjTRLliCFDc=",
|
||||
"path": "/nix/store/rk489311m97gs49qid05c1xra05h64sm-source/nixpatches",
|
||||
"type": "path"
|
||||
"lastModified": 1606086654,
|
||||
"narHash": "sha256-VFl+3eGIMqNp7cyOMJ6TjM/+UcsLKtodKoYexrlTJMI=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "19db3e5ea2777daa874563b5986288151f502e27",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"path": "/nix/store/rk489311m97gs49qid05c1xra05h64sm-source/nixpatches",
|
||||
"type": "path"
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-20.09",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1674868155,
|
||||
"narHash": "sha256-eFNm2h6fNbgD7ZpO4MHikCB5pSnCJ7DTmwPisjetmwc=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ce20e9ebe1903ea2ba1ab006ec63093020c761cb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-22.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable_2": {
|
||||
"locked": {
|
||||
"lastModified": 1674352297,
|
||||
"narHash": "sha256-OkAnJPrauEcUCrst4/3DKoQfUn2gXKuU6CFvhtMrLgg=",
|
||||
"lastModified": 1681005198,
|
||||
"narHash": "sha256-5LrnBeXR7Hv8OXh6eany7br4qBW+ZNl4LKf1CJu9zbg=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "918b760070bb8f48cb511300fcd7e02e13058a2e",
|
||||
"rev": "e45cc0138829ad86e7ff17a76acf2d05e781e30a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -82,16 +82,16 @@
|
||||
},
|
||||
"nixpkgs-unpatched": {
|
||||
"locked": {
|
||||
"lastModified": 1674641431,
|
||||
"narHash": "sha256-qfo19qVZBP4qn5M5gXc/h1MDgAtPA5VxJm9s8RUAkVk=",
|
||||
"lastModified": 1681236078,
|
||||
"narHash": "sha256-6taUbMK380Ul35hOP1PlPoE4ezZrcdNm9afewkSNYfY=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9b97ad7b4330aacda9b2343396eb3df8a853b4fc",
|
||||
"rev": "4e2c1815ed1a40825c52e30dc993bf3a3c136104",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"ref": "staging-next",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -99,8 +99,7 @@
|
||||
"root": {
|
||||
"inputs": {
|
||||
"mobile-nixos": "mobile-nixos",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-stable": "nixpkgs-stable",
|
||||
"nix-serve": "nix-serve",
|
||||
"nixpkgs-unpatched": "nixpkgs-unpatched",
|
||||
"sops-nix": "sops-nix",
|
||||
"uninsane-dot-org": "uninsane-dot-org"
|
||||
@@ -109,16 +108,16 @@
|
||||
"sops-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
"nixpkgs-unpatched"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable_2"
|
||||
"nixpkgs-stable": "nixpkgs-stable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1674546403,
|
||||
"narHash": "sha256-vkyNv0xzXuEnu9v52TUtRugNmQWIti8c2RhYnbLG71w=",
|
||||
"lastModified": 1681209176,
|
||||
"narHash": "sha256-wyQokPpkNZnsl/bVf8m1428tfA0hJ0w/qexq4EizhTc=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "b6ab3c61e2ca5e07d1f4eb1b67304e2670ea230c",
|
||||
"rev": "00d5fd73756d424de5263b92235563bc06f2c6e1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -131,15 +130,15 @@
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
"nixpkgs-unpatched"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1666870107,
|
||||
"narHash": "sha256-b9eXZxSwhzdJI5uQgfrMhu4SY2POrPkinUg7F5gQVYo=",
|
||||
"lastModified": 1680517067,
|
||||
"narHash": "sha256-8Ew0IDRuzEGFUjIGqk7EjuB/NL80HDIvlR1YY4Iw95M=",
|
||||
"ref": "refs/heads/master",
|
||||
"rev": "80c6ec95bd430e29d231cf745f19279bb76fb382",
|
||||
"revCount": 164,
|
||||
"rev": "2970c6080187975a1fc996f541167e697d4ebebc",
|
||||
"revCount": 187,
|
||||
"type": "git",
|
||||
"url": "https://git.uninsane.org/colin/uninsane"
|
||||
},
|
||||
|
186
flake.nix
186
flake.nix
@@ -12,6 +12,11 @@
|
||||
# - Flake RFC: <https://github.com/tweag/rfcs/blob/flakes/rfcs/0049-flakes.md>
|
||||
# - Discussion: <https://github.com/NixOS/rfcs/pull/49>
|
||||
# - <https://serokell.io/blog/practical-nix-flakes>
|
||||
#
|
||||
#
|
||||
# COMMON OPERATIONS:
|
||||
# - update a specific flake input:
|
||||
# - `nix flake lock --update-input nixpkgs`
|
||||
|
||||
{
|
||||
# XXX: use the `github:` scheme instead of the more readable git+https: because it's *way* more efficient
|
||||
@@ -19,14 +24,17 @@
|
||||
# but `inputs` is required to be a strict attrset: not an expression.
|
||||
inputs = {
|
||||
# <https://github.com/nixos/nixpkgs/tree/nixos-22.11>
|
||||
nixpkgs-stable.url = "github:nixos/nixpkgs?ref=nixos-22.11";
|
||||
# nixpkgs-stable.url = "github:nixos/nixpkgs?ref=nixos-22.11";
|
||||
|
||||
# <https://github.com/nixos/nixpkgs/tree/nixos-unstable>
|
||||
nixpkgs-unpatched.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
nixpkgs = {
|
||||
url = "./nixpatches";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unpatched";
|
||||
};
|
||||
# nixpkgs-unpatched.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
nixpkgs-unpatched.url = "github:nixos/nixpkgs?ref=staging-next";
|
||||
|
||||
# nixpkgs = {
|
||||
# url = "./nixpatches";
|
||||
# inputs.nixpkgs.follows = "nixpkgs-unpatched";
|
||||
# };
|
||||
|
||||
mobile-nixos = {
|
||||
# <https://github.com/nixos/mobile-nixos>
|
||||
url = "github:nixos/mobile-nixos";
|
||||
@@ -35,24 +43,43 @@
|
||||
sops-nix = {
|
||||
# <https://github.com/Mic92/sops-nix>
|
||||
url = "github:Mic92/sops-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
# inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unpatched";
|
||||
};
|
||||
uninsane-dot-org = {
|
||||
url = "git+https://git.uninsane.org/colin/uninsane";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
# inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unpatched";
|
||||
};
|
||||
nix-serve = {
|
||||
# <https://github.com/edolstra/nix-serve>
|
||||
url = "github:edolstra/nix-serve";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
nixpkgs-stable,
|
||||
nixpkgs-unpatched,
|
||||
mobile-nixos,
|
||||
sops-nix,
|
||||
uninsane-dot-org
|
||||
}:
|
||||
uninsane-dot-org,
|
||||
nix-serve,
|
||||
...
|
||||
}@inputs:
|
||||
let
|
||||
inherit (builtins) attrNames elem listToAttrs map mapAttrs;
|
||||
mapAttrs' = f: set:
|
||||
listToAttrs (map (attr: f attr set.${attr}) (attrNames set));
|
||||
# mapAttrs but without the `name` argument
|
||||
mapAttrValues = f: mapAttrs (_: f);
|
||||
# rather than apply our nixpkgs patches as a flake input, do that here instead.
|
||||
# this (temporarily?) resolves the bad UX wherein a subflake residing in the same git
|
||||
# repo as the main flake causes the main flake to have an unstable hash.
|
||||
nixpkgs = (import ./nixpatches/flake.nix).outputs {
|
||||
self = nixpkgs;
|
||||
nixpkgs = nixpkgs-unpatched;
|
||||
};
|
||||
|
||||
nixpkgsCompiledBy = local: nixpkgs.legacyPackages."${local}";
|
||||
|
||||
evalHost = { name, local, target }:
|
||||
@@ -65,35 +92,58 @@
|
||||
nixosSystem = import ((nixpkgsCompiledBy target).path + "/nixos/lib/eval-config.nix");
|
||||
in
|
||||
(nixosSystem {
|
||||
# we use pkgs built for and *by* the target, i.e. emulation, by default.
|
||||
# cross compilation only happens on explicit access to `pkgs.cross`
|
||||
system = target;
|
||||
modules = [
|
||||
(import ./hosts/instantiate.nix { localSystem = local; hostName = name; })
|
||||
self.nixosModules.default
|
||||
self.nixosModules.passthru
|
||||
{
|
||||
nixpkgs.overlays = [
|
||||
self.overlays.default
|
||||
self.overlays.disable-flakey-tests
|
||||
self.overlays.passthru
|
||||
self.overlays.pins
|
||||
self.overlays.pkgs
|
||||
# self.overlays.optimizations
|
||||
];
|
||||
nixpkgs.hostPlatform = target;
|
||||
# nixpkgs.buildPlatform = local; # set by instantiate.nix instead
|
||||
# nixpkgs.config.replaceStdenv = { pkgs }: pkgs.ccacheStdenv;
|
||||
}
|
||||
];
|
||||
});
|
||||
in {
|
||||
nixosConfigurations = {
|
||||
servo = evalHost { name = "servo"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
desko = evalHost { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
lappy = evalHost { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
moby = evalHost { name = "moby"; local = "aarch64-linux"; target = "aarch64-linux"; };
|
||||
# special cross-compiled variant, to speed up deploys from an x86 box to the arm target
|
||||
# note that these *do* produce different store paths, because the closure for the tools used to cross compile
|
||||
# v.s. emulate differ.
|
||||
# so deploying foo-cross and then foo incurs some rebuilding.
|
||||
moby-cross = evalHost { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; };
|
||||
rescue = evalHost { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
};
|
||||
nixosConfigurations =
|
||||
let
|
||||
hosts = {
|
||||
servo = { name = "servo"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
desko = { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
lappy = { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
moby = { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; };
|
||||
rescue = { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||
};
|
||||
# cross-compiled builds: instead of emulating the host, build using a cross-compiler.
|
||||
# - these are faster to *build* than the emulated variants (useful when tweaking packages),
|
||||
# - but fewer of their packages can be found in upstream caches.
|
||||
cross = mapAttrValues evalHost hosts;
|
||||
emulated = mapAttrValues
|
||||
({name, local, target}: evalHost {
|
||||
inherit name target;
|
||||
local = null;
|
||||
})
|
||||
hosts;
|
||||
prefixAttrs = prefix: attrs: mapAttrs'
|
||||
(name: value: {
|
||||
name = prefix + name;
|
||||
inherit value;
|
||||
})
|
||||
attrs;
|
||||
in
|
||||
(prefixAttrs "cross-" cross) //
|
||||
(prefixAttrs "emulated-" emulated) // {
|
||||
# prefer native builds for these machines:
|
||||
inherit (emulated) servo desko lappy rescue;
|
||||
# prefer cross-compiled builds for these machines:
|
||||
inherit (cross) moby;
|
||||
};
|
||||
|
||||
# unofficial output
|
||||
# this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition).
|
||||
@@ -109,22 +159,42 @@
|
||||
# - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /`
|
||||
# - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS.
|
||||
# - `nixos-rebuild --flake './#<host>' switch`
|
||||
imgs = builtins.mapAttrs (_: host-dfn: host-dfn.config.system.build.img) self.nixosConfigurations;
|
||||
imgs = mapAttrValues (host: host.config.system.build.img) self.nixosConfigurations;
|
||||
|
||||
overlays = rec {
|
||||
default = pkgs;
|
||||
pkgs = import ./overlays/pkgs.nix;
|
||||
pins = import ./overlays/pins.nix; # TODO: move to `nixpatches/` input
|
||||
passthru =
|
||||
# unofficial output
|
||||
host-pkgs = mapAttrValues (host: host.config.system.build.pkgs) self.nixosConfigurations;
|
||||
|
||||
overlays = {
|
||||
# N.B.: `nix flake check` requires every overlay to take `final: prev:` at defn site,
|
||||
# hence the weird redundancy.
|
||||
default = final: prev: self.overlays.pkgs final prev;
|
||||
disable-flakey-tests = final: prev: import ./overlays/disable-flakey-tests.nix final prev;
|
||||
pkgs = final: prev: import ./overlays/pkgs.nix final prev;
|
||||
pins = final: prev: import ./overlays/pins.nix final prev;
|
||||
optimizations = final: prev: import ./overlays/optimizations.nix final prev;
|
||||
passthru = final: prev:
|
||||
let
|
||||
stable = next: prev: {
|
||||
stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform.system}";
|
||||
};
|
||||
stable =
|
||||
if inputs ? "nixpkgs-stable" then (
|
||||
final': prev': {
|
||||
stable = inputs.nixpkgs-stable.legacyPackages."${prev'.stdenv.hostPlatform.system}";
|
||||
}
|
||||
) else (final': prev': {});
|
||||
mobile = (import "${mobile-nixos}/overlay/overlay.nix");
|
||||
uninsane = uninsane-dot-org.overlay;
|
||||
# nix-serve' = nix-serve.overlay;
|
||||
nix-serve' = next: prev: {
|
||||
# XXX(2023/03/02): upstream isn't compatible with modern `nix`. probably the perl bindings.
|
||||
# - we use the package built against `nixpkgs` specified in its flake rather than use its overlay,
|
||||
# to get around this.
|
||||
inherit (nix-serve.packages."${next.system}") nix-serve;
|
||||
};
|
||||
in
|
||||
next: prev:
|
||||
(stable next prev) // (mobile next prev) // (uninsane next prev);
|
||||
(stable final prev)
|
||||
// (mobile final prev)
|
||||
// (uninsane final prev)
|
||||
// (nix-serve' final prev)
|
||||
;
|
||||
};
|
||||
|
||||
nixosModules = rec {
|
||||
@@ -148,14 +218,33 @@
|
||||
aarch64-linux = allPkgsFor "aarch64-linux";
|
||||
};
|
||||
|
||||
# extract only our own packages from the full set
|
||||
packages = builtins.mapAttrs
|
||||
(_: full: full.sane // { inherit (full) sane uninsane-dot-org; })
|
||||
self.legacyPackages;
|
||||
# extract only our own packages from the full set.
|
||||
# because of `nix flake check`, we flatten the package set and only surface x86_64-linux packages.
|
||||
packages = mapAttrs
|
||||
(system: allPkgs:
|
||||
allPkgs.lib.filterAttrs (name: pkg:
|
||||
# keep only packages which will pass `nix flake check`, i.e. keep only:
|
||||
# - derivations (not package sets)
|
||||
# - packages that build for the given platform
|
||||
(! elem name [ "feeds" "pythonPackagesExtensions" ])
|
||||
&& (allPkgs.lib.meta.availableOn allPkgs.stdenv.hostPlatform pkg)
|
||||
)
|
||||
(allPkgs.sane // {
|
||||
inherit (allPkgs) uninsane-dot-org;
|
||||
})
|
||||
)
|
||||
# self.legacyPackages;
|
||||
{ inherit (self.legacyPackages) x86_64-linux; }
|
||||
;
|
||||
|
||||
apps."x86_64-linux" =
|
||||
let
|
||||
pkgs = self.legacyPackages."x86_64-linux";
|
||||
deployScript = action: pkgs.writeShellScript "deploy-moby" ''
|
||||
nixos-rebuild --flake '.#moby' build $@
|
||||
sudo nix sign-paths -r -k /run/secrets/nix_serve_privkey $(readlink ./result)
|
||||
nixos-rebuild --flake '.#moby' ${action} --target-host colin@moby-hn --use-remote-sudo $@
|
||||
'';
|
||||
in {
|
||||
update-feeds = {
|
||||
type = "app";
|
||||
@@ -167,6 +256,17 @@
|
||||
type = "app";
|
||||
program = "${pkgs.feeds.passthru.initFeedScript}";
|
||||
};
|
||||
|
||||
deploy-moby-test = {
|
||||
# `nix run '.#deploy-moby-test'`
|
||||
type = "app";
|
||||
program = ''${deployScript "test"}'';
|
||||
};
|
||||
deploy-moby-switch = {
|
||||
# `nix run '.#deploy-moby-switch'`
|
||||
type = "app";
|
||||
program = ''${deployScript "switch"}'';
|
||||
};
|
||||
};
|
||||
|
||||
templates = {
|
||||
|
@@ -4,17 +4,17 @@
|
||||
./fs.nix
|
||||
];
|
||||
|
||||
# sane.packages.enableDevPkgs = true;
|
||||
|
||||
sane.roles.build-machine.enable = true;
|
||||
sane.roles.client = true;
|
||||
sane.services.wg-home.enable = true;
|
||||
sane.services.wg-home.ip = config.sane.hosts.by-name."desko".wg-home.ip;
|
||||
sane.services.duplicity.enable = true;
|
||||
sane.services.nixserve.enable = true;
|
||||
sane.services.nixserve.sopsFile = ../../../secrets/desko.yaml;
|
||||
sane.persist.enable = true;
|
||||
|
||||
sane.gui.sway.enable = true;
|
||||
sane.programs.iphoneUtils.enableFor.user.colin = true;
|
||||
|
||||
sane.programs.guiApps.suggestedPrograms = [ "desktopGuiApps" ];
|
||||
|
||||
boot.loader.efi.canTouchEfiVariables = false;
|
||||
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
|
||||
@@ -54,7 +54,7 @@
|
||||
remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
|
||||
dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
|
||||
};
|
||||
sane.persist.home.plaintext = [
|
||||
sane.user.persist.plaintext = [
|
||||
".steam"
|
||||
".local/share/Steam"
|
||||
];
|
||||
|
@@ -4,19 +4,22 @@
|
||||
./fs.nix
|
||||
];
|
||||
|
||||
sane.yggdrasil.enable = true;
|
||||
|
||||
sane.roles.client = true;
|
||||
sane.services.wg-home.enable = true;
|
||||
sane.services.wg-home.ip = config.sane.hosts.by-name."lappy".wg-home.ip;
|
||||
|
||||
# sane.packages.enableDevPkgs = true;
|
||||
|
||||
# sane.users.guest.enable = true;
|
||||
# sane.guest.enable = true;
|
||||
sane.gui.sway.enable = true;
|
||||
sane.persist.enable = true;
|
||||
sane.nixcache.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = false;
|
||||
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
|
||||
|
||||
sane.programs.guiApps.suggestedPrograms = [
|
||||
"desktopGuiApps"
|
||||
"stepmania"
|
||||
];
|
||||
|
||||
sops.secrets.colin-passwd = {
|
||||
sopsFile = ../../../secrets/lappy.yaml;
|
||||
neededForUsers = true;
|
||||
|
@@ -10,13 +10,6 @@
|
||||
sane.services.wg-home.enable = true;
|
||||
sane.services.wg-home.ip = config.sane.hosts.by-name."moby".wg-home.ip;
|
||||
|
||||
# cross-compiled documentation is *slow*.
|
||||
# no obvious way to natively compile docs (2022/09/29).
|
||||
# entrypoint is nixos/modules/misc/documentation.nix
|
||||
# doc building happens in nixos/doc/manual/default.nix
|
||||
# TODO: we could *maybe* inject pkgs.buildPackages.xyz = cross.buildPackages.xyz?
|
||||
documentation.nixos.enable = false;
|
||||
|
||||
# XXX colin: phosh doesn't work well with passwordless login,
|
||||
# so set this more reliable default password should anything go wrong
|
||||
users.users.colin.initialPassword = "147147";
|
||||
@@ -37,18 +30,15 @@
|
||||
# addons.sideberry.enable = false;
|
||||
};
|
||||
|
||||
sane.persist.home.plaintext = [
|
||||
sane.user.persist.plaintext = [
|
||||
".config/pulse" # persist pulseaudio volume
|
||||
];
|
||||
|
||||
# sane.packages.enableGuiPkgs = false; # XXX faster builds/imaging for debugging
|
||||
sane.packages.extraUserPkgs = [
|
||||
pkgs.plasma5Packages.konsole # terminal
|
||||
];
|
||||
|
||||
sane.nixcache.enable = true;
|
||||
sane.persist.enable = true;
|
||||
sane.gui.phosh.enable = true;
|
||||
# sane.programs.consoleUtils.enableFor.user.colin = false;
|
||||
# sane.programs.guiApps.enableFor.user.colin = false;
|
||||
sane.programs.sequoia.enableFor.user.colin = false;
|
||||
sane.programs.tuiApps.enableFor.user.colin = false; # visidata, others, don't compile well
|
||||
|
||||
boot.loader.efi.canTouchEfiVariables = false;
|
||||
# /boot space is at a premium. default was 20.
|
||||
|
@@ -114,7 +114,7 @@ in
|
||||
# - phone rotation sensor is off by 90 degrees
|
||||
# - ambient light sensor causes screen brightness to be shakey
|
||||
# - phosh greeter may not appear after wake from sleep
|
||||
boot.kernelPackages = pkgs.cross.linuxPackagesFor pkgs.cross.linux-megous;
|
||||
boot.kernelPackages = pkgs.linuxPackagesFor pkgs.linux-megous;
|
||||
|
||||
boot.kernelPatches = [
|
||||
(patchDefconfig (kernelConfig //
|
||||
|
@@ -1,4 +1,4 @@
|
||||
{ config, pkgs, ... }:
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./fs.nix
|
||||
@@ -7,6 +7,8 @@
|
||||
boot.loader.generic-extlinux-compatible.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = false;
|
||||
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
|
||||
# sane.persist.enable = false; # TODO: disable (but run `nix flake check` to ensure it works!)
|
||||
sane.nixcache.enable = false; # don't want to be calling out to dead machines that we're *trying* to rescue
|
||||
|
||||
# docs: https://nixos.org/manual/nixos/stable/options.html#opt-system.stateVersion
|
||||
system.stateVersion = "21.05";
|
||||
|
@@ -8,13 +8,16 @@
|
||||
./services
|
||||
];
|
||||
|
||||
sane.packages.extraUserPkgs = with pkgs; [
|
||||
sane.programs = {
|
||||
# for administering services
|
||||
freshrss
|
||||
matrix-synapse
|
||||
signaldctl
|
||||
];
|
||||
sane.persist.enable = true;
|
||||
freshrss.enableFor.user.colin = true;
|
||||
matrix-synapse.enableFor.user.colin = true;
|
||||
signaldctl.enableFor.user.colin = true;
|
||||
};
|
||||
|
||||
sane.roles.build-machine.enable = true;
|
||||
sane.roles.build-machine.emulation = false;
|
||||
sane.zsh.showDeadlines = false; # ~/knowledge doesn't always exist
|
||||
sane.services.dyn-dns.enable = true;
|
||||
sane.services.wg-home.enable = true;
|
||||
sane.services.wg-home.ip = config.sane.hosts.by-name."servo".wg-home.ip;
|
||||
|
@@ -25,6 +25,7 @@
|
||||
};
|
||||
sops.secrets."mautrix_signal_env" = {
|
||||
sopsFile = ../../../secrets/servo/mautrix_signal_env.bin;
|
||||
format = "binary";
|
||||
};
|
||||
|
||||
sops.secrets."mediawiki_pw" = {
|
||||
|
@@ -38,11 +38,11 @@
|
||||
];
|
||||
networking.firewall.allowedTCPPortRanges = [{
|
||||
from = 49152; # TURN
|
||||
to = 65535;
|
||||
to = 49408;
|
||||
}];
|
||||
networking.firewall.allowedUDPPortRanges = [{
|
||||
from = 49152; # TURN
|
||||
to = 65535;
|
||||
to = 49408;
|
||||
}];
|
||||
|
||||
# provide access to certs
|
||||
|
@@ -1,16 +1,63 @@
|
||||
# configuration options (today i don't store my config in nix):
|
||||
#
|
||||
# - jellyfin-web can be statically configured (result/share/jellyfin-web/config.json)
|
||||
# - <https://jellyfin.org/docs/general/clients/web-config>
|
||||
# - configure server list, plugins, "menuLinks", colors
|
||||
#
|
||||
# - jellfyin server is configured in /var/lib/jellfin/
|
||||
# - root/default/<LibraryType>/
|
||||
# - <LibraryName>.mblink: contains the directory name where this library lives
|
||||
# - options.xml: contains preferences which were defined in the web UI during import
|
||||
# - e.g. `EnablePhotos`, `EnableChapterImageExtraction`, etc.
|
||||
# - config/encoding.xml: transcoder settings
|
||||
# - config/system.xml: misc preferences like log file duration, audiobook resume settings, etc.
|
||||
# - data/jellyfin.db: maybe account definitions? internal state?
|
||||
|
||||
{ config, lib, ... }:
|
||||
|
||||
# TODO: re-enable after migrating media dir to /var/lib/uninsane/media
|
||||
# else it's too spammy
|
||||
lib.mkIf false
|
||||
{
|
||||
# identical to:
|
||||
# services.jellyfin.openFirewall = true;
|
||||
networking.firewall.allowedUDPPorts = [
|
||||
1900 7359 # DLNA: https://jellyfin.org/docs/general/networking/index.html
|
||||
# https://jellyfin.org/docs/general/networking/index.html
|
||||
1900 # UPnP service discovery
|
||||
7359 # Jellyfin-specific (?) client discovery
|
||||
];
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
8096 # HTTP (for the LAN)
|
||||
8920 # HTTPS (for the LAN)
|
||||
];
|
||||
sane.persist.sys.plaintext = [
|
||||
# TODO: mode? could be more granular
|
||||
{ user = "jellyfin"; group = "jellyfin"; directory = "/var/lib/jellyfin"; }
|
||||
{ user = "jellyfin"; group = "jellyfin"; mode = "0700"; directory = "/var/lib/jellyfin"; }
|
||||
];
|
||||
sane.fs."/var/lib/jellyfin/config/logging.json" = {
|
||||
# "Emby.Dlna" logging: <https://jellyfin.org/docs/general/networking/dlna>
|
||||
symlink.text = ''
|
||||
{
|
||||
"Serilog": {
|
||||
"MinimumLevel": {
|
||||
"Default": "Information",
|
||||
"Override": {
|
||||
"Microsoft": "Warning",
|
||||
"System": "Warning",
|
||||
"Emby.Dlna": "Debug",
|
||||
"Emby.Dlna.Eventing": "Debug"
|
||||
}
|
||||
},
|
||||
"WriteTo": [
|
||||
{
|
||||
"Name": "Console",
|
||||
"Args": {
|
||||
"outputTemplate": "[{Timestamp:HH:mm:ss}] [{Level:u3}] [{ThreadId}] {SourceContext}: {Message:lj}{NewLine}{Exception}"
|
||||
}
|
||||
}
|
||||
],
|
||||
"Enrich": [ "FromLogContext", "WithThreadId" ]
|
||||
}
|
||||
}
|
||||
'';
|
||||
wantedBeforeBy = [ "jellyfin.service" ];
|
||||
};
|
||||
|
||||
# Jellyfin multimedia server
|
||||
# this is mostly taken from the official jellfin.org docs
|
||||
|
@@ -6,12 +6,10 @@
|
||||
imports = [
|
||||
./discord-puppet.nix
|
||||
# ./irc.nix
|
||||
./signal.nix
|
||||
# TODO(2023/03/10): disabled because it's not bridging and mautrix_signal is hogging CPU
|
||||
# ./signal.nix
|
||||
];
|
||||
|
||||
# allow synapse to read the registration files of its appservices
|
||||
users.users.matrix-synapse.extraGroups = [ "mautrix-signal" ];
|
||||
|
||||
sane.persist.sys.plaintext = [
|
||||
{ user = "matrix-synapse"; group = "matrix-synapse"; directory = "/var/lib/matrix-synapse"; }
|
||||
];
|
||||
|
@@ -7,6 +7,9 @@
|
||||
{ user = "signald"; group = "signald"; directory = "/var/lib/signald"; }
|
||||
];
|
||||
|
||||
# allow synapse to read the registration file
|
||||
users.users.matrix-synapse.extraGroups = [ "mautrix-signal" ];
|
||||
|
||||
services.signald.enable = true;
|
||||
services.mautrix-signal.enable = true;
|
||||
services.mautrix-signal.environmentFile =
|
||||
@@ -27,7 +30,6 @@
|
||||
};
|
||||
|
||||
sops.secrets."mautrix_signal_env" = {
|
||||
format = "binary";
|
||||
mode = "0440";
|
||||
owner = config.users.users.mautrix-signal.name;
|
||||
group = config.users.users.matrix-synapse.name;
|
||||
|
@@ -1,3 +1,6 @@
|
||||
# DOCS:
|
||||
# - dovecot config: <https://doc.dovecot.org/configuration_manual/>
|
||||
|
||||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
@@ -27,11 +30,14 @@ in
|
||||
];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
25 # SMTP
|
||||
# exposed over non-vpn imap.uninsane.org
|
||||
143 # IMAP
|
||||
993 # IMAPS
|
||||
|
||||
# exposed over vpn mx.uninsane.org
|
||||
25 # SMTP
|
||||
465 # SMTPS
|
||||
587 # SMTPS/submission
|
||||
993 # IMAPS
|
||||
];
|
||||
|
||||
# exists only to manage certs for dovecot
|
||||
@@ -59,7 +65,7 @@ in
|
||||
|
||||
# DKIM public key:
|
||||
TXT."mx._domainkey" =
|
||||
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkSyMufc2KrRx3j17e/LyB+3eYSBRuEFT8PUka8EDX04QzCwDPdkwgnj3GNDvnB5Ktb05Cf2SJ/S1OLqNsINxJRWtkVfZd/C339KNh9wrukMKRKNELL9HLUw0bczOI4gKKFqyrRE9qm+4csCMAR79Te9FCjGV/jVnrkLdPT0GtFwIDAQAB"
|
||||
"v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkSyMufc2KrRx3j17e/LyB+3eYSBRuEFT8PUka8EDX04QzCwDPdkwgnj3GNDvnB5Ktb05Cf2SJ/S1OLqNsINxJRWtkVfZd/C339KNh9wrukMKRKNELL9HLUw0bczOI4gKKFqyrRE9qm+4csCMAR79Te9FCjGV/jVnrkLdPT0GtFwIDAQAB"
|
||||
;
|
||||
|
||||
# DMARC fields <https://datatracker.ietf.org/doc/html/rfc7489>:
|
||||
@@ -143,6 +149,25 @@ in
|
||||
|
||||
# inspired by https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/
|
||||
services.dovecot2.enable = true;
|
||||
services.dovecot2.mailboxes = {
|
||||
# special-purpose mailboxes: "All" "Archive" "Drafts" "Flagged" "Junk" "Sent" "Trash"
|
||||
# RFC6154 describes these special mailboxes: https://www.ietf.org/rfc/rfc6154.html
|
||||
# how these boxes are treated is 100% up to the client and server to decide.
|
||||
# client behavior:
|
||||
# iOS
|
||||
# - Drafts: ?
|
||||
# - Sent: works
|
||||
# - Trash: works
|
||||
# aerc
|
||||
# - Drafts: works
|
||||
# - Sent: works
|
||||
# - Trash: no; deleted messages are actually deleted
|
||||
# use `:move trash` instead
|
||||
# Sent mailbox: all sent messages are copied to it. unclear if this happens server-side or client-side.
|
||||
Drafts = { specialUse = "Drafts"; auto = "create"; };
|
||||
Sent = { specialUse = "Sent"; auto = "create"; };
|
||||
Trash = { specialUse = "Trash"; auto = "create"; };
|
||||
};
|
||||
services.dovecot2.sslServerCert = "/var/lib/acme/imap.uninsane.org/fullchain.pem";
|
||||
services.dovecot2.sslServerKey = "/var/lib/acme/imap.uninsane.org/key.pem";
|
||||
services.dovecot2.enablePAM = false;
|
||||
|
@@ -6,7 +6,7 @@
|
||||
sane.services.trust-dns.listenAddrsIPv4 = [
|
||||
# specify each address explicitly, instead of using "*".
|
||||
# this ensures responses are sent from the address at which the request was received.
|
||||
"192.168.0.5"
|
||||
config.sane.hosts.by-name."servo".lan-ip
|
||||
"10.0.1.5"
|
||||
];
|
||||
sane.services.trust-dns.quiet = true;
|
||||
|
@@ -1,22 +0,0 @@
|
||||
{ config, ... }:
|
||||
|
||||
let
|
||||
mkCrossFrom = localSystem: pkgs: import pkgs.path {
|
||||
inherit localSystem;
|
||||
crossSystem = pkgs.stdenv.hostPlatform.system;
|
||||
inherit (config.nixpkgs) config overlays;
|
||||
};
|
||||
in
|
||||
{
|
||||
# the configuration of which specific package set `pkgs.cross` refers to happens elsewhere;
|
||||
# here we just define them all.
|
||||
nixpkgs.overlays = [
|
||||
(next: prev: {
|
||||
# non-emulated packages build *from* local *for* target.
|
||||
# for large packages like the linux kernel which are expensive to build under emulation,
|
||||
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
|
||||
crossFrom."x86_64-linux" = mkCrossFrom "x86_64-linux" next;
|
||||
crossFrom."aarch64-linux" = mkCrossFrom "aarch64-linux" next;
|
||||
})
|
||||
];
|
||||
}
|
1598
hosts/common/cross/default.nix
Normal file
1598
hosts/common/cross/default.nix
Normal file
File diff suppressed because it is too large
Load Diff
22
hosts/common/cross/kitty-no-docs.patch
Normal file
22
hosts/common/cross/kitty-no-docs.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
diff --git a/setup.py b/setup.py
|
||||
index 2b9d240e..770bc5e7 100755
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -1092,11 +1092,12 @@ def c(base_path: str, **kw: object) -> None:
|
||||
|
||||
|
||||
def create_linux_bundle_gunk(ddir: str, libdir_name: str) -> None:
|
||||
- if not os.path.exists('docs/_build/html'):
|
||||
- make = 'gmake' if is_freebsd else 'make'
|
||||
- run_tool([make, 'docs'])
|
||||
- copy_man_pages(ddir)
|
||||
- copy_html_docs(ddir)
|
||||
+ if not os.getenv('KITTY_NO_DOCS'):
|
||||
+ if not os.path.exists('docs/_build/html'):
|
||||
+ make = 'gmake' if is_freebsd else 'make'
|
||||
+ run_tool([make, 'docs'])
|
||||
+ copy_man_pages(ddir)
|
||||
+ copy_html_docs(ddir)
|
||||
for (icdir, ext) in {'256x256': 'png', 'scalable': 'svg'}.items():
|
||||
icdir = os.path.join(ddir, 'share', 'icons', 'hicolor', icdir, 'apps')
|
||||
safe_makedirs(icdir)
|
@@ -1,7 +1,7 @@
|
||||
{ pkgs, ... }:
|
||||
{ lib, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./cross.nix
|
||||
./cross
|
||||
./feeds.nix
|
||||
./fs.nix
|
||||
./hardware.nix
|
||||
@@ -10,6 +10,8 @@
|
||||
./ids.nix
|
||||
./machine-id.nix
|
||||
./net.nix
|
||||
./persist.nix
|
||||
./programs.nix
|
||||
./secrets.nix
|
||||
./ssh.nix
|
||||
./users.nix
|
||||
@@ -17,17 +19,10 @@
|
||||
];
|
||||
|
||||
sane.nixcache.enable-trusted-keys = true;
|
||||
sane.packages.enableConsolePkgs = true;
|
||||
sane.packages.enableSystemPkgs = true;
|
||||
|
||||
sane.persist.sys.plaintext = [
|
||||
"/var/log"
|
||||
"/var/backup" # for e.g. postgres dumps
|
||||
# TODO: move elsewhere
|
||||
"/var/lib/alsa" # preserve output levels, default devices
|
||||
"/var/lib/colord" # preserve color calibrations (?)
|
||||
"/var/lib/machines" # maybe not needed, but would be painful to add a VM and forget.
|
||||
];
|
||||
sane.nixcache.enable = lib.mkDefault true;
|
||||
sane.persist.enable = lib.mkDefault true;
|
||||
sane.programs.sysadminUtils.enableFor.system = lib.mkDefault true;
|
||||
sane.programs.consoleUtils.enableFor.user.colin = lib.mkDefault true;
|
||||
|
||||
# some services which use private directories error if the parent (/var/lib/private) isn't 700.
|
||||
sane.fs."/var/lib/private".dir.acl.mode = "0700";
|
||||
@@ -38,6 +33,7 @@
|
||||
time.timeZone = "Etc/UTC"; # DST is too confusing for me => use a stable timezone
|
||||
|
||||
# allow `nix flake ...` command
|
||||
# TODO: is this still required?
|
||||
nix.extraOptions = ''
|
||||
experimental-features = nix-command flakes
|
||||
'';
|
||||
@@ -46,19 +42,37 @@
|
||||
"nixpkgs=${pkgs.path}"
|
||||
"nixpkgs-overlays=${../..}/overlays"
|
||||
];
|
||||
# hardlinks identical files in the nix store to save 25-35% disk space.
|
||||
# unclear _when_ this occurs. it's not a service.
|
||||
# does the daemon continually scan the nix store?
|
||||
# does the builder use some content-addressed db to efficiently dedupe?
|
||||
nix.settings.auto-optimise-store = true;
|
||||
|
||||
fonts = {
|
||||
enableDefaultFonts = true;
|
||||
fonts = with pkgs; [ font-awesome twitter-color-emoji hack-font ];
|
||||
fonts = with pkgs; [ font-awesome noto-fonts-emoji hack-font ];
|
||||
fontconfig.enable = true;
|
||||
fontconfig.defaultFonts = {
|
||||
emoji = [ "Font Awesome 6 Free" "Twitter Color Emoji" ];
|
||||
emoji = [ "Font Awesome 6 Free" "Noto Color Emoji" ];
|
||||
monospace = [ "Hack" ];
|
||||
serif = [ "DejaVu Serif" ];
|
||||
sansSerif = [ "DejaVu Sans" ];
|
||||
};
|
||||
};
|
||||
|
||||
# XXX: twitter-color-emoji doesn't cross-compile; but not-fonts-emoji does
|
||||
# fonts = {
|
||||
# enableDefaultFonts = true;
|
||||
# fonts = with pkgs; [ font-awesome twitter-color-emoji hack-font ];
|
||||
# fontconfig.enable = true;
|
||||
# fontconfig.defaultFonts = {
|
||||
# emoji = [ "Font Awesome 6 Free" "Twitter Color Emoji" ];
|
||||
# monospace = [ "Hack" ];
|
||||
# serif = [ "DejaVu Serif" ];
|
||||
# sansSerif = [ "DejaVu Sans" ];
|
||||
# };
|
||||
# };
|
||||
|
||||
# disable non-required packages like nano, perl, rsync, strace
|
||||
environment.defaultPackages = [];
|
||||
|
||||
|
@@ -1,3 +1,9 @@
|
||||
# candidates:
|
||||
# - The Nonlinear Library (podcast): <https://forum.effectivealtruism.org/posts/JTZTBienqWEAjGDRv/listen-to-more-ea-content-with-the-nonlinear-library>
|
||||
# - has ~10 posts per day, text-to-speech; i would need better tagging before adding this
|
||||
# - <https://www.metaculus.com/questions/11102/introducing-the-metaculus-journal-podcast/>
|
||||
# - dead since 2022/10 - 2023/03
|
||||
|
||||
{ lib, sane-data, ... }:
|
||||
let
|
||||
hourly = { freq = "hourly"; };
|
||||
@@ -50,18 +56,29 @@ let
|
||||
(fromDb "lexfridman.com/podcast" // rat)
|
||||
## Astral Codex Ten
|
||||
(fromDb "sscpodcast.libsyn.com" // rat)
|
||||
## Less Wrong Curated
|
||||
(fromDb "feeds.libsyn.com/421877" // rat)
|
||||
## Econ Talk
|
||||
(fromDb "feeds.simplecast.com/wgl4xEgL" // rat)
|
||||
## Cory Doctorow -- both podcast & text entries
|
||||
(fromDb "craphound.com" // pol)
|
||||
## Maggie Killjoy -- referenced by Cory Doctorow
|
||||
(fromDb "omny.fm/shows/cool-people-who-did-cool-stuff" // pol)
|
||||
(fromDb "congressionaldish.libsyn.com" // pol)
|
||||
(mkPod "https://podcasts.la.utexas.edu/this-is-democracy/feed/podcast/" // pol // weekly)
|
||||
## Civboot -- https://anchor.fm/civboot
|
||||
(fromDb "anchor.fm/s/34c7232c/podcast/rss" // tech)
|
||||
## Emerge: making sense of what's next -- <https://www.whatisemerging.com/emergepodcast>
|
||||
(mkPod "https://anchor.fm/s/21bc734/podcast/rss" // pol // infrequent)
|
||||
(fromDb "feeds.feedburner.com/80000HoursPodcast" // rat)
|
||||
## Daniel Huberman on sleep
|
||||
(fromDb "feeds.megaphone.fm/hubermanlab" // uncat)
|
||||
## Multidisciplinary Association for Psychedelic Studies
|
||||
(fromDb "mapspodcast.libsyn.com" // uncat)
|
||||
(fromDb "allinchamathjason.libsyn.com" // pol)
|
||||
(fromDb "acquired.libsyn.com" // tech)
|
||||
## ACQ2 - more "Acquired" episodes
|
||||
(fromDb "acquiredlpbonussecretsecret.libsyn.com" // tech)
|
||||
# The Intercept - Deconstructed; also available: <rss.acast.com/deconstructed>
|
||||
(fromDb "rss.prod.firstlook.media/deconstructed/podcast.rss" // pol)
|
||||
## The Daily
|
||||
@@ -90,13 +107,18 @@ let
|
||||
(fromDb "seattlenice.buzzsprout.com" // pol)
|
||||
## Sci-Fi? has Peter Watts; author of No Moods, Ads or Cutesy Fucking Icons (rifters.com)
|
||||
(fromDb "talesfromthebridge.buzzsprout.com" // tech)
|
||||
## UnNamed Reverse Engineering Podcast
|
||||
(fromDb "reverseengineering.libsyn.com/rss" // tech)
|
||||
## The Witch Trials of J.K. Rowling
|
||||
## - <https://www.thefp.com/witchtrials>
|
||||
(mkPod "https://feeds.megaphone.fm/RUNMED9919162779" // pol // infrequent)
|
||||
];
|
||||
|
||||
texts = [
|
||||
# AGGREGATORS (> 1 post/day)
|
||||
(fromDb "lwn.net" // tech)
|
||||
(fromDb "lesswrong.com" // rat)
|
||||
(fromDb "econlib.org" // pol)
|
||||
# (fromDb "econlib.org" // pol)
|
||||
|
||||
# AGGREGATORS (< 1 post/day)
|
||||
(fromDb "palladiummag.com" // uncat)
|
||||
@@ -104,6 +126,10 @@ let
|
||||
(fromDb "semiaccurate.com" // tech)
|
||||
(mkText "https://linuxphoneapps.org/blog/atom.xml" // tech // infrequent)
|
||||
(fromDb "spectrum.ieee.org" // tech)
|
||||
(fromDb "thisweek.gnome.org" // tech)
|
||||
# more nixos stuff here, but unclear how to subscribe: <https://nixos.org/blog/categories.html>
|
||||
(mkText "https://nixos.org/blog/announcements-rss.xml" // tech // infrequent)
|
||||
(mkText "https://nixos.org/blog/stories-rss.xml" // tech // weekly)
|
||||
## n.b.: quality RSS list here: <https://forum.merveilles.town/thread/57/share-your-rss-feeds%21-6/>
|
||||
(mkText "https://forum.merveilles.town/rss.xml" // pol // infrequent)
|
||||
|
||||
@@ -112,6 +138,8 @@ let
|
||||
|
||||
# DEVELOPERS
|
||||
(fromDb "uninsane.org" // tech)
|
||||
(fromDb "ascii.textfiles.com" // tech) # Jason Scott
|
||||
(fromDb "xn--gckvb8fzb.com" // tech)
|
||||
(fromDb "mg.lol" // tech)
|
||||
(fromDb "drewdevault.com" // tech)
|
||||
## Ken Shirriff
|
||||
@@ -131,6 +159,10 @@ let
|
||||
(mkText "https://anish.lakhwara.com/home.html" // tech // weekly)
|
||||
(fromDb "jefftk.com" // tech)
|
||||
(fromDb "pomeroyb.com" // tech)
|
||||
(mkText "https://til.simonwillison.net/tils/feed.atom" // tech // weekly)
|
||||
|
||||
# TECH PROJECTS
|
||||
(fromDb "blog.rust-lang.org" // tech)
|
||||
|
||||
# (TECH; POL) COMMENTATORS
|
||||
## Matt Webb -- engineering-ish, but dreamy
|
||||
@@ -147,7 +179,8 @@ let
|
||||
(fromDb "lynalden.com" // pol)
|
||||
(fromDb "austinvernon.site" // tech)
|
||||
(mkSubstack "oversharing" // pol // daily)
|
||||
(mkSubstack "doomberg" // tech // weekly)
|
||||
(mkSubstack "byrnehobart" // pol // infrequent)
|
||||
# (mkSubstack "doomberg" // tech // weekly) # articles are all pay-walled
|
||||
## David Rosenthal
|
||||
(fromDb "blog.dshr.org" // pol)
|
||||
## Matt Levine
|
||||
@@ -177,6 +210,9 @@ let
|
||||
## mostly dating topics. not advice, or humor, but looking through a social lens
|
||||
(fromDb "putanumonit.com" // rat)
|
||||
|
||||
# LOCAL
|
||||
(fromDb "capitolhillseattle.com" // pol)
|
||||
|
||||
# CODE
|
||||
# (mkText "https://github.com/Kaiteki-Fedi/Kaiteki/commits/master.atom" // tech // infrequent)
|
||||
];
|
||||
@@ -186,6 +222,7 @@ let
|
||||
(fromDb "xkcd.com" // img // humor)
|
||||
(fromDb "pbfcomics.com" // img // humor)
|
||||
# (mkImg "http://dilbert.com/feed" // humor // daily)
|
||||
(fromDb "poorlydrawnlines.com/feed" // img // humor)
|
||||
|
||||
# ART
|
||||
(fromDb "miniature-calendar.com" // img // art // daily)
|
||||
|
@@ -7,5 +7,5 @@
|
||||
sopsFile = ../../../secrets/universal/aerc_accounts.conf;
|
||||
format = "binary";
|
||||
};
|
||||
sane.fs."/home/colin/.config/aerc/accounts.conf" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.aerc_accounts.path;
|
||||
sane.user.fs.".config/aerc/accounts.conf" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.aerc_accounts.path;
|
||||
}
|
||||
|
@@ -7,12 +7,14 @@
|
||||
./git.nix
|
||||
./gpodder.nix
|
||||
./keyring.nix
|
||||
./kitty.nix
|
||||
./kitty
|
||||
./libreoffice.nix
|
||||
./mime.nix
|
||||
./mpv.nix
|
||||
./neovim.nix
|
||||
./newsflash.nix
|
||||
./offlineimap.nix
|
||||
./ripgrep.nix
|
||||
./splatmoji.nix
|
||||
./ssh.nix
|
||||
./sublime-music.nix
|
||||
|
@@ -125,16 +125,17 @@ in
|
||||
# `wget ...xpi`; `unar ...xpi`; `cat */manifest.json | jq '.browser_specific_settings.gecko.id'`
|
||||
# browserpass-ce.package = addon "browserpass-ce" "browserpass@maximbaz.com" "sha256-sXgUBbRvMnRpeIW1MTkmTcoqtW/8RDXAkxAq1evFkpc=";
|
||||
browserpass-extension.package = localAddon pkgs.browserpass-extension;
|
||||
bypass-paywalls-clean.package = addon "bypass-paywalls-clean" "{d133e097-46d9-4ecc-9903-fa6a722a6e0e}" "sha256-JOj5P7c2JTTReHCRZXm4BscaGr3i+9Y4Ey/y621x8PI=";
|
||||
# TODO: build bypass-paywalls from source? it's mysteriously disappeared from the Mozilla store.
|
||||
# bypass-paywalls-clean.package = addon "bypass-paywalls-clean" "{d133e097-46d9-4ecc-9903-fa6a722a6e0e}" "sha256-oUwdqdAwV3DezaTtOMx7A/s4lzIws+t2f08mwk+324k=";
|
||||
ether-metamask.package = addon "ether-metamask" "webextension@metamask.io" "sha256-G+MwJDOcsaxYSUXjahHJmkWnjLeQ0Wven8DU/lGeMzA=";
|
||||
i2p-in-private-browsing.package = addon "i2p-in-private-browsing" "i2ppb@eyedeekay.github.io" "sha256-dJcJ3jxeAeAkRvhODeIVrCflvX+S4E0wT/PyYzQBQWs=";
|
||||
sidebery.package = addon "sidebery" "{3c078156-979c-498b-8990-85f7987dd929}" "sha256-YONfK/rIjlsrTgRHIt3km07Q7KnpIW89Z9r92ZSCc6w=";
|
||||
sponsorblock.package = addon "sponsorblock" "sponsorBlocker@ajay.app" "sha256-d2K3ufvurWnYVzqLbyR//MgejybkY9exitAf9RdLNRo=";
|
||||
sponsorblock.package = addon "sponsorblock" "sponsorBlocker@ajay.app" "sha256-hRsvLaAsVm3dALsTrJqHTNgRFAQcU7XSaGhr5G6+mFs=";
|
||||
ublacklist.package = addon "ublacklist" "@ublacklist" "sha256-RqY5iHzbL2qizth7aguyOKWPyINXmrwOlf/OsfqAS48=";
|
||||
ublock-origin.package = addon "ublock-origin" "uBlock0@raymondhill.net" "sha256-a/ivUmY1P6teq9x0dt4CbgHt+3kBsEMMXlOfZ5Hx7cg=";
|
||||
ublock-origin.package = addon "ublock-origin" "uBlock0@raymondhill.net" "sha256-eHlQrU/b9X/6sTbHBpGAd+0VsLT7IrVCnd0AQ948lyA=";
|
||||
|
||||
browserpass-extension.enable = lib.mkDefault true;
|
||||
bypass-paywalls-clean.enable = lib.mkDefault true;
|
||||
# bypass-paywalls-clean.enable = lib.mkDefault true;
|
||||
ether-metamask.enable = lib.mkDefault true;
|
||||
i2p-in-private-browsing.enable = lib.mkDefault config.services.i2p.enable;
|
||||
sidebery.enable = lib.mkDefault true;
|
||||
@@ -146,6 +147,11 @@ in
|
||||
};
|
||||
|
||||
config = {
|
||||
sane.programs.web-browser = {
|
||||
inherit package;
|
||||
# TODO: define the persistence & fs config here
|
||||
};
|
||||
sane.programs.guiApps.suggestedPrograms = [ "web-browser" ];
|
||||
|
||||
# uBlock filter list configuration.
|
||||
# specifically, enable the GDPR cookie prompt blocker.
|
||||
@@ -155,7 +161,7 @@ in
|
||||
# the specific attribute path is found via scraping ublock code here:
|
||||
# - <https://github.com/gorhill/uBlock/blob/master/src/js/storage.js>
|
||||
# - <https://github.com/gorhill/uBlock/blob/master/assets/assets.json>
|
||||
sane.fs."/home/colin/${cfg.browser.dotDir}/managed-storage/uBlock0@raymondhill.net.json" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs."${cfg.browser.dotDir}/managed-storage/uBlock0@raymondhill.net.json" = sane-lib.fs.wantedText ''
|
||||
{
|
||||
"name": "uBlock0@raymondhill.net",
|
||||
"description": "ignored",
|
||||
@@ -165,26 +171,24 @@ in
|
||||
}
|
||||
}
|
||||
'';
|
||||
sane.fs."/home/colin/${cfg.browser.dotDir}/${cfg.browser.libName}.overrides.cfg" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs."${cfg.browser.dotDir}/${cfg.browser.libName}.overrides.cfg" = sane-lib.fs.wantedText ''
|
||||
// if we can't query the revocation status of a SSL cert because the issuer is offline,
|
||||
// treat it as unrevoked.
|
||||
// see: <https://librewolf.net/docs/faq/#im-getting-sec_error_ocsp_server_error-what-can-i-do>
|
||||
defaultPref("security.OCSP.require", false);
|
||||
'';
|
||||
|
||||
sane.packages.extraGuiPkgs = [ package ];
|
||||
# flush the cache to disk to avoid it taking up too much tmp
|
||||
sane.persist.home.byPath."${cfg.browser.cacheDir}" = lib.mkIf (cfg.persistCache != null) {
|
||||
sane.user.persist.byPath."${cfg.browser.cacheDir}" = lib.mkIf (cfg.persistCache != null) {
|
||||
store = cfg.persistCache;
|
||||
};
|
||||
|
||||
sane.persist.home.byPath."${cfg.browser.dotDir}/default" = lib.mkIf (cfg.persistData != null) {
|
||||
sane.user.persist.byPath."${cfg.browser.dotDir}/default" = lib.mkIf (cfg.persistData != null) {
|
||||
store = cfg.persistData;
|
||||
};
|
||||
sane.fs."/home/colin/${cfg.browser.dotDir}/default" = sane-lib.fs.wantedDir;
|
||||
sane.user.fs."${cfg.browser.dotDir}/default" = sane-lib.fs.wantedDir;
|
||||
# instruct Firefox to put the profile in a predictable directory (so we can do things like persist just it).
|
||||
# XXX: the directory *must* exist, even if empty; Firefox will not create the directory itself.
|
||||
sane.fs."/home/colin/${cfg.browser.dotDir}/profiles.ini" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs."${cfg.browser.dotDir}/profiles.ini" = sane-lib.fs.wantedText ''
|
||||
[Profile0]
|
||||
Name=default
|
||||
IsRelative=1
|
||||
|
@@ -6,7 +6,7 @@ let
|
||||
all-feeds = config.sane.feeds;
|
||||
wanted-feeds = feeds.filterByFormat ["text" "image"] all-feeds;
|
||||
in {
|
||||
sane.fs."/home/colin/.config/org.gabmus.gfeeds.json" = sane-lib.fs.wantedText (
|
||||
sane.user.fs.".config/org.gabmus.gfeeds.json" = sane-lib.fs.wantedText (
|
||||
builtins.toJSON {
|
||||
# feed format is a map from URL to a dict,
|
||||
# with dict["tags"] a list of string tags.
|
||||
|
@@ -4,7 +4,7 @@ let
|
||||
mkCfg = lib.generators.toINI { };
|
||||
in
|
||||
{
|
||||
sane.fs."/home/colin/.config/git/config" = sane-lib.fs.wantedText (mkCfg {
|
||||
sane.user.fs.".config/git/config" = sane-lib.fs.wantedText (mkCfg {
|
||||
user.name = "Colin";
|
||||
user.email = "colin@uninsane.org";
|
||||
alias.co = "checkout";
|
||||
|
@@ -6,7 +6,7 @@ let
|
||||
all-feeds = config.sane.feeds;
|
||||
wanted-feeds = feeds.filterByFormat ["podcast"] all-feeds;
|
||||
in {
|
||||
sane.fs."/home/colin/.config/gpodderFeeds.opml" = sane-lib.fs.wantedText (
|
||||
sane.user.fs.".config/gpodderFeeds.opml" = sane-lib.fs.wantedText (
|
||||
feeds.feedsToOpml wanted-feeds
|
||||
);
|
||||
}
|
||||
|
@@ -1,10 +1,11 @@
|
||||
{ config, sane-lib, ... }:
|
||||
|
||||
{
|
||||
sane.persist.home.private = [ ".local/share/keyrings" ];
|
||||
sane.user.persist.private = [ ".local/share/keyrings" ];
|
||||
|
||||
sane.fs."/home/colin/private/.local/share/keyrings/default" = {
|
||||
sane.user.fs."private/.local/share/keyrings/default" = {
|
||||
generated.script.script = builtins.readFile ../../../scripts/init-keyring;
|
||||
# TODO: is this `wantedBy` needed? can we inherit it?
|
||||
wantedBy = [ config.sane.fs."/home/colin/private".unit ];
|
||||
};
|
||||
}
|
||||
|
47
hosts/common/home/kitty/PaperColor_dark.conf
Normal file
47
hosts/common/home/kitty/PaperColor_dark.conf
Normal file
@@ -0,0 +1,47 @@
|
||||
# vim:ft=kitty
|
||||
|
||||
## name: PaperColor Dark
|
||||
## author: Nikyle Nguyen
|
||||
## license: MIT
|
||||
## blurb: Dark color scheme inspired by Google's Material Design
|
||||
|
||||
# special
|
||||
foreground #d0d0d0
|
||||
background #1c1c1c
|
||||
cursor #d0d0d0
|
||||
cursor_text_color background
|
||||
|
||||
# black
|
||||
color0 #1c1c1c
|
||||
color8 #585858
|
||||
|
||||
# red
|
||||
color1 #af005f
|
||||
color9 #5faf5f
|
||||
|
||||
# green
|
||||
# "color2" is the green color used by ls to indicate executability
|
||||
# both as text color
|
||||
# or as bg color when the text is blue (color4)
|
||||
color2 #246a28
|
||||
color10 #2df200
|
||||
|
||||
# yellow
|
||||
color3 #d7af5f
|
||||
color11 #af87d7
|
||||
|
||||
# blue
|
||||
color4 #78c6ef
|
||||
color12 #ffaf00
|
||||
|
||||
# magenta
|
||||
color5 #808080
|
||||
color13 #ff5faf
|
||||
|
||||
# cyan
|
||||
color6 #d7875f
|
||||
color14 #00afaf
|
||||
|
||||
# white
|
||||
color7 #d0d0d0
|
||||
color15 #5f8787
|
@@ -1,15 +1,17 @@
|
||||
{ pkgs, sane-lib, ... }:
|
||||
|
||||
{
|
||||
sane.fs."/home/colin/.config/kitty/kitty.conf" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs.".config/kitty/kitty.conf" = sane-lib.fs.wantedText ''
|
||||
# docs: https://sw.kovidgoyal.net/kitty/conf/
|
||||
# disable terminal bell (when e.g. you backspace too many times)
|
||||
enable_audio_bell no
|
||||
|
||||
map ctrl+n new_os_window_with_cwd
|
||||
|
||||
include ${pkgs.kitty-themes}/themes/PaperColor_dark.conf
|
||||
include ${./PaperColor_dark.conf}
|
||||
'';
|
||||
|
||||
# include ${pkgs.kitty-themes}/themes/PaperColor_dark.conf
|
||||
|
||||
# THEME CHOICES:
|
||||
# docs: https://github.com/kovidgoyal/kitty-themes
|
||||
# theme = "1984 Light"; # dislike: awful, harsh blues/teals
|
@@ -2,7 +2,7 @@
|
||||
|
||||
{
|
||||
# libreoffice: disable first-run stuff
|
||||
sane.fs."/home/colin/.config/libreoffice/4/user/registrymodifications.xcu" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs.".config/libreoffice/4/user/registrymodifications.xcu" = sane-lib.fs.wantedText ''
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<item oor:path="/org.openoffice.Office.Common/Misc"><prop oor:name="FirstRun" oor:op="fuse"><value>false</value></prop></item>
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
{
|
||||
# format is <key>=%<length>%<value>
|
||||
sane.fs."/home/colin/.config/mpv/mpv.conf" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs.".config/mpv/mpv.conf" = sane-lib.fs.wantedText ''
|
||||
save-position-on-quit=%3%yes
|
||||
keep-open=%3%yes
|
||||
'';
|
||||
|
@@ -72,7 +72,7 @@ let
|
||||
in
|
||||
{
|
||||
# private because there could be sensitive things in the swap
|
||||
sane.persist.home.private = [ ".cache/vim-swap" ];
|
||||
sane.user.persist.private = [ ".cache/vim-swap" ];
|
||||
|
||||
programs.neovim = {
|
||||
# neovim: https://github.com/neovim/neovim
|
||||
|
@@ -6,7 +6,7 @@ let
|
||||
all-feeds = config.sane.feeds;
|
||||
wanted-feeds = feeds.filterByFormat ["text" "image"] all-feeds;
|
||||
in {
|
||||
sane.fs."/home/colin/.config/newsflashFeeds.opml" = sane-lib.fs.wantedText (
|
||||
sane.user.fs.".config/newsflashFeeds.opml" = sane-lib.fs.wantedText (
|
||||
feeds.feedsToOpml wanted-feeds
|
||||
);
|
||||
}
|
||||
|
17
hosts/common/home/offlineimap.nix
Normal file
17
hosts/common/home/offlineimap.nix
Normal file
@@ -0,0 +1,17 @@
|
||||
# mail archiving/synchronization tool.
|
||||
#
|
||||
# manually download all emails for an account with
|
||||
# - `offlineimap -a <accountname>`
|
||||
#
|
||||
# view account names inside the secrets file, listed below.
|
||||
{ config, sane-lib, ... }:
|
||||
|
||||
{
|
||||
sops.secrets."offlineimaprc" = {
|
||||
owner = config.users.users.colin.name;
|
||||
sopsFile = ../../../secrets/universal/offlineimaprc.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sane.user.fs.".config/offlineimap/config" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.offlineimaprc.path;
|
||||
}
|
||||
|
9
hosts/common/home/ripgrep.nix
Normal file
9
hosts/common/home/ripgrep.nix
Normal file
@@ -0,0 +1,9 @@
|
||||
{ sane-lib, ... }:
|
||||
{
|
||||
# .ignore file is read by ripgrep (rg), silver searcher (ag), maybe others.
|
||||
# ignore translation files by default when searching, as they tend to have
|
||||
# a LOT of duplicate text.
|
||||
sane.user.fs.".ignore" = sane-lib.fs.wantedText ''
|
||||
po/
|
||||
'';
|
||||
}
|
@@ -4,8 +4,9 @@
|
||||
{ pkgs, sane-lib, ... }:
|
||||
|
||||
{
|
||||
sane.persist.home.plaintext = [ ".local/state/splatmoji" ];
|
||||
sane.fs."/home/colin/.config/splatmoji/splatmoji.config" = sane-lib.fs.wantedText ''
|
||||
sane.user.persist.plaintext = [ ".local/state/splatmoji" ];
|
||||
sane.user.fs.".config/splatmoji/splatmoji.config" = sane-lib.fs.wantedText ''
|
||||
# XXX doesn't seem to understand ~ as shorthand for `$HOME`
|
||||
history_file=/home/colin/.local/state/splatmoji/history
|
||||
history_length=5
|
||||
# TODO: wayland equiv
|
||||
|
@@ -3,7 +3,8 @@
|
||||
with lib;
|
||||
let
|
||||
host = config.networking.hostName;
|
||||
user-pubkey = config.sane.ssh.pubkeys."colin@${host}".asUserKey;
|
||||
user-pubkey-full = config.sane.ssh.pubkeys."colin@${host}" or {};
|
||||
user-pubkey = user-pubkey-full.asUserKey or null;
|
||||
host-keys = filter (k: k.user == "root") (attrValues config.sane.ssh.pubkeys);
|
||||
known-hosts-text = concatStringsSep
|
||||
"\n"
|
||||
@@ -12,9 +13,10 @@ let
|
||||
in
|
||||
{
|
||||
# ssh key is stored in private storage
|
||||
sane.persist.home.private = [ ".ssh/id_ed25519" ];
|
||||
sane.fs."/home/colin/.ssh/id_ed25519.pub" = sane-lib.fs.wantedText user-pubkey;
|
||||
sane.fs."/home/colin/.ssh/known_hosts" = sane-lib.fs.wantedText known-hosts-text;
|
||||
sane.user.persist.private = [ ".ssh/id_ed25519" ];
|
||||
sane.user.fs.".ssh/id_ed25519.pub" =
|
||||
mkIf (user-pubkey != null) (sane-lib.fs.wantedText user-pubkey);
|
||||
sane.user.fs.".ssh/known_hosts" = sane-lib.fs.wantedText known-hosts-text;
|
||||
|
||||
users.users.colin.openssh.authorizedKeys.keys =
|
||||
let
|
||||
|
@@ -7,5 +7,5 @@
|
||||
sopsFile = ../../../secrets/universal/sublime_music_config.json.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sane.fs."/home/colin/.config/sublime-music/config.json" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.sublime_music_config.path;
|
||||
sane.user.fs.".config/sublime-music/config.json" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.sublime_music_config.path;
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@ let
|
||||
);
|
||||
in
|
||||
{
|
||||
sane.fs."/home/colin/.config/vlc/vlcrc" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs.".config/vlc/vlcrc" = sane-lib.fs.wantedText ''
|
||||
[podcast]
|
||||
podcast-urls=${podcast-urls}
|
||||
[core]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
{
|
||||
# XDG defines things like ~/Desktop, ~/Downloads, etc.
|
||||
# these clutter the home, so i mostly don't use them.
|
||||
sane.fs."/home/colin/.config/user-dirs.dirs" = sane-lib.fs.wantedText ''
|
||||
sane.user.fs.".config/user-dirs.dirs" = sane-lib.fs.wantedText ''
|
||||
XDG_DESKTOP_DIR="$HOME/.xdg/Desktop"
|
||||
XDG_DOCUMENTS_DIR="$HOME/dev"
|
||||
XDG_DOWNLOAD_DIR="$HOME/tmp"
|
||||
@@ -16,5 +16,5 @@
|
||||
|
||||
# prevent `xdg-user-dirs-update` from overriding/updating our config
|
||||
# see <https://manpages.ubuntu.com/manpages/bionic/man5/user-dirs.conf.5.html>
|
||||
sane.fs."/home/colin/.config/user-dirs.conf" = sane-lib.fs.wantedText "enabled=False";
|
||||
sane.user.fs.".config/user-dirs.conf" = sane-lib.fs.wantedText "enabled=False";
|
||||
}
|
||||
|
@@ -1,6 +1,8 @@
|
||||
{ pkgs, sane-lib, ... }:
|
||||
{ config, lib, pkgs, sane-lib, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkOption types;
|
||||
cfg = config.sane.zsh;
|
||||
# powerlevel10k prompt config
|
||||
# p10k.zsh is the auto-generated config, and i overwrite those defaults here, below.
|
||||
p10k-overrides = ''
|
||||
@@ -26,118 +28,134 @@ let
|
||||
'';
|
||||
in
|
||||
{
|
||||
sane.persist.home.plaintext = [
|
||||
# we don't need to full zsh dir -- just the history file --
|
||||
# but zsh will sometimes backup the history file and we get fewer errors if we do proper mounts instead of symlinks.
|
||||
# TODO: should be private?
|
||||
".local/share/zsh"
|
||||
# cache gitstatus otherwise p10k fetched it from the net EVERY BOOT
|
||||
".cache/gitstatus"
|
||||
];
|
||||
|
||||
# zsh/prezto complains if zshrc doesn't exist; but it does allow an "empty" file.
|
||||
sane.fs."/home/colin/.config/zsh/.zshrc" = sane-lib.fs.wantedText "# ";
|
||||
|
||||
# enable zsh completions
|
||||
environment.pathsToLink = [ "/share/zsh" ];
|
||||
|
||||
programs.zsh = {
|
||||
enable = true;
|
||||
histFile = "$HOME/.local/share/zsh/history";
|
||||
shellAliases = {
|
||||
":q" = "exit";
|
||||
# common typos
|
||||
"cd.." = "cd ..";
|
||||
"cd../" = "cd ../";
|
||||
options = {
|
||||
sane.zsh = {
|
||||
showDeadlines = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "show upcoming deadlines (frommy PKM) upon shell init";
|
||||
};
|
||||
};
|
||||
setOptions = [
|
||||
# defaults:
|
||||
"HIST_IGNORE_DUPS"
|
||||
"SHARE_HISTORY"
|
||||
"HIST_FCNTL_LOCK"
|
||||
# disable `rm *` confirmations
|
||||
"rmstarsilent"
|
||||
];
|
||||
|
||||
# .zshenv config:
|
||||
shellInit = ''
|
||||
ZDOTDIR=$HOME/.config/zsh
|
||||
'';
|
||||
|
||||
# .zshrc config:
|
||||
interactiveShellInit =
|
||||
(builtins.readFile ./p10k.zsh)
|
||||
+ p10k-overrides
|
||||
+ prezto-init
|
||||
+ ''
|
||||
# zmv is a way to do rich moves/renames, with pattern matching/substitution.
|
||||
# see for an example: <https://filipe.kiss.ink/zmv-zsh-rename/>
|
||||
autoload -Uz zmv
|
||||
|
||||
HISTORY_IGNORE='(sane-shutdown *|sane-reboot *|rm *)'
|
||||
|
||||
# extra aliases
|
||||
# TODO: move to `shellAliases` config?
|
||||
function nd() {
|
||||
mkdir -p "$1";
|
||||
pushd "$1";
|
||||
}
|
||||
|
||||
# auto-cd into any of these dirs by typing them and pressing 'enter':
|
||||
hash -d 3rd="/home/colin/dev/3rd"
|
||||
hash -d dev="/home/colin/dev"
|
||||
hash -d knowledge="/home/colin/knowledge"
|
||||
hash -d nixos="/home/colin/nixos"
|
||||
hash -d nixpkgs="/home/colin/dev/3rd/nixpkgs"
|
||||
hash -d ref="/home/colin/ref"
|
||||
hash -d secrets="/home/colin/knowledge/secrets"
|
||||
hash -d tmp="/home/colin/tmp"
|
||||
hash -d uninsane="/home/colin/dev/uninsane"
|
||||
hash -d Videos="/home/colin/Videos"
|
||||
'';
|
||||
|
||||
syntaxHighlighting.enable = true;
|
||||
vteIntegration = true;
|
||||
};
|
||||
|
||||
# enable a command-not-found hook to show nix packages that might provide the binary typed.
|
||||
programs.nix-index.enable = true;
|
||||
programs.command-not-found.enable = false; #< mutually exclusive with nix-index
|
||||
config = {
|
||||
sane.user.persist.plaintext = [
|
||||
# we don't need to full zsh dir -- just the history file --
|
||||
# but zsh will sometimes backup the history file and we get fewer errors if we do proper mounts instead of symlinks.
|
||||
# TODO: should be private?
|
||||
".local/share/zsh"
|
||||
# cache gitstatus otherwise p10k fetched it from the net EVERY BOOT
|
||||
".cache/gitstatus"
|
||||
];
|
||||
|
||||
# prezto = oh-my-zsh fork; controls prompt, auto-completion, etc.
|
||||
# see: https://github.com/sorin-ionescu/prezto
|
||||
# i believe this file is auto-sourced by the prezto init.zsh script.
|
||||
sane.fs."/home/colin/.config/zsh/.zpreztorc" = sane-lib.fs.wantedText ''
|
||||
zstyle ':prezto:*:*' color 'yes'
|
||||
# zsh/prezto complains if zshrc doesn't exist; but it does allow an "empty" file.
|
||||
sane.user.fs.".config/zsh/.zshrc" = sane-lib.fs.wantedText "# ";
|
||||
|
||||
# modules (they ship with prezto):
|
||||
# ENVIRONMENT: configures jobs to persist after shell exit; other basic niceties
|
||||
# TERMINAL: auto-titles terminal (e.g. based on cwd)
|
||||
# EDITOR: configures shortcuts like Ctrl+U=undo, Ctrl+L=clear
|
||||
# HISTORY: `history-stat` alias, setopts for good history defaults
|
||||
# DIRECTORY: sets AUTO_CD, adds `d` alias to list directory stack, and `1`-`9` to cd that far back the stack
|
||||
# SPECTRUM: helpers for term colors and styling. used by prompts? might be unnecessary
|
||||
# UTILITY: configures aliases like `ll`, `la`, disables globbing for things like rsync
|
||||
# adds aliases like `get` to fetch a file. also adds `http-serve` alias??
|
||||
# COMPLETION: tab completion. requires `utility` module prior to loading
|
||||
# TODO: enable AUTO_PARAM_SLASH
|
||||
zstyle ':prezto:load' pmodule \
|
||||
'environment' \
|
||||
'terminal' \
|
||||
'editor' \
|
||||
'history' \
|
||||
'directory' \
|
||||
'spectrum' \
|
||||
'utility' \
|
||||
'completion' \
|
||||
'prompt'
|
||||
# enable zsh completions
|
||||
environment.pathsToLink = [ "/share/zsh" ];
|
||||
|
||||
# default keymap. try also `vicmd` (vim normal mode, AKA "cmd mode") or `vi`.
|
||||
zstyle ':prezto:module:editor' key-bindings 'emacs'
|
||||
programs.zsh = {
|
||||
enable = true;
|
||||
histFile = "$HOME/.local/share/zsh/history";
|
||||
shellAliases = {
|
||||
":q" = "exit";
|
||||
# common typos
|
||||
"cd.." = "cd ..";
|
||||
"cd../" = "cd ../";
|
||||
};
|
||||
setOptions = [
|
||||
# defaults:
|
||||
"HIST_IGNORE_DUPS"
|
||||
"SHARE_HISTORY"
|
||||
"HIST_FCNTL_LOCK"
|
||||
# disable `rm *` confirmations
|
||||
"rmstarsilent"
|
||||
];
|
||||
|
||||
zstyle ':prezto:module:prompt' theme 'powerlevel10k'
|
||||
# .zshenv config:
|
||||
shellInit = ''
|
||||
ZDOTDIR=$HOME/.config/zsh
|
||||
'';
|
||||
|
||||
# disable `mv` confirmation (and `rm`, too, unfortunately)
|
||||
zstyle ':prezto:module:utility' safe-ops 'no'
|
||||
'';
|
||||
# .zshrc config:
|
||||
interactiveShellInit =
|
||||
(builtins.readFile ./p10k.zsh)
|
||||
+ p10k-overrides
|
||||
+ prezto-init
|
||||
+ ''
|
||||
# zmv is a way to do rich moves/renames, with pattern matching/substitution.
|
||||
# see for an example: <https://filipe.kiss.ink/zmv-zsh-rename/>
|
||||
autoload -Uz zmv
|
||||
|
||||
HISTORY_IGNORE='(sane-shutdown *|sane-reboot *|rm *|nixos-rebuild.* switch)'
|
||||
|
||||
# extra aliases
|
||||
# TODO: move to `shellAliases` config?
|
||||
function nd() {
|
||||
mkdir -p "$1";
|
||||
pushd "$1";
|
||||
}
|
||||
''
|
||||
+ lib.optionalString cfg.showDeadlines ''
|
||||
${pkgs.sane-scripts}/bin/sane-deadlines
|
||||
''
|
||||
+ ''
|
||||
# auto-cd into any of these dirs by typing them and pressing 'enter':
|
||||
hash -d 3rd="/home/colin/dev/3rd"
|
||||
hash -d dev="/home/colin/dev"
|
||||
hash -d knowledge="/home/colin/knowledge"
|
||||
hash -d nixos="/home/colin/nixos"
|
||||
hash -d nixpkgs="/home/colin/dev/3rd/nixpkgs"
|
||||
hash -d ref="/home/colin/ref"
|
||||
hash -d secrets="/home/colin/knowledge/secrets"
|
||||
hash -d tmp="/home/colin/tmp"
|
||||
hash -d uninsane="/home/colin/dev/uninsane"
|
||||
hash -d Videos="/home/colin/Videos"
|
||||
'';
|
||||
|
||||
syntaxHighlighting.enable = true;
|
||||
vteIntegration = true;
|
||||
};
|
||||
|
||||
# enable a command-not-found hook to show nix packages that might provide the binary typed.
|
||||
programs.nix-index.enable = true;
|
||||
programs.command-not-found.enable = false; #< mutually exclusive with nix-index
|
||||
|
||||
# prezto = oh-my-zsh fork; controls prompt, auto-completion, etc.
|
||||
# see: https://github.com/sorin-ionescu/prezto
|
||||
# i believe this file is auto-sourced by the prezto init.zsh script.
|
||||
sane.user.fs.".config/zsh/.zpreztorc" = sane-lib.fs.wantedText ''
|
||||
zstyle ':prezto:*:*' color 'yes'
|
||||
|
||||
# modules (they ship with prezto):
|
||||
# ENVIRONMENT: configures jobs to persist after shell exit; other basic niceties
|
||||
# TERMINAL: auto-titles terminal (e.g. based on cwd)
|
||||
# EDITOR: configures shortcuts like Ctrl+U=undo, Ctrl+L=clear
|
||||
# HISTORY: `history-stat` alias, setopts for good history defaults
|
||||
# DIRECTORY: sets AUTO_CD, adds `d` alias to list directory stack, and `1`-`9` to cd that far back the stack
|
||||
# SPECTRUM: helpers for term colors and styling. used by prompts? might be unnecessary
|
||||
# UTILITY: configures aliases like `ll`, `la`, disables globbing for things like rsync
|
||||
# adds aliases like `get` to fetch a file. also adds `http-serve` alias??
|
||||
# COMPLETION: tab completion. requires `utility` module prior to loading
|
||||
# TODO: enable AUTO_PARAM_SLASH
|
||||
zstyle ':prezto:load' pmodule \
|
||||
'environment' \
|
||||
'terminal' \
|
||||
'editor' \
|
||||
'history' \
|
||||
'directory' \
|
||||
'spectrum' \
|
||||
'utility' \
|
||||
'completion' \
|
||||
'prompt'
|
||||
|
||||
# default keymap. try also `vicmd` (vim normal mode, AKA "cmd mode") or `vi`.
|
||||
zstyle ':prezto:module:editor' key-bindings 'emacs'
|
||||
|
||||
zstyle ':prezto:module:prompt' theme 'powerlevel10k'
|
||||
|
||||
# disable `mv` confirmation (and `rm`, too, unfortunately)
|
||||
zstyle ':prezto:module:utility' safe-ops 'no'
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
{ ... }:
|
||||
{
|
||||
# services.i2p.enable = true;
|
||||
services.i2p.enable = true;
|
||||
}
|
||||
|
@@ -1,3 +1,6 @@
|
||||
# TODO: migrate to nixpkgs `config.ids.uids`
|
||||
# - note that nixpkgs' `config.ids.uids` is strictly a database: it doesn't set anything by default
|
||||
# whereas our impl sets the gid/uid of the user/group specified if they exist.
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
@@ -35,7 +38,7 @@
|
||||
sane.ids.sshd.uid = 2001; # 997
|
||||
sane.ids.sshd.gid = 2001; # 997
|
||||
sane.ids.polkituser.gid = 2002; # 998
|
||||
sane.ids.systemd-coredump.gid = 2003; # 996
|
||||
sane.ids.systemd-coredump.gid = 2003; # 996 # 2023/02/12-2023/02/28: upstream temporarily specified this as 151
|
||||
sane.ids.nscd.uid = 2004;
|
||||
sane.ids.nscd.gid = 2004;
|
||||
sane.ids.systemd-oom.uid = 2005;
|
||||
|
18
hosts/common/persist.nix
Normal file
18
hosts/common/persist.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
sane.persist.stores.private.origin = "/home/colin/private";
|
||||
# store /home/colin/a/b in /home/private/a/b instead of /home/private/home/colin/a/b
|
||||
sane.persist.stores.private.prefix = "/home/colin";
|
||||
|
||||
sane.persist.sys.plaintext = [
|
||||
"/var/log"
|
||||
"/var/backup" # for e.g. postgres dumps
|
||||
# TODO: move elsewhere
|
||||
"/var/lib/alsa" # preserve output levels, default devices
|
||||
"/var/lib/colord" # preserve color calibrations (?)
|
||||
"/var/lib/machines" # maybe not needed, but would be painful to add a VM and forget.
|
||||
"/var/lib/systemd/backlight" # backlight brightness
|
||||
"/var/lib/systemd/coredump"
|
||||
];
|
||||
}
|
387
hosts/common/programs.nix
Normal file
387
hosts/common/programs.nix
Normal file
@@ -0,0 +1,387 @@
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (builtins) attrNames concatLists;
|
||||
inherit (lib) mapAttrs mapAttrsToList mkDefault mkMerge optional;
|
||||
|
||||
flattenedPkgs = pkgs // (with pkgs; {
|
||||
# XXX can't `inherit` a nested attr, so we move them to the toplevel
|
||||
"cacert.unbundled" = pkgs.cacert.unbundled;
|
||||
"gnome.cheese" = gnome.cheese;
|
||||
"gnome.dconf-editor" = gnome.dconf-editor;
|
||||
"gnome.file-roller" = gnome.file-roller;
|
||||
"gnome.gnome-disk-utility" = gnome.gnome-disk-utility;
|
||||
"gnome.gnome-maps" = gnome.gnome-maps;
|
||||
"gnome.nautilus" = gnome.nautilus;
|
||||
"gnome.gnome-system-monitor" = gnome.gnome-system-monitor;
|
||||
"gnome.gnome-terminal" = gnome.gnome-terminal;
|
||||
"gnome.gnome-weather" = gnome.gnome-weather;
|
||||
"gnome.totem" = gnome.totem;
|
||||
"libsForQt5.plasmatube" = libsForQt5.plasmatube;
|
||||
});
|
||||
|
||||
sysadminPkgs = {
|
||||
inherit (flattenedPkgs)
|
||||
btrfs-progs
|
||||
"cacert.unbundled" # some services require unbundled /etc/ssl/certs
|
||||
cryptsetup
|
||||
dig
|
||||
efibootmgr
|
||||
fatresize
|
||||
fd
|
||||
file
|
||||
gawk
|
||||
git
|
||||
gptfdisk
|
||||
hdparm
|
||||
htop
|
||||
iftop
|
||||
inetutils # for telnet
|
||||
iotop
|
||||
iptables
|
||||
jq
|
||||
killall
|
||||
lsof
|
||||
nano
|
||||
netcat
|
||||
nethogs
|
||||
nmap
|
||||
openssl
|
||||
parted
|
||||
pciutils
|
||||
powertop
|
||||
pstree
|
||||
ripgrep
|
||||
screen
|
||||
smartmontools
|
||||
socat
|
||||
strace
|
||||
subversion
|
||||
tcpdump
|
||||
tree
|
||||
usbutils
|
||||
wget
|
||||
;
|
||||
};
|
||||
sysadminExtraPkgs = {
|
||||
# application-specific packages
|
||||
inherit (pkgs)
|
||||
backblaze-b2
|
||||
duplicity
|
||||
sqlite # to debug sqlite3 databases
|
||||
;
|
||||
};
|
||||
|
||||
iphonePkgs = {
|
||||
inherit (pkgs)
|
||||
ifuse
|
||||
ipfs
|
||||
libimobiledevice
|
||||
;
|
||||
};
|
||||
|
||||
tuiPkgs = {
|
||||
inherit (pkgs)
|
||||
aerc # email client
|
||||
offlineimap # email mailox sync
|
||||
visidata # TUI spreadsheet viewer/editor
|
||||
w3m
|
||||
;
|
||||
};
|
||||
|
||||
# TODO: split these into smaller groups.
|
||||
# - transcoders (ffmpeg, imagemagick) only wanted on desko/lappy ("powerutils"?)
|
||||
consolePkgs = {
|
||||
inherit (pkgs)
|
||||
cdrtools
|
||||
dmidecode
|
||||
efivar
|
||||
flashrom
|
||||
fwupd
|
||||
ghostscript # TODO: imagemagick wrapper should add gs to PATH
|
||||
gnupg
|
||||
gocryptfs
|
||||
gopass
|
||||
gopass-jsonapi
|
||||
imagemagick
|
||||
kitty # TODO: move to GUI, but `ssh servo` from kitty sets `TERM=xterm-kitty` in the remove and breaks things
|
||||
libsecret # for managing user keyrings
|
||||
lm_sensors # for sensors-detect
|
||||
lshw
|
||||
ffmpeg
|
||||
memtester
|
||||
# networkmanager
|
||||
nixpkgs-review
|
||||
# nixos-generators
|
||||
# nettools
|
||||
nmon
|
||||
oathToolkit # for oathtool
|
||||
# ponymix
|
||||
pulsemixer
|
||||
python3
|
||||
rsync
|
||||
# python3Packages.eyeD3 # music tagging
|
||||
sane-scripts
|
||||
sequoia
|
||||
snapper
|
||||
sops
|
||||
sox
|
||||
speedtest-cli
|
||||
ssh-to-age
|
||||
sudo
|
||||
# tageditor # music tagging
|
||||
unar
|
||||
wireguard-tools
|
||||
xdg-utils # for xdg-open
|
||||
# youtube-dl
|
||||
yt-dlp
|
||||
;
|
||||
};
|
||||
|
||||
guiPkgs = {
|
||||
inherit (flattenedPkgs)
|
||||
celluloid # mpv frontend
|
||||
clinfo
|
||||
emote
|
||||
evince # works on phosh
|
||||
|
||||
# { pkg = fluffychat-moby; dir = [ ".local/share/chat.fluffy.fluffychat" ]; } # TODO: ship normal fluffychat on non-moby?
|
||||
|
||||
# foliate # e-book reader
|
||||
|
||||
# XXX by default fractal stores its state in ~/.local/share/<UUID>.
|
||||
# after logging in, manually change ~/.local/share/keyrings/... to point it to some predictable subdir.
|
||||
# then reboot (so that libsecret daemon re-loads the keyring...?)
|
||||
# { pkg = fractal-latest; private = [ ".local/share/fractal" ]; }
|
||||
# { pkg = fractal-next; private = [ ".local/share/fractal" ]; }
|
||||
|
||||
# "gnome.cheese"
|
||||
"gnome.dconf-editor"
|
||||
gnome-feeds # RSS reader (with claimed mobile support)
|
||||
"gnome.file-roller"
|
||||
# "gnome.gnome-maps" # works on phosh
|
||||
"gnome.nautilus"
|
||||
# gnome-podcasts
|
||||
"gnome.gnome-system-monitor"
|
||||
# "gnome.gnome-terminal" # works on phosh
|
||||
"gnome.gnome-weather"
|
||||
gpodder-configured
|
||||
gthumb
|
||||
jellyfin-media-player
|
||||
# lollypop
|
||||
mpv
|
||||
networkmanagerapplet
|
||||
# newsflash
|
||||
nheko
|
||||
pavucontrol
|
||||
# picard # music tagging
|
||||
playerctl
|
||||
# "libsForQt5.plasmatube" # Youtube player
|
||||
soundconverter
|
||||
# sublime music persists any downloaded albums here.
|
||||
# it doesn't obey a conventional ~/Music/{Artist}/{Album}/{Track} notation, so no symlinking
|
||||
# config (e.g. server connection details) is persisted in ~/.config/sublime-music/config.json
|
||||
# possible to pass config as a CLI arg (sublime-music -c config.json)
|
||||
# { pkg = sublime-music; dir = [ ".local/share/sublime-music" ]; }
|
||||
sublime-music-mobile
|
||||
# tdesktop # broken on phosh
|
||||
# tokodon
|
||||
vlc
|
||||
# pleroma client (Electron). input is broken on phosh. TODO(2023/02/02): fix electron19 input (insecure)
|
||||
# whalebird
|
||||
xterm # broken on phosh
|
||||
;
|
||||
};
|
||||
desktopGuiPkgs = {
|
||||
inherit (flattenedPkgs)
|
||||
audacity
|
||||
brave # for the integrated wallet -- as a backup
|
||||
chromium
|
||||
dino
|
||||
electrum
|
||||
element-desktop
|
||||
font-manager
|
||||
gajim # XMPP client
|
||||
gimp # broken on phosh
|
||||
"gnome.gnome-disk-utility"
|
||||
# "gnome.totem" # video player, supposedly supports UPnP
|
||||
handbrake
|
||||
hase
|
||||
inkscape
|
||||
kdenlive
|
||||
kid3 # audio tagging
|
||||
krita
|
||||
libreoffice-fresh # XXX colin: maybe don't want this on mobile
|
||||
mumble
|
||||
obsidian
|
||||
slic3r
|
||||
;
|
||||
};
|
||||
x86GuiPkgs = {
|
||||
inherit (pkgs)
|
||||
discord
|
||||
|
||||
# kaiteki # Pleroma client
|
||||
# gnome.zenity # for kaiteki (it will use qarma, kdialog, or zenity)
|
||||
# gpt2tc # XXX: unreliable mirror
|
||||
|
||||
logseq
|
||||
losslesscut-bin
|
||||
makemkv
|
||||
monero-gui
|
||||
signal-desktop
|
||||
spotify
|
||||
tor-browser-bundle-bin
|
||||
zecwallet-lite
|
||||
;
|
||||
};
|
||||
|
||||
# packages not part of any package set
|
||||
otherPkgs = {
|
||||
inherit (pkgs)
|
||||
stepmania
|
||||
;
|
||||
};
|
||||
|
||||
# define -- but don't enable -- the packages in some attrset.
|
||||
# use `mkDefault` for the package here so we can customize some of them further down this file
|
||||
declarePkgs = pkgsAsAttrs: mapAttrs (_n: p: {
|
||||
package = mkDefault p;
|
||||
}) pkgsAsAttrs;
|
||||
in
|
||||
{
|
||||
config = {
|
||||
sane.programs = mkMerge [
|
||||
(declarePkgs consolePkgs)
|
||||
(declarePkgs desktopGuiPkgs)
|
||||
(declarePkgs guiPkgs)
|
||||
(declarePkgs iphonePkgs)
|
||||
(declarePkgs sysadminPkgs)
|
||||
(declarePkgs sysadminExtraPkgs)
|
||||
(declarePkgs tuiPkgs)
|
||||
(declarePkgs x86GuiPkgs)
|
||||
(declarePkgs otherPkgs)
|
||||
{
|
||||
# link the various package sets into their own meta packages
|
||||
consoleUtils = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames consolePkgs;
|
||||
};
|
||||
desktopGuiApps = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames desktopGuiPkgs;
|
||||
};
|
||||
guiApps = {
|
||||
package = null;
|
||||
suggestedPrograms = (attrNames guiPkgs)
|
||||
++ [ "tuiApps" ]
|
||||
++ optional (pkgs.system == "x86_64-linux") "x86GuiApps";
|
||||
};
|
||||
iphoneUtils = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames iphonePkgs;
|
||||
};
|
||||
sysadminUtils = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames sysadminPkgs;
|
||||
};
|
||||
sysadminExtraUtils = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames sysadminExtraPkgs;
|
||||
};
|
||||
tuiApps = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames tuiPkgs;
|
||||
};
|
||||
x86GuiApps = {
|
||||
package = null;
|
||||
suggestedPrograms = attrNames x86GuiPkgs;
|
||||
};
|
||||
}
|
||||
{
|
||||
# nontrivial package definitions
|
||||
imagemagick.package = pkgs.imagemagick.override {
|
||||
ghostscriptSupport = true;
|
||||
};
|
||||
|
||||
dino.private = [ ".local/share/dino" ];
|
||||
|
||||
# creds, but also 200 MB of node modules, etc
|
||||
discord.private = [ ".config/discord" ];
|
||||
|
||||
# creds/session keys, etc
|
||||
element-desktop.private = [ ".config/Element" ];
|
||||
|
||||
# `emote` will show a first-run dialog based on what's in this directory.
|
||||
# mostly, it just keeps a LRU of previously-used emotes to optimize display order.
|
||||
# TODO: package [smile](https://github.com/mijorus/smile) for probably a better mobile experience.
|
||||
emote.dir = [ ".local/share/Emote" ];
|
||||
|
||||
# XXX: we preserve the whole thing because if we only preserve gPodder/Downloads
|
||||
# then startup is SLOW during feed import, and we might end up with zombie eps in the dl dir.
|
||||
gpodder-configured.dir = [ "gPodder" ];
|
||||
|
||||
# jellyfin stores things in a bunch of directories: this one persists auth info.
|
||||
# it *might* be possible to populate this externally (it's Qt stuff), but likely to
|
||||
# be fragile and take an hour+ to figure out.
|
||||
jellyfin-media-player.dir = [ ".local/share/Jellyfin Media Player" ];
|
||||
|
||||
# actual monero blockchain (not wallet/etc; safe to delete, just slow to regenerate)
|
||||
# XXX: is it really safe to persist this? it doesn't have info that could de-anonymize if captured?
|
||||
monero-gui.dir = [ ".bitmonero" ];
|
||||
|
||||
mpv.dir = [ ".config/mpv/watch_later" ];
|
||||
|
||||
mumble.private = [ ".local/share/Mumble" ];
|
||||
|
||||
# not strictly necessary, but allows caching articles; offline use, etc.
|
||||
newsflash.dir = [ ".local/share/news-flash" ];
|
||||
nheko.private = [
|
||||
".config/nheko" # config file (including client token)
|
||||
".cache/nheko" # media cache
|
||||
".local/share/nheko" # per-account state database
|
||||
];
|
||||
|
||||
# settings (electron app)
|
||||
obsidian.dir = [ ".config/obsidian" ];
|
||||
|
||||
# creds, media
|
||||
signal-desktop.private = [ ".config/Signal" ];
|
||||
|
||||
# printer/filament settings
|
||||
slic3r.dir = [ ".Slic3r" ];
|
||||
|
||||
# creds, widevine .so download. TODO: could easily manage these statically.
|
||||
spotify.dir = [ ".config/spotify" ];
|
||||
|
||||
# sublime music persists any downloaded albums here.
|
||||
# it doesn't obey a conventional ~/Music/{Artist}/{Album}/{Track} notation, so no symlinking
|
||||
# config (e.g. server connection details) is persisted in ~/.config/sublime-music/config.json
|
||||
# possible to pass config as a CLI arg (sublime-music -c config.json)
|
||||
# { pkg = sublime-music; dir = [ ".local/share/sublime-music" ]; }
|
||||
sublime-music-mobile.dir = [ ".local/share/sublime-music" ];
|
||||
|
||||
tdesktop.private = [ ".local/share/TelegramDesktop" ];
|
||||
|
||||
tokodon.private = [ ".cache/KDE/tokodon" ];
|
||||
|
||||
# hardenedMalloc solves a crash at startup
|
||||
# TODO 2023/02/02: is this safe to remove yet?
|
||||
tor-browser-bundle-bin.package = pkgs.tor-browser-bundle-bin.override {
|
||||
useHardenedMalloc = false;
|
||||
};
|
||||
|
||||
# vlc remembers play position in ~/.config/vlc/vlc-qt-interface.conf
|
||||
vlc.dir = [ ".config/vlc" ];
|
||||
|
||||
whalebird.private = [ ".config/Whalebird" ];
|
||||
|
||||
# zcash coins. safe to delete, just slow to regenerate (10-60 minutes)
|
||||
zecwallet-lite.private = [ ".zcash" ];
|
||||
}
|
||||
];
|
||||
|
||||
# XXX: this might not be necessary. try removing this and cacert.unbundled (servo)?
|
||||
environment.etc."ssl/certs".source = "${pkgs.cacert.unbundled}/etc/ssl/certs/*";
|
||||
};
|
||||
}
|
@@ -55,6 +55,9 @@
|
||||
sops.secrets."router_passwd" = {
|
||||
sopsFile = ../../secrets/universal.yaml;
|
||||
};
|
||||
sops.secrets."transmission_passwd" = {
|
||||
sopsFile = ../../secrets/universal.yaml;
|
||||
};
|
||||
sops.secrets."wg_ovpnd_us_privkey" = {
|
||||
sopsFile = ../../secrets/universal.yaml;
|
||||
};
|
||||
@@ -99,18 +102,26 @@
|
||||
sopsFile = ../../secrets/universal/net/friend-rationalist-empathist.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/home-bedroom.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/home-bedroom.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/home-shared-24G.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/home-shared-24G.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/home-shared.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/home-shared.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/makespace-south.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/makespace-south.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/archive-2023-02-home-bedroom.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/archive/2023-02-home-bedroom.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/archive-2023-02-home-shared-24G.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/archive/2023-02-home-shared-24G.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/archive-2023-02-home-shared.psk" = {
|
||||
sopsFile = ../../secrets/universal/net/archive/2023-02-home-shared.psk.bin;
|
||||
format = "binary";
|
||||
};
|
||||
sops.secrets."iwd/iphone" = {
|
||||
sopsFile = ../../secrets/universal/net/iphone.psk.bin;
|
||||
format = "binary";
|
||||
|
@@ -3,12 +3,12 @@
|
||||
# installer docs: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/installation-device.nix
|
||||
with lib;
|
||||
let
|
||||
cfg = config.sane.users;
|
||||
cfg = config.sane.guest;
|
||||
fs = sane-lib.fs;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
sane.users.guest.enable = mkOption {
|
||||
sane.guest.enable = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
@@ -49,8 +49,6 @@ in
|
||||
|
||||
shell = pkgs.zsh;
|
||||
|
||||
packages = builtins.map (p: p.pkg) config.sane.packages.enabledUserPkgs;
|
||||
|
||||
# mount encrypted stuff at login
|
||||
# some other nix pam users:
|
||||
# - <https://github.com/g00pix/nixconf/blob/32c04f6fa843fed97639dd3f09e157668d3eea1f/profiles/sshfs.nix>
|
||||
@@ -68,6 +66,7 @@ in
|
||||
|
||||
security.pam.mount.enable = true;
|
||||
|
||||
sane.users.colin.default = true;
|
||||
# ensure ~ perms are known to sane.fs module.
|
||||
# TODO: this is generic enough to be lifted up into sane.fs itself.
|
||||
sane.fs."/home/colin".dir.acl = {
|
||||
@@ -76,7 +75,7 @@ in
|
||||
mode = config.users.users.colin.homeMode;
|
||||
};
|
||||
|
||||
sane.persist.home.plaintext = [
|
||||
sane.user.persist.plaintext = [
|
||||
"archive"
|
||||
"dev"
|
||||
# TODO: records should be private
|
||||
@@ -90,25 +89,27 @@ in
|
||||
|
||||
".cache/nix"
|
||||
".cache/nix-index"
|
||||
".cargo"
|
||||
".rustup"
|
||||
|
||||
# ".cargo"
|
||||
# ".rustup"
|
||||
];
|
||||
|
||||
# convenience
|
||||
sane.fs."/home/colin/knowledge" = fs.wantedSymlinkTo "/home/colin/private/knowledge";
|
||||
sane.fs."/home/colin/nixos" = fs.wantedSymlinkTo "/home/colin/dev/nixos";
|
||||
sane.fs."/home/colin/Videos/servo" = fs.wantedSymlinkTo "/mnt/servo-media/Videos";
|
||||
sane.fs."/home/colin/Videos/servo-incomplete" = fs.wantedSymlinkTo "/mnt/servo-media/incomplete";
|
||||
sane.fs."/home/colin/Music/servo" = fs.wantedSymlinkTo "/mnt/servo-media/Music";
|
||||
sane.user.fs."knowledge" = fs.wantedSymlinkTo "private/knowledge";
|
||||
sane.user.fs."nixos" = fs.wantedSymlinkTo "dev/nixos";
|
||||
sane.user.fs."Books/servo" = fs.wantedSymlinkTo "/mnt/servo-media/Books";
|
||||
sane.user.fs."Videos/servo" = fs.wantedSymlinkTo "/mnt/servo-media/Videos";
|
||||
sane.user.fs."Videos/servo-incomplete" = fs.wantedSymlinkTo "/mnt/servo-media/incomplete";
|
||||
sane.user.fs."Music/servo" = fs.wantedSymlinkTo "/mnt/servo-media/Music";
|
||||
|
||||
# used by password managers, e.g. unix `pass`
|
||||
sane.fs."/home/colin/.password-store" = fs.wantedSymlinkTo "/home/colin/knowledge/secrets/accounts";
|
||||
sane.user.fs.".password-store" = fs.wantedSymlinkTo "knowledge/secrets/accounts";
|
||||
|
||||
sane.persist.sys.plaintext = mkIf cfg.guest.enable [
|
||||
sane.persist.sys.plaintext = mkIf cfg.enable [
|
||||
# intentionally allow other users to write to the guest folder
|
||||
{ directory = "/home/guest"; user = "guest"; group = "users"; mode = "0775"; }
|
||||
];
|
||||
users.users.guest = mkIf cfg.guest.enable {
|
||||
users.users.guest = mkIf cfg.enable {
|
||||
isNormalUser = true;
|
||||
home = "/home/guest";
|
||||
subUidRanges = [
|
||||
|
@@ -4,7 +4,7 @@
|
||||
{ hostName, localSystem }:
|
||||
|
||||
# module args
|
||||
{ config, ... }:
|
||||
{ config, lib, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
@@ -14,14 +14,16 @@
|
||||
];
|
||||
|
||||
networking.hostName = hostName;
|
||||
nixpkgs.buildPlatform = lib.mkIf (localSystem != null) localSystem;
|
||||
sane.cross.enablePatches = localSystem != null;
|
||||
|
||||
nixpkgs.overlays = [
|
||||
(next: prev: {
|
||||
# for local != target we by default just emulate the target while building.
|
||||
# provide a `pkgs.cross.<pkg>` alias that consumers can use instead of `pkgs.<foo>`
|
||||
# to explicitly opt into non-emulated cross compilation for any specific package.
|
||||
# this is most beneficial for large packages with few pre-requisites -- like Linux.
|
||||
cross = next.crossFrom."${localSystem}";
|
||||
})
|
||||
];
|
||||
# nixpkgs.overlays = [
|
||||
# (next: prev: {
|
||||
# # for local != target we by default just emulate the target while building.
|
||||
# # provide a `pkgs.cross.<pkg>` alias that consumers can use instead of `pkgs.<foo>`
|
||||
# # to explicitly opt into non-emulated cross compilation for any specific package.
|
||||
# # this is most beneficial for large packages with few pre-requisites -- like Linux.
|
||||
# cross = prev.crossFrom."${localSystem}";
|
||||
# })
|
||||
# ];
|
||||
}
|
||||
|
@@ -7,7 +7,10 @@
|
||||
./hardware
|
||||
./hostnames.nix
|
||||
./hosts.nix
|
||||
./nixcache.nix
|
||||
./roles
|
||||
./services
|
||||
./wg-home.nix
|
||||
./yggdrasil.nix
|
||||
];
|
||||
}
|
||||
|
@@ -12,24 +12,4 @@ in
|
||||
./plasma-mobile.nix
|
||||
./sway.nix
|
||||
];
|
||||
|
||||
options = {
|
||||
sane.gui.enable = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = ''
|
||||
enables config used by any GUI, like display management or select packages.
|
||||
the user should prefer to interact with specific GUIs like `sane.gui.sway`
|
||||
and let those modules auto-set this flag when necessary.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
sane.packages.enableGuiPkgs = mkDefault true;
|
||||
|
||||
# preserve backlight brightness across power cycles
|
||||
# see `man systemd-backlight`
|
||||
sane.persist.sys.plaintext = [ "/var/lib/systemd/backlight" ];
|
||||
};
|
||||
}
|
||||
|
@@ -13,7 +13,7 @@ in
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
sane.gui.enable = true;
|
||||
sane.programs.guiApps.enableFor.user.colin = true;
|
||||
|
||||
# start gnome/gdm on boot
|
||||
services.xserver.enable = true;
|
||||
|
@@ -20,9 +20,43 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (mkMerge [
|
||||
config = mkMerge [
|
||||
{
|
||||
sane.gui.enable = true;
|
||||
sane.programs.phoshApps = {
|
||||
package = null;
|
||||
suggestedPrograms = [
|
||||
"guiApps"
|
||||
# TODO: see about removing gnome-bluetooth if the in-built gnome-settings bluetooth manager can work
|
||||
"gnome.gnome-bluetooth"
|
||||
"gnome.gnome-terminal"
|
||||
"phosh-mobile-settings"
|
||||
# "plasma5Packages.konsole" # more reliable terminal
|
||||
];
|
||||
};
|
||||
}
|
||||
{
|
||||
sane.programs = {
|
||||
inherit (pkgs // {
|
||||
"gnome.gnome-bluetooth" = pkgs.gnome.gnome-bluetooth;
|
||||
"gnome.gnome-terminal" = pkgs.gnome.gnome-terminal;
|
||||
"plasma5Packages.konsole" = pkgs.plasma5Packages.konsole;
|
||||
})
|
||||
phosh-mobile-settings
|
||||
"plasma5Packages.konsole"
|
||||
# "gnome.gnome-bluetooth"
|
||||
"gnome.gnome-terminal"
|
||||
;
|
||||
};
|
||||
}
|
||||
|
||||
(mkIf cfg.enable {
|
||||
sane.programs.phoshApps.enableFor.user.colin = true;
|
||||
|
||||
# TODO(2023/02/28): remove this qt.style = "gtk2" override.
|
||||
# gnome by default tells qt to stylize its apps similar to gnome.
|
||||
# but the package needed for that doesn't cross-compile, hence i disable that here.
|
||||
# qt.platformTheme = "gtk2";
|
||||
# qt.style = "gtk2";
|
||||
|
||||
# docs: https://github.com/NixOS/nixpkgs/blob/nixos-22.05/nixos/modules/services/x11/desktop-managers/phosh.nix
|
||||
services.xserver.desktopManager.phosh = {
|
||||
@@ -38,6 +72,26 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
# phosh enables `services.gnome.{core-os-services, core-shell}`
|
||||
# and this in turn enables some default apps we don't really care about.
|
||||
# see <nixos/modules/services/x11/desktop-managers/gnome.nix>
|
||||
environment.gnome.excludePackages = with pkgs; [
|
||||
# gnome.gnome-menus # unused outside gnome classic, but probably harmless
|
||||
gnome-tour
|
||||
];
|
||||
services.dleyna-renderer.enable = false;
|
||||
services.dleyna-server.enable = false;
|
||||
services.gnome.gnome-browser-connector.enable = false;
|
||||
services.gnome.gnome-initial-setup.enable = false;
|
||||
services.gnome.gnome-online-accounts.enable = false;
|
||||
services.gnome.gnome-remote-desktop.enable = false;
|
||||
services.gnome.gnome-user-share.enable = false;
|
||||
services.gnome.rygel.enable = false;
|
||||
|
||||
# gnome doesn't use mkDefault for these -- unclear why not
|
||||
services.gnome.evolution-data-server.enable = mkForce false;
|
||||
services.gnome.gnome-online-miners.enable = mkForce false;
|
||||
|
||||
# XXX: phosh enables networkmanager by default; can probably disable these lines
|
||||
networking.useDHCP = false;
|
||||
networking.networkmanager.enable = true;
|
||||
@@ -60,6 +114,7 @@ in
|
||||
};
|
||||
|
||||
programs.dconf.packages = [
|
||||
# org.kde.konsole.desktop
|
||||
(pkgs.writeTextFile {
|
||||
name = "dconf-phosh-settings";
|
||||
destination = "/etc/dconf/db/site.d/00_phosh_settings";
|
||||
@@ -72,19 +127,13 @@ in
|
||||
sleep-inactive-battery-timeout=5400
|
||||
|
||||
[sm/puri/phosh]
|
||||
favorites=['gpodder.desktop', 'nheko.desktop', 'sublime-music.desktop', 'firefox.desktop', 'org.kde.konsole.desktop']
|
||||
favorites=['gpodder.desktop', 'nheko.desktop', 'sublime-music.desktop', 'firefox.desktop', 'org.gnome.Terminal.desktop']
|
||||
'';
|
||||
})
|
||||
];
|
||||
})
|
||||
|
||||
sane.packages.extraUserPkgs = with pkgs; [
|
||||
phosh-mobile-settings
|
||||
|
||||
# TODO: see about removing this if the in-built gnome-settings bluetooth manager can work
|
||||
gnome.gnome-bluetooth
|
||||
];
|
||||
}
|
||||
(mkIf cfg.useGreeter {
|
||||
(mkIf (cfg.enable && cfg.useGreeter) {
|
||||
services.xserver.enable = true;
|
||||
# NB: setting defaultSession has the critical side-effect that it lets org.freedesktop.AccountsService
|
||||
# know that our user exists. this ensures lightdm succeeds when calling /org/freedesktop/AccountsServices ListCachedUsers
|
||||
@@ -110,5 +159,5 @@ in
|
||||
|
||||
systemd.services.phosh.wantedBy = lib.mkForce []; # disable auto-start
|
||||
})
|
||||
]);
|
||||
];
|
||||
}
|
||||
|
@@ -13,7 +13,8 @@ in
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
sane.gui.enable = true;
|
||||
sane.programs.guiApps.enableFor.user.colin = true;
|
||||
|
||||
# start plasma-mobile on boot
|
||||
services.xserver.enable = true;
|
||||
services.xserver.desktopManager.plasma5.mobile.enable = true;
|
||||
|
@@ -13,7 +13,7 @@ in
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
sane.gui.enable = true;
|
||||
sane.programs.guiApps.enableFor.user.colin = true;
|
||||
|
||||
# start plasma on boot
|
||||
services.xserver.enable = true;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -9,11 +9,6 @@
|
||||
# efi_pstore evivars
|
||||
];
|
||||
|
||||
# enable cross compilation
|
||||
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
|
||||
# nixpkgs.config.allowUnsupportedSystem = true;
|
||||
# nixpkgs.crossSystem.system = "aarch64-linux";
|
||||
|
||||
powerManagement.cpuFreqGovernor = "powersave";
|
||||
hardware.cpu.amd.updateMicrocode = true; # desktop
|
||||
hardware.cpu.intel.updateMicrocode = true; # laptop
|
||||
|
@@ -69,7 +69,7 @@ in
|
||||
ssh.host_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFw9NoRaYrM6LbDd3aFBc4yyBlxGQn8HjeHd/dZ3CfHk";
|
||||
wg-home.pubkey = "17PMZssYi0D4t2d0vbmhjBKe1sGsE8kT8/dod0Q2CXc=";
|
||||
wg-home.ip = "10.0.10.22";
|
||||
lan-ip = "192.168.0.22";
|
||||
lan-ip = "192.168.15.25";
|
||||
};
|
||||
|
||||
sane.hosts.by-name."lappy" = {
|
||||
@@ -77,7 +77,7 @@ in
|
||||
ssh.host_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILSJnqmVl9/SYQ0btvGb0REwwWY8wkdkGXQZfn/1geEc";
|
||||
wg-home.pubkey = "FTUWGw2p4/cEcrrIE86PWVnqctbv8OYpw8Gt3+dC/lk=";
|
||||
wg-home.ip = "10.0.10.20";
|
||||
lan-ip = "192.168.0.20";
|
||||
lan-ip = "192.168.15.13";
|
||||
};
|
||||
|
||||
sane.hosts.by-name."moby" = {
|
||||
@@ -85,7 +85,7 @@ in
|
||||
ssh.host_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO1N/IT3nQYUD+dBlU1sTEEVMxfOyMkrrDeyHcYgnJvw";
|
||||
wg-home.pubkey = "I7XIR1hm8bIzAtcAvbhWOwIAabGkuEvbWH/3kyIB1yA=";
|
||||
wg-home.ip = "10.0.10.48";
|
||||
lan-ip = "192.168.0.48";
|
||||
lan-ip = "192.168.15.28";
|
||||
};
|
||||
|
||||
sane.hosts.by-name."servo" = {
|
||||
@@ -94,7 +94,7 @@ in
|
||||
wg-home.pubkey = "roAw+IUFVtdpCcqa4khB385Qcv9l5JAB//730tyK4Wk=";
|
||||
wg-home.ip = "10.0.10.5";
|
||||
wg-home.endpoint = "uninsane.org:51820";
|
||||
lan-ip = "192.168.0.5";
|
||||
lan-ip = "192.168.15.24";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@@ -13,6 +13,7 @@
|
||||
with lib;
|
||||
let
|
||||
cfg = config.sane.nixcache;
|
||||
hostName = config.networking.hostName;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
@@ -24,6 +25,17 @@ in
|
||||
default = config.sane.nixcache.enable;
|
||||
type = types.bool;
|
||||
};
|
||||
sane.nixcache.substituters = mkOption {
|
||||
type = types.listOf types.string;
|
||||
default =
|
||||
# TODO: make these blacklisted entries injectable
|
||||
(lib.optional (hostName != "servo") "https://nixcache.uninsane.org")
|
||||
++ (lib.optional (hostName != "servo" && hostName != "desko") "http://desko:5000")
|
||||
++ [
|
||||
"https://nix-community.cachix.org"
|
||||
"https://cache.nixos.org/"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
@@ -31,12 +43,7 @@ in
|
||||
# to explicitly build from a specific cache (in case others are down):
|
||||
# - `nixos-rebuild ... --option substituters https://cache.nixos.org`
|
||||
# - `nix build ... --substituters http://desko:5000`
|
||||
nix.settings.substituters = mkIf cfg.enable [
|
||||
"https://nixcache.uninsane.org"
|
||||
"http://desko:5000"
|
||||
"https://nix-community.cachix.org"
|
||||
"https://cache.nixos.org/"
|
||||
];
|
||||
nix.settings.substituters = mkIf cfg.enable cfg.substituters;
|
||||
# always trust our keys (so one can explicitly use a substituter even if it's not the default
|
||||
nix.settings.trusted-public-keys = mkIf cfg.enable-trusted-keys [
|
||||
"nixcache.uninsane.org:r3WILM6+QrkmsLgqVQcEdibFD7Q/4gyzD9dGT33GP70="
|
82
hosts/modules/roles/build-machine.nix
Normal file
82
hosts/modules/roles/build-machine.nix
Normal file
@@ -0,0 +1,82 @@
|
||||
{ config, lib, pkgs, sane-lib, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkMerge mkOption types;
|
||||
inherit (config.programs.ccache) cacheDir;
|
||||
cfg = config.sane.roles.build-machine;
|
||||
in
|
||||
{
|
||||
options.sane.roles.build-machine = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
};
|
||||
emulation = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
ccache = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
|
||||
config = mkMerge [
|
||||
({
|
||||
sane.programs.qemu = pkgs.qemu;
|
||||
})
|
||||
(mkIf cfg.enable {
|
||||
# enable opt-in emulation of any package at runtime.
|
||||
# i.e. `nix build '.#host-pkgs.moby.bash' ; qemu-aarch64 ./result/bin/bash`.
|
||||
sane.programs.qemu.enableFor.user.colin = true;
|
||||
# serve packages to other machines that ask for them
|
||||
sane.services.nixserve.enable = true;
|
||||
|
||||
# enable cross compilation
|
||||
# TODO: do this via stdenv injection, linking into /run/binfmt the stuff in <nixpkgs:nixos/modules/system/boot/binfmt.nix>
|
||||
boot.binfmt.emulatedSystems = lib.optionals cfg.emulation [
|
||||
"aarch64-linux"
|
||||
# "aarch64-darwin" # not supported
|
||||
# "x86_64-darwin" # not supported
|
||||
];
|
||||
# corresponds to env var: NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1
|
||||
# nixpkgs.config.allowUnsupportedSystem = true;
|
||||
})
|
||||
(mkIf (cfg.enable && cfg.ccache) {
|
||||
# programs.ccache.cacheDir = "/var/cache/ccache"; # nixos default
|
||||
# programs.ccache.cacheDir = "/homeless-shelter/.ccache"; # ccache default (~/.ccache)
|
||||
|
||||
# if the cache doesn't reside at ~/.ccache, then CCACHE_DIR has to be set.
|
||||
# we can do that manually as commented out below, or let nixos do it for us by telling it to use ccache on a dummy package:
|
||||
programs.ccache.packageNames = [ "dummy-pkg-to-force-ccache-config" ];
|
||||
# nixpkgs.overlays = [
|
||||
# (self: super: {
|
||||
# # XXX: if the cache resides not at ~/.ccache (i.e. /homeless-shelter/.ccache)
|
||||
# # then we need to explicitly tell ccache where that is.
|
||||
# ccacheWrapper = super.ccacheWrapper.override {
|
||||
# extraConfig = ''
|
||||
# export CCACHE_DIR="${cacheDir}"
|
||||
# '';
|
||||
# };
|
||||
# })
|
||||
# ];
|
||||
|
||||
# granular compilation cache
|
||||
# docs: <https://nixos.wiki/wiki/CCache>
|
||||
# investigate the cache with:
|
||||
# - `nix-ccache --show-stats`
|
||||
# - `build '.#ccache'
|
||||
# - `sudo CCACHE_DIR=/var/cache/ccache ./result/bin/ccache --show-stats -v`
|
||||
# TODO: whitelist `--verbose` in <nixpkgs:nixos/modules/programs/ccache.nix>
|
||||
# TODO: configure without compression (leverage fs-level compression), and enable file-clone (i.e. hardlinks)
|
||||
programs.ccache.enable = true;
|
||||
nix.settings.extra-sandbox-paths = [ cacheDir ];
|
||||
sane.persist.sys.plaintext = [
|
||||
{ group = "nixbld"; mode = "0775"; directory = config.programs.ccache.cacheDir; }
|
||||
];
|
||||
sane.fs."${cacheDir}/ccache.conf" = sane-lib.fs.wantedText ''
|
||||
max_size = 50G
|
||||
'';
|
||||
})
|
||||
];
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./build-machine.nix
|
||||
./client
|
||||
];
|
||||
}
|
||||
|
6
hosts/modules/services/default.nix
Normal file
6
hosts/modules/services/default.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./duplicity.nix
|
||||
];
|
||||
}
|
30
hosts/modules/yggdrasil.nix
Normal file
30
hosts/modules/yggdrasil.nix
Normal file
@@ -0,0 +1,30 @@
|
||||
# docs: <nixpkgs:nixos/modules/services/networking/yggdrasil.md>
|
||||
# - or message CW/0x00
|
||||
|
||||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
inherit (lib) mkIf mkOption types;
|
||||
cfg = config.sane.yggdrasil;
|
||||
in
|
||||
{
|
||||
options.sane.yggdrasil = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
};
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
services.yggdrasil = {
|
||||
enable = true;
|
||||
persistentKeys = true;
|
||||
config = {
|
||||
IFName = "ygg0";
|
||||
Peers = [
|
||||
"tls://longseason.1200bps.xyz:13122"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 443732,
|
||||
"content_type": "application/rss+xml; charset=utf-8",
|
||||
"description": "Ben and David are joined by expert founders and investors \u2014 writing the next generation of great company stories in real-time.\n\nWe go behind the scenes on their journeys and bring back emerging insights and lessons that are useful for anyone in the tech and investing ecosystems.\n\nAcquired covers yesterday. ACQ2 covers tomorrow.",
|
||||
"favicon": "",
|
||||
"favicon_data_uri": "",
|
||||
"hubs": [],
|
||||
"is_podcast": true,
|
||||
"is_push": false,
|
||||
"item_count": 92,
|
||||
"last_updated": "2023-03-02T17:03:15+00:00",
|
||||
"score": 10,
|
||||
"self_url": "https://acquiredlpbonussecretsecret.libsyn.com/",
|
||||
"site_name": "ACQ2 by Acquired",
|
||||
"site_url": "https://acquiredlpbonussecretsecret.libsyn.com",
|
||||
"title": "ACQ2 by Acquired",
|
||||
"url": "https://acquiredlpbonussecretsecret.libsyn.com",
|
||||
"velocity": 0.057,
|
||||
"version": "rss20"
|
||||
}
|
21
modules/data/feeds/sources/ascii.textfiles.com/default.json
Normal file
21
modules/data/feeds/sources/ascii.textfiles.com/default.json
Normal file
File diff suppressed because one or more lines are too long
21
modules/data/feeds/sources/blog.rust-lang.org/default.json
Normal file
21
modules/data/feeds/sources/blog.rust-lang.org/default.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 76362,
|
||||
"content_type": "application/xml; charset=utf-8",
|
||||
"description": "Empowering everyone to build reliable and efficient software.",
|
||||
"favicon": "https://blog.rust-lang.org/images/favicon-16x16.png",
|
||||
"favicon_data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4gseBBkAzEcAUAAAAWlJREFUOMul079L1WEUBvCPdhPUzbhC3JYQwn6MLTU4CA5C/QMJimQS2NDiZpM0NDoZ0iK4+SdIV5ykpgKtIYyiqCBSuKBBibflufBiVxt64eV73uc855z3fb7ndPh7daMPU/gR7ByeYRc/nbJGMI8GjvAKb2M34hspA84U9jgeYAIv8Bi9+IxFnMcYLqCJ12WiYTzHL0wee05Xcb6H3+EOt8CeXK0Z526b/R1ruIL74c4nVi3v+4BvOAxhHzv4lHMTb3A1WAO1zqjdhRU8SjWpOIBBvAx2hFEsRZ8pmEn28ZC+FhXLvY9L4UwHm+ksBNo79kvf4QlWC61uxR5qkSqoJttkROqN7wDvk+Q6LuIh+nEnMdVSxOYJ+zKetsEbqFVy9QXMpYE28TE3gC+YxXaKDeFGYvYqIa7jZppjI/2w1GZGzia4npiDSpz1tCjcjg5VbAW7hrtpqjqW8/3nMLXee+IwdfzvOP8BuzB3onylpecAAAAASUVORK5CYII=",
|
||||
"hubs": [],
|
||||
"is_podcast": false,
|
||||
"is_push": false,
|
||||
"item_count": 10,
|
||||
"last_updated": "2023-03-09T00:00:00+00:00",
|
||||
"score": 20,
|
||||
"self_url": "https://blog.rust-lang.org/feed.xml",
|
||||
"site_name": "The Rust Programming Language Blog",
|
||||
"site_url": "https://blog.rust-lang.org",
|
||||
"title": "Rust Blog",
|
||||
"url": "https://blog.rust-lang.org/feed.xml",
|
||||
"velocity": 0.096,
|
||||
"version": "atom10"
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 83424,
|
||||
"content_type": "application/rss+xml; charset=utf-8",
|
||||
"description": "Community News For All of Seattle's Capitol Hill",
|
||||
"favicon": "https://www.capitolhillseattle.com/favicon.ico",
|
||||
"favicon_data_uri": "data:image/png;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////39/f/h4eH/vb29/729vf/i4uL//f39/////////////////////////////////////////////f39/6+vr/81NTX/AgIC/wAAAP8AAAD/AgIC/zU1Nf+wsLD//f39////////////////////////////+vr6/2pqav8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/2xsbP/6+vr//////////////////v7+/7u7u/9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/vb29//7+/v/+/v7//////87Ozv8eHh7/HBwc/xwcHP8cHBz/t7e3/z8/P/+VlZX/WVlZ/xwcHP8cHBz/HBwc/x4eHv/Q0ND//v7+//7+/v9hYWH/AAAA/yUlJf/Dw8P/4ODg//n5+f/29vb//Pz8/+Li4v9MTEz/AAAA/wAAAP8AAAD/ZGRk///////7+/v/MTEx/xUVFf8WFhb/jY2N//7+/v/+/v7//v7+//7+/v/+/v7/+vr6/2FhYf8VFRX/FRUV/zMzM//8/Pz/7+/v/xgYGP8TExP/ExMT/xMTE/+2trb//v7+//7+/v/+/v7//v7+//7+/v/z8/P/JiYm/xMTE/8ZGRn/8PDw/+zs7P8EBAT/AAAA/wAAAP8AAAD/NjY2//39/f/+/v7//v7+//7+/v/+/v7//v7+/zk5Of8AAAD/BgYG/+3t7f/5+fn/FhYW/wAAAP8AAAD/AAAA/wICAv/T09P//v7+//7+/v/+/v7//v7+//7+/v9BQUH/AAAA/xcXF//5+fn//v7+/1FRUf8AAAD/AAAA/wAAAP8AAAD/RUVF//Pz8//+/v7//v7+//7+/v/+/v7/Li4u/wAAAP9UVFT///////////+7u7v/AQEB/wAAAP8AAAD/AAAA/wAAAP8fHx//vLy8//7+/v/+/v7/8/Pz/xEREf8BAQH/vb29/////////////f39/1hYWP8AAAD/AAAA/wAAAP8AAAD/GBgY/15eXv+Li4v/39/f/2tra/8AAAD/W1tb//7+/v/////////////////x8fH/Q0ND/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMDA/8AAAD/RUVF//Ly8v////////////////////////////b29v+EhIT/EhIS/wAAAP8AAAD/AAAA/wAAAP8TExP/hYWF//f39/////////////////////////////////////////////Ly8v+2trb/kJCQ/5CQkP+3t7f/8/Pz////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"hubs": [],
|
||||
"is_podcast": false,
|
||||
"is_push": false,
|
||||
"item_count": 5,
|
||||
"last_updated": "2023-04-02T02:03:11+00:00",
|
||||
"score": 13,
|
||||
"self_url": "https://www.capitolhillseattle.com/feed/",
|
||||
"site_name": "CHS Capitol Hill Seattle News",
|
||||
"site_url": "https://www.capitolhillseattle.com",
|
||||
"title": "CHS Capitol Hill Seattle News",
|
||||
"url": "https://www.capitolhillseattle.com/feed/",
|
||||
"velocity": 1.6,
|
||||
"version": "rss20"
|
||||
}
|
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 272569,
|
||||
"content_type": "text/xml; charset=utf-8",
|
||||
"description": "Audio version of the posts shared in the LessWrong Curated newsletter.",
|
||||
"favicon": "",
|
||||
"favicon_data_uri": "",
|
||||
"hubs": [
|
||||
"https://pubsubhubbub.appspot.com/"
|
||||
],
|
||||
"is_podcast": true,
|
||||
"is_push": true,
|
||||
"item_count": 56,
|
||||
"last_updated": "2023-03-08T08:00:00+00:00",
|
||||
"score": 32,
|
||||
"self_url": "https://feeds.buzzsprout.com/2037297.rss",
|
||||
"site_name": "",
|
||||
"site_url": "",
|
||||
"title": "LessWrong Curated Podcast",
|
||||
"url": "https://feeds.buzzsprout.com/2037297.rss",
|
||||
"velocity": 0.192,
|
||||
"version": "rss20"
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 1377252,
|
||||
"content_type": "application/xml; charset=utf-8",
|
||||
"description": "Andrew Huberman, Ph.D.",
|
||||
"favicon": "",
|
||||
"favicon_data_uri": "",
|
||||
"hubs": [],
|
||||
"is_podcast": true,
|
||||
"is_push": false,
|
||||
"item_count": 129,
|
||||
"last_updated": "2023-03-06T09:00:00+00:00",
|
||||
"score": 14,
|
||||
"self_url": "https://feeds.megaphone.fm/hubermanlab",
|
||||
"site_name": "",
|
||||
"site_url": "",
|
||||
"title": "Huberman Lab",
|
||||
"url": "https://feeds.megaphone.fm/hubermanlab",
|
||||
"velocity": 0.159,
|
||||
"version": "rss20"
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 256360,
|
||||
"content_type": "application/rss+xml; charset=utf-8",
|
||||
"description": "Hosted by Zach Leary, the intent of the podcast is to bring you the listener an easily accessible resource for a variety of topics all related to psychedelic research. There is a lot to learn about new research into the therapeutic potential of psychedelics and marijuana. Over the years, the Multidisciplinary Association for Psychedelic Studies (MAPS) has amassed an incredible treasure trove of audio archives sourced from the amazing talks, presentations and panels that have taken place at past Psychedelic Science conferences and other unique events. By selecting some of that content and then bringing it to you in a podcast we hope to create a centralized location for the greater MAPS community. If you're a researcher, scientist, medical professional or just a curiosity seeker we hope that you'll find this content a valuable resource tool.\n\nPlease visit the MAPS website at https://maps.org",
|
||||
"favicon": "",
|
||||
"favicon_data_uri": "",
|
||||
"hubs": [],
|
||||
"is_podcast": true,
|
||||
"is_push": false,
|
||||
"item_count": 62,
|
||||
"last_updated": "2023-03-06T20:20:00+00:00",
|
||||
"score": 0,
|
||||
"self_url": "https://feeds.libsyn.com/95610/rss",
|
||||
"site_name": "",
|
||||
"site_url": "",
|
||||
"title": "MAPS Podcast",
|
||||
"url": "https://feeds.libsyn.com/95610/rss",
|
||||
"velocity": 0.028,
|
||||
"version": "rss20"
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 242702,
|
||||
"content_type": "application/xml; charset=utf-8",
|
||||
"description": "<p>As long as there’s been oppression, there’ve been people fighting it. This weekly podcast dives into history to drag up the wildest rebels, the most beautiful revolts, and all the people who long to be—and fight to be—free. It explores complex stories of resistance that offer lessons and inspiration for us today, focusing on the ensemble casts that make up each act of history. That is to say, this podcast focuses on Cool People Who Did Cool Stuff.</p>",
|
||||
"favicon": "",
|
||||
"favicon_data_uri": "",
|
||||
"hubs": [],
|
||||
"is_podcast": true,
|
||||
"is_push": false,
|
||||
"item_count": 86,
|
||||
"last_updated": "2023-03-20T04:01:00+00:00",
|
||||
"score": -12,
|
||||
"self_url": "https://www.omnycontent.com/d/playlist/e73c998e-6e60-432f-8610-ae210140c5b1/45bcda9a-4724-45c0-82ca-ae7f00e1dd18/f21245f2-a297-42f7-a016-ae7f00e390c4/podcast.rss",
|
||||
"site_name": "",
|
||||
"site_url": "",
|
||||
"title": "Cool People Who Did Cool Stuff",
|
||||
"url": "https://www.omnycontent.com/d/playlist/e73c998e-6e60-432f-8610-ae210140c5b1/45bcda9a-4724-45c0-82ca-ae7f00e1dd18/f21245f2-a297-42f7-a016-ae7f00e390c4/podcast.rss",
|
||||
"velocity": 0.256,
|
||||
"version": "rss20"
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 13524,
|
||||
"content_type": "application/rss+xml; charset=utf-8",
|
||||
"description": "A Comic",
|
||||
"favicon": "http://www.poorlydrawnlines.com/wp-content/themes/PoorlyDrawnLines/images/favicon.ico",
|
||||
"favicon_data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAE+SURBVDiNnZO9rgFRFIW/Yy4KCldDN4VCQ63STTyAR0BU3kEy8SQeYiIRKq+gkFytZAo/0VBZtxC5Y85McFdymr2Sb6+z9zlG0g/wTUyHwwGAcrkct6I6IumsiHa7nTqdjkqlknK5nBqNhsbjsU6nkxJ0RtI+WgmCQICMMWq323JdV4BarZbCMIwD9hZgNpsJ0Gg0kiRdr1f1+30B6vV6FiATv5TjOABUKhUA8vk8w+EQgPV6bQ3BAki6G5k/KwxDADzPswBfaYDNZsNyuWS73TKZTCgWiwwGA3sP8RnM53MBT6dQKGg6nSZtYW8leER3XZd6vY7neXS7XWq1mt09KcFisRAg3/eTOr7ewkO32y3Nek6cZjyG+W/Au0p9B58kyEYLxpi7kXkrXNYo9p0vlwur1Ypms0m1Wn0FOP4CBWA38rLJ0EUAAAAASUVORK5CYII=",
|
||||
"hubs": [],
|
||||
"is_podcast": false,
|
||||
"is_push": false,
|
||||
"item_count": 10,
|
||||
"last_updated": "2023-03-22T17:51:01+00:00",
|
||||
"score": 12,
|
||||
"self_url": "https://poorlydrawnlines.com/feed/",
|
||||
"site_name": "Poorly Drawn Lines",
|
||||
"site_url": "https://poorlydrawnlines.com",
|
||||
"title": "Poorly Drawn Lines",
|
||||
"url": "https://poorlydrawnlines.com/feed/",
|
||||
"velocity": 0.272,
|
||||
"version": "rss20"
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 560867,
|
||||
"content_type": "application/rss+xml; charset=utf-8",
|
||||
"description": "Listen and learn about different reverse engineering hardware projects and methods as Alvaro (@alvaroprieto) and Jen(@rebelbotjen) talk with guests about their work.",
|
||||
"favicon": "",
|
||||
"favicon_data_uri": "",
|
||||
"hubs": [],
|
||||
"is_podcast": true,
|
||||
"is_push": false,
|
||||
"item_count": 63,
|
||||
"last_updated": "2022-12-30T15:42:48+00:00",
|
||||
"score": 18,
|
||||
"self_url": "https://reverseengineering.libsyn.com/rss",
|
||||
"site_name": "",
|
||||
"site_url": "",
|
||||
"title": "Unnamed Reverse Engineering Podcast",
|
||||
"url": "https://reverseengineering.libsyn.com/rss",
|
||||
"velocity": 0.032,
|
||||
"version": "rss20"
|
||||
}
|
21
modules/data/feeds/sources/thisweek.gnome.org/default.json
Normal file
21
modules/data/feeds/sources/thisweek.gnome.org/default.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"bozo": 0,
|
||||
"content_length": 1250267,
|
||||
"content_type": "text/xml; charset=utf-8",
|
||||
"description": "Recent content on This Week in GNOME",
|
||||
"favicon": "https://thisweek.gnome.org/images/favicon-32x32.png",
|
||||
"favicon_data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABYAAAAWABINkT2gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI5SURBVFiFvdZPiE1RHAfwz/xBxhSTISxYaJSiJAklioWNjYWVhYWUtYRMslEWSv7WkPybsbHSGMmGDUmhyEKihMgsjMQsnjEW597emdt7z7vvvplvnTr3d3/n9/3ec8/vd35MHVqnkAu0YR+eoYQxPMWyZhEswH0M43DmXTuGMF5hXGyWgMEo6A8Tt/h0FfJxnGmEbA160ZU8twvbGgeenrxbgj81BKzNS746IhtIbB2ZoJ8j/6M1yIfyksORKMB3tCT2T5H9cuR/qwr5NyzMBq8nNYaj+Zxonu5GSfjnKdoqxBjBdnypg08XruFA8jwfv5W/IkUH+rAzs77XxC9/g1X1EKc4Fy3enNj2Cnl8qY71nejHk0TMzDzkcCUScCGy92BG3mD/Q3sF2w3sTuZLI/vbaN6NbVgnpN28xFYSDudjYRfiNblwTNiBqxn7VtxRO8/TUcL+RgXACsxN5otxtw7S7PiLlUVEwAbh9OclT8euIuTLheLTKPm4cE4aQgseFSR/qFw5c2NjQfJ3WNQoOZwoQH5PSMtCGGiAeBSHNKn96stJ/kAT2y3YUyfxLxw0CU1nj1BIapG/EErxpCHu+7Ljo3KlTNGNs/iQ+PzE8SIC1qu+C6cq+Fcq1yNFBMDJKgKeY1rG93UFv9tFBUwXrtdKIgaV832T0LRkfbYUFQCzVS/Lo3il8hXd3wzyFJ24WUVEtXtgVjMFpNiB9zWIx4RWLncvmAetQkt2XTh4X/ES5zWhAZlS/AMHdE5EpHwlOQAAAABJRU5ErkJggg==",
|
||||
"hubs": [],
|
||||
"is_podcast": false,
|
||||
"is_push": false,
|
||||
"item_count": 86,
|
||||
"last_updated": "2023-03-10T00:00:00+00:00",
|
||||
"score": 46,
|
||||
"self_url": "https://thisweek.gnome.org/index.xml",
|
||||
"site_name": "This Week in GNOME",
|
||||
"site_url": "https://thisweek.gnome.org",
|
||||
"title": "This Week in GNOME",
|
||||
"url": "https://thisweek.gnome.org/index.xml",
|
||||
"velocity": 0.141,
|
||||
"version": "rss20"
|
||||
}
|
21
modules/data/feeds/sources/xn--gckvb8fzb.com/default.json
Normal file
21
modules/data/feeds/sources/xn--gckvb8fzb.com/default.json
Normal file
File diff suppressed because one or more lines are too long
@@ -5,13 +5,13 @@
|
||||
./feeds.nix
|
||||
./fs
|
||||
./ids.nix
|
||||
./packages.nix
|
||||
./programs.nix
|
||||
./image.nix
|
||||
./nixcache.nix
|
||||
./persist
|
||||
./services
|
||||
./sops.nix
|
||||
./ssh.nix
|
||||
./users.nix
|
||||
];
|
||||
|
||||
_module.args = {
|
||||
|
@@ -189,7 +189,7 @@ let
|
||||
serviceConfig.Type = "oneshot";
|
||||
|
||||
script = wrapper.script;
|
||||
scriptArgs = builtins.concatStringsSep " " wrapper.scriptArgs;
|
||||
scriptArgs = escapeShellArgs wrapper.scriptArgs;
|
||||
|
||||
after = gen-opt.depends;
|
||||
wants = gen-opt.depends;
|
||||
|
@@ -20,9 +20,13 @@ sane-lib = rec {
|
||||
isPrefixOfList = p: l: (lib.sublist 0 (lib.length p) l) == p;
|
||||
|
||||
# merges N attrsets
|
||||
# Type: flattenAttrsList :: [AttrSet] -> AttrSet
|
||||
# Type: joinAttrsets :: [AttrSet] -> AttrSet
|
||||
joinAttrsets = l: lib.foldl' lib.attrsets.unionOfDisjoint {} l;
|
||||
|
||||
# merges N attrsets, recursively
|
||||
# Type: joinAttrsetsRecursive :: [AttrSet] -> AttrSet
|
||||
joinAttrsetsRecursive = l: lib.foldl' (lib.attrsets.recursiveUpdateUntil (path: lhs: rhs: false)) {} l;
|
||||
|
||||
# evaluate a `{ name, value }` pair in the same way that `listToAttrs` does.
|
||||
# Type: nameValueToAttrs :: { name :: String, value :: Any } -> Any
|
||||
nameValueToAttrs = { name, value }: {
|
||||
|
@@ -17,7 +17,7 @@ rec {
|
||||
merged = builtins.map (p: lib.setAttrByPath p (mergeAtPath p discharged)) pathsToMerge;
|
||||
in
|
||||
assert builtins.all (assertNoExtraPaths pathsToMerge) discharged;
|
||||
sane-lib.joinAttrsets merged;
|
||||
sane-lib.joinAttrsetsRecursive merged;
|
||||
|
||||
# `take` is as in mkTypedMerge. this function queries which items `take` is interested in.
|
||||
# for example:
|
||||
|
@@ -1,330 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
with pkgs;
|
||||
let
|
||||
cfg = config.sane.packages;
|
||||
|
||||
imagemagick = pkgs.imagemagick.override {
|
||||
ghostscriptSupport = true;
|
||||
};
|
||||
|
||||
consolePkgs = [
|
||||
backblaze-b2
|
||||
cdrtools
|
||||
dmidecode
|
||||
duplicity
|
||||
efivar
|
||||
flashrom
|
||||
fwupd
|
||||
ghostscript # TODO: imagemagick wrapper should add gs to PATH
|
||||
gnupg
|
||||
gocryptfs
|
||||
gopass
|
||||
gopass-jsonapi
|
||||
ifuse
|
||||
imagemagick
|
||||
ipfs
|
||||
libimobiledevice
|
||||
libsecret # for managing user keyrings
|
||||
lm_sensors # for sensors-detect
|
||||
lshw
|
||||
ffmpeg
|
||||
memtester
|
||||
networkmanager
|
||||
nixpkgs-review
|
||||
# nixos-generators
|
||||
# nettools
|
||||
nmon
|
||||
oathToolkit # for oathtool
|
||||
# ponymix
|
||||
pulsemixer
|
||||
python3
|
||||
rsync
|
||||
# python3Packages.eyeD3 # music tagging
|
||||
sane-scripts
|
||||
sequoia
|
||||
snapper
|
||||
sops
|
||||
speedtest-cli
|
||||
sqlite # to debug sqlite3 databases
|
||||
ssh-to-age
|
||||
sudo
|
||||
# tageditor # music tagging
|
||||
unar
|
||||
visidata
|
||||
w3m
|
||||
wireguard-tools
|
||||
# youtube-dl
|
||||
yt-dlp
|
||||
];
|
||||
|
||||
guiPkgs = [
|
||||
# GUI only
|
||||
aerc # email client
|
||||
audacity
|
||||
celluloid # mpv frontend
|
||||
chromium
|
||||
clinfo
|
||||
{ pkg = dino; private = [ ".local/share/dino" ]; }
|
||||
electrum
|
||||
|
||||
# creds/session keys, etc
|
||||
{ pkg = element-desktop; private = [ ".config/Element" ]; }
|
||||
# `emote` will show a first-run dialog based on what's in this directory.
|
||||
# mostly, it just keeps a LRU of previously-used emotes to optimize display order.
|
||||
# TODO: package [smile](https://github.com/mijorus/smile) for probably a better mobile experience.
|
||||
{ pkg = emote; dir = [ ".local/share/Emote" ]; }
|
||||
evince # works on phosh
|
||||
|
||||
# { pkg = fluffychat-moby; dir = [ ".local/share/chat.fluffy.fluffychat" ]; } # TODO: ship normal fluffychat on non-moby?
|
||||
|
||||
foliate
|
||||
font-manager
|
||||
|
||||
# XXX by default fractal stores its state in ~/.local/share/<UUID>.
|
||||
# after logging in, manually change ~/.local/share/keyrings/... to point it to some predictable subdir.
|
||||
# then reboot (so that libsecret daemon re-loads the keyring...?)
|
||||
# { pkg = fractal-latest; private = [ ".local/share/fractal" ]; }
|
||||
# { pkg = fractal-next; private = [ ".local/share/fractal" ]; }
|
||||
|
||||
gajim # XMPP client
|
||||
gimp # broken on phosh
|
||||
gnome.cheese
|
||||
gnome.dconf-editor
|
||||
gnome-feeds # RSS reader (with claimed mobile support)
|
||||
gnome.file-roller
|
||||
gnome.gnome-disk-utility
|
||||
gnome.gnome-maps # works on phosh
|
||||
gnome.nautilus
|
||||
# gnome-podcasts
|
||||
gnome.gnome-system-monitor
|
||||
gnome.gnome-terminal # works on phosh
|
||||
gnome.gnome-weather
|
||||
|
||||
# XXX: we preserve the whole thing because if we only preserve gPodder/Downloads
|
||||
# then startup is SLOW during feed import, and we might end up with zombie eps in the dl dir.
|
||||
{ pkg = gpodder-configured; dir = [ "gPodder" ]; }
|
||||
|
||||
gthumb
|
||||
inkscape
|
||||
|
||||
kdenlive
|
||||
kid3 # audio tagging
|
||||
kitty
|
||||
krita
|
||||
libreoffice-fresh # XXX colin: maybe don't want this on mobile
|
||||
lollypop
|
||||
|
||||
{ pkg = mpv; dir = [ ".config/mpv/watch_later" ]; }
|
||||
|
||||
networkmanagerapplet
|
||||
|
||||
# not strictly necessary, but allows caching articles; offline use, etc.
|
||||
{ pkg = newsflash; dir = [ ".local/share/news-flash" ]; }
|
||||
|
||||
{ pkg = nheko; private = [
|
||||
".config/nheko" # config file (including client token)
|
||||
".cache/nheko" # media cache
|
||||
".local/share/nheko" # per-account state database
|
||||
]; }
|
||||
|
||||
# settings (electron app)
|
||||
{ pkg = obsidian; dir = [ ".config/obsidian" ]; }
|
||||
|
||||
pavucontrol
|
||||
# picard # music tagging
|
||||
playerctl
|
||||
|
||||
libsForQt5.plasmatube # Youtube player
|
||||
|
||||
soundconverter
|
||||
# sublime music persists any downloaded albums here.
|
||||
# it doesn't obey a conventional ~/Music/{Artist}/{Album}/{Track} notation, so no symlinking
|
||||
# config (e.g. server connection details) is persisted in ~/.config/sublime-music/config.json
|
||||
# possible to pass config as a CLI arg (sublime-music -c config.json)
|
||||
# { pkg = sublime-music; dir = [ ".local/share/sublime-music" ]; }
|
||||
{ pkg = sublime-music-mobile; dir = [ ".local/share/sublime-music" ]; }
|
||||
{ pkg = tdesktop; private = [ ".local/share/TelegramDesktop" ]; } # broken on phosh
|
||||
|
||||
{ pkg = tokodon; private = [ ".cache/KDE/tokodon" ]; }
|
||||
|
||||
# vlc remembers play position in ~/.config/vlc/vlc-qt-interface.conf
|
||||
{ pkg = vlc; dir = [ ".config/vlc" ]; }
|
||||
|
||||
# pleroma client (Electron). input is broken on phosh.
|
||||
{ pkg = whalebird; private = [ ".config/Whalebird" ]; }
|
||||
|
||||
xdg-utils # for xdg-open
|
||||
xterm # broken on phosh
|
||||
]
|
||||
++ (if pkgs.system == "x86_64-linux" then
|
||||
[
|
||||
# x86_64 only
|
||||
|
||||
# creds, but also 200 MB of node modules, etc
|
||||
(let discord = (pkgs.discord.override {
|
||||
# XXX 2022-07-31: fix to allow links to open in default web-browser:
|
||||
# https://github.com/NixOS/nixpkgs/issues/78961
|
||||
nss = pkgs.nss_latest;
|
||||
}); in { pkg = discord; private = [ ".config/discord" ]; })
|
||||
|
||||
# kaiteki # Pleroma client
|
||||
# gnome.zenity # for kaiteki (it will use qarma, kdialog, or zenity)
|
||||
# gpt2tc # XXX: unreliable mirror
|
||||
|
||||
# TODO(unpin): handbrake is broken on aarch64-linux 2023/01/29
|
||||
handbrake
|
||||
|
||||
logseq
|
||||
losslesscut-bin
|
||||
makemkv
|
||||
|
||||
# actual monero blockchain (not wallet/etc; safe to delete, just slow to regenerate)
|
||||
{ pkg = monero-gui; dir = [ ".bitmonero" ]; }
|
||||
|
||||
# creds, media
|
||||
{ pkg = signal-desktop; private = [ ".config/Signal" ]; }
|
||||
|
||||
# creds, widevine .so download. TODO: could easily manage these statically.
|
||||
{ pkg = spotify; dir = [ ".config/spotify" ]; }
|
||||
|
||||
# hardenedMalloc solves a crash at startup
|
||||
(tor-browser-bundle-bin.override { useHardenedMalloc = false; })
|
||||
|
||||
# zcash coins. safe to delete, just slow to regenerate (10-60 minutes)
|
||||
{ pkg = zecwallet-lite; private = [ ".zcash" ]; }
|
||||
] else []);
|
||||
|
||||
# general-purpose utilities that we want any user to be able to access
|
||||
# (specifically: root, in case of rescue)
|
||||
systemPkgs = [
|
||||
btrfs-progs
|
||||
cacert.unbundled # some services require unbundled /etc/ssl/certs
|
||||
cryptsetup
|
||||
dig
|
||||
efibootmgr
|
||||
fatresize
|
||||
fd
|
||||
file
|
||||
gawk
|
||||
git
|
||||
gptfdisk
|
||||
hdparm
|
||||
htop
|
||||
iftop
|
||||
inetutils # for telnet
|
||||
iotop
|
||||
iptables
|
||||
jq
|
||||
killall
|
||||
lsof
|
||||
nano
|
||||
netcat
|
||||
nethogs
|
||||
nmap
|
||||
openssl
|
||||
parted
|
||||
pciutils
|
||||
powertop
|
||||
pstree
|
||||
ripgrep
|
||||
screen
|
||||
smartmontools
|
||||
socat
|
||||
strace
|
||||
tcpdump
|
||||
tree
|
||||
usbutils
|
||||
wget
|
||||
];
|
||||
|
||||
# useful devtools:
|
||||
devPkgs = [
|
||||
bison
|
||||
dtc
|
||||
flex
|
||||
gcc
|
||||
gdb
|
||||
# gcc-arm-embedded
|
||||
# gcc_multi
|
||||
gnumake
|
||||
mercurial
|
||||
mix2nix
|
||||
rustup
|
||||
swig
|
||||
];
|
||||
|
||||
pkgSpec = types.submodule {
|
||||
options = {
|
||||
pkg = mkOption {
|
||||
type = types.package;
|
||||
};
|
||||
dir = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "list of home-relative paths to persist for this package";
|
||||
};
|
||||
private = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "list of home-relative paths to persist (in encrypted format) for this package";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
toPkgSpec = types.coercedTo types.package (p: { pkg = p; }) pkgSpec;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
# packages to deploy to the user's home
|
||||
sane.packages.extraUserPkgs = mkOption {
|
||||
default = [ ];
|
||||
type = types.listOf toPkgSpec;
|
||||
};
|
||||
sane.packages.extraGuiPkgs = mkOption {
|
||||
default = [ ];
|
||||
type = types.listOf toPkgSpec;
|
||||
description = "packages to only ship if gui's enabled";
|
||||
};
|
||||
sane.packages.enableConsolePkgs = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
sane.packages.enableGuiPkgs = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
sane.packages.enableDevPkgs = mkOption {
|
||||
description = ''
|
||||
enable packages that are useful for building other software by hand.
|
||||
you should prefer to keep this disabled except when prototyping, e.g. packaging new software.
|
||||
'';
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
sane.packages.enableSystemPkgs = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = "enable system-wide packages";
|
||||
};
|
||||
|
||||
sane.packages.enabledUserPkgs = mkOption {
|
||||
default = cfg.extraUserPkgs
|
||||
++ (if cfg.enableConsolePkgs then consolePkgs else [])
|
||||
++ (if cfg.enableGuiPkgs then guiPkgs ++ cfg.extraGuiPkgs else [])
|
||||
++ (if cfg.enableDevPkgs then devPkgs else [])
|
||||
;
|
||||
type = types.listOf toPkgSpec;
|
||||
description = "generated from other config options";
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
environment.systemPackages = mkIf cfg.enableSystemPkgs systemPkgs;
|
||||
sane.persist.home.plaintext = concatLists (map (p: p.dir) cfg.enabledUserPkgs);
|
||||
sane.persist.home.private = concatLists (map (p: p.private) cfg.enabledUserPkgs);
|
||||
# XXX: this might not be necessary. try removing this and cacert.unbundled?
|
||||
environment.etc."ssl/certs".source = mkIf cfg.enableSystemPkgs "${pkgs.cacert.unbundled}/etc/ssl/certs/*";
|
||||
};
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
{ config, lib, sane-lib, ... }:
|
||||
|
||||
let
|
||||
path = sane-lib.path;
|
||||
cfg = config.sane.persist;
|
||||
|
||||
withPrefix = relativeTo: entries: lib.mapAttrs' (fspath: value: {
|
||||
name = path.concat [ relativeTo fspath ];
|
||||
inherit value;
|
||||
}) entries;
|
||||
in
|
||||
{
|
||||
# merge the `byPath` mappings from both `home` and `sys` into one namespace
|
||||
sane.persist.byPath = lib.mkMerge [
|
||||
(withPrefix "/home/colin" cfg.home.byPath)
|
||||
(withPrefix "/" cfg.sys.byPath)
|
||||
];
|
||||
}
|
@@ -124,6 +124,9 @@ let
|
||||
# <option>.private.".cache/vim" = { mode = "0700"; };
|
||||
# to place ".cache/vim" into the private store and create with the appropriate mode
|
||||
dirsSubModule = types.submodule ({ config, ... }: {
|
||||
# TODO: this should be a plain-old `attrsOf (convertInlineAcl entryInStoreOrShorthand)` with downstream checks,
|
||||
# rather than being filled in based on *other* settings.
|
||||
# otherwise, it behaves poorly when `sane.persist.enable = false`
|
||||
options = lib.attrsets.unionOfDisjoint
|
||||
(mapAttrs (store: store-cfg: mkOption {
|
||||
default = [];
|
||||
@@ -179,23 +182,11 @@ in
|
||||
type = types.bool;
|
||||
description = "define / fs root to be a tmpfs. make sure to mount some other device to /nix";
|
||||
};
|
||||
sane.persist.home = mkOption {
|
||||
description = "directories to persist to disk, relative to a user's home ~";
|
||||
default = {};
|
||||
type = dirsSubModule;
|
||||
};
|
||||
sane.persist.sys = mkOption {
|
||||
description = "directories to persist to disk, relative to the fs root /";
|
||||
default = {};
|
||||
type = dirsSubModule;
|
||||
};
|
||||
sane.persist.byPath = mkOption {
|
||||
type = types.attrsOf (convertInlineAcl entryAtPath);
|
||||
description = ''
|
||||
map of <path> => <path config> for all paths to be persisted.
|
||||
this is computed from the other options, but users can also set it explicitly (useful for overriding)
|
||||
'';
|
||||
};
|
||||
sane.persist.stores = mkOption {
|
||||
type = types.attrsOf storeType;
|
||||
default = {};
|
||||
@@ -206,7 +197,6 @@ in
|
||||
};
|
||||
|
||||
imports = [
|
||||
./computed.nix
|
||||
./root-on-tmpfs.nix
|
||||
./stores
|
||||
];
|
||||
@@ -247,7 +237,7 @@ in
|
||||
);
|
||||
}
|
||||
];
|
||||
configs = lib.mapAttrsToList cfgFor cfg.byPath;
|
||||
configs = lib.mapAttrsToList cfgFor cfg.sys.byPath;
|
||||
take = f: { sane.fs = f.sane.fs; };
|
||||
in mkIf cfg.enable (
|
||||
take (sane-lib.mkTypedMerge take configs)
|
||||
|
@@ -1,14 +1,10 @@
|
||||
{ config, lib, pkgs, utils, ... }:
|
||||
{ config, lib, pkgs, sane-lib, utils, ... }:
|
||||
|
||||
let
|
||||
store = rec {
|
||||
device = "/mnt/persist/crypt/clearedonboot";
|
||||
underlying = {
|
||||
path = "/nix/persist/crypt/clearedonboot";
|
||||
# TODO: consider moving this to /tmp, but that requires tmp be mounted first?
|
||||
key = "/mnt/persist/crypt/clearedonboot.key";
|
||||
};
|
||||
};
|
||||
persist-base = config.sane.persist.stores."plaintext".origin;
|
||||
device = config.sane.persist.stores."cryptClearOnBoot".origin;
|
||||
key = "${device}.key";
|
||||
underlying = sane-lib.path.concat [ persist-base "crypt/clearedonboot" ];
|
||||
in
|
||||
lib.mkIf config.sane.persist.enable
|
||||
{
|
||||
@@ -17,35 +13,35 @@ lib.mkIf config.sane.persist.enable
|
||||
stored to disk, but encrypted to an in-memory key and cleared on every boot
|
||||
so that it's unreadable after power-off
|
||||
'';
|
||||
origin = store.device;
|
||||
origin = lib.mkDefault "/mnt/persist/crypt/clearedonboot";
|
||||
};
|
||||
|
||||
|
||||
fileSystems."${store.device}" = {
|
||||
device = store.underlying.path;
|
||||
fileSystems."${device}" = {
|
||||
device = underlying;
|
||||
fsType = "fuse.gocryptfs";
|
||||
options = [
|
||||
"nodev"
|
||||
"nosuid"
|
||||
"allow_other"
|
||||
"passfile=${store.underlying.key}"
|
||||
"passfile=${key}"
|
||||
"defaults"
|
||||
];
|
||||
noCheck = true;
|
||||
};
|
||||
# let sane.fs know about our fileSystem and automatically add the appropriate dependencies
|
||||
sane.fs."${store.device}".mount = {
|
||||
sane.fs."${device}".mount = {
|
||||
# technically the dependency on the keyfile is extraneous because that *happens* to
|
||||
# be needed to init the store.
|
||||
depends = let
|
||||
cryptfile = config.sane.fs."${store.underlying.path}/gocryptfs.conf";
|
||||
keyfile = config.sane.fs."${store.underlying.key}";
|
||||
cryptfile = config.sane.fs."${underlying}/gocryptfs.conf";
|
||||
keyfile = config.sane.fs."${key}";
|
||||
in [ keyfile.unit cryptfile.unit ];
|
||||
};
|
||||
|
||||
# let sane.fs know how to initialize the gocryptfs store,
|
||||
# and that it MUST do so
|
||||
sane.fs."${store.underlying.path}/gocryptfs.conf".generated = {
|
||||
sane.fs."${underlying}/gocryptfs.conf".generated = {
|
||||
script.script = ''
|
||||
backing="$1"
|
||||
passfile="$2"
|
||||
@@ -54,17 +50,17 @@ lib.mkIf config.sane.persist.enable
|
||||
rm -rf "''${backing:?}"/*
|
||||
${pkgs.gocryptfs}/bin/gocryptfs -quiet -passfile "$passfile" -init "$backing"
|
||||
'';
|
||||
script.scriptArgs = [ store.underlying.path store.underlying.key ];
|
||||
script.scriptArgs = [ underlying key ];
|
||||
# we need the key in order to initialize the store
|
||||
depends = [ config.sane.fs."${store.underlying.key}".unit ];
|
||||
depends = [ config.sane.fs."${key}".unit ];
|
||||
};
|
||||
|
||||
# let sane.fs know how to generate the key for gocryptfs
|
||||
sane.fs."${store.underlying.key}".generated = {
|
||||
sane.fs."${key}".generated = {
|
||||
script.script = ''
|
||||
dd if=/dev/random bs=128 count=1 | base64 --wrap=0 > "$1"
|
||||
'';
|
||||
script.scriptArgs = [ store.underlying.key ];
|
||||
script.scriptArgs = [ key ];
|
||||
# no need for anyone else to be able to read the key
|
||||
acl.mode = "0400";
|
||||
};
|
||||
|
@@ -3,7 +3,7 @@
|
||||
let
|
||||
cfg = config.sane.persist;
|
||||
in lib.mkIf cfg.enable {
|
||||
sane.persist.stores."plaintext" = {
|
||||
sane.persist.stores."plaintext" = lib.mkDefault {
|
||||
origin = "/nix/persist";
|
||||
};
|
||||
# TODO: needed?
|
||||
|
@@ -1,21 +1,23 @@
|
||||
{ config, lib, pkgs, utils, ... }:
|
||||
{ config, lib, pkgs, sane-lib, utils, ... }:
|
||||
|
||||
let
|
||||
persist-base = config.sane.persist.stores."plaintext".origin;
|
||||
private-dir = config.sane.persist.stores."private".origin;
|
||||
private-backing-dir = sane-lib.path.concat [ persist-base private-dir ];
|
||||
in
|
||||
lib.mkIf config.sane.persist.enable
|
||||
{
|
||||
sane.persist.stores."private" = {
|
||||
storeDescription = ''
|
||||
encrypted to the user's password and auto-unlocked at login
|
||||
encrypted store which persists across boots.
|
||||
typical use case is for the user to encrypt this store using their login password so that it
|
||||
can be auto-unlocked at login.
|
||||
'';
|
||||
origin = "/home/colin/private";
|
||||
# files stored under here *must* have the /home/colin prefix.
|
||||
# internally, this prefix is removed so that e.g.
|
||||
# /home/colin/foo/bar when stored in `private` is visible at
|
||||
# /home/colin/private/foo/bar
|
||||
prefix = "/home/colin";
|
||||
origin = lib.mkDefault "/mnt/private";
|
||||
defaultOrdering = let
|
||||
private-unit = config.sane.fs."/home/colin/private".unit;
|
||||
private-unit = config.sane.fs."${private-dir}".unit;
|
||||
in {
|
||||
# auto create only after ~/private is mounted
|
||||
# auto create only after the store is mounted
|
||||
wantedBy = [ private-unit ];
|
||||
# we can't create things in private before local-fs.target
|
||||
wantedBeforeBy = [ ];
|
||||
@@ -23,13 +25,13 @@ lib.mkIf config.sane.persist.enable
|
||||
defaultMethod = "symlink";
|
||||
};
|
||||
|
||||
fileSystems."/home/colin/private" = {
|
||||
device = "/nix/persist/home/colin/private";
|
||||
fileSystems."${private-dir}" = {
|
||||
device = private-backing-dir;
|
||||
fsType = "fuse.gocryptfs";
|
||||
options = [
|
||||
"noauto" # don't try to mount, until the user logs in!
|
||||
"nofail"
|
||||
"allow_other" # root ends up being the user that mounts this, so need to make it visible to `colin`.
|
||||
"allow_other" # root ends up being the user that mounts this, so need to make it visible to other users.
|
||||
"nodev"
|
||||
"nosuid"
|
||||
"quiet"
|
||||
@@ -39,9 +41,9 @@ lib.mkIf config.sane.persist.enable
|
||||
};
|
||||
|
||||
# let sane.fs know about the mount
|
||||
sane.fs."/home/colin/private".mount = {};
|
||||
sane.fs."${private-dir}".mount = {};
|
||||
# it also needs to know that the underlying device is an ordinary folder
|
||||
sane.fs."/nix/persist/home/colin/private".dir = {};
|
||||
sane.fs."${private-backing-dir}".dir = {};
|
||||
|
||||
# TODO: could add this *specifically* to the .mount file for the encrypted fs?
|
||||
system.fsPackages = [ pkgs.gocryptfs ]; # fuse needs to find gocryptfs
|
||||
|
133
modules/programs.nix
Normal file
133
modules/programs.nix
Normal file
@@ -0,0 +1,133 @@
|
||||
{ config, lib, pkgs, sane-lib, ... }:
|
||||
let
|
||||
inherit (builtins) any elem map;
|
||||
inherit (lib)
|
||||
filterAttrs
|
||||
hasAttrByPath
|
||||
getAttrFromPath
|
||||
mapAttrs
|
||||
mapAttrsToList
|
||||
mkDefault
|
||||
mkIf
|
||||
mkMerge
|
||||
mkOption
|
||||
optional
|
||||
optionalAttrs
|
||||
splitString
|
||||
types
|
||||
;
|
||||
inherit (sane-lib) joinAttrsets;
|
||||
cfg = config.sane.programs;
|
||||
pkgSpec = types.submodule ({ name, ... }: {
|
||||
options = {
|
||||
package = mkOption {
|
||||
type = types.nullOr types.package;
|
||||
description = ''
|
||||
package, or `null` if the program is some sort of meta set (in which case it much EXPLICITLY be set null).
|
||||
'';
|
||||
default =
|
||||
let
|
||||
pkgPath = splitString "." name;
|
||||
in
|
||||
# package can be inferred by the attr name, allowing shorthand like
|
||||
# `sane.programs.nano.enable = true;`
|
||||
# this indexing will throw if the package doesn't exist and the user forgets to specify
|
||||
# a valid source explicitly.
|
||||
getAttrFromPath pkgPath pkgs;
|
||||
};
|
||||
enableFor.system = mkOption {
|
||||
type = types.bool;
|
||||
default = any (en: en) (
|
||||
mapAttrsToList
|
||||
(otherName: otherPkg:
|
||||
otherName != name && elem name otherPkg.suggestedPrograms && otherPkg.enableSuggested && otherPkg.enableFor.system
|
||||
)
|
||||
cfg
|
||||
);
|
||||
description = ''
|
||||
place this program on the system PATH
|
||||
'';
|
||||
};
|
||||
enableFor.user = mkOption {
|
||||
type = types.attrsOf types.bool;
|
||||
default = joinAttrsets (mapAttrsToList (otherName: otherPkg:
|
||||
optionalAttrs
|
||||
(otherName != name && elem name otherPkg.suggestedPrograms && otherPkg.enableSuggested)
|
||||
(filterAttrs (user: en: en) otherPkg.enableFor.user)
|
||||
) cfg);
|
||||
description = ''
|
||||
place this program on the PATH for some specified user(s).
|
||||
'';
|
||||
};
|
||||
suggestedPrograms = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = ''
|
||||
list of other programs a user may want to enable alongside this one.
|
||||
for example, the gnome desktop environment would suggest things like its settings app.
|
||||
'';
|
||||
};
|
||||
enableSuggested = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
dir = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "list of home-relative paths to persist for this package";
|
||||
};
|
||||
private = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "list of home-relative paths to persist (in encrypted format) for this package";
|
||||
};
|
||||
};
|
||||
|
||||
});
|
||||
toPkgSpec = types.coercedTo types.package (p: { package = p; }) pkgSpec;
|
||||
|
||||
configs = mapAttrsToList (name: p: {
|
||||
assertions = map (sug: {
|
||||
assertion = cfg ? "${sug}";
|
||||
message = ''program "${sug}" referenced by "${name}", but not defined'';
|
||||
}) p.suggestedPrograms;
|
||||
|
||||
# conditionally add to system PATH
|
||||
environment.systemPackages = optional
|
||||
(p.package != null && p.enableFor.system)
|
||||
p.package;
|
||||
# conditionally add to user(s) PATH
|
||||
users.users = mapAttrs (user: en: {
|
||||
packages = optional (p.package != null && en) p.package;
|
||||
}) p.enableFor.user;
|
||||
# conditionally persist relevant user dirs
|
||||
sane.users = mapAttrs (user: en: optionalAttrs en {
|
||||
persist.plaintext = p.dir;
|
||||
persist.private = p.private;
|
||||
}) p.enableFor.user;
|
||||
}) cfg;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
sane.programs = mkOption {
|
||||
type = types.attrsOf toPkgSpec;
|
||||
default = {};
|
||||
};
|
||||
};
|
||||
|
||||
config =
|
||||
let
|
||||
take = f: {
|
||||
assertions = f.assertions;
|
||||
environment.systemPackages = f.environment.systemPackages;
|
||||
users.users = f.users.users;
|
||||
sane.users = f.sane.users;
|
||||
};
|
||||
in mkMerge [
|
||||
(take (sane-lib.mkTypedMerge take configs))
|
||||
{
|
||||
# expose the pkgs -- as available to the system -- as a build target.
|
||||
system.build.pkgs = pkgs;
|
||||
}
|
||||
];
|
||||
}
|
@@ -1,7 +1,6 @@
|
||||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./duplicity.nix
|
||||
./dyn-dns.nix
|
||||
./kiwix-serve.nix
|
||||
./mautrix-signal.nix
|
||||
|
@@ -3,6 +3,11 @@
|
||||
with lib;
|
||||
let
|
||||
cfg = config.sane.services.dyn-dns;
|
||||
getIp = pkgs.writeShellScript "dyn-dns-query-wan" ''
|
||||
# preferred method and fallback
|
||||
${pkgs.sane-scripts}/bin/sane-ip-check-router-wan || \
|
||||
${pkgs.sane-scripts}/bin/sane-ip-check
|
||||
'';
|
||||
in
|
||||
{
|
||||
options = {
|
||||
@@ -19,7 +24,7 @@ in
|
||||
};
|
||||
|
||||
ipCmd = mkOption {
|
||||
default = "${pkgs.sane-scripts}/bin/sane-ip-check-router-wan";
|
||||
default = "${getIp}";
|
||||
type = types.path;
|
||||
description = "command to run to query the current WAN IP";
|
||||
};
|
||||
|
@@ -7,7 +7,20 @@ with lib;
|
||||
let
|
||||
cfg = config.sane.services.trust-dns;
|
||||
toml = pkgs.formats.toml { };
|
||||
fmtRecord = proto: rrtype: name: value: "${name}\t${proto}\t${rrtype}\t${value}";
|
||||
recordFormatters = {
|
||||
# quote rules for zone files:
|
||||
# - any character may be encoded by `\DDD`, where `DDD` represents its ascii value in base 8.
|
||||
# - any non-digit `X` may be encoded by `\X`.
|
||||
# - stated in: <https://www.ietf.org/rfc/rfc1035.txt>: 5.1 Format
|
||||
# - visible in <trust-dns:crates/proto/src/serialize/txt/zone_lex.rs:escape_seq>
|
||||
# for us, we can just replace `\` => `\\ and `"` -> `\"`
|
||||
TXT = value: "\"" + (lib.escape [ "\\" "\"" ] value) + "\"";
|
||||
};
|
||||
fmtRecord = proto: rrtype: name: value:
|
||||
let
|
||||
formatter = recordFormatters."${rrtype}" or lib.id;
|
||||
in
|
||||
"${name}\t${proto}\t${rrtype}\t${formatter value}";
|
||||
fmtRecordList = proto: rrtype: name: values: concatStringsSep
|
||||
"\n"
|
||||
(map (fmtRecord proto rrtype name) values)
|
||||
|
110
modules/users.nix
Normal file
110
modules/users.nix
Normal file
@@ -0,0 +1,110 @@
|
||||
{ config, lib, options, sane-lib, ... }:
|
||||
|
||||
let
|
||||
inherit (builtins) attrValues;
|
||||
inherit (lib) count mapAttrs' mapAttrsToList mkIf mkMerge mkOption types;
|
||||
sane-user-cfg = config.sane.user;
|
||||
cfg = config.sane.users;
|
||||
path-lib = sane-lib.path;
|
||||
userOptions = {
|
||||
options = {
|
||||
fs = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
description = ''
|
||||
entries to pass onto `sane.fs` after prepending the user's home-dir to the path.
|
||||
e.g. `sane.users.colin.fs."/.config/aerc" = X`
|
||||
=> `sane.fs."/home/colin/.config/aerc" = X;
|
||||
'';
|
||||
};
|
||||
|
||||
persist = mkOption {
|
||||
type = options.sane.persist.sys.type;
|
||||
default = {};
|
||||
description = ''
|
||||
entries to pass onto `sane.persist.sys` after prepending the user's home-dir to the path.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
userModule = types.submodule ({ name, config, ... }: {
|
||||
options = userOptions.options // {
|
||||
default = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
only one default user may exist.
|
||||
this option determines what the `sane.user` shorthand evaluates to.
|
||||
'';
|
||||
};
|
||||
|
||||
home = mkOption {
|
||||
type = types.str;
|
||||
# XXX: we'd prefer to set this to `config.users.users.home`, but that causes infinite recursion...
|
||||
# TODO: maybe assert that this matches the actual home?
|
||||
default = "/home/${name}";
|
||||
};
|
||||
};
|
||||
|
||||
# if we're the default user, inherit whatever settings were routed to the default user
|
||||
config = mkIf config.default sane-user-cfg;
|
||||
});
|
||||
processUser = user: defn:
|
||||
let
|
||||
prefixWithHome = mapAttrs' (path: value: {
|
||||
name = path-lib.concat [ defn.home path ];
|
||||
inherit value;
|
||||
});
|
||||
in
|
||||
{
|
||||
sane.fs = prefixWithHome defn.fs;
|
||||
|
||||
# `byPath` is the actual output here, computed from the other keys.
|
||||
sane.persist.sys.byPath = prefixWithHome defn.persist.byPath;
|
||||
};
|
||||
in
|
||||
{
|
||||
options = {
|
||||
sane.users = mkOption {
|
||||
type = types.attrsOf userModule;
|
||||
default = {};
|
||||
description = ''
|
||||
options to apply to the given user.
|
||||
the user is expected to be created externally.
|
||||
configs applied at this level are simply transformed and then merged
|
||||
into the toplevel `sane` options. it's merely a shorthand.
|
||||
'';
|
||||
};
|
||||
|
||||
sane.user = mkOption {
|
||||
type = types.nullOr (types.submodule userOptions);
|
||||
default = null;
|
||||
description = ''
|
||||
options to pass down to the default user
|
||||
'';
|
||||
};
|
||||
};
|
||||
config =
|
||||
let
|
||||
configs = mapAttrsToList processUser cfg;
|
||||
num-default-users = count (u: u.default) (attrValues cfg);
|
||||
take = f: {
|
||||
sane.fs = f.sane.fs;
|
||||
sane.persist.sys.byPath = f.sane.persist.sys.byPath;
|
||||
};
|
||||
in mkMerge [
|
||||
(take (sane-lib.mkTypedMerge take configs))
|
||||
{
|
||||
assertions = [
|
||||
{
|
||||
assertion = sane-user-cfg == null || num-default-users != 0;
|
||||
message = "cannot set `sane.user` without first setting `sane.users.<user>.default = true` for some user";
|
||||
}
|
||||
{
|
||||
assertion = num-default-users <= 1;
|
||||
message = "cannot set more than one default user";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
@@ -1,78 +0,0 @@
|
||||
diff --git a/pkgs/applications/networking/instant-messengers/signald/0001-Fetch-buildconfig-during-gradle-build-inside-Nix-FOD.patch b/pkgs/applications/networking/instant-messengers/signald/0001-Fetch-buildconfig-during-gradle-build-inside-Nix-FOD.patch
|
||||
index 1d9ca8d838d..d2cf9dd4315 100644
|
||||
--- a/pkgs/applications/networking/instant-messengers/signald/0001-Fetch-buildconfig-during-gradle-build-inside-Nix-FOD.patch
|
||||
+++ b/pkgs/applications/networking/instant-messengers/signald/0001-Fetch-buildconfig-during-gradle-build-inside-Nix-FOD.patch
|
||||
@@ -11,25 +11,15 @@ diff --git a/build.gradle b/build.gradle
|
||||
index 799e782..caceaac 100644
|
||||
--- a/build.gradle
|
||||
+++ b/build.gradle
|
||||
-@@ -83,6 +83,9 @@ static String getVersion() {
|
||||
-
|
||||
- repositories {
|
||||
- maven {url "https://gitlab.com/api/v4/groups/6853927/-/packages/maven"} // https://gitlab.com/groups/signald/-/packages
|
||||
-+ maven {
|
||||
-+ url "https://plugins.gradle.org/m2/"
|
||||
-+ }
|
||||
- mavenCentral()
|
||||
- }
|
||||
-
|
||||
-@@ -104,6 +107,8 @@ dependencies {
|
||||
- implementation 'io.prometheus:simpleclient_httpserver:0.16.0'
|
||||
- implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'
|
||||
- implementation 'io.sentry:sentry:6.4.0'
|
||||
-+ implementation 'com.github.gmazzo.buildconfig:com.github.gmazzo.buildconfig.gradle.plugin:3.1.0'
|
||||
-+ implementation 'org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10'
|
||||
- testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
|
||||
+@@ -87,7 +86,7 @@ repositories {
|
||||
}
|
||||
|
||||
+ dependencies {
|
||||
+- implementation 'org.signald:signal-service-java-' + getTarget() + ':2.15.3_unofficial_50_signald_1'
|
||||
++ implementation 'org.signald:signal-service-java-' + getTarget() + ':2.15.3_unofficial_50_signald_2'
|
||||
+ implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
|
||||
+ implementation 'com.kohlschutter.junixsocket:junixsocket-common:2.6.1'
|
||||
+ implementation 'com.kohlschutter.junixsocket:junixsocket-native-common:2.6.1'
|
||||
@@ -171,4 +176,4 @@ allprojects {
|
||||
runtime {
|
||||
options = ['--strip-java-debug-attributes', '--compress', '2', '--no-header-files', '--no-man-pages']
|
||||
diff --git a/pkgs/applications/networking/instant-messengers/signald/0002-buildconfig-local-deps-fixes.patch b/pkgs/applications/networking/instant-messengers/signald/0002-buildconfig-local-deps-fixes.patch
|
||||
index 96a7d6d2ef3..2f0f6e73159 100644
|
||||
--- a/pkgs/applications/networking/instant-messengers/signald/0002-buildconfig-local-deps-fixes.patch
|
||||
+++ b/pkgs/applications/networking/instant-messengers/signald/0002-buildconfig-local-deps-fixes.patch
|
||||
@@ -47,15 +47,15 @@ index 799e782..6ecef3e 100644
|
||||
}
|
||||
|
||||
dependencies {
|
||||
-@@ -104,6 +117,8 @@ dependencies {
|
||||
- implementation 'io.prometheus:simpleclient_httpserver:0.16.0'
|
||||
- implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'
|
||||
- implementation 'io.sentry:sentry:6.4.0'
|
||||
-+ implementation 'com.github.gmazzo.buildconfig:com.github.gmazzo.buildconfig.gradle.plugin:3.1.0'
|
||||
-+ implementation 'org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10'
|
||||
- testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
|
||||
+@@ -87,7 +86,7 @@ repositories {
|
||||
}
|
||||
|
||||
+ dependencies {
|
||||
+- implementation 'org.signald:signal-service-java-' + getTarget() + ':2.15.3_unofficial_50_signald_1'
|
||||
++ implementation 'org.signald:signal-service-java-' + getTarget() + ':2.15.3_unofficial_50_signald_2'
|
||||
+ implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
|
||||
+ implementation 'com.kohlschutter.junixsocket:junixsocket-common:2.6.1'
|
||||
+ implementation 'com.kohlschutter.junixsocket:junixsocket-native-common:2.6.1'
|
||||
@@ -167,8 +182,3 @@ allprojects {
|
||||
}
|
||||
}
|
||||
diff --git a/pkgs/applications/networking/instant-messengers/signald/default.nix b/pkgs/applications/networking/instant-messengers/signald/default.nix
|
||||
index a9e023cdf63..8847707e137 100644
|
||||
--- a/pkgs/applications/networking/instant-messengers/signald/default.nix
|
||||
+++ b/pkgs/applications/networking/instant-messengers/signald/default.nix
|
||||
@@ -54,8 +54,8 @@ let
|
||||
outputHashMode = "recursive";
|
||||
# Downloaded jars differ by platform
|
||||
outputHash = {
|
||||
- x86_64-linux = "sha256-ANiNDdTuCuDEH5zUPsrVF6Uegdq3zVsMv+uMtYRX0jE=";
|
||||
- aarch64-linux = "sha256-V9zn4v/ZeLELAwFJ5y7OVAeJwZp4DmHm4KWxE6KpwGs=";
|
||||
+ x86_64-linux = "sha256-B2T8bM8xdob5507oS1CVO+sszEg9VWL8QKUEanIlXvk=";
|
||||
+ aarch64-linux = "sha256-I314eLUQP8HPbwc+10ZDKzcn9WsqLGuBtfoiCEYZRck=";
|
||||
}.${stdenv.system} or (throw "Unsupported platform");
|
||||
};
|
22
nixpatches/2023-01-30-mesa-cma-leak.patch
Normal file
22
nixpatches/2023-01-30-mesa-cma-leak.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
diff --git a/pkgs/development/libraries/mesa/default.nix b/pkgs/development/libraries/mesa/default.nix
|
||||
index 56fa74e5c0c..3573bb0af49 100644
|
||||
--- a/pkgs/development/libraries/mesa/default.nix
|
||||
+++ b/pkgs/development/libraries/mesa/default.nix
|
||||
@@ -88,7 +88,7 @@
|
||||
let
|
||||
# Release calendar: https://www.mesa3d.org/release-calendar.html
|
||||
# Release frequency: https://www.mesa3d.org/releasing.html#schedule
|
||||
- version = "22.3.4";
|
||||
+ version = "22.3.2";
|
||||
branch = lib.versions.major version;
|
||||
|
||||
withLibdrm = lib.meta.availableOn stdenv.hostPlatform libdrm;
|
||||
@@ -120,7 +120,7 @@ self = stdenv.mkDerivation {
|
||||
"ftp://ftp.freedesktop.org/pub/mesa/${version}/mesa-${version}.tar.xz"
|
||||
"ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz"
|
||||
];
|
||||
- sha256 = "37a1ddaf03f41919ee3c89c97cff41e87de96e00e9d3247959cc8279d8294593";
|
||||
+ sha256 = "c15df758a8795f53e57f2a228eb4593c22b16dffd9b38f83901f76cd9533140b";
|
||||
};
|
||||
|
||||
# TODO:
|
23
nixpatches/2023-02-28-mesa-22.3.6.patch
Normal file
23
nixpatches/2023-02-28-mesa-22.3.6.patch
Normal file
@@ -0,0 +1,23 @@
|
||||
diff --git a/pkgs/development/libraries/mesa/default.nix b/pkgs/development/libraries/mesa/default.nix
|
||||
index 52633a6d21649..20d839b74c2ea 100644
|
||||
--- a/pkgs/development/libraries/mesa/default.nix
|
||||
+++ b/pkgs/development/libraries/mesa/default.nix
|
||||
@@ -88,7 +88,7 @@
|
||||
let
|
||||
# Release calendar: https://www.mesa3d.org/release-calendar.html
|
||||
# Release frequency: https://www.mesa3d.org/releasing.html#schedule
|
||||
- version = "22.3.5";
|
||||
+ version = "22.3.6";
|
||||
branch = lib.versions.major version;
|
||||
|
||||
withLibdrm = lib.meta.availableOn stdenv.hostPlatform libdrm;
|
||||
@@ -120,7 +120,7 @@ self = stdenv.mkDerivation {
|
||||
"ftp://ftp.freedesktop.org/pub/mesa/${version}/mesa-${version}.tar.xz"
|
||||
"ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz"
|
||||
];
|
||||
- sha256 = "3eed2ecae2bc674494566faab9fcc9beb21cd804c7ba2b59a1694f3d7236e6a9";
|
||||
+ hash = "sha256-TsjsZdvbHulETbpylwiQEooZVDpYzwWTG9b1TxJOEX8=";
|
||||
};
|
||||
|
||||
# TODO:
|
||||
|
34
nixpatches/2023-03-03-qtbase-cross-compile.patch
Normal file
34
nixpatches/2023-03-03-qtbase-cross-compile.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
diff --git a/pkgs/development/libraries/qt-6/modules/qtbase.nix b/pkgs/development/libraries/qt-6/modules/qtbase.nix
|
||||
index e71b0a7613d..72779ac57a5 100644
|
||||
--- a/pkgs/development/libraries/qt-6/modules/qtbase.nix
|
||||
+++ b/pkgs/development/libraries/qt-6/modules/qtbase.nix
|
||||
@@ -5,6 +5,7 @@
|
||||
, version
|
||||
, coreutils
|
||||
, bison
|
||||
+, buildPackages
|
||||
, flex
|
||||
, gdb
|
||||
, gperf
|
||||
@@ -224,6 +225,8 @@ stdenv.mkDerivation rec {
|
||||
] ++ lib.optionals stdenv.isDarwin [
|
||||
# error: 'path' is unavailable: introduced in macOS 10.15
|
||||
"-DQT_FEATURE_cxx17_filesystem=OFF"
|
||||
+ ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
|
||||
+ "-DQT_HOST_PATH=${buildPackages.qt6.full}"
|
||||
];
|
||||
|
||||
NIX_LDFLAGS = toString (lib.optionals stdenv.isDarwin [
|
||||
diff --git a/pkgs/development/libraries/qt-6/qtModule.nix b/pkgs/development/libraries/qt-6/qtModule.nix
|
||||
index 28180d3b0ca..f14c73b10ee 100644
|
||||
--- a/pkgs/development/libraries/qt-6/qtModule.nix
|
||||
+++ b/pkgs/development/libraries/qt-6/qtModule.nix
|
||||
@@ -61,7 +61,7 @@ stdenv.mkDerivation (args // {
|
||||
if [[ -z "$dontSyncQt" && -f sync.profile ]]; then
|
||||
# FIXME: this probably breaks crosscompiling as it's not from nativeBuildInputs
|
||||
# I don't know how to get /libexec from nativeBuildInputs to work, it's not under /bin
|
||||
- ${lib.getDev qtbase}/libexec/syncqt.pl -version "''${version%%-*}"
|
||||
+ perl ${lib.getDev qtbase}/libexec/syncqt.pl -version "''${version%%-*}"
|
||||
fi
|
||||
'';
|
||||
|
65
nixpatches/2023-03-04-ccache-cross-fix.patch
Normal file
65
nixpatches/2023-03-04-ccache-cross-fix.patch
Normal file
@@ -0,0 +1,65 @@
|
||||
diff --git a/pkgs/development/tools/misc/ccache/default.nix b/pkgs/development/tools/misc/ccache/default.nix
|
||||
index cad25a942d6..9130097ab07 100644
|
||||
--- a/pkgs/development/tools/misc/ccache/default.nix
|
||||
+++ b/pkgs/development/tools/misc/ccache/default.nix
|
||||
@@ -2,7 +2,7 @@
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, substituteAll
|
||||
-, binutils
|
||||
+, buildPackages
|
||||
, asciidoctor
|
||||
, cmake
|
||||
, perl
|
||||
@@ -33,7 +33,7 @@ let ccache = stdenv.mkDerivation rec {
|
||||
# Darwin.
|
||||
(substituteAll {
|
||||
src = ./force-objdump-on-darwin.patch;
|
||||
- objdump = "${binutils.bintools}/bin/objdump";
|
||||
+ objdump = "${buildPackages.binutils.bintools}/bin/objdump";
|
||||
})
|
||||
];
|
||||
|
||||
@@ -71,11 +71,12 @@ let ccache = stdenv.mkDerivation rec {
|
||||
passthru = {
|
||||
# A derivation that provides gcc and g++ commands, but that
|
||||
# will end up calling ccache for the given cacheDir
|
||||
- links = {unwrappedCC, extraConfig}: stdenv.mkDerivation {
|
||||
+ links = {unwrappedCC, extraConfig, targetPrefix ? ""}: stdenv.mkDerivation {
|
||||
name = "ccache-links";
|
||||
passthru = {
|
||||
isClang = unwrappedCC.isClang or false;
|
||||
isGNU = unwrappedCC.isGNU or false;
|
||||
+ cc = unwrappedCC;
|
||||
};
|
||||
inherit (unwrappedCC) lib;
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
@@ -83,7 +84,7 @@ let ccache = stdenv.mkDerivation rec {
|
||||
mkdir -p $out/bin
|
||||
|
||||
wrap() {
|
||||
- local cname="$1"
|
||||
+ local cname="${targetPrefix}$1"
|
||||
if [ -x "${unwrappedCC}/bin/$cname" ]; then
|
||||
makeWrapper ${ccache}/bin/ccache $out/bin/$cname \
|
||||
--run ${lib.escapeShellArg extraConfig} \
|
||||
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
|
||||
index cb6fd2f0c4d..da4aadff3cb 100644
|
||||
--- a/pkgs/top-level/all-packages.nix
|
||||
+++ b/pkgs/top-level/all-packages.nix
|
||||
@@ -17383,10 +17383,12 @@ with pkgs;
|
||||
# should be owned by user root, group nixbld with permissions 0770.
|
||||
ccacheWrapper = makeOverridable ({ extraConfig, cc }:
|
||||
cc.override {
|
||||
- cc = ccache.links {
|
||||
+ cc = ccache.links ({
|
||||
inherit extraConfig;
|
||||
unwrappedCC = cc.cc;
|
||||
- };
|
||||
+ } // lib.optionalAttrs (cc ? targetPrefix) {
|
||||
+ inherit (cc) targetPrefix;
|
||||
+ });
|
||||
}) {
|
||||
extraConfig = "";
|
||||
inherit (stdenv) cc;
|
||||
|
7
nixpatches/flake.lock
generated
7
nixpatches/flake.lock
generated
@@ -2,16 +2,15 @@
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1673163619,
|
||||
"narHash": "sha256-B33PFBL64ZgTWgMnhFL3jgheAN/DjHPsZ1Ih3z0VE5I=",
|
||||
"lastModified": 1675123384,
|
||||
"narHash": "sha256-RpU+kboEWlIYwbRMGIPBIcztH63CvmqWN1B8GpJogd4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "8c54d842d9544361aac5f5b212ba04e4089e8efe",
|
||||
"rev": "e0fa1ece2f3929726c9b98c539ad14b63ae8e4fd",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-22.11",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
|
@@ -1,10 +1,4 @@
|
||||
{ fetchpatch, fetchurl }: [
|
||||
# librewolf: build with `MOZ_REQUIRE_SIGNING=false`
|
||||
(fetchpatch {
|
||||
url = "https://github.com/NixOS/nixpkgs/pull/199134.diff";
|
||||
# url = "https://git.uninsane.org/colin/nixpkgs/commit/99b82e07fee4d194520d6e8d51bc45c80a4d3c7e.diff";
|
||||
sha256 = "sha256-Ne4hyHQDwBHUlWo8Z3QyRdmEv1rYGOjFGxSfOAcLUvQ=";
|
||||
})
|
||||
|
||||
# splatmoji: init at 1.2.0
|
||||
(fetchpatch {
|
||||
@@ -13,26 +7,43 @@
|
||||
hash = "sha256-IvsIcd2wPdz4b/7FMrDrcVlIZjFecCQ9uiL0Umprbx0=";
|
||||
})
|
||||
|
||||
# fix libreoffice build by: Revert "mdds: 2.0.3 -> 2.1.0"
|
||||
# merged 2023/01/25
|
||||
(fetchpatch {
|
||||
url = "https://github.com/NixOS/nixpkgs/pull/212583.diff";
|
||||
hash = "sha256-nkXgwQUtxYkJT2OzG6Jc72snizW5wHvR1nmh2KDnaPc=";
|
||||
})
|
||||
|
||||
# fix handbrake build by: handbrake: 1.5.1 -> 1.6.1
|
||||
# PR opened 2023/01/23
|
||||
(fetchpatch {
|
||||
# see alternate fix: <https://github.com/NixOS/nixpkgs/pull/211834>
|
||||
url = "https://github.com/NixOS/nixpkgs/pull/212306.diff";
|
||||
hash = "sha256-iQX2NaZaCzZVRlCM0pgXt0gecNwhXGeh3kXEiY38ZIM=";
|
||||
})
|
||||
# (fetchpatch {
|
||||
# # stdenv: fix cc for pseudo-crosscompilation
|
||||
# # closed because it breaks pkgsStatic (as of 2023/02/12)
|
||||
# url = "https://github.com/NixOS/nixpkgs/pull/196497.diff";
|
||||
# hash = "sha256-eTwEbVULYjmOW7zUFcTUqvBZqUFjHTKFhvmU2m3XQeo=";
|
||||
# })
|
||||
|
||||
./2022-12-19-i2p-aarch64.patch
|
||||
|
||||
# fix for <https://gitlab.com/signald/signald/-/issues/345>
|
||||
# allows to actually run signald
|
||||
./2023-01-25-signald-update.patch
|
||||
# fix for CMA memory leak in mesa: <https://gitlab.freedesktop.org/mesa/mesa/-/issues/8198>
|
||||
# fixed in mesa 22.3.6: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21330/diffs>
|
||||
# only necessary on aarch64.
|
||||
# it's a revert of nixpkgs commit dcf630c172df2a9ecaa47c77f868211e61ae8e52
|
||||
# ./2023-01-30-mesa-cma-leak.patch
|
||||
# upgrade to 22.3.6 instead
|
||||
# ./2023-02-28-mesa-22.3.6.patch
|
||||
|
||||
# fix qt6.qtbase and qt6.qtModule to cross-compile.
|
||||
# unfortunately there's some tangle that makes that difficult to do via the normal `override` facilities
|
||||
./2023-03-03-qtbase-cross-compile.patch
|
||||
|
||||
# let ccache cross-compile
|
||||
# TODO: why doesn't this apply?
|
||||
# ./2023-03-04-ccache-cross-fix.patch
|
||||
|
||||
# 2023-03-28: jellyfin-media-player: 1.8.1 -> 1.9.0
|
||||
# TODO: i should review/approve this PR if it works
|
||||
(fetchpatch {
|
||||
url = "https://github.com/NixOS/nixpkgs/pull/220974.diff";
|
||||
hash = "sha256-AK/l0vteCEg/ae4E0dS1oWnlLI4xyeyLFJcqMgCQ4RI=";
|
||||
})
|
||||
|
||||
# 2023-04-11: sequoia: 0.27.0 -> 0.28.0 & fix staging-next build
|
||||
(fetchpatch {
|
||||
url = "https://github.com/NixOS/nixpkgs/pull/225823.diff";
|
||||
hash = "sha256-6ExUJZxP1t5SbTaHimaqzScTjFdqnZhZqTIUxY452QQ=";
|
||||
})
|
||||
|
||||
# # kaiteki: init at 2022-09-03
|
||||
# vendorHash changes too frequently (might not be reproducible).
|
||||
|
203
overlays/disable-flakey-tests.nix
Normal file
203
overlays/disable-flakey-tests.nix
Normal file
@@ -0,0 +1,203 @@
|
||||
# disable tests for packages which flake.
|
||||
# tests will fail for a variety of reasons:
|
||||
# - they were coded with timeouts that aren't reliable under heavy load.
|
||||
# - they assume a particular architecture (e.g. x86) whereas i compile on multiple archs.
|
||||
# - they assume too much about their environment and fail under qemu.
|
||||
#
|
||||
(next: prev: {
|
||||
ell = prev.ell.overrideAttrs (_upstream: {
|
||||
# 2023/02/11
|
||||
# fixes "TEST FAILED in get_random_return_callback at unit/test-dbus-message-fds.c:278: !l_dbus_message_get_error(message, ((void *)0), ((void *)0))"
|
||||
# 2023/04/06
|
||||
# fixes "test-cipher: unit/test-cipher.c:102: test_aes_ctr: Assertion `!r' failed."
|
||||
# unclear *why* this test fails.
|
||||
doCheck = false;
|
||||
});
|
||||
# fish = prev.fish.overrideAttrs (_upstream: {
|
||||
# # 2023/02/28
|
||||
# # The following tests FAILED:
|
||||
# # 177 - sigint.fish (Failed)
|
||||
# # 241 - torn_escapes.py (Failed)
|
||||
# doCheck = false;
|
||||
# });
|
||||
# gjs = prev.gjs.overrideAttrs (_upstream: {
|
||||
# # 2023/01/30: one test times out. probably flakey test that only got built because i patched mesa.
|
||||
# doCheck = false;
|
||||
# });
|
||||
# gssdp = prev.gssdp.overrideAttrs (_upstream: {
|
||||
# # 2023/02/11
|
||||
# # fixes "ERROR:../tests/test-regression.c:429:test_ggo_7: assertion failed (error == NULL): Failed to set multicast interfaceProtocol not available (gssdp-error, 1)"
|
||||
# doCheck = false;
|
||||
# });
|
||||
# gupnp = prev.gupnp.overrideAttrs (_upstream: {
|
||||
# # 2023/02/22
|
||||
# # fixes "Bail out! ERROR:../tests/test-bugs.c:205:test_bgo_696762: assertion failed (error == NULL): Failed to set multicast interfaceProtocol not available (gssdp-erro>"
|
||||
# doCheck = false;
|
||||
# });
|
||||
# json-glib = prev.json-glib.overrideAttrs (_upstream: {
|
||||
# # 2023/02/11
|
||||
# # fixes: "15/15 json-glib:docs / doc-check TIMEOUT 30.52s killed by signal 15 SIGTERM"
|
||||
# doCheck = false;
|
||||
# });
|
||||
# lapack-reference = prev.lapack-reference.overrideAttrs (_upstream: {
|
||||
# # 2023/02/11: test timeouts
|
||||
# # > The following tests FAILED:
|
||||
# # > 93 - LAPACK-xlintstz_ztest_in (Timeout)
|
||||
# # > 98 - LAPACK-xeigtstz_svd_in (Timeout)
|
||||
# # > 99 - LAPACK-xeigtstz_zec_in (Timeout)
|
||||
# doCheck = false;
|
||||
# });
|
||||
# libadwaita = prev.libadwaita.overrideAttrs (_upstream: {
|
||||
# # 2023/01/30: one test times out. probably flakey test that only got built because i patched mesa.
|
||||
# doCheck = false;
|
||||
# });
|
||||
# libsecret = prev.libsecret.overrideAttrs (_upstream: {
|
||||
# # 2023/01/30: one test times out. probably flakey test that only got built because i patched mesa.
|
||||
# doCheck = false;
|
||||
# });
|
||||
# libuv = prev.libuv.overrideAttrs (_upstream: {
|
||||
# # 2023/02/11
|
||||
# # 2 tests fail:
|
||||
# # - not ok 261 - tcp_bind6_error_addrinuse
|
||||
# # - not ok 267 - tcp_bind_error_addrinuse_listen
|
||||
# doCheck = false;
|
||||
# });
|
||||
libwacom = prev.libwacom.overrideAttrs (_upstream: {
|
||||
# 2023/03/30
|
||||
# "libwacom:all / pytest TIMEOUT"
|
||||
doCheck = false;
|
||||
mesonFlags = [ "-Dtests=disabled" ];
|
||||
});
|
||||
|
||||
# llvmPackages_12 =
|
||||
# let
|
||||
# tools = prev.llvmPackages_12.tools.extend (self: super: {
|
||||
# libllvm = super.libllvm.overrideAttrs (upstream: {
|
||||
# # 2023/02/21: fix: "FAIL: LLVM-Unit :: ExecutionEngine/MCJIT/./MCJITTests/MCJITTest.return_global (2857 of 42084)"
|
||||
# # - nix log /nix/store/6vydavlxh1gvs0vmrkcx9qp67g3h7kcz-llvm-12.0.1.drv
|
||||
# # - wanted by sequoia, rav1e, rustc-1.66.1 (is this right?)
|
||||
# doCheck = false;
|
||||
# # upstream sets this with `rec`; TODO: have upstream refer to the final overrideAttrs version of the derivation instead of using rec.
|
||||
# cmakeFlags = next.lib.remove "-DLLVM_BUILD_TESTS=ON" upstream.cmakeFlags;
|
||||
# });
|
||||
# });
|
||||
# in
|
||||
# # see <nixpkgs:pkgs/development/compilers/llvm/12/default.nix>
|
||||
# # - we copy their strategy / attrset mutilation
|
||||
# prev.llvmPackages_12 // { inherit tools; } // tools;
|
||||
|
||||
# llvmPackages_14 =
|
||||
# let
|
||||
# tools = prev.llvmPackages_14.tools.extend (self: super: {
|
||||
# libllvm = super.libllvm.overrideAttrs (upstream: {
|
||||
# # 2023/02/21: fix: "FAIL: LLVM-Unit :: ExecutionEngine/MCJIT/./MCJITTests/MCJITMultipleModuleTest.two_module_global_variables_case (43769 of 46988)"
|
||||
# # - nix log /nix/store/ib2yw6sajnhlmibxkrn7lj7chllbr85h-llvm-14.0.6.drv
|
||||
# # - wanted by clang-11-12-LLVMgold-path, compiler-rt-libc-12.0.1, clang-wrapper-12.0.1 (is this right?)
|
||||
# doCheck = false;
|
||||
# # upstream sets this with `rec`; TODO: have upstream refer to the final overrideAttrs version of the derivation instead of using rec.
|
||||
# cmakeFlags = next.lib.remove "-DLLVM_BUILD_TESTS=ON" upstream.cmakeFlags;
|
||||
# });
|
||||
# });
|
||||
# in
|
||||
# # see <nixpkgs:pkgs/development/compilers/llvm/14/default.nix>
|
||||
# # - we copy their strategy / attrset mutilation
|
||||
# prev.llvmPackages_14 // { inherit tools; } // tools;
|
||||
|
||||
# llvmPackages_15 =
|
||||
# let
|
||||
# tools = prev.llvmPackages_15.tools.extend (self: super: {
|
||||
# libllvm = super.libllvm.override {
|
||||
# # 2023/02/21: fix: "FAIL: LLVM-Unit :: ExecutionEngine/MCJIT/./MCJITTests/..."
|
||||
# # llvm15 passes doCheck as a call arg, so we don't need to set cmakeFlags explicitly as in previous versions
|
||||
# doCheck = false;
|
||||
# };
|
||||
# });
|
||||
# in
|
||||
# prev.llvmPackages_15 // { inherit tools; } // tools;
|
||||
|
||||
# modemmanager = prev.modemmanager.overrideAttrs (_upstream: {
|
||||
# # 2023/02/25
|
||||
# # "ERROR:test-modem-helpers.c:257:test_cmgl_response: assertion failed: (list != NULL)"
|
||||
# doCheck = false;
|
||||
# doInstallCheck = false; # tests are run during install check??
|
||||
# });
|
||||
|
||||
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
|
||||
(py-next: py-prev: {
|
||||
# ipython = py-prev.ipython.overridePythonAttrs (upstream: {
|
||||
# # > FAILED IPython/core/tests/test_debugger.py::test_xmode_skip - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# # > FAILED IPython/core/tests/test_debugger.py::test_decorator_skip - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# # > FAILED IPython/core/tests/test_debugger.py::test_decorator_skip_disabled - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# # > FAILED IPython/core/tests/test_debugger.py::test_decorator_skip_with_breakpoint - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# # > FAILED IPython/core/tests/test_debugger.py::test_where_erase_value - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# # > FAILED IPython/terminal/tests/test_debug_magic.py::test_debug_magic_passes_through_generators - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# # > FAILED IPython/terminal/tests/test_embed.py::test_nest_embed - pexpect.exceptions.TIMEOUT: Timeout exceeded.
|
||||
# disabledTestPaths = upstream.disabledTestPaths or [] ++ [
|
||||
# "IPython/core/tests/test_debugger.py"
|
||||
# "IPython/terminal/tests/test_debug_magic.py"
|
||||
# "IPython/terminal/tests/test_embed.py"
|
||||
# ];
|
||||
# });
|
||||
pyarrow = py-prev.pyarrow.overridePythonAttrs (upstream: {
|
||||
# 2023/04/02
|
||||
# disabledTests = upstream.disabledTests ++ [ "test_generic_options" ];
|
||||
disabledTestPaths = upstream.disabledTestPaths or [] ++ [
|
||||
"pyarrow/tests/test_flight.py"
|
||||
];
|
||||
});
|
||||
# pytest-xdist = py-prev.pytest-xdist.overridePythonAttrs (upstream: {
|
||||
# # 2023/02/19
|
||||
# # 4 tests fail:
|
||||
# # - FAILED: testing/test_remote.py::TestWorkInteractor::* - execnet.gateway_base.TimeoutError: no item after 10.0 seconds
|
||||
# # doCheck = false;
|
||||
# disabledTestPaths = upstream.disabledTestPaths or [] ++ [
|
||||
# "testing/test_remote.py"
|
||||
# ];
|
||||
# # disabledTests = upstream.disabledTests or [] ++ [
|
||||
# # "test_basic_collect_and_runtests"
|
||||
# # "test_remote_collect_fail"
|
||||
# # "test_remote_collect_skip"
|
||||
# # "test_runtests_all"
|
||||
# # ];
|
||||
# });
|
||||
# twisted = py-prev.twisted.overridePythonAttrs (upstream: {
|
||||
# # 2023/02/25
|
||||
# # ```
|
||||
# # [ERROR]
|
||||
# # Traceback (most recent call last):
|
||||
# # File "/nix/store/dcnsxrn8rsfk1dghah7md5glbbnfysq3-python3.10-twisted-22.10.0/lib/python3.10/site-packages/twisted/test/test_udp.py", line 645, in test_interface
|
||||
# # self.assertEqual(self.client.transport.getOutgoingInterface(), "0.0.0.0")
|
||||
# # File "/nix/store/dcnsxrn8rsfk1dghah7md5glbbnfysq3-python3.10-twisted-22.10.0/lib/python3.10/site-packages/twisted/internet/udp.py", line 449, in getOutgoingInterface
|
||||
# # i = self.socket.getsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF)
|
||||
# # builtins.OSError: [Errno 92] Protocol not available
|
||||
# #
|
||||
# # twisted.test.test_udp.MulticastTests.test_interface
|
||||
# # ```
|
||||
# postPatch = upstream.postPatch + ''
|
||||
# echo 'MulticastTests.test_interface.skip = "Protocol not available"'>> src/twisted/test/test_udp.py
|
||||
# '';
|
||||
# });
|
||||
})
|
||||
];
|
||||
|
||||
# strp = prev.srtp.overrideAttrs (_upstream: {
|
||||
# # 2023/02/11
|
||||
# # roc_driver test times out after 30s
|
||||
# doCheck = false;
|
||||
# });
|
||||
tracker = prev.tracker.overrideAttrs (_upstream: {
|
||||
# 2023/02/22
|
||||
# "27/37 tracker:core / service TIMEOUT 60.37s killed by signal 15 SIGTERM"
|
||||
doCheck = false;
|
||||
});
|
||||
# udisks2 = prev.udisks2.overrideAttrs (_upstream: {
|
||||
# # 2023/02/25
|
||||
# # "udisks-test:ERROR:test.c:61:on_completed_expect_failure: assertion failed (message == expected_message): ("Command-line `./udisks-test-helper 4' was signaled with signal SIGSEGV (11):\nstdout: `OK, deliberately causing a segfault\n'\nstderr: `qemu: uncaught target signal 11 (Segmentation fault) - core dumped\n'" == "Command-line `./udisks-test-helper 4' was signaled with signal SIGSEGV (11): OK, deliberately causing a segfault\n")"
|
||||
# doCheck = false;
|
||||
# });
|
||||
# upower = prev.upower.overrideAttrs (_upstream: {
|
||||
# # 2023/02/25
|
||||
# # "Tests.test_battery_state_guessing TIMEOUT 60.80s killed by signal 15 SIGTERM"
|
||||
# doCheck = false;
|
||||
# });
|
||||
})
|
32
overlays/optimizations.nix
Normal file
32
overlays/optimizations.nix
Normal file
@@ -0,0 +1,32 @@
|
||||
(self: super:
|
||||
with self;
|
||||
let
|
||||
# ccache-able = drv: drv.override { stdenv = builtins.trace "with ccache ${drv.name}" ccacheStdenv; };
|
||||
ccache-able = drv: drv.override { stdenv = builtins.trace "with ccache: ${drv.name}" ccacheStdenv; };
|
||||
in {
|
||||
# TODO: if we link /homeless-shelter/.ccache into the nix environment,
|
||||
# then maybe we get better use of upstream caches?
|
||||
# ccacheWrapper = super.ccacheWrapper.override {
|
||||
# extraConfig = ''
|
||||
# export CCACHE_DIR="/var/cache/ccache"
|
||||
# '';
|
||||
# };
|
||||
# ccacheStdenv = super.ccacheStdenv.override {
|
||||
# extraConfig = ''
|
||||
# export CCACHE_DIR="/homeless-shelter/.ccache"
|
||||
# '';
|
||||
# };
|
||||
# firefox-esr = ccache-able super.firefox-esr;
|
||||
# firefox/librewolf distribution is wacky: it grabs the stdenv off of `rustc.llvmPackages`, and really wants those to match.
|
||||
# buildMozillaMach = opts: ccache-able (super.buildMozillaMach opts);
|
||||
# webkitgtk = ccache-able super.webkitgtk;
|
||||
# mesa = ccache-able super.mesa;
|
||||
|
||||
webkitgtk = super.webkitgtk.overrideAttrs (_upstream: {
|
||||
# means we drop debug info when linking.
|
||||
# this is a trade-off to require less memory when linking, since
|
||||
# building `webkitgtk` otherwise requires about 40G+ of RAM.
|
||||
# <https://github.com/NixOS/nixpkgs/issues/153528>
|
||||
separateDebugInfo = false;
|
||||
});
|
||||
})
|
@@ -4,31 +4,18 @@
|
||||
# - if it's broken by that upstream builder, then pin it: somebody will come along and fix the package.
|
||||
# - otherwise, search github issues/PRs for knowledge of it before pinning.
|
||||
# - if nobody's said anything about it yet, probably want to root cause it or hold off on updating.
|
||||
#
|
||||
# note that these pins apply to *all* platforms:
|
||||
# - natively compiled packages
|
||||
# - cross compiled packages
|
||||
# - qemu-emulated packages
|
||||
|
||||
(next: prev: {
|
||||
# XXX: when invoked outside our flake (e.g. via NIX_PATH) there is no `next.stable`,
|
||||
# so just forward the unstable packages.
|
||||
inherit (next.stable or prev)
|
||||
# broken on 2023/01/14 via mtxclient dep, aarch64-only:
|
||||
# fixed on 2023/01/24?
|
||||
# error: builder for '/nix/store/gwidl0c9ksxjgx0dgwnjssix4ikq73v5-mtxclient-0.9.0.drv' failed with exit code 2;
|
||||
# last 10 log lines:
|
||||
# > make[2]: *** [CMakeFiles/matrix_client.dir/build.make:370: CMakeFiles/matrix_client.dir/lib/structs/events/encrypted.cpp.o] Error 1
|
||||
# > In file included from /build/source/include/mtxclient/crypto/client.hpp:17,
|
||||
# > from /build/source/lib/crypto/utils.cpp:17:
|
||||
# > /build/source/include/mtx/identifiers.hpp:12:10: fatal error: compare: No such file or directory
|
||||
# > 12 | #include <compare>
|
||||
# > | ^~~~~~~~~
|
||||
# > compilation terminated.
|
||||
# > make[2]: *** [CMakeFiles/matrix_client.dir/build.make:132: CMakeFiles/matrix_client.dir/lib/crypto/utils.cpp.o] Error 1
|
||||
# > make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/matrix_client.dir/all] Error 2
|
||||
# > make: *** [Makefile:136: all] Error 2
|
||||
# For full logs, run 'nix log /nix/store/gwidl0c9ksxjgx0dgwnjssix4ikq73v5-mtxclient-0.9.0.drv'.
|
||||
# error: 1 dependencies of derivation '/nix/store/4i2d1qdh4x6n23h1jbcbhm8q9q2hch9a-nheko-0.11.0.drv' failed to build
|
||||
# error: 1 dependencies of derivation '/nix/store/k4f7k7cvjp8rb7clhlfq3yxgs6lbfmk7-home-manager-path.drv' failed to build
|
||||
# error: 1 dependencies of derivation '/nix/store/67d9k554188lh4ddl4ar6j74mpc3r4sv-home-manager-generation.drv' failed to build
|
||||
# error: 1 dependencies of derivation '/nix/store/5qjxzhsw1jvh2d7jypbcam9409ivb472-user-environment.drv' failed to build
|
||||
# error: 1 dependencies of derivation '/nix/store/hrb3qpdbisqh0lzlyz1g9g4164khmqwn-etc.drv' failed to build
|
||||
# error: 1 dependencies of derivation '/nix/store/ny21xyicbgim5wy7ksg2hibd9gn7i01b-nixos-system-moby-23.05pre-git.drv' failed to build
|
||||
# nheko
|
||||
;
|
||||
# chromium can take 4 hours to build from source, with no signs of progress.
|
||||
# disable it if you're in a rush.
|
||||
# chromium = next.emptyDirectory;
|
||||
})
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user