Compare commits

..

206 Commits

Author SHA1 Message Date
fd19802e91 WIP: fixup sway bugs 2023-01-28 12:25:12 +00:00
d84846e293 refactor: sway: port away from home-manager 2023-01-28 11:13:54 +00:00
b46ccb9bc2 zsh: add an empty .zshrc to shutup prezto 2023-01-28 10:59:06 +00:00
1958c1f36b refactor: port waybar config out of home-manager 2023-01-28 09:58:18 +00:00
67299ebfd7 nix-index: move out of home-manager -> nixos 2023-01-28 09:44:32 +00:00
adecfbaea4 refactor: home-manager: remove dead sysconfig hack 2023-01-28 09:31:09 +00:00
fa4a576703 refactor: zsh: enable VTE with programs.zsh.vteIntegration instead of manual sourcing 2023-01-28 09:30:45 +00:00
abb0a3c94e refactor: move xdg.nix -> xdg-dirs.nix 2023-01-28 09:27:10 +00:00
32612e6acb refactor: sort the mime associations 2023-01-28 09:26:29 +00:00
e0a3979b65 refactor: mimeapps: port from home-manager -> nixos 2023-01-28 09:23:41 +00:00
4d84ca0878 refactor: xdg.conf: move out of home-manager 2023-01-28 03:57:35 +00:00
1ae8ab2550 refactor: ~/.cache/nix-index: persist in common/users.nix instead of home-manager 2023-01-28 03:48:37 +00:00
ed1380ba70 libreoffice config: move out of home-manager 2023-01-28 03:45:51 +00:00
e1b8d3ccc3 zsh: move out of home-manager 2023-01-28 03:40:26 +00:00
392ad7c674 zsh: port from home-manager to nixos 2023-01-28 03:39:13 +00:00
4026334e51 neovim: move out of home-manager 2023-01-28 00:20:40 +00:00
2269016736 neovim: port to nixos config instead of home-manager 2023-01-28 00:19:48 +00:00
f2c61d64b7 mpv: move out of home-manager 2023-01-27 08:12:37 +00:00
840c2feba5 mpv: specify config by sane.fs instead of home-manager 2023-01-27 08:11:59 +00:00
4603f0fd8e kitty: move out of home-manager 2023-01-27 08:09:03 +00:00
64704d361b kitty: configure via sane.fs instead of home-manager 2023-01-27 08:08:22 +00:00
7df18686e0 git: move out of home-manager 2023-01-27 07:57:42 +00:00
aee928dac0 git: populate with sane.fs instead of home-manager 2023-01-27 07:55:38 +00:00
76c0c3dc6a vlc: move out of home-manager 2023-01-27 07:34:07 +00:00
796988bdeb sublime-music: move out of home-manager 2023-01-27 07:33:23 +00:00
31d28ccf23 ssh: move out of home-manager 2023-01-27 07:19:04 +00:00
a298678622 splatmoji: move out of home-manager 2023-01-27 07:18:13 +00:00
32eb3b1998 newsflash: move out of home-manager 2023-01-27 07:17:27 +00:00
7a726b8d08 keyring: move out of home-manager 2023-01-27 07:15:45 +00:00
3edbb1c873 gpodder: move out of home-manager 2023-01-27 07:12:29 +00:00
d94687e8cc gfeeds: move out of home-manager 2023-01-27 07:11:31 +00:00
641ffc3452 firefox: move out of home-manager 2023-01-27 07:09:10 +00:00
fa8016db67 aerc: migrate out of home-manager directory 2023-01-27 07:08:03 +00:00
0c9cc87728 patch handbrake instead of pinning it 2023-01-27 05:15:09 +00:00
5236da2383 Merge branch 'staging/nixpkgs-2023-01-25' 2023-01-27 04:22:25 +00:00
aa24eebf40 all hosts: declare $host-hn as an alias to speak with that host over the Home Network vpn 2023-01-27 03:18:49 +00:00
3cc0d7ec40 flake update: nixpkgs/nixos-unstable 2023-01-23 -> 2023-01-25; mobile-nixos; nixpkgs/nixos-22.11
```
• Updated input 'mobile-nixos':
    'github:nixos/mobile-nixos/4d2093efa7efa00131d385fd9d11e54ce16bc57a' (2023-01-24)
  → 'github:nixos/mobile-nixos/80ece5a61738fbf3b96fdda402ab2dfc74ee5cee' (2023-01-27)
• Updated input 'nixpkgs':
    'path:/nix/store/2yvdsmlp8nx67fh4gvn64mbm82pbgzz8-source/nixpatches?lastModified=1&narHash=sha256-hxFwrPvi%2fvd6g8BfCYtTM2CEIDde%2fgz7GjVmkmRzP+o=' (1970-01-01)
  → 'path:/nix/store/4xd16l52dabh0xgwg57j4qraj2nrijl5-source/nixpatches?lastModified=1&narHash=sha256-hxFwrPvi%2fvd6g8BfCYtTM2CEIDde%2fgz7GjVmkmRzP+o=' (1970-01-01)
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/ab1254087f4cdf4af74b552d7fc95175d9bdbb49' (2023-01-22)
  → 'github:nixos/nixpkgs/def9e420d27c951026d57dc96ce0218c3131f412' (2023-01-26)
• Updated input 'nixpkgs-unpatched':
    'github:nixos/nixpkgs/1b1f50645af2a70dc93eae18bfd88d330bfbcf7f' (2023-01-23)
  → 'github:nixos/nixpkgs/9b97ad7b4330aacda9b2343396eb3df8a853b4fc' (2023-01-25)
```
2023-01-27 03:08:23 +00:00
42c2d93306 firefox: persist just the ~/.mozilla/firefox/default profile dir 2023-01-27 01:52:00 +00:00
f6f8d0e19d sane-lib.fs: new wantedDir helper 2023-01-27 01:51:35 +00:00
8ad4d8a4f9 nits: fix comments/improve docs 2023-01-27 00:00:50 +00:00
d419e10f10 moby: bump CMA 384M -> 512M 2023-01-26 23:41:22 +00:00
c56734e00e remove unused custom signaldctl package (it has been upstreamed) 2023-01-26 23:37:34 +00:00
e095149797 remove unused custom pleroma package 2023-01-26 23:36:36 +00:00
6006b84f9e moby: disable metamask 2023-01-26 23:35:57 +00:00
b3b914bc2e disable i2p on all hosts (i don't use it) 2023-01-26 23:35:29 +00:00
d6f87c7ee7 formatting: firefox: sort addons by name/attr 2023-01-26 23:31:46 +00:00
028d78437b firefox: make all addons externally configurable 2023-01-26 23:30:56 +00:00
0539bb8fd5 firefox: factor out the addons a little 2023-01-26 23:17:06 +00:00
95cc42f057 Merge branch 'staging/linux-6.2' 2023-01-26 09:21:33 +00:00
54cfde0e30 moby: linux-megous: 6.1.0-rc8 -> 6.2.0-rc5 2023-01-26 08:45:01 +00:00
b358cbe02a feeds: rifters: port to db 2023-01-26 00:07:29 +00:00
64cd562824 feeds: IEEE spectrum: port to db 2023-01-26 00:05:50 +00:00
749f59a4af feeds: palladium: port to db 2023-01-26 00:04:17 +00:00
77d5ff623e feeds: Profectus: port to db 2023-01-26 00:02:55 +00:00
6386abb8c6 feeds: SemiAccurate: port to db 2023-01-26 00:01:28 +00:00
28f8434c53 feeds: vitalik.ca: port to db 2023-01-26 00:00:16 +00:00
30fafb4837 feeds: sagacious suricata: port to db 2023-01-25 23:59:23 +00:00
c7205ed668 feeds: bunnie juang: port to db 2023-01-25 23:58:43 +00:00
c69c6612fe feeds: Daniel Janus: port to db 2023-01-25 23:57:53 +00:00
6951b277ad feeds: ian henry: port to db 2023-01-25 23:57:00 +00:00
1167c9bd0c feeds: bitbashing: port to db 2023-01-25 23:56:22 +00:00
8537fe411b feeds: idiomdrottning: port to db 2023-01-25 23:55:36 +00:00
1fb2ddbecc feeds: jefftk: port to db 2023-01-25 23:52:00 +00:00
27608cb8c7 feeds: pomeroyb: port to db 2023-01-25 23:51:12 +00:00
33ee59e80d feeds: miniature-calendar: port to db 2023-01-25 23:49:52 +00:00
edacc28e4a feeds: smbc: port to db 2023-01-25 23:45:49 +00:00
99780e30bc feeds: pbfcomics: port to db 2023-01-25 23:45:16 +00:00
140dd05bd1 feeds: xkcd: port to db 2023-01-25 23:44:06 +00:00
c35bc92ac9 feeds: Sean Carrol/Preposterous Universe: port to db 2023-01-25 23:40:55 +00:00
16b92f98e7 feeds: put a num on it: port to db 2023-01-25 23:38:58 +00:00
576b63da9c feeds: sideways view: port to db 2023-01-25 23:35:39 +00:00
e434add20d feeds: Overcoming Bias: port to db 2023-01-25 23:34:30 +00:00
d288086aa2 feeds: roots of progress: port to db 2023-01-25 23:32:53 +00:00
e9c0f692d8 feeds: gwern: port to db 2023-01-25 23:32:11 +00:00
5a75d0f56b feeds: richardcarrier: port to db 2023-01-25 23:29:58 +00:00
a222cf18a3 feeds: port slimemoldtimemold to db 2023-01-25 23:29:17 +00:00
45b9ee763b feeds: applied divinity studies: port to db 2023-01-25 23:28:23 +00:00
50a2196495 feeds: unintended consequences: port to db 2023-01-25 23:27:15 +00:00
e4419ffad4 feeds: stpeter.im: port to db 2023-01-25 23:26:23 +00:00
ae3ba64fc3 feeds: dshr.org: port to db 2023-01-25 23:25:11 +00:00
948b2489d3 feeds: port austinvernon to db 2023-01-25 22:50:41 +00:00
abe491b563 feeds: port lynalden to db 2023-01-25 22:49:45 +00:00
9911593a63 feeds: port benedict evans to db 2023-01-25 22:48:57 +00:00
798ba7f7e3 remove benjaminrosshoffman.com db entry: it only has the comments feed and is not useful 2023-01-25 22:23:06 +00:00
f72e901f57 feeds: port balaji to db 2023-01-25 22:22:06 +00:00
2047222233 RSS: add philosopher.coach 2023-01-25 21:27:18 +00:00
5d33cb66d6 feeds: add Julia Evans 2023-01-25 10:55:50 +00:00
6fded1f256 feeds: add Matt Webb 2023-01-25 10:36:10 +00:00
1d1c528abc feeds: add Merveilles forum 2023-01-25 10:31:51 +00:00
35fdd2788f feeds: add Emerge podcast 2023-01-25 10:28:15 +00:00
77cb951545 feeds: port congressionaldish to db 2023-01-25 09:46:10 +00:00
1909e0fbe8 feedsearch-crawler: fix for very large RSS feeds (like congressionaldish) 2023-01-25 09:44:32 +00:00
33d7819619 trust-dns: add a "quiet" option and enable it 2023-01-25 08:18:29 +00:00
0846abb6bf signald: update, and persist the /var/lib/signald accounts directory 2023-01-25 06:38:27 +00:00
f3568462c2 fix matrix-synapse after nixpkgs update 2023-01-25 03:46:05 +00:00
ed9291a443 Merge branch 'staging/nixpkgs-2023-01-23' 2023-01-25 03:14:41 +00:00
9eac7f7c02 pleroma: update to mainline 2023-01-25 03:13:06 +00:00
f5eaa635a5 flake update: nixpkgs-stable 2023-01-15 -> 2023-01-22
```
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/2f9fd351ec37f5d479556cd48be4ca340da59b8f' (2023-01-15)
  → 'github:nixos/nixpkgs/ab1254087f4cdf4af74b552d7fc95175d9bdbb49' (2023-01-22)
• Updated input 'sops-nix/nixpkgs-stable':
    'github:NixOS/nixpkgs/7c65528c3f8462b902e09d1ccca23bb9034665c2' (2023-01-15)
  → 'github:NixOS/nixpkgs/918b760070bb8f48cb511300fcd7e02e13058a2e' (2023-01-22)
```
2023-01-25 00:19:00 +00:00
47db6f0dd4 unpin nheko 2023-01-25 00:16:37 +00:00
bba7efc535 flake update: nixpkgs 2023-01-19 -> 2023-01-23; mobile-nixos, sops-nix
```
• Updated input 'mobile-nixos':
    'github:nixos/mobile-nixos/5ee45cc1f8e43f4af14ee17ccef9156b0db8cd77' (2022-12-04)
  → 'github:nixos/mobile-nixos/4d2093efa7efa00131d385fd9d11e54ce16bc57a' (2023-01-24)
• Updated input 'nixpkgs-unpatched':
    'github:nixos/nixpkgs/d7705c01ef0a39c8ef532d1033bace8845a07d35' (2023-01-19)
  → 'github:nixos/nixpkgs/1b1f50645af2a70dc93eae18bfd88d330bfbcf7f' (2023-01-23)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/e18eefd2b133a58309475298052c341c08470717' (2023-01-15)
  → 'github:Mic92/sops-nix/b6ab3c61e2ca5e07d1f4eb1b67304e2670ea230c' (2023-01-24)
```
2023-01-25 00:15:55 +00:00
358b673344 moby: bump CMA 256MB -> 384MB 2023-01-23 07:42:51 +00:00
d9c101689d feeds: add lwn.net 2023-01-22 23:48:08 +00:00
ccbb573681 nit: remove dead comment in feeds.nix 2023-01-22 23:47:22 +00:00
f5c270233f feeds: add Tales From The Bridge (podcast) 2023-01-22 23:46:11 +00:00
bf92bb48be feeds: subscribe to project-insanity.org 2023-01-22 23:40:43 +00:00
2037b425d6 feeds: add Seattle Nice podcast 2023-01-21 09:41:20 +00:00
026746a76f flake.nix: document the init-feed "app" 2023-01-21 06:22:18 +00:00
de74c4e7d5 RSS: add Drew Devault 2023-01-21 06:21:34 +00:00
34a5f3f49b flake update: nixpkgs 2023-01-15 -> 2023-01-19
```
• Updated input 'nixpkgs-unpatched':
    'github:nixos/nixpkgs/6dccdc458512abce8d19f74195bb20fdb067df50' (2023-01-15)
  → 'github:nixos/nixpkgs/d7705c01ef0a39c8ef532d1033bace8845a07d35' (2023-01-19)
```
2023-01-21 05:33:15 +00:00
ee93141c07 splatmoji: build from upstream nixpkgs PR 2023-01-21 04:48:57 +00:00
f2d22231a3 freshrss: force sync feeds on every launch. requires to login as user "colin" 2023-01-21 03:50:27 +00:00
d5334e65ad overlays/pins.nix: act as NOOP when isn't available 2023-01-21 03:49:31 +00:00
17cdfff286 phosh: update 0.22.0 -> 0.23.0 2023-01-21 03:17:42 +00:00
8d4ff6d4e6 pkgs: fix infinite recursion around firefox-unwrapped 2023-01-21 01:41:30 +00:00
5d78bc6704 moby: enable wireguard/home VPN 2023-01-20 22:40:58 +00:00
4da19a6d34 servo: remove users.nix; move autologinUser -> default.nix 2023-01-20 22:16:47 +00:00
2f75925678 servo: lift pleroma user def out of toplevel -> pleroma.nix 2023-01-20 22:15:26 +00:00
55a1856e87 servo: lift git user def out of toplevel -> gitea.nix 2023-01-20 22:14:14 +00:00
2ee0f4efe2 servo: navidrome: give non-private dir and fix perms 2023-01-20 22:11:15 +00:00
b0c5a5907f Merge branch 'wip/hosts' 2023-01-20 19:40:49 +00:00
9af157b294 moby: enable the client role 2023-01-20 11:37:43 +00:00
c36fed8547 Revert "flake update: nixpkgs-stable: 2023-01-15 -> 2023-01-17"
This reverts commit 35e28041cd.

this "stable" update wasn't actually stable: nheko/mtxclient
is broken on all usable branches atm:
<https://github.com/NixOS/nixpkgs/issues/211758>
2023-01-20 11:31:19 +00:00
a653311f04 wg-home: enable dynamicEndpointRefreshSeconds to be robust against intermittent failure 2023-01-20 10:34:30 +00:00
f4d6ecb1cf wg-home: use the DNS endpoint for connecting to my home VPN 2023-01-20 10:34:04 +00:00
c2e5a0a2fc wg-home: when acting as client, allow server to relay all other clients' messages 2023-01-20 10:20:33 +00:00
c316e51344 desko: enable wg-home 2023-01-20 07:59:11 +00:00
f4f0c1bdd6 servo: fix broken config/typo 2023-01-20 07:45:54 +00:00
6a2374e046 wg-home: unify server and client config 2023-01-20 07:42:31 +00:00
708cb841fe wg-home: auto-generate peer list from hosts.nix config 2023-01-20 07:22:34 +00:00
094b7223c7 servo: wireguard secret is auto-generated 2023-01-20 07:11:37 +00:00
f6dfc9cf29 hosts: migrate IP addresses into hosts/modules 2023-01-20 07:07:45 +00:00
7c2ab92302 wg-home: derive wireguard key from ssh privkey 2023-01-20 06:57:49 +00:00
7c18d77046 wg-home: make wireguard pubkeys configurable; we'll want one per host 2023-01-20 06:09:57 +00:00
02f316f7f8 tweak wg-home to where i can get a p2p connection between lappy and servo 2023-01-20 05:38:14 +00:00
df848b3262 wg-home: use separate host key than client key 2023-01-20 05:10:51 +00:00
1e67b5c97e sane-mount-servo: fix so we really do prefer lan over wan mounts 2023-01-20 04:58:05 +00:00
a3a7b6c563 hosts: split wifi and bluetooth pairings into the "client" role 2023-01-20 04:25:08 +00:00
e527beb9d0 sane-bt-search: add a --full flag 2023-01-20 02:17:59 +00:00
2e942e2dd4 sane-bt-search: include size and tracker in results 2023-01-20 02:10:07 +00:00
f46e3fdf01 sane-bt-search: fix incomparable datetime objects 2023-01-20 02:05:40 +00:00
038a9034d7 hosts: remove the is-target attribute and opt into roles via the config system instead 2023-01-20 00:13:13 +00:00
5a232eb832 servo: fix secrets path 2023-01-19 23:57:40 +00:00
9301b95dbb wg-home: move to shared module so that host and client config can be adjacent 2023-01-19 23:55:56 +00:00
d13bcc49ab refactor hosts directory, and move ssh keys out of modules/data
longer-term, i want hosts/by-name to define host-specific data
that's accessible via the other hosts (things like pubkeys).

also the secrets management needs some rethinking. there's really not
much point in me specifiying where *exactly* a secret comes from at its
use site. i should really be specifying secret store manifests; i.e.
"servo.yaml contains secrets X Y and Z", and leaving the rest up to
auto-computing.
2023-01-19 23:23:43 +00:00
35e28041cd flake update: nixpkgs-stable: 2023-01-15 -> 2023-01-17
```
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/2f9fd351ec37f5d479556cd48be4ca340da59b8f' (2023-01-15)
  → 'github:nixos/nixpkgs/b83e7f5a04a3acc8e92228b0c4bae68933d504eb' (2023-01-17)
```
2023-01-19 10:52:15 +00:00
58a5a8b56d wg_home_privkey: move secret to common file 2023-01-19 09:47:44 +00:00
e6d4ff3c6a experimental wg-home VPN shared across my devices 2023-01-19 09:45:03 +00:00
be29ad8bd8 servo: rename wg0 interface -> wg-ovpns 2023-01-19 09:35:07 +00:00
0fb8e2c867 persist ~/.cache/nix-index 2023-01-19 04:03:23 +00:00
580c1b74cb pkgs: bootpart-tow-boot-rpi-aarch64: fix build 2023-01-19 03:57:32 +00:00
f8595f1ed6 splatmoji: account for source paths sometimes having duplicate slashes 2023-01-18 11:53:14 +00:00
1deda148bb splatmoji: use upstream build.sh to build the package 2023-01-18 11:24:40 +00:00
5bbef18130 packages: remove mesa-demos 2023-01-18 09:16:48 +00:00
6967c331e2 matrix: fix synapse/signal permissions 2023-01-18 01:50:28 +00:00
9202345beb Merge branch 'staging/nixpkgs-2023-01-15' 2023-01-18 00:56:07 +00:00
17a8cabc09 remove trust-dns: it's been upstreamed 2023-01-17 11:22:10 +00:00
bc190f90bd flake update: nixpkgs 2023-01-13 -> 2023-01-15
```
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/a83ed85c14fcf242653df6f4b0974b7e1c73c6c6' (2023-01-14)
  → 'github:nixos/nixpkgs/2f9fd351ec37f5d479556cd48be4ca340da59b8f' (2023-01-15)
• Updated input 'nixpkgs-unpatched':
    'github:nixos/nixpkgs/befc83905c965adfd33e5cae49acb0351f6e0404' (2023-01-13)
  → 'github:nixos/nixpkgs/6dccdc458512abce8d19f74195bb20fdb067df50' (2023-01-15)
```
2023-01-17 10:50:00 +00:00
bb983a5328 servo: ship with signaldctl 2023-01-17 10:31:21 +00:00
0e8fc29b01 use signaldctl via nixpkgs patch which i hope to upstream later 2023-01-17 10:28:43 +00:00
4e14f063fc Merge branch 'wip/signal' 2023-01-17 10:14:53 +00:00
10d69fb0a4 mautrix-signal: configure correct permissions so that i can use the bridge 2023-01-17 07:57:24 +00:00
7aac965e32 bootpart-tow-boot-rpi-aarch64: fix syntax error 2023-01-16 12:14:22 +00:00
98ae1a8513 matrix: persist the mautrix-signal directory 2023-01-16 11:58:21 +00:00
72a2ab78f3 matrix: allow mautrix-signal to communicate with signald 2023-01-16 11:54:32 +00:00
18c98feb34 fs: fix /var/lib/private to have expected mode (0700) 2023-01-16 11:44:07 +00:00
487af9b492 fs: fix /var/lib/private to have expected mode (0700) 2023-01-16 11:43:43 +00:00
472d25c056 mautrix-signal: define the shared secrets statically 2023-01-16 11:43:17 +00:00
9eafacad12 mautrix-signal: get a *little* closer to working
it looks like mautrix-signal reads the appserver token (AS_TOKEN) from
its config file -- which we place in the nix store. as such, we have no
easy way of getting the token from registration.yaml over to
mautrix-signal. this is presumably what the environmentFile stuff is
meant for, but it doesn't *really* help much.

i think it makes sense to pursue coffeetables' nix-matrix-appservices
module, which has good-looking AS_TOKEN support:
<https://gitlab.com/coffeetables/nix-matrix-appservices>
2023-01-16 10:22:44 +00:00
0eb46a3179 add mautrix-signal (experimental) 2023-01-16 09:03:56 +00:00
ddb184b5ff (nixos) mx-puppet-discord: move to matrix category 2023-01-16 07:31:12 +00:00
194a6b6cf4 nixpatches: remove unused fakeHash input (just omit the hash when you need to) 2023-01-16 06:47:44 +00:00
016384aa2b nixpatches: move the list to the nixpatches flake instead of injecting it 2023-01-16 06:46:59 +00:00
b4e19c037e ejabberd: TODO: fix acme/nginx group membership 2023-01-16 05:59:52 +00:00
bd504f6c83 pin nheko package 2023-01-15 07:52:21 +00:00
bdd309eb15 flake: convert path:nixpatches -> ./nixpatches to fix poor flake input invalidation 2023-01-15 07:36:04 +00:00
eedc1170ec fix: remove kiwix-tools patch & improve nixpatches sub-flake UX 2023-01-15 04:27:42 +00:00
5a586c6e3c flake: migrate back to the more-efficient github: input scheme 2023-01-15 04:10:10 +00:00
371bcad650 flake.nix: use conventional URIs, no custom shit 2023-01-14 23:28:12 +00:00
926decbea5 persist ~/.cache/nix 2023-01-14 23:21:15 +00:00
c0f76ea8d8 flake: add flake feedback info for nix devs/readers 2023-01-14 23:20:38 +00:00
40fc37930f flake update: nixpkgs 2023-01-11 -> 2023-01-12
```
• Updated input 'nixpkgs-stable':
    'github:NixOS/nixpkgs/6a3f9996408c970b99b8b992b11bb249d1455b62' (2023-01-12)
  → 'github:NixOS/nixpkgs/e285dd0ca97c264003867c7329f0d1f4f028739c' (2023-01-13)
• Updated input 'nixpkgs-unpatched':
    'github:NixOS/nixpkgs/6c8644fc37b6e141cbfa6c7dc8d98846c4ff0c2e' (2023-01-11)
  → 'github:NixOS/nixpkgs/0f213d0fee84280d8c3a97f7469b988d6fe5fcdf' (2023-01-12)
```
2023-01-14 18:37:57 +00:00
30e7eb9ab6 sane-bt-search: convert to nix-shell and increase verbosity 2023-01-14 10:23:50 +00:00
2e03f47edc gPodder: persist the whole gPodder directory 2023-01-14 05:36:31 +00:00
4d552e3f0f gpodder-configured: remove the readFile business and use linkFarm instead 2023-01-14 05:29:38 +00:00
176a98879d gpodder: auto-unsubscribe from extra feeds at start 2023-01-14 05:25:16 +00:00
fc70889c34 Revert "import nix-script": it doesn't provide benefit over nix-shell
This reverts commit fe15cdd705.

although it *does* support generating derivation text,
import-from-derivation on the results is too clunky to actually be
usable in practice. it frequently mysteriously hangs instead.
2023-01-14 04:01:04 +00:00
49b4c57826 snippets: add nixos snippets 2023-01-14 03:38:51 +00:00
5111d095ac gpodder-configured: improve docs 2023-01-13 15:09:43 +00:00
fe15cdd705 import nix-script
this is a tool i can use like `nix-shell`, but it should be more
amenable to packaging. `nix-script --export --build-root .
./my-script.sh` gives a derivation which i should be able to
`callPackage` on.
2023-01-13 15:08:30 +00:00
638420ea0d whalebird: fix tray_icon oversight during last update 2023-01-13 10:09:07 +00:00
d55dd5ace6 whalebird: fix aarch64 build (hopefully) 2023-01-13 09:53:14 +00:00
45695aed6b whalebird: 4.6.5 -> 4.7.4 2023-01-13 09:41:05 +00:00
d6e79c4d07 feeds: remove the unused update.nix file 2023-01-13 09:41:05 +00:00
380ceaf625 mfeeds: rename update.sh -> update.py 2023-01-13 09:41:05 +00:00
942c581107 feeds: port the update.sh script to use our own feedsearch package instead of the deployed version 2023-01-13 09:41:05 +00:00
b6d94c2e08 feedsearch_crawler: add to all python3XXPackages 2023-01-13 09:41:05 +00:00
fd7acc8fc8 let host nix (i.e. nix-shell, nix-locate) know about our patched nixpkgs and overlays 2023-01-13 09:41:05 +00:00
db670fc172 package feedsearch-crawler 2023-01-13 09:41:05 +00:00
6438971c8c ssh keys: add github.com's pubkey 2023-01-13 09:41:05 +00:00
e439d398b6 flake: patch using the target system instead of the host 2023-01-13 09:05:00 +00:00
0f25cba331 moby kernel: disable config option that would break build 2023-01-13 04:40:34 +00:00
39959e912d cross: fix cross compilation by setting both local AND crossSystem 2023-01-13 04:40:34 +00:00
62e649743d moby: update megous kernel 6.1-20221128-1027 -> 6.1-20221211-1046 2023-01-13 04:40:34 +00:00
b1741a18e1 feeds: include "title" in the output OPML -- when it exists 2023-01-13 04:13:44 +00:00
a829a8e027 persist: fix permission mapping when acl is specified as toplevel attribute 2023-01-13 01:50:08 +00:00
d742ae83bd flake update: nixpkgs-unpatched: 2023-01-09 -> 2023-01-11
```
• Updated input 'nixpkgs-stable':
    'github:NixOS/nixpkgs/8c54d842d9544361aac5f5b212ba04e4089e8efe' (2023-01-08)
  → 'github:NixOS/nixpkgs/6a3f9996408c970b99b8b992b11bb249d1455b62' (2023-01-12)
• Updated input 'nixpkgs-unpatched':
    'github:NixOS/nixpkgs/aa1d74709f5dac623adb4d48fdfb27cc2c92a4d4' (2023-01-09)
  → 'github:NixOS/nixpkgs/6c8644fc37b6e141cbfa6c7dc8d98846c4ff0c2e' (2023-01-11)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/2253120d2a6147e57bafb5c689e086221df8032f' (2023-01-08)
  → 'github:Mic92/sops-nix/32187b33ac6ec9b628dcd08dd941a715e6241dda' (2023-01-12)
```
2023-01-13 00:02:32 +00:00
182 changed files with 3339 additions and 3348 deletions

50
flake.lock generated
View File

@@ -39,11 +39,11 @@
"mobile-nixos": { "mobile-nixos": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1670131242, "lastModified": 1674779092,
"narHash": "sha256-T/o1/3gffr010fsqgNshs1NJJjsnUYvQnUZgm6hilsY=", "narHash": "sha256-mFBD0Dvjf8tuxWtJhsCQ+8VYqI4fQeWjd/vfWsZiRRo=",
"owner": "nixos", "owner": "nixos",
"repo": "mobile-nixos", "repo": "mobile-nixos",
"rev": "5ee45cc1f8e43f4af14ee17ccef9156b0db8cd77", "rev": "80ece5a61738fbf3b96fdda402ab2dfc74ee5cee",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -60,37 +60,38 @@
}, },
"locked": { "locked": {
"lastModified": 1, "lastModified": 1,
"narHash": "sha256-5eJxyBRYQCoRt92ZFUOdT237Z0VscuNRd0pktDYWJYE=", "narHash": "sha256-5pNu9Ph1LIBj5q9RWLV3r7daANjmd4u5y+MVq8vlfS4=",
"path": "nixpatches", "path": "/nix/store/bjzsgw8zn4av0dv4sqyj7vxhi43na16y-source/nixpatches",
"type": "path" "type": "path"
}, },
"original": { "original": {
"path": "nixpatches", "path": "/nix/store/bjzsgw8zn4av0dv4sqyj7vxhi43na16y-source/nixpatches",
"type": "path" "type": "path"
} }
}, },
"nixpkgs-stable": { "nixpkgs-stable": {
"locked": { "locked": {
"lastModified": 1673163619, "lastModified": 1674692158,
"narHash": "sha256-B33PFBL64ZgTWgMnhFL3jgheAN/DjHPsZ1Ih3z0VE5I=", "narHash": "sha256-oqGpwVg4D+eMSgF7Th5Ve1ysCiH3H3g85vGJ3nvJsZQ=",
"owner": "NixOS", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "8c54d842d9544361aac5f5b212ba04e4089e8efe", "rev": "def9e420d27c951026d57dc96ce0218c3131f412",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "owner": "nixos",
"ref": "nixos-22.11", "ref": "nixos-22.11",
"type": "indirect" "repo": "nixpkgs",
"type": "github"
} }
}, },
"nixpkgs-stable_2": { "nixpkgs-stable_2": {
"locked": { "locked": {
"lastModified": 1673100377, "lastModified": 1674352297,
"narHash": "sha256-mT76pTd0YFxT6CwtPhDgHJhuIgLY+ZLSMiQpBufwMG4=", "narHash": "sha256-OkAnJPrauEcUCrst4/3DKoQfUn2gXKuU6CFvhtMrLgg=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "9f11a2df77cb945c115ae2a65f53f38121597d73", "rev": "918b760070bb8f48cb511300fcd7e02e13058a2e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -102,17 +103,18 @@
}, },
"nixpkgs-unpatched": { "nixpkgs-unpatched": {
"locked": { "locked": {
"lastModified": 1673226411, "lastModified": 1674641431,
"narHash": "sha256-b6cGb5Ln7Zy80YO66+cbTyGdjZKtkoqB/iIIhDX9gRA=", "narHash": "sha256-qfo19qVZBP4qn5M5gXc/h1MDgAtPA5VxJm9s8RUAkVk=",
"owner": "NixOS", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "aa1d74709f5dac623adb4d48fdfb27cc2c92a4d4", "rev": "9b97ad7b4330aacda9b2343396eb3df8a853b4fc",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "owner": "nixos",
"ref": "nixos-unstable", "ref": "nixos-unstable",
"type": "indirect" "repo": "nixpkgs",
"type": "github"
} }
}, },
"root": { "root": {
@@ -134,11 +136,11 @@
"nixpkgs-stable": "nixpkgs-stable_2" "nixpkgs-stable": "nixpkgs-stable_2"
}, },
"locked": { "locked": {
"lastModified": 1673147300, "lastModified": 1674546403,
"narHash": "sha256-gR9OEfTzWfL6vG0qkbn1TlBAOlg4LuW8xK/u0V41Ihc=", "narHash": "sha256-vkyNv0xzXuEnu9v52TUtRugNmQWIti8c2RhYnbLG71w=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "2253120d2a6147e57bafb5c689e086221df8032f", "rev": "b6ab3c61e2ca5e07d1f4eb1b67304e2670ea230c",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -1,24 +1,44 @@
# docs: # FLAKE FEEDBACK:
# - <https://nixos.wiki/wiki/Flakes> # - if flake inputs are meant to be human-readable, a human should be able to easily track them down given the URL.
# - this is not the case with registry URLs, like `nixpkgs/nixos-22.11`.
# - this is marginally the case with schemes like `github:nixos/nixpkgs`.
# - given the *existing* `git+https://` scheme, i propose expressing github URLs similarly:
# - `github+https://github.com/nixos/nixpkgs/tree/nixos-22.11`
# - need some way to apply local patches to inputs.
#
#
# DEVELOPMENT DOCS:
# - Flake docs: <https://nixos.wiki/wiki/Flakes>
# - 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> # - <https://serokell.io/blog/practical-nix-flakes>
{ {
# XXX: use the `github:` scheme instead of the more readable git+https: because it's *way* more efficient
# preferably, i would rewrite the human-readable https URLs to nix-specific github: URLs with a helper,
# but `inputs` is required to be a strict attrset: not an expression.
inputs = { inputs = {
nixpkgs-stable.url = "nixpkgs/nixos-22.11"; # <https://github.com/nixos/nixpkgs/tree/nixos-22.11>
nixpkgs-unpatched.url = "nixpkgs/nixos-unstable"; 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 = { nixpkgs = {
url = "path:nixpatches"; url = "./nixpatches";
inputs.nixpkgs.follows = "nixpkgs-unpatched"; inputs.nixpkgs.follows = "nixpkgs-unpatched";
}; };
mobile-nixos = { mobile-nixos = {
# <https://github.com/nixos/mobile-nixos>
url = "github:nixos/mobile-nixos"; url = "github:nixos/mobile-nixos";
flake = false; flake = false;
}; };
home-manager = { home-manager = {
url = "github:nix-community/home-manager/release-22.05"; # <https://github.com/nix-community/home-manager/tree/release-22.05>
url = "github:nix-community/home-manager?ref=release-22.05";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
sops-nix = { sops-nix = {
# <https://github.com/Mic92/sops-nix>
url = "github:Mic92/sops-nix"; url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -43,10 +63,12 @@
evalHost = { name, local, target }: evalHost = { name, local, target }:
let let
# XXX: we'd prefer to use `nixosSystem = (nixpkgsCompiledBy local).nixos` # XXX: we'd prefer to use `nixosSystem = (nixpkgsCompiledBy target).nixos`
# but it doesn't propagate config to the underlying pkgs, meaning it doesn't let you use # but it doesn't propagate config to the underlying pkgs, meaning it doesn't let you use
# non-free packages even after setting nixpkgs.allowUnfree. # non-free packages even after setting nixpkgs.allowUnfree.
nixosSystem = import ((nixpkgsCompiledBy local).path + "/nixos/lib/eval-config.nix"); # XXX: patch using the target -- not local -- otherwise the target will
# need to emulate the host in order to rebuild!
nixosSystem = import ((nixpkgsCompiledBy target).path + "/nixos/lib/eval-config.nix");
in in
(nixosSystem { (nixosSystem {
# we use pkgs built for and *by* the target, i.e. emulation, by default. # we use pkgs built for and *by* the target, i.e. emulation, by default.
@@ -60,6 +82,7 @@
nixpkgs.overlays = [ nixpkgs.overlays = [
self.overlays.default self.overlays.default
self.overlays.passthru self.overlays.passthru
self.overlays.pins
]; ];
} }
]; ];
@@ -96,11 +119,12 @@
overlays = rec { overlays = rec {
default = pkgs; default = pkgs;
pkgs = import ./pkgs/overlay.nix; pkgs = import ./overlays/pkgs.nix;
pins = import ./overlays/pins.nix; # TODO: move to `nixpatches/` input
passthru = passthru =
let let
stable = next: prev: { stable = next: prev: {
stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform}"; stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform.system}";
}; };
mobile = (import "${mobile-nixos}/overlay/overlay.nix"); mobile = (import "${mobile-nixos}/overlay/overlay.nix");
uninsane = uninsane-dot-org.overlay; uninsane = uninsane-dot-org.overlay;
@@ -146,6 +170,7 @@
}; };
init-feed = { init-feed = {
# use like `nix run '.#init-feed' uninsane.org`
type = "app"; type = "app";
program = "${pkgs.feeds.passthru.initFeedScript}"; program = "${pkgs.feeds.passthru.initFeedScript}";
}; };

View File

@@ -6,12 +6,16 @@
# sane.packages.enableDevPkgs = true; # sane.packages.enableDevPkgs = true;
sane.gui.sway.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.duplicity.enable = true;
sane.services.nixserve.enable = true; sane.services.nixserve.enable = true;
sane.services.nixserve.sopsFile = ../../secrets/desko.yaml; sane.services.nixserve.sopsFile = ../../../secrets/desko.yaml;
sane.persist.enable = true; sane.persist.enable = true;
sane.gui.sway.enable = true;
boot.loader.efi.canTouchEfiVariables = false; boot.loader.efi.canTouchEfiVariables = false;
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ]; sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
@@ -19,7 +23,7 @@
services.usbmuxd.enable = true; services.usbmuxd.enable = true;
sops.secrets.colin-passwd = { sops.secrets.colin-passwd = {
sopsFile = ../../secrets/desko.yaml; sopsFile = ../../../secrets/desko.yaml;
neededForUsers = true; neededForUsers = true;
}; };
@@ -41,7 +45,7 @@
}; };
sops.secrets.duplicity_passphrase = { sops.secrets.duplicity_passphrase = {
sopsFile = ../../secrets/desko.yaml; sopsFile = ../../../secrets/desko.yaml;
}; };
programs.steam = { programs.steam = {

View File

@@ -1,9 +1,13 @@
{ pkgs, ... }: { config, pkgs, ... }:
{ {
imports = [ imports = [
./fs.nix ./fs.nix
]; ];
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.packages.enableDevPkgs = true;
# sane.users.guest.enable = true; # sane.users.guest.enable = true;
@@ -14,7 +18,7 @@
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ]; sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
sops.secrets.colin-passwd = { sops.secrets.colin-passwd = {
sopsFile = ../../secrets/lappy.yaml; sopsFile = ../../../secrets/lappy.yaml;
neededForUsers = true; neededForUsers = true;
}; };

View File

@@ -6,6 +6,10 @@
./kernel.nix ./kernel.nix
]; ];
sane.roles.client = true;
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*. # cross-compiled documentation is *slow*.
# no obvious way to natively compile docs (2022/09/29). # no obvious way to natively compile docs (2022/09/29).
# entrypoint is nixos/modules/misc/documentation.nix # entrypoint is nixos/modules/misc/documentation.nix
@@ -19,13 +23,20 @@
services.getty.autologinUser = "root"; # allows for emergency maintenance? services.getty.autologinUser = "root"; # allows for emergency maintenance?
sops.secrets.colin-passwd = { sops.secrets.colin-passwd = {
sopsFile = ../../secrets/moby.yaml; sopsFile = ../../../secrets/moby.yaml;
neededForUsers = true; neededForUsers = true;
}; };
# usability compromises sane.web-browser = {
sane.web-browser.persistCache = "private"; # compromise impermanence for the sake of usability
sane.web-browser.persistData = "private"; persistCache = "private";
persistData = "private";
# i don't do crypto stuff on moby
addons.ether-metamask.enable = false;
# addons.sideberry.enable = false;
};
sane.persist.home.plaintext = [ sane.persist.home.plaintext = [
".config/pulse" # persist pulseaudio volume ".config/pulse" # persist pulseaudio volume
]; ];
@@ -54,9 +65,10 @@
# without this some GUI apps fail: `DRM_IOCTL_MODE_CREATE_DUMB failed: Cannot allocate memory` # without this some GUI apps fail: `DRM_IOCTL_MODE_CREATE_DUMB failed: Cannot allocate memory`
# this is because they can't allocate enough video ram. # this is because they can't allocate enough video ram.
# the default CMA seems to be 32M. we could probably get by with as little as 64M, and safely with 128M. # the default CMA seems to be 32M.
# i was running fine with 256MB from 2022/07-ish through 2022/12-ish, but then the phone quit reliably coming back from sleep: maybe a memory leak?
# `cat /proc/meminfo` to see CmaTotal/CmaFree if interested in tuning this. # `cat /proc/meminfo` to see CmaTotal/CmaFree if interested in tuning this.
boot.kernelParams = [ "cma=256M" ]; boot.kernelParams = [ "cma=512M" ];
# mobile-nixos' /lib/firmware includes: # mobile-nixos' /lib/firmware includes:
# rtl_bt (bluetooth) # rtl_bt (bluetooth)

View File

@@ -125,6 +125,9 @@ in
# aarch64-unknown-linux-gnu-gcc: error: unrecognized command line option '-mfpu=neon' # aarch64-unknown-linux-gnu-gcc: error: unrecognized command line option '-mfpu=neon'
# make[3]: *** [../scripts/Makefile.build:289: drivers/video/fbdev/sun5i-eink-neon.o] Error 1 # make[3]: *** [../scripts/Makefile.build:289: drivers/video/fbdev/sun5i-eink-neon.o] Error 1
FB_SUN5I_EINK = no; FB_SUN5I_EINK = no;
# used by the pinephone pro, but fails to compile with:
# ../drivers/media/i2c/ov8858.c:1834:27: error: implicit declaration of function 'compat_ptr'
VIDEO_OV8858 = no;
}) })
)) ))
]; ];

View File

@@ -1,29 +1,32 @@
{ pkgs, ... }: { config, pkgs, ... }:
{ {
imports = [ imports = [
./fs.nix ./fs.nix
./net.nix ./net.nix
./users.nix ./secrets.nix
./services ./services
]; ];
sane.packages.extraUserPkgs = [ sane.packages.extraUserPkgs = with pkgs; [
# for administering services # for administering services
pkgs.matrix-synapse freshrss
pkgs.freshrss matrix-synapse
signaldctl
]; ];
sane.persist.enable = true; sane.persist.enable = true;
sane.services.dyn-dns.enable = true; 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;
# sane.services.duplicity.enable = true; # TODO: re-enable after HW upgrade # sane.services.duplicity.enable = true; # TODO: re-enable after HW upgrade
# automatically log in at the virtual consoles.
# using root here makes sure we always have an escape hatch
services.getty.autologinUser = "root";
boot.loader.efi.canTouchEfiVariables = false; boot.loader.efi.canTouchEfiVariables = false;
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ]; sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
sops.secrets.duplicity_passphrase = {
sopsFile = ../../secrets/servo.yaml;
};
# both transmission and ipfs try to set different net defaults. # both transmission and ipfs try to set different net defaults.
# we just use the most aggressive of the two here: # we just use the most aggressive of the two here:
boot.kernel.sysctl = { boot.kernel.sysctl = {

View File

@@ -52,18 +52,18 @@
# services.resolved.extraConfig = '' # services.resolved.extraConfig = ''
# # docs: `man resolved.conf` # # docs: `man resolved.conf`
# # DNS servers to use via the `wg0` interface. # # DNS servers to use via the `wg-ovpns` interface.
# # i hope that from the root ns, these aren't visible. # # i hope that from the root ns, these aren't visible.
# DNS=46.227.67.134%wg0 192.165.9.158%wg0 # DNS=46.227.67.134%wg-ovpns 192.165.9.158%wg-ovpns
# FallbackDNS=1.1.1.1 9.9.9.9 # FallbackDNS=1.1.1.1 9.9.9.9
# ''; # '';
# OVPN CONFIG (https://www.ovpn.com): # OVPN CONFIG (https://www.ovpn.com):
# DOCS: https://nixos.wiki/wiki/WireGuard # DOCS: https://nixos.wiki/wiki/WireGuard
# if you `systemctl restart wireguard-wg0`, make sure to also restart any other services in `NetworkNamespacePath = .../ovpns`. # if you `systemctl restart wireguard-wg-ovpns`, make sure to also restart any other services in `NetworkNamespacePath = .../ovpns`.
# TODO: why not create the namespace as a seperate operation (nix config for that?) # TODO: why not create the namespace as a seperate operation (nix config for that?)
networking.wireguard.enable = true; networking.wireguard.enable = true;
networking.wireguard.interfaces.wg0 = let networking.wireguard.interfaces.wg-ovpns = let
ip = "${pkgs.iproute2}/bin/ip"; ip = "${pkgs.iproute2}/bin/ip";
in-ns = "${ip} netns exec ovpns"; in-ns = "${ip} netns exec ovpns";
iptables = "${pkgs.iptables}/bin/iptables"; iptables = "${pkgs.iptables}/bin/iptables";
@@ -163,9 +163,6 @@
''; '';
networking.iproute2.enable = true; networking.iproute2.enable = true;
sops.secrets."wg_ovpns_privkey" = {
sopsFile = ../../secrets/servo.yaml;
};
# HURRICANE ELECTRIC CONFIG: # HURRICANE ELECTRIC CONFIG:
# networking.sits = { # networking.sits = {

View File

@@ -0,0 +1,41 @@
{ ... }:
{
sops.secrets."ddns_afraid" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."ddns_he" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."dovecot_passwd" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."duplicity_passphrase" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."freshrss_passwd" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."matrix_synapse_secrets" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."mautrix_signal_env" = {
sopsFile = ../../../secrets/servo/mautrix_signal_env.bin;
};
sops.secrets."mediawiki_pw" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."pleroma_secrets" = {
sopsFile = ../../../secrets/servo.yaml;
};
sops.secrets."wg_ovpns_privkey" = {
sopsFile = ../../../secrets/servo.yaml;
};
}

View File

@@ -24,8 +24,4 @@ lib.mkIf false
OnUnitActiveSec = "10min"; OnUnitActiveSec = "10min";
}; };
}; };
sops.secrets."ddns_afraid" = {
sopsFile = ../../../secrets/servo.yaml;
};
} }

View File

@@ -27,8 +27,4 @@ lib.mkIf false
OnUnitActiveSec = "10min"; OnUnitActiveSec = "10min";
}; };
}; };
sops.secrets."ddns_he" = {
sopsFile = ../../../secrets/servo.yaml;
};
} }

View File

@@ -46,6 +46,8 @@
}]; }];
# provide access to certs # provide access to certs
# TODO: this should just be `acme`. then we also add nginx to the `acme` group.
# why is /var/lib/acme/* owned by `nginx` group??
users.users.ejabberd.extraGroups = [ "nginx" ]; users.users.ejabberd.extraGroups = [ "nginx" ];
security.acme.certs."uninsane.org".extraDomainNames = [ security.acme.certs."uninsane.org".extraDomainNames = [

View File

@@ -11,8 +11,7 @@
{ config, lib, pkgs, sane-lib, ... }: { config, lib, pkgs, sane-lib, ... }:
{ {
sops.secrets.freshrss_passwd = { sops.secrets."freshrss_passwd" = {
sopsFile = ../../../secrets/servo.yaml;
owner = config.users.users.freshrss.name; owner = config.users.users.freshrss.name;
mode = "0400"; mode = "0400";
}; };
@@ -42,7 +41,10 @@
description = "import sane RSS feed list"; description = "import sane RSS feed list";
after = [ "freshrss-config.service" ]; after = [ "freshrss-config.service" ];
script = '' script = ''
${pkgs.freshrss}/cli/import-for-user.php --user admin --filename ${opml} # easiest way to preserve feeds: delete the user, recreate it, import feeds
${pkgs.freshrss}/cli/delete-user.php --user colin || true
${pkgs.freshrss}/cli/create-user.php --user colin --password "$(cat ${config.services.freshrss.passwordFile})" || true
${pkgs.freshrss}/cli/import-for-user.php --user colin --filename ${opml}
''; '';
}; };

View File

@@ -15,6 +15,17 @@
services.gitea.settings.session.COOKIE_SECURE = true; services.gitea.settings.session.COOKIE_SECURE = true;
# services.gitea.disableRegistration = true; # services.gitea.disableRegistration = true;
# gitea doesn't create the git user
users.users.git = {
description = "Gitea Service";
home = "/var/lib/gitea";
useDefaultShell = true;
group = "gitea";
isSystemUser = true;
# sendmail access (not 100% sure if this is necessary)
extraGroups = [ "postdrop" ];
};
services.gitea.settings = { services.gitea.settings = {
server = { server = {
# options: "home", "explore", "organizations", "login" or URL fragment (or full URL) # options: "home", "explore", "organizations", "login" or URL fragment (or full URL)

View File

@@ -7,8 +7,8 @@
]; ];
services.jackett.enable = true; services.jackett.enable = true;
systemd.services.jackett.after = [ "wireguard-wg0.service" ]; systemd.services.jackett.after = [ "wireguard-wg-ovpns.service" ];
systemd.services.jackett.partOf = [ "wireguard-wg0.service" ]; systemd.services.jackett.partOf = [ "wireguard-wg-ovpns.service" ];
systemd.services.jackett.serviceConfig = { systemd.services.jackett.serviceConfig = {
# run this behind the OVPN static VPN # run this behind the OVPN static VPN
NetworkNamespacePath = "/run/netns/ovpns"; NetworkNamespacePath = "/run/netns/ovpns";

View File

@@ -6,12 +6,18 @@
imports = [ imports = [
./discord-puppet.nix ./discord-puppet.nix
# ./irc.nix # ./irc.nix
./signal.nix
]; ];
# allow synapse to read the registration files of its appservices
users.users.matrix-synapse.extraGroups = [ "mautrix-signal" ];
sane.persist.sys.plaintext = [ sane.persist.sys.plaintext = [
{ user = "matrix-synapse"; group = "matrix-synapse"; directory = "/var/lib/matrix-synapse"; } { user = "matrix-synapse"; group = "matrix-synapse"; directory = "/var/lib/matrix-synapse"; }
]; ];
services.matrix-synapse.enable = true; services.matrix-synapse.enable = true;
# this changes the default log level from INFO to WARN.
# maybe there's an easier way?
services.matrix-synapse.settings.log_config = ./synapse-log_level.yaml; services.matrix-synapse.settings.log_config = ./synapse-log_level.yaml;
services.matrix-synapse.settings.server_name = "uninsane.org"; services.matrix-synapse.settings.server_name = "uninsane.org";
@@ -127,8 +133,7 @@
}; };
sops.secrets.matrix_synapse_secrets = { sops.secrets."matrix_synapse_secrets" = {
sopsFile = ../../../../secrets/servo.yaml;
owner = config.users.users.matrix-synapse.name; owner = config.users.users.matrix-synapse.name;
}; };
} }

View File

@@ -43,6 +43,7 @@
}; };
}; };
# TODO: should use a dedicated user
systemd.services.mx-puppet-discord.serviceConfig = { systemd.services.mx-puppet-discord.serviceConfig = {
# fix up to not use /var/lib/private, but just /var/lib # fix up to not use /var/lib/private, but just /var/lib
DynamicUser = lib.mkForce false; DynamicUser = lib.mkForce false;

View File

@@ -0,0 +1,35 @@
# config options:
# - <https://github.com/mautrix/signal/blob/master/mautrix_signal/example-config.yaml>
{ config, pkgs, ... }:
{
sane.persist.sys.plaintext = [
{ user = "mautrix-signal"; group = "mautrix-signal"; directory = "/var/lib/mautrix-signal"; }
{ user = "signald"; group = "signald"; directory = "/var/lib/signald"; }
];
services.signald.enable = true;
services.mautrix-signal.enable = true;
services.mautrix-signal.environmentFile =
config.sops.secrets.mautrix_signal_env.path;
services.mautrix-signal.settings.signal.socket_path = "/run/signald/signald.sock";
services.mautrix-signal.settings.homeserver.domain = "uninsane.org";
services.mautrix-signal.settings.bridge.permissions."@colin:uninsane.org" = "admin";
services.matrix-synapse.settings.app_service_config_files = [
# auto-created by mautrix-signal service
"/var/lib/mautrix-signal/signal-registration.yaml"
];
systemd.services.mautrix-signal.serviceConfig = {
# allow communication to signald
SupplementaryGroups = [ "signald" ];
ReadWritePaths = [ "/run/signald" ];
};
sops.secrets."mautrix_signal_env" = {
format = "binary";
mode = "0440";
owner = config.users.users.mautrix-signal.name;
group = config.users.users.matrix-synapse.name;
};
}

View File

@@ -1,11 +1,8 @@
{ ... }: { lib, ... }:
{ {
sane.persist.sys.plaintext = [ sane.persist.sys.plaintext = [
# TODO: we don't have a static user allocated for navidrome! { user = "navidrome"; group = "navidrome"; directory = "/var/lib/navidrome"; }
# the chown would happen too early for us to set static perms
"/var/lib/private/navidrome"
# { user = "navidrome"; group = "navidrome"; directory = "/var/lib/private/navidrome"; }
]; ];
services.navidrome.enable = true; services.navidrome.enable = true;
services.navidrome.settings = { services.navidrome.settings = {
@@ -18,6 +15,20 @@
ScanSchedule = "@every 1h"; ScanSchedule = "@every 1h";
}; };
systemd.services.navidrome.serviceConfig = {
# fix to use a normal user so we can configure perms correctly
DynamicUser = lib.mkForce false;
User = "navidrome";
Group = "navidrome";
};
users.groups.navidrome = {};
users.users.navidrome = {
group = "navidrome";
isSystemUser = true;
};
services.nginx.virtualHosts."music.uninsane.org" = { services.nginx.virtualHosts."music.uninsane.org" = {
forceSSL = true; forceSSL = true;
enableACME = true; enableACME = true;

View File

@@ -17,5 +17,5 @@
sane.services.trust-dns.zones."uninsane.org".inet.CNAME."nixcache" = "native"; sane.services.trust-dns.zones."uninsane.org".inet.CNAME."nixcache" = "native";
sane.services.nixserve.enable = true; sane.services.nixserve.enable = true;
sane.services.nixserve.sopsFile = ../../../secrets/servo.yaml; sane.services.nixserve.sopsFile = ../../../../secrets/servo.yaml;
} }

View File

@@ -135,6 +135,11 @@
# CapabilityBoundingSet = lib.mkForce "~"; # CapabilityBoundingSet = lib.mkForce "~";
# }; # };
# this is required to allow pleroma to send email.
# raw `sendmail` works, but i think pleroma's passing it some funny flags or something, idk.
# hack to fix that.
users.users.pleroma.extraGroups = [ "postdrop" ];
# Pleroma server and web interface # Pleroma server and web interface
# TODO: enable publog? # TODO: enable publog?
services.nginx.virtualHosts."fed.uninsane.org" = { services.nginx.virtualHosts."fed.uninsane.org" = {
@@ -179,8 +184,7 @@
sane.services.trust-dns.zones."uninsane.org".inet.CNAME."fed" = "native"; sane.services.trust-dns.zones."uninsane.org".inet.CNAME."fed" = "native";
sops.secrets.pleroma_secrets = { sops.secrets."pleroma_secrets" = {
sopsFile = ../../../secrets/servo.yaml;
owner = config.users.users.pleroma.name; owner = config.users.users.pleroma.name;
}; };
} }

View File

@@ -110,8 +110,8 @@ in
services.postfix.enableSubmissions = true; services.postfix.enableSubmissions = true;
services.postfix.submissionsOptions = submissionOptions; services.postfix.submissionsOptions = submissionOptions;
systemd.services.postfix.after = [ "wireguard-wg0.service" ]; systemd.services.postfix.after = [ "wireguard-wg-ovpns.service" ];
systemd.services.postfix.partOf = [ "wireguard-wg0.service" ]; systemd.services.postfix.partOf = [ "wireguard-wg-ovpns.service" ];
systemd.services.postfix.serviceConfig = { systemd.services.postfix.serviceConfig = {
# run this behind the OVPN static VPN # run this behind the OVPN static VPN
NetworkNamespacePath = "/run/netns/ovpns"; NetworkNamespacePath = "/run/netns/ovpns";
@@ -132,8 +132,8 @@ in
# keeping this the same as the hostname seems simplest # keeping this the same as the hostname seems simplest
services.opendkim.selector = "mx"; services.opendkim.selector = "mx";
systemd.services.opendkim.after = [ "wireguard-wg0.service" ]; systemd.services.opendkim.after = [ "wireguard-wg-ovpns.service" ];
systemd.services.opendkim.partOf = [ "wireguard-wg0.service" ]; systemd.services.opendkim.partOf = [ "wireguard-wg-ovpns.service" ];
systemd.services.opendkim.serviceConfig = { systemd.services.opendkim.serviceConfig = {
# run this behind the OVPN static VPN # run this behind the OVPN static VPN
NetworkNamespacePath = "/run/netns/ovpns"; NetworkNamespacePath = "/run/netns/ovpns";
@@ -197,8 +197,7 @@ in
# } # }
]; ];
sops.secrets.dovecot_passwd = { sops.secrets."dovecot_passwd" = {
sopsFile = ../../../secrets/servo.yaml;
owner = config.users.users.dovecot2.name; owner = config.users.users.dovecot2.name;
# TODO: debug why mail can't be sent without this being world-readable # TODO: debug why mail can't be sent without this being world-readable
mode = "0444"; mode = "0444";

View File

@@ -40,8 +40,8 @@
# transmission will by default not allow the world to read its files. # transmission will by default not allow the world to read its files.
services.transmission.downloadDirPermissions = "775"; services.transmission.downloadDirPermissions = "775";
systemd.services.transmission.after = [ "wireguard-wg0.service" ]; systemd.services.transmission.after = [ "wireguard-wg-ovpns.service" ];
systemd.services.transmission.partOf = [ "wireguard-wg0.service" ]; systemd.services.transmission.partOf = [ "wireguard-wg-ovpns.service" ];
systemd.services.transmission.serviceConfig = { systemd.services.transmission.serviceConfig = {
# run this behind the OVPN static VPN # run this behind the OVPN static VPN
NetworkNamespacePath = "/run/netns/ovpns"; NetworkNamespacePath = "/run/netns/ovpns";

View File

@@ -9,6 +9,7 @@
"192.168.0.5" "192.168.0.5"
"10.0.1.5" "10.0.1.5"
]; ];
sane.services.trust-dns.quiet = true;
sane.services.trust-dns.zones."uninsane.org".TTL = 900; sane.services.trust-dns.zones."uninsane.org".TTL = 900;

View File

@@ -8,7 +8,6 @@ lib.mkIf false
{ {
sops.secrets."mediawiki_pw" = { sops.secrets."mediawiki_pw" = {
owner = config.users.users.mediawiki.name; owner = config.users.users.mediawiki.name;
sopsFile = ../../../secrets/servo.yaml;
}; };
services.mediawiki.enable = true; services.mediawiki.enable = true;

View File

@@ -1,16 +0,0 @@
{ lib, pkgs, ... }:
{
# persist external pairings by default
sane.persist.sys.plaintext = [ "/var/lib/bluetooth" ];
sane.fs."/var/lib/bluetooth".generated.acl.mode = "0700";
sane.fs."/var/lib/bluetooth/.secrets.stamp" = {
wantedBeforeBy = [ "bluetooth.service" ];
# XXX: install-bluetooth uses sed, but that's part of the default systemd unit path, it seems
generated.script.script = builtins.readFile ../../scripts/install-bluetooth + ''
touch "/var/lib/bluetooth/.secrets.stamp"
'';
generated.script.scriptArgs = [ "/run/secrets/bt" ];
};
}

View File

@@ -1,5 +1,12 @@
{ ... }: { 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; # the configuration of which specific package set `pkgs.cross` refers to happens elsewhere;
# here we just define them all. # here we just define them all.
@@ -8,8 +15,8 @@
# non-emulated packages build *from* local *for* target. # non-emulated packages build *from* local *for* target.
# for large packages like the linux kernel which are expensive to build under emulation, # 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. # the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
crossFrom."x86_64-linux" = (prev.forceSystem "x86_64-linux" null).appendOverlays next.overlays; crossFrom."x86_64-linux" = mkCrossFrom "x86_64-linux" next;
crossFrom."aarch64-linux" = (prev.forceSystem "aarch64-linux" null).appendOverlays next.overlays; crossFrom."aarch64-linux" = mkCrossFrom "aarch64-linux" next;
}) })
]; ];
} }

View File

@@ -1,11 +1,11 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
imports = [ imports = [
./bluetooth.nix
./cross.nix ./cross.nix
./feeds.nix ./feeds.nix
./fs.nix ./fs.nix
./hardware ./hardware.nix
./home
./i2p.nix ./i2p.nix
./ids.nix ./ids.nix
./machine-id.nix ./machine-id.nix
@@ -30,6 +30,9 @@
"/var/lib/machines" # maybe not needed, but would be painful to add a VM and forget. "/var/lib/machines" # maybe not needed, but would be painful to add a VM and forget.
]; ];
# 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";
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
# time.timeZone = "America/Los_Angeles"; # time.timeZone = "America/Los_Angeles";
@@ -39,8 +42,12 @@
nix.extraOptions = '' nix.extraOptions = ''
experimental-features = nix-command flakes experimental-features = nix-command flakes
''; '';
# allow `nix-shell` (and probably nix-index?) to locate our patched and custom packages
nix.nixPath = [
"nixpkgs=${pkgs.path}"
"nixpkgs-overlays=${../..}/overlays"
];
# TODO: move this into home-manager?
fonts = { fonts = {
enableDefaultFonts = true; enableDefaultFonts = true;
fonts = with pkgs; [ font-awesome twitter-color-emoji hack-font ]; fonts = with pkgs; [ font-awesome twitter-color-emoji hack-font ];

View File

@@ -13,6 +13,7 @@ let
uncat = { cat = "uncat"; }; uncat = { cat = "uncat"; };
text = { format = "text"; }; text = { format = "text"; };
img = { format = "image"; };
mkRss = format: url: { inherit url format; } // uncat // infrequent; mkRss = format: url: { inherit url format; } // uncat // infrequent;
# format-specific helpers # format-specific helpers
@@ -29,32 +30,35 @@ let
in { in {
url = raw.url; url = raw.url;
# not sure the exact mapping with velocity here: entries per day? # not sure the exact mapping with velocity here: entries per day?
freq = lib.mkDefault ( freq = lib.mkIf (raw.velocity or 0 != 0) (lib.mkDefault (
if raw.velocity or 0 > 2 then if raw.velocity > 2 then
"hourly" "hourly"
else if raw.velocity or 0 > 0.5 then else if raw.velocity > 0.5 then
"daily" "daily"
else if raw.velocity or 0 > 0.1 then else if raw.velocity > 0.1 then
"weekly" "weekly"
else else
"infrequent" "infrequent"
); ));
} // lib.optionalAttrs (raw.is_podcast or false) { } // lib.optionalAttrs (raw.is_podcast or false) {
format = "podcast"; format = "podcast";
} // lib.optionalAttrs (raw.title or "" != "") {
title = lib.mkDefault raw.title;
}; };
podcasts = [ podcasts = [
(fromDb "lexfridman.com/podcast" // rat) (fromDb "lexfridman.com/podcast" // rat)
# (mkPod "https://lexfridman.com/feed/podcast/" // rat // weekly)
## Astral Codex Ten ## Astral Codex Ten
(fromDb "sscpodcast.libsyn.com" // rat) (fromDb "sscpodcast.libsyn.com" // rat)
## Econ Talk ## Econ Talk
(fromDb "feeds.simplecast.com/wgl4xEgL" // rat) (fromDb "feeds.simplecast.com/wgl4xEgL" // rat)
## Cory Doctorow -- both podcast & text entries ## Cory Doctorow -- both podcast & text entries
(fromDb "craphound.com" // pol) (fromDb "craphound.com" // pol)
(mkPod "https://congressionaldish.libsyn.com/rss" // pol // infrequent) (fromDb "congressionaldish.libsyn.com" // pol)
## Civboot -- https://anchor.fm/civboot ## Civboot -- https://anchor.fm/civboot
(fromDb "anchor.fm/s/34c7232c/podcast/rss" // tech) (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) (fromDb "feeds.feedburner.com/80000HoursPodcast" // rat)
(fromDb "allinchamathjason.libsyn.com" // pol) (fromDb "allinchamathjason.libsyn.com" // pol)
(fromDb "acquired.libsyn.com" // tech) (fromDb "acquired.libsyn.com" // tech)
@@ -83,93 +87,108 @@ let
(fromDb "feed.podbean.com/matrixlive/feed.xml" // tech) (fromDb "feed.podbean.com/matrixlive/feed.xml" // tech)
## Michael Malice - Your Welcome -- also available here: <https://origin.podcastone.com/podcast?categoryID2=2232> ## Michael Malice - Your Welcome -- also available here: <https://origin.podcastone.com/podcast?categoryID2=2232>
(fromDb "rss.art19.com/your-welcome" // pol) (fromDb "rss.art19.com/your-welcome" // pol)
(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)
]; ];
texts = [ texts = [
# AGGREGATORS (> 1 post/day) # AGGREGATORS (> 1 post/day)
(fromDb "lwn.net" // tech)
(fromDb "lesswrong.com" // rat) (fromDb "lesswrong.com" // rat)
(fromDb "econlib.org" // pol) (fromDb "econlib.org" // pol)
# AGGREGATORS (< 1 post/day) # AGGREGATORS (< 1 post/day)
(mkText "https://palladiummag.com/feed" // uncat // weekly) (fromDb "palladiummag.com" // uncat)
(mkText "https://profectusmag.com/feed" // uncat // weekly) (fromDb "profectusmag.com" // uncat)
(mkText "https://semiaccurate.com/feed" // tech // weekly) (fromDb "semiaccurate.com" // tech)
(mkText "https://linuxphoneapps.org/blog/atom.xml" // tech // infrequent) (mkText "https://linuxphoneapps.org/blog/atom.xml" // tech // infrequent)
(mkText "https://spectrum.ieee.org/rss" // tech // weekly) (fromDb "spectrum.ieee.org" // tech)
## 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)
## No Moods, Ads or Cutesy Fucking Icons ## No Moods, Ads or Cutesy Fucking Icons
(mkText "https://www.rifters.com/crawl/?feed=rss2" // uncat // weekly) (fromDb "rifters.com/crawl" // uncat)
# DEVELOPERS # DEVELOPERS
(fromDb "uninsane.org" // tech) (fromDb "uninsane.org" // tech)
(fromDb "mg.lol" // tech) (fromDb "mg.lol" // tech)
(fromDb "drewdevault.com" // tech)
## Ken Shirriff ## Ken Shirriff
(fromDb "righto.com" // tech) (fromDb "righto.com" // tech)
## shared blog by a few NixOS devs, notably onny
(fromDb "project-insanity.org" // tech)
## Vitalik Buterin ## Vitalik Buterin
(mkText "https://vitalik.ca/feed.xml" // tech // infrequent) (fromDb "vitalik.ca" // tech)
## ian (Sanctuary) ## ian (Sanctuary)
(mkText "https://sagacioussuricata.com/feed.xml" // tech // infrequent) (fromDb "sagacioussuricata.com" // tech)
## Bunnie Juang ## Bunnie Juang
(mkText "https://www.bunniestudios.com/blog/?feed=rss2" // tech // infrequent) (fromDb "bunniestudios.com" // tech)
(mkText "https://blog.danieljanus.pl/atom.xml" // tech // infrequent) (fromDb "blog.danieljanus.pl" // tech)
(mkText "https://ianthehenry.com/feed.xml" // tech // infrequent) (fromDb "ianthehenry.com" // tech)
(mkText "https://bitbashing.io/feed.xml" // tech // infrequent) (fromDb "bitbashing.io" // tech)
(mkText "https://idiomdrottning.org/feed.xml" // uncat // daily) (fromDb "idiomdrottning.org" // uncat)
(mkText "https://anish.lakhwara.com/home.html" // tech // weekly) (mkText "https://anish.lakhwara.com/home.html" // tech // weekly)
(mkText "https://www.jefftk.com/news.rss" // tech // daily) (fromDb "jefftk.com" // tech)
(mkText "https://pomeroyb.com/feed.xml" // tech // infrequent) (fromDb "pomeroyb.com" // tech)
# (TECH; POL) COMMENTATORS # (TECH; POL) COMMENTATORS
## Matt Webb -- engineering-ish, but dreamy
(fromDb "interconnected.org/home/feed" // rat)
(fromDb "edwardsnowden.substack.com" // pol // text) (fromDb "edwardsnowden.substack.com" // pol // text)
## Julia Evans
(mkText "https://jvns.ca/atom.xml" // tech // weekly)
(mkText "http://benjaminrosshoffman.com/feed" // pol // weekly) (mkText "http://benjaminrosshoffman.com/feed" // pol // weekly)
## Ben Thompson ## Ben Thompson
(mkText "https://www.stratechery.com/rss" // pol // weekly) (mkText "https://www.stratechery.com/rss" // pol // weekly)
## Balaji ## Balaji
(mkText "https://balajis.com/rss" // pol // weekly) (fromDb "balajis.com" // pol)
(mkText "https://www.ben-evans.com/benedictevans/rss.xml" // pol // weekly) (fromDb "ben-evans.com/benedictevans" // pol)
(mkText "https://www.lynalden.com/feed" // pol // infrequent) (fromDb "lynalden.com" // pol)
(mkText "https://austinvernon.site/rss.xml" // tech // infrequent) (fromDb "austinvernon.site" // tech)
(mkSubstack "oversharing" // pol // daily) (mkSubstack "oversharing" // pol // daily)
(mkSubstack "doomberg" // tech // weekly) (mkSubstack "doomberg" // tech // weekly)
## David Rosenthal ## David Rosenthal
(mkText "https://blog.dshr.org/rss.xml" // pol // weekly) (fromDb "blog.dshr.org" // pol)
## Matt Levine ## Matt Levine
(mkText "https://www.bloomberg.com/opinion/authors/ARbTQlRLRjE/matthew-s-levine.rss" // pol // weekly) (mkText "https://www.bloomberg.com/opinion/authors/ARbTQlRLRjE/matthew-s-levine.rss" // pol // weekly)
(mkText "https://stpeter.im/atom.xml" // pol // weekly) (fromDb "stpeter.im/atom.xml" // pol)
## Peter Saint-Andre -- side project of stpeter.im
(fromDb "philosopher.coach" // rat)
# RATIONALITY/PHILOSOPHY/ETC # RATIONALITY/PHILOSOPHY/ETC
(mkSubstack "samkriss" // humor // infrequent) (mkSubstack "samkriss" // humor // infrequent)
(mkText "https://unintendedconsequenc.es/feed" // rat // infrequent) (fromDb "unintendedconsequenc.es" // rat)
(mkText "https://applieddivinitystudies.com/atom.xml" // rat // weekly) (fromDb "applieddivinitystudies.com" // rat)
(mkText "https://slimemoldtimemold.com/feed.xml" // rat // weekly) (fromDb "slimemoldtimemold.com" // rat)
(mkText "https://www.richardcarrier.info/feed" // rat // weekly) (fromDb "richardcarrier.info" // rat)
(mkText "https://www.gwern.net/feed.xml" // uncat // infrequent) (fromDb "gwern.net" // rat)
## Jason Crawford ## Jason Crawford
(mkText "https://rootsofprogress.org/feed.xml" // rat // weekly) (fromDb "rootsofprogress.org" // rat)
## Robin Hanson ## Robin Hanson
(mkText "https://www.overcomingbias.com/feed" // rat // daily) (fromDb "overcomingbias.com" // rat)
## Scott Alexander ## Scott Alexander
(mkSubstack "astralcodexten" // rat // daily) (mkSubstack "astralcodexten" // rat // daily)
## Paul Christiano ## Paul Christiano
(mkText "https://sideways-view.com/feed" // rat // infrequent) (fromDb "sideways-view.com" // rat)
## Sean Carroll ## Sean Carroll
(mkText "https://www.preposterousuniverse.com/rss" // rat // infrequent) (fromDb "preposterousuniverse.com" // rat)
## mostly dating topics. not advice, or humor, but looking through a social lens ## mostly dating topics. not advice, or humor, but looking through a social lens
(mkText "https://putanumonit.com/feed" // rat // infrequent) (fromDb "putanumonit.com" // rat)
# CODE # CODE
# (mkText "https://github.com/Kaiteki-Fedi/Kaiteki/commits/master.atom" // tech // infrequent) # (mkText "https://github.com/Kaiteki-Fedi/Kaiteki/commits/master.atom" // tech // infrequent)
]; ];
images = [ images = [
(mkImg "https://www.smbc-comics.com/comic/rss" // humor // daily) (fromDb "smbc-comics.com" // img // humor)
(mkImg "https://xkcd.com/atom.xml" // humor // daily) (fromDb "xkcd.com" // img // humor)
(mkImg "https://pbfcomics.com/feed" // humor // infrequent) (fromDb "pbfcomics.com" // img // humor)
# (mkImg "http://dilbert.com/feed" // humor // daily) # (mkImg "http://dilbert.com/feed" // humor // daily)
# ART # ART
(mkImg "https://miniature-calendar.com/feed" // art // daily) (fromDb "miniature-calendar.com" // img // art // daily)
]; ];
in in
{ {

View File

@@ -5,7 +5,7 @@ lib.mkIf config.sane.home-manager.enable
{ {
sops.secrets."aerc_accounts" = { sops.secrets."aerc_accounts" = {
owner = config.users.users.colin.name; owner = config.users.users.colin.name;
sopsFile = ../../secrets/universal/aerc_accounts.conf; sopsFile = ../../../secrets/universal/aerc_accounts.conf;
format = "binary"; format = "binary";
}; };
sane.fs."/home/colin/.config/aerc/accounts.conf" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.aerc_accounts.path; sane.fs."/home/colin/.config/aerc/accounts.conf" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.aerc_accounts.path;

View File

@@ -0,0 +1,23 @@
{ ... }:
{
imports = [
./aerc.nix
./firefox.nix
./gfeeds.nix
./git.nix
./gpodder.nix
./keyring.nix
./kitty.nix
./libreoffice.nix
./mime.nix
./mpv.nix
./neovim.nix
./newsflash.nix
./splatmoji.nix
./ssh.nix
./sublime-music.nix
./vlc.nix
./xdg-dirs.nix
./zsh
];
}

View File

@@ -32,16 +32,6 @@ let
defaultSettings = firefoxSettings; defaultSettings = firefoxSettings;
# defaultSettings = librewolfSettings; # defaultSettings = librewolfSettings;
package = pkgs.wrapFirefox cfg.browser.browser {
# inherit the default librewolf.cfg
# it can be further customized via ~/.librewolf/librewolf.overrides.cfg
inherit (pkgs.librewolf-unwrapped) extraPrefsFiles;
inherit (cfg.browser) libName;
extraNativeMessagingHosts = [ pkgs.browserpass ];
# extraNativeMessagingHosts = [ pkgs.gopass-native-messaging-host ];
nixExtensions = let
addon = name: extid: hash: pkgs.fetchFirefoxAddon { addon = name: extid: hash: pkgs.fetchFirefoxAddon {
inherit name hash; inherit name hash;
url = "https://addons.mozilla.org/firefox/downloads/latest/${name}/latest.xpi"; url = "https://addons.mozilla.org/firefox/downloads/latest/${name}/latest.xpi";
@@ -53,20 +43,17 @@ let
src = "${pkg}/share/mozilla/extensions/\\{ec8030f7-c20a-464f-9b0e-13a3a9e97384\\}/${pkg.extid}.xpi"; src = "${pkg}/share/mozilla/extensions/\\{ec8030f7-c20a-464f-9b0e-13a3a9e97384\\}/${pkg.extid}.xpi";
fixedExtid = pkg.extid; fixedExtid = pkg.extid;
}; };
in [
# get names from: package = pkgs.wrapFirefox cfg.browser.browser {
# - ~/ref/nix-community/nur-combined/repos/rycee/pkgs/firefox-addons/generated-firefox-addons.nix # inherit the default librewolf.cfg
# `wget ...xpi`; `unar ...xpi`; `cat */manifest.json | jq '.browser_specific_settings.gecko.id'` # it can be further customized via ~/.librewolf/librewolf.overrides.cfg
(addon "ublock-origin" "uBlock0@raymondhill.net" "sha256-a/ivUmY1P6teq9x0dt4CbgHt+3kBsEMMXlOfZ5Hx7cg=") inherit (pkgs.librewolf-unwrapped) extraPrefsFiles;
(addon "sponsorblock" "sponsorBlocker@ajay.app" "sha256-d2K3ufvurWnYVzqLbyR//MgejybkY9exitAf9RdLNRo=") inherit (cfg.browser) libName;
(addon "bypass-paywalls-clean" "{d133e097-46d9-4ecc-9903-fa6a722a6e0e}" "sha256-t6Q335Nq60mDILPmzem+DT5KflleAPVJL3bsaA+UL0g=")
(addon "sidebery" "{3c078156-979c-498b-8990-85f7987dd929}" "sha256-YONfK/rIjlsrTgRHIt3km07Q7KnpIW89Z9r92ZSCc6w=") extraNativeMessagingHosts = [ pkgs.browserpass ];
(addon "ether-metamask" "webextension@metamask.io" "sha256-G+MwJDOcsaxYSUXjahHJmkWnjLeQ0Wven8DU/lGeMzA=") # extraNativeMessagingHosts = [ pkgs.gopass-native-messaging-host ];
(addon "ublacklist" "@ublacklist" "sha256-vHe/7EYOzcKeAbTElmt0Rb4E2rX0f3JgXThJaUmaz+M=")
(addon "i2p-in-private-browsing" "i2ppb@eyedeekay.github.io" "sha256-dJcJ3jxeAeAkRvhODeIVrCflvX+S4E0wT/PyYzQBQWs=") nixExtensions = concatMap (ext: optional ext.enable ext.package) (attrValues cfg.addons);
# (addon "browserpass-ce" "browserpass@maximbaz.com" "sha256-sXgUBbRvMnRpeIW1MTkmTcoqtW/8RDXAkxAq1evFkpc=")
(localAddon pkgs.browserpass-extension)
];
extraPolicies = { extraPolicies = {
NoDefaultBookmarks = true; NoDefaultBookmarks = true;
@@ -102,6 +89,17 @@ let
# NewTabPage = true; # NewTabPage = true;
}; };
}; };
addonOpts = types.submodule {
options = {
package = mkOption {
type = types.package;
};
enable = mkOption {
type = types.bool;
};
};
};
in in
{ {
options = { options = {
@@ -119,6 +117,32 @@ in
type = types.nullOr types.str; type = types.nullOr types.str;
default = "cryptClearOnBoot"; default = "cryptClearOnBoot";
}; };
sane.web-browser.addons = mkOption {
type = types.attrsOf addonOpts;
default = {
# get names from:
# - ~/ref/nix-community/nur-combined/repos/rycee/pkgs/firefox-addons/generated-firefox-addons.nix
# `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=";
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=";
ublacklist.package = addon "ublacklist" "@ublacklist" "sha256-RqY5iHzbL2qizth7aguyOKWPyINXmrwOlf/OsfqAS48=";
ublock-origin.package = addon "ublock-origin" "uBlock0@raymondhill.net" "sha256-a/ivUmY1P6teq9x0dt4CbgHt+3kBsEMMXlOfZ5Hx7cg=";
browserpass-extension.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;
sponsorblock.enable = lib.mkDefault true;
ublacklist.enable = lib.mkDefault true;
ublock-origin.enable = lib.mkDefault true;
};
};
}; };
config = lib.mkIf config.sane.home-manager.enable { config = lib.mkIf config.sane.home-manager.enable {
@@ -149,13 +173,27 @@ in
''; '';
sane.packages.extraGuiPkgs = [ package ]; sane.packages.extraGuiPkgs = [ package ];
# flood the cache to disk to avoid it taking up too much tmp # 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.persist.home.byPath."${cfg.browser.cacheDir}" = lib.mkIf (cfg.persistCache != null) {
store = cfg.persistCache; store = cfg.persistCache;
}; };
sane.persist.home.byPath."${cfg.browser.dotDir}" = lib.mkIf (cfg.persistData != null) { sane.persist.home.byPath."${cfg.browser.dotDir}/default" = lib.mkIf (cfg.persistData != null) {
store = cfg.persistData; store = cfg.persistData;
}; };
sane.fs."/home/colin/${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 ''
[Profile0]
Name=default
IsRelative=1
Path=default
Default=1
[General]
StartWithLastProfile=1
'';
}; };
} }

19
hosts/common/home/git.nix Normal file
View File

@@ -0,0 +1,19 @@
{ config, lib, pkgs, sane-lib, ... }:
let
mkCfg = lib.generators.toINI { };
in
lib.mkIf config.sane.home-manager.enable
{
sane.fs."/home/colin/.config/git/config" = sane-lib.fs.wantedText (mkCfg {
user.name = "Colin";
user.email = "colin@uninsane.org";
alias.co = "checkout";
# difftastic docs:
# - <https://difftastic.wilfred.me.uk/git.html>
diff.tool = "difftastic";
difftool.prompt = false;
"difftool \"difftastic\"".cmd = ''${pkgs.difftastic}/bin/difft "$LOCAL" "$REMOTE"'';
# now run `git difftool` to use difftastic git
});
}

View File

@@ -5,7 +5,7 @@ lib.mkIf config.sane.home-manager.enable
sane.persist.home.private = [ ".local/share/keyrings" ]; sane.persist.home.private = [ ".local/share/keyrings" ];
sane.fs."/home/colin/private/.local/share/keyrings/default" = { sane.fs."/home/colin/private/.local/share/keyrings/default" = {
generated.script.script = builtins.readFile ../../scripts/init-keyring; generated.script.script = builtins.readFile ../../../scripts/init-keyring;
wantedBy = [ config.sane.fs."/home/colin/private".unit ]; wantedBy = [ config.sane.fs."/home/colin/private".unit ];
}; };
} }

View File

@@ -0,0 +1,69 @@
{ config, lib, pkgs, sane-lib, ... }:
lib.mkIf config.sane.home-manager.enable
{
sane.fs."/home/colin/.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
'';
# THEME CHOICES:
# docs: https://github.com/kovidgoyal/kitty-themes
# theme = "1984 Light"; # dislike: awful, harsh blues/teals
# theme = "Adventure Time"; # dislike: harsh (dark)
# theme = "Atom One Light"; # GOOD: light theme. all color combos readable. not a huge fan of the blue.
# theme = "Belafonte Day"; # dislike: too low contrast for text colors
# theme = "Belafonte Night"; # better: dark theme that's easy on the eyes. all combos readable. low contrast.
# theme = "Catppuccin"; # dislike: a bit pale/low-contrast (dark)
# theme = "Desert"; # mediocre: colors are harsh
# theme = "Earthsong"; # BEST: dark theme. readable, good contrast. unique, but decent colors.
# theme = "Espresso Libre"; # better: dark theme. readable, but meh colors
# theme = "Forest Night"; # decent: very pastel. it's workable, but unconventional and muted/flat.
# theme = "Gruvbox Material Light Hard"; # mediocre light theme.
# theme = "kanagawabones"; # better: dark theme. colors are too background-y
# theme = "Kaolin Dark"; # dislike: too dark
# theme = "Kaolin Breeze"; # mediocre: not-too-harsh light theme, but some parts are poor contrast
# theme = "Later This Evening"; # mediocre: not-too-harsh dark theme, but cursor is poor contrast
# theme = "Material"; # decent: light theme, few colors.
# theme = "Mayukai"; # decent: not-too-harsh dark theme. the teal is a bit straining
# theme = "Nord"; # mediocre: pale background, low contrast
# theme = "One Half Light"; # better: not-too-harsh light theme. contrast could be better
# theme = "PaperColor Dark"; # BEST: dark theme, very readable still the colors are background-y
# theme = "Parasio Dark"; # dislike: too low contrast
# theme = "Pencil Light"; # better: not-too-harsh light theme. decent contrast.
# theme = "Pnevma"; # dislike: too low contrast
# theme = "Piatto Light"; # better: readable light theme. pleasing colors. powerline prompt is hard to read.
# theme = "Rosé Pine Dawn"; # GOOD: light theme. all color combinations are readable. it is very mild -- may need to manually tweak contrast. tasteful colors
# theme = "Rosé Pine Moon"; # GOOD: dark theme. tasteful colors. but background is a bit intense
# theme = "Sea Shells"; # mediocre. not all color combos are readable
# theme = "Solarized Light"; # mediocre: not-too-harsh light theme; GREAT background; but some colors are low contrast
# theme = "Solarized Dark Higher Contrast"; # better: dark theme, decent colors
# theme = "Sourcerer"; # mediocre: ugly colors
# theme = "Space Gray"; # mediocre: too muted
# theme = "Space Gray Eighties"; # better: all readable, decent colors
# theme = "Spacemacs"; # mediocre: too muted
# theme = "Spring"; # mediocre: readable light theme, but the teal is ugly.
# theme = "Srcery"; # better: highly readable. colors are ehhh
# theme = "Substrata"; # decent: nice colors, but a bit flat.
# theme = "Sundried"; # mediocre: the solar text makes me squint
# theme = "Symfonic"; # mediocre: the dark purple has low contrast to the black bg.
# theme = "Tango Light"; # dislike: teal is too grating
# theme = "Tokyo Night Day"; # medicore: too muted
# theme = "Tokyo Night"; # better: tasteful. a bit flat
# theme = "Tomorrow"; # GOOD: all color combinations are readable. contrast is slightly better than Rose. on the blander side
# theme = "Treehouse"; # dislike: the orange is harsh on my eyes.
# theme = "Urple"; # dislike: weird palette
# theme = "Warm Neon"; # decent: not-too-harsh dark theme. the green is a bit unattractive
# theme = "Wild Cherry"; # GOOD: dark theme: nice colors. a bit flat
# theme = "Xcodedark"; # dislike: bad palette
# theme = "citylights"; # decent: dark theme. some parts have just a bit low contrast
# theme = "neobones_light"; # better light theme. the background is maybe too muted
# theme = "vimbones";
# theme = "zenbones_dark"; # mediocre: readable, but meh colors
# theme = "zenbones_light"; # decent: light theme. all colors are readable. contrast is passable but not excellent. highlight color is BAD
# theme = "zenwritten_dark"; # mediocre: looks same as zenbones_dark
}

View File

@@ -0,0 +1,15 @@
{ config, lib, sane-lib, ... }:
lib.mkIf config.sane.home-manager.enable
{
# libreoffice: disable first-run stuff
sane.fs."/home/colin/.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>
<item oor:path="/org.openoffice.Office.Common/Misc"><prop oor:name="ShowTipOfTheDay" oor:op="fuse"><value>false</value></prop></item>
</oor:items>
'';
# <item oor:path="/org.openoffice.Setup/Product"><prop oor:name="LastTimeDonateShown" oor:op="fuse"><value>1667693880</value></prop></item>
# <item oor:path="/org.openoffice.Setup/Product"><prop oor:name="LastTimeGetInvolvedShown" oor:op="fuse"><value>1667693880</value></prop></item>
}

View File

@@ -0,0 +1,43 @@
{ config, lib, sane-lib, ...}:
let
www = config.sane.web-browser.browser.desktop;
pdf = "org.gnome.Evince.desktop";
md = "obsidian.desktop";
thumb = "org.gnome.gThumb.desktop";
video = "vlc.desktop";
# audio = "mpv.desktop";
audio = "vlc.desktop";
in
lib.mkIf config.sane.home-manager.enable
{
# the xdg mime type for a file can be found with:
# - `xdg-mime query filetype path/to/thing.ext`
# we can have single associations or a list of associations.
# there's also options to *remove* [non-default] associations from specific apps
xdg.mime.enable = true;
xdg.mime.defaultApplications = {
# AUDIO
"audio/flac" = audio;
"audio/mpeg" = audio;
"audio/x-vorbis+ogg" = audio;
# IMAGES
"image/heif" = thumb; # apple codec
"image/png" = thumb;
"image/jpeg" = thumb;
# VIDEO
"video/mp4" = video;
"video/quicktime" = video;
"video/x-matroska" = video;
# HTML
"text/html" = www;
"x-scheme-handler/http" = www;
"x-scheme-handler/https" = www;
"x-scheme-handler/about" = www;
"x-scheme-handler/unknown" = www;
# RICH-TEXT DOCUMENTS
"application/pdf" = pdf;
"text/markdown" = md;
};
}

11
hosts/common/home/mpv.nix Normal file
View File

@@ -0,0 +1,11 @@
{ config, lib, sane-lib, ... }:
lib.mkIf config.sane.home-manager.enable
{
# format is <key>=%<length>%<value>
sane.fs."/home/colin/.config/mpv/mpv.conf" = sane-lib.fs.wantedText ''
save-position-on-quit=%3%yes
keep-open=%3%yes
'';
}

View File

@@ -0,0 +1,130 @@
{ config, lib, pkgs, ... }:
let
inherit (builtins) map;
inherit (lib) concatMapStrings optionalString;
# this structure roughly mirrors home-manager's `programs.neovim.plugins` option
plugins = with pkgs.vimPlugins; [
# docs: surround-nvim: https://github.com/ur4ltz/surround.nvim/
# docs: vim-surround: https://github.com/tpope/vim-surround
{ plugin = vim-surround; }
# docs: fzf-vim (fuzzy finder): https://github.com/junegunn/fzf.vim
{ plugin = fzf-vim; }
({
# docs: tex-conceal-vim: https://github.com/KeitaNakamura/tex-conceal.vim/
plugin = tex-conceal-vim;
type = "viml";
config = ''
" present prettier fractions
let g:tex_conceal_frac=1
'';
})
({
plugin = vim-SyntaxRange;
type = "viml";
config = ''
" enable markdown-style codeblock highlighting for tex code
autocmd BufEnter * call SyntaxRange#Include('```tex', '```', 'tex', 'NonText')
" autocmd Syntax tex set conceallevel=2
'';
})
({
# treesitter syntax highlighting: https://nixos.wiki/wiki/Tree_sitters
# docs: https://github.com/nvim-treesitter/nvim-treesitter
# config taken from: https://github.com/i077/system/blob/master/modules/home/neovim/default.nix
# this is required for tree-sitter to even highlight
plugin = nvim-treesitter.withAllGrammars;
type = "lua";
config = ''
require'nvim-treesitter.configs'.setup {
highlight = {
enable = true,
-- disable treesitter on Rust so that we can use SyntaxRange
-- and leverage TeX rendering in rust projects
disable = { "rust", "tex", "latex" },
-- disable = { "tex", "latex" },
-- true to also use builtin vim syntax highlighting when treesitter fails
additional_vim_regex_highlighting = false
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = "gnn",
node_incremental = "grn",
mcope_incremental = "grc",
node_decremental = "grm"
}
},
indent = {
enable = true,
disable = {}
}
}
vim.o.foldmethod = 'expr'
vim.o.foldexpr = 'nvim_treesitter#foldexpr()'
'';
})
];
plugin-packages = map (p: p.plugin) plugins;
plugin-config-tex = concatMapStrings (p: optionalString (p.type or "" == "viml") p.config) plugins;
plugin-config-lua = concatMapStrings (p: optionalString (p.type or "" == "lua") p.config) plugins;
in
lib.mkIf config.sane.home-manager.enable
{
# private because there could be sensitive things in the swap
sane.persist.home.private = [ ".cache/vim-swap" ];
programs.neovim = {
# neovim: https://github.com/neovim/neovim
enable = true;
viAlias = true;
vimAlias = true;
configure = {
packages.myVimPackage = {
start = plugin-packages;
};
customRC = ''
" let the terminal handle mouse events, that way i get OS-level ctrl+shift+c/etc
" this used to be default, until <https://github.com/neovim/neovim/pull/19290>
set mouse=
" copy/paste to system clipboard
set clipboard=unnamedplus
" screw tabs; always expand them into spaces
set expandtab
" at least don't open files with sections folded by default
set nofoldenable
" allow text substitutions for certain glyphs.
" higher number = more aggressive substitution (0, 1, 2, 3)
" i only make use of this for tex, but it's unclear how to
" apply that *just* to tex and retain the SyntaxRange stuff.
set conceallevel=2
" horizontal rule under the active line
" set cursorline
" highlight trailing space & related syntax errors (doesn't seem to work??)
" let c_space_errors=1
" let python_space_errors=1
" enable highlighting of leading/trailing spaces,
" and especially tabs
" source: https://www.reddit.com/r/neovim/comments/chlmfk/highlight_trailing_whitespaces_in_neovim/
set list
set listchars=tab:\·,trail:·,extends:,precedes:,nbsp:
""""" PLUGIN CONFIG (tex)
${plugin-config-tex}
""""" PLUGIN CONFIG (lua)
lua <<EOF
${plugin-config-lua}
EOF
'';
};
};
}

View File

@@ -5,7 +5,7 @@ lib.mkIf config.sane.home-manager.enable
# TODO: this should only be shipped on gui platforms # TODO: this should only be shipped on gui platforms
sops.secrets."sublime_music_config" = { sops.secrets."sublime_music_config" = {
owner = config.users.users.colin.name; owner = config.users.users.colin.name;
sopsFile = ../../secrets/universal/sublime_music_config.json.bin; sopsFile = ../../../secrets/universal/sublime_music_config.json.bin;
format = "binary"; format = "binary";
}; };
sane.fs."/home/colin/.config/sublime-music/config.json" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.sublime_music_config.path; sane.fs."/home/colin/.config/sublime-music/config.json" = sane-lib.fs.wantedSymlinkTo config.sops.secrets.sublime_music_config.path;

View File

@@ -0,0 +1,21 @@
{ config, lib, sane-lib, ...}:
lib.mkIf config.sane.home-manager.enable
{
# 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 ''
XDG_DESKTOP_DIR="$HOME/.xdg/Desktop"
XDG_DOCUMENTS_DIR="$HOME/dev"
XDG_DOWNLOAD_DIR="$HOME/tmp"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_PUBLICSHARE_DIR="$HOME/.xdg/Public"
XDG_TEMPLATES_DIR="$HOME/.xdg/Templates"
XDG_VIDEOS_DIR="$HOME/Videos"
'';
# 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";
}

View File

@@ -0,0 +1,141 @@
{ config, lib, pkgs, sane-lib, ... }:
let
# powerlevel10k prompt config
# p10k.zsh is the auto-generated config, and i overwrite those defaults here, below.
p10k-overrides = ''
# powerlevel10k launches a gitstatusd daemon to accelerate git prompt queries.
# this keeps open file handles for any git repo i touch for 60 minutes (by default).
# that prevents unmounting whatever device the git repo is on -- particularly problematic for ~/private.
# i can disable gitstatusd and get slower fallback git queries:
# - either universally
# - or selectively by path
# see: <https://github.com/romkatv/powerlevel10k/issues/246>
typeset -g POWERLEVEL9K_VCS_DISABLED_DIR_PATTERN='(/home/colin/private/*|/home/colin/knowledge/*)'
# typeset -g POWERLEVEL9K_DISABLE_GITSTATUS=true
# show user@host also when logged into the current machine.
# default behavior is to show it only over ssh.
typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION='$P9K_CONTENT'
'';
prezto-init = ''
source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source ${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source ${pkgs.zsh-prezto}/share/zsh-prezto/init.zsh
'';
in
lib.mkIf config.sane.home-manager.enable
{
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 "# ";
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"
];
# .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
# 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'
# 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'
'';
}

View File

@@ -1,4 +1,4 @@
{ ... }: { ... }:
{ {
services.i2p.enable = true; # services.i2p.enable = true;
} }

View File

@@ -21,6 +21,12 @@
sane.ids.freshrss.uid = 2401; sane.ids.freshrss.uid = 2401;
sane.ids.freshrss.gid = 2401; sane.ids.freshrss.gid = 2401;
sane.ids.mediawiki.uid = 2402; sane.ids.mediawiki.uid = 2402;
sane.ids.signald.uid = 2403;
sane.ids.signald.gid = 2403;
sane.ids.mautrix-signal.uid = 2404;
sane.ids.mautrix-signal.gid = 2404;
sane.ids.navidrome.uid = 2405;
sane.ids.navidrome.gid = 2405;
sane.ids.colin.uid = 1000; sane.ids.colin.uid = 1000;
sane.ids.guest.uid = 1100; sane.ids.guest.uid = 1100;

View File

@@ -1,16 +1,6 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
{ {
# if using router's DNS, these mappings will already exist.
# if using a different DNS provider (which servo does), then we need to explicity provide them.
# ugly hack. would be better to get servo to somehow use the router's DNS
networking.hosts = {
"192.168.0.5" = [ "servo" ];
"192.168.0.20" = [ "lappy" ];
"192.168.0.22" = [ "desko" ];
"192.168.0.48" = [ "moby" ];
};
# the default backend is "wpa_supplicant". # the default backend is "wpa_supplicant".
# wpa_supplicant reliably picks weak APs to connect to. # wpa_supplicant reliably picks weak APs to connect to.
# see: <https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/474> # see: <https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/474>
@@ -30,14 +20,4 @@
General.RoamThreshold = "-52"; # default -70 General.RoamThreshold = "-52"; # default -70
General.RoamThreshold5G = "-52"; # default -76 General.RoamThreshold5G = "-52"; # default -76
}; };
sane.fs."/var/lib/iwd/.secrets.psk.stamp" = {
wantedBeforeBy = [ "iwd.service" ];
generated.acl.mode = "0600";
# XXX: install-iwd uses sed, but that's part of the default systemd unit path, it seems
generated.script.script = builtins.readFile ../../scripts/install-iwd + ''
touch "/var/lib/iwd/.secrets.psk.stamp"
'';
generated.script.scriptArgs = [ "/run/secrets/iwd" "/var/lib/iwd" ];
};
} }

View File

@@ -1,24 +1,33 @@
{ config, lib, sane-data, sane-lib, ... }: { config, lib, sane-data, sane-lib, ... }:
let
inherit (builtins) head map mapAttrs tail;
inherit (lib) concatStringsSep mkMerge reverseList;
in
{ {
sane.ssh.pubkeys = sane.ssh.pubkeys =
let let
# path is a DNS-style path like [ "org" "uninsane" "root" ] # path is a DNS-style path like [ "org" "uninsane" "root" ]
keyNameForPath = path: keyNameForPath = path:
let let
rev = lib.reverseList path; rev = reverseList path;
name = builtins.head rev; name = head rev;
host = lib.concatStringsSep "." (builtins.tail rev); host = concatStringsSep "." (tail rev);
in in
"${name}@${host}"; "${name}@${host}";
# [{ path :: [String], value :: String }] for the keys we want to install # [{ path :: [String], value :: String }] for the keys we want to install
globalKeys = sane-lib.flattenAttrs sane-data.keys; globalKeys = sane-lib.flattenAttrs sane-data.keys;
localKeys = sane-lib.flattenAttrs sane-data.keys.org.uninsane.local; domainKeys = sane-lib.flattenAttrs (
in lib.mkMerge (builtins.map mapAttrs (host: cfg: {
colin = cfg.ssh.user_pubkey;
root = cfg.ssh.host_pubkey;
}) config.sane.hosts.by-name
);
in mkMerge (map
({ path, value }: { ({ path, value }: {
"${keyNameForPath path}" = value; "${keyNameForPath path}" = lib.mkIf (value != null) value;
}) })
(globalKeys ++ localKeys) (globalKeys ++ domainKeys)
); );
} }

View File

@@ -86,6 +86,8 @@ in
"Pictures" "Pictures"
"Videos" "Videos"
".cache/nix"
".cache/nix-index"
".cargo" ".cargo"
".rustup" ".rustup"
]; ];
@@ -125,8 +127,8 @@ in
services.openssh = { services.openssh = {
enable = true; enable = true;
permitRootLogin = "no"; settings.PermitRootLogin = "no";
passwordAuthentication = false; settings.PasswordAuthentication = false;
}; };
}; };
} }

View File

@@ -1,12 +1,16 @@
# trampoline from flake.nix into the specific host definition, while doing a tiny bit of common setup # trampoline from flake.nix into the specific host definition, while doing a tiny bit of common setup
# args from flake-level `import`
{ hostName, localSystem }: { hostName, localSystem }:
{ ... }:
# module args
{ config, ... }:
{ {
imports = [ imports = [
./${hostName} ./by-name/${hostName}
./common ./common
./modules
]; ];
networking.hostName = hostName; networking.hostName = hostName;

12
hosts/modules/default.nix Normal file
View File

@@ -0,0 +1,12 @@
{ ... }:
{
imports = [
./derived-secrets.nix
./hardware
./hostnames.nix
./hosts.nix
./roles
./wg-home.nix
];
}

View File

@@ -0,0 +1,47 @@
{ config, lib, ... }:
let
inherit (builtins) toString;
inherit (lib) mapAttrs mkOption types;
cfg = config.sane.derived-secrets;
secret = types.submodule {
options = {
len = mkOption {
type = types.int;
};
encoding = mkOption {
type = types.enum [ "base64" ];
};
};
};
in
{
options = {
sane.derived-secrets = mkOption {
type = types.attrsOf secret;
default = {};
description = ''
fs path => secret options.
for each entry, we create an item at the given path whose value is deterministic,
but also pseudo-random and not predictable by anyone without root access to the machine.
as PRNG source we use the host ssh key, and derived secrets are salted based on the destination path.
'';
};
};
config = {
sane.fs = mapAttrs (path: c: {
generated.script.script = ''
echo "$1" | cat /dev/stdin /etc/ssh/host_keys/ssh_host_ed25519_key \
| sha512sum \
| cut -c 1-${toString (c.len * 2)} \
| tr a-z A-Z \
| basenc -d --base16 \
| basenc --${c.encoding} \
> "$1"
'';
generated.script.scriptArgs = [ path ];
generated.acl.mode = "0600";
}) cfg;
};
}

View File

@@ -2,7 +2,6 @@
{ {
imports = [ imports = [
./all.nix
./x86_64.nix ./x86_64.nix
]; ];
} }

View File

@@ -1,8 +1,7 @@
{ lib, pkgs, ... }: { lib, pkgs, ... }:
with lib;
{ {
config = mkIf (pkgs.system == "x86_64-linux") { config = lib.mkIf (pkgs.system == "x86_64-linux") {
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [
"xhci_pci" "ahci" "sd_mod" "sdhci_pci" # nixos-generate-config defaults "xhci_pci" "ahci" "sd_mod" "sdhci_pci" # nixos-generate-config defaults
"usb_storage" # rpi needed this to boot from usb storage, i think. "usb_storage" # rpi needed this to boot from usb storage, i think.

View File

@@ -0,0 +1,21 @@
{ config, lib, ... }:
{
# give each host a shortname that all the other hosts know, to allow easy comms.
networking.hosts = lib.mkMerge [
(lib.mapAttrs' (host: cfg: {
# bare-name for LAN addresses
# if using router's DNS, these mappings will already exist.
# if using a different DNS provider (which servo does), then we need to explicity provide them.
# ugly hack. would be better to get servo to somehow use the router's DNS
name = cfg.lan-ip;
value = [ host ];
}) config.sane.hosts.by-name)
(lib.mapAttrs' (host: cfg: {
# -hn suffixed name for communication over my wg-home VPN.
# hn = "home network"
name = cfg.wg-home.ip;
value = [ "${host}-hn" ];
}) config.sane.hosts.by-name)
];
}

100
hosts/modules/hosts.nix Normal file
View File

@@ -0,0 +1,100 @@
{ config, lib, ... }:
let
inherit (lib) attrValues filterAttrs mkMerge mkOption types;
cfg = config.sane.hosts;
host = types.submodule ({ config, ... }: {
options = {
ssh.user_pubkey = mkOption {
type = types.str;
description = ''
ssh pubkey that the primary user of this machine will use when connecting to other machines.
e.g. "ssh-ed25519 AAAA<base64>".
'';
};
ssh.host_pubkey = mkOption {
type = types.str;
description = ''
ssh pubkey which this host will present to connections initiated against it.
e.g. "ssh-ed25519 AAAA<base64>".
'';
};
wg-home.pubkey = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
wireguard public key for the wg-home VPN.
e.g. "pWtnKW7f7sNIZQ2M83uJ7cHg3IL1tebE3IoVkCgjkXM=".
'';
};
wg-home.ip = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
IP address to use on the wg-home VPN.
e.g. "10.0.10.5";
'';
};
wg-home.endpoint = mkOption {
type = types.nullOr types.str;
default = null;
};
lan-ip = mkOption {
type = types.str;
description = ''
ip address when on the lan.
e.g. "192.168.0.5";
'';
};
};
});
in
{
options = {
sane.hosts.by-name = mkOption {
type = types.attrsOf host;
default = {};
description = ''
map of hostname => attrset of information specific to that host,
like its ssh pubkey, etc.
'';
};
};
config = {
# TODO: this should be populated per-host
sane.hosts.by-name."desko" = {
ssh.user_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPU5GlsSfbaarMvDA20bxpSZGWviEzXGD8gtrIowc1pX";
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";
};
sane.hosts.by-name."lappy" = {
ssh.user_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDpmFdNSVPRol5hkbbCivRhyeENzb9HVyf9KutGLP2Zu";
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";
};
sane.hosts.by-name."moby" = {
ssh.user_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICrR+gePnl0nV/vy7I5BzrGeyVL+9eOuXHU1yNE3uCwU";
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";
};
sane.hosts.by-name."servo" = {
ssh.user_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPS1qFzKurAdB9blkWomq8gI1g0T3sTs9LsmFOj5VtqX";
ssh.host_pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOfdSmFkrVT6DhpgvFeQKm3Fh9VKZ9DbLYOPOJWYQ0E8";
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";
};
};
}

View File

@@ -0,0 +1,18 @@
{ config, lib, pkgs, ... }:
{
config = lib.mkIf config.sane.roles.client {
# persist external pairings by default
sane.persist.sys.plaintext = [ "/var/lib/bluetooth" ];
sane.fs."/var/lib/bluetooth".generated.acl.mode = "0700";
sane.fs."/var/lib/bluetooth/.secrets.stamp" = {
wantedBeforeBy = [ "bluetooth.service" ];
# XXX: install-bluetooth uses sed, but that's part of the default systemd unit path, it seems
generated.script.script = builtins.readFile ../../../../scripts/install-bluetooth + ''
touch "/var/lib/bluetooth/.secrets.stamp"
'';
generated.script.scriptArgs = [ "/run/secrets/bt" ];
};
};
}

View File

@@ -0,0 +1,17 @@
{ config, lib, ... }:
let
inherit (lib) mkIf mkOption types;
in
{
imports = [
./bluetooth-pairings.nix
./wifi-pairings.nix
];
# option is consumed by the other imports in this dir
options.sane.roles.client = mkOption {
type = types.bool;
default = false;
};
}

View File

@@ -0,0 +1,15 @@
{ config, lib, pkgs, ... }:
{
config = lib.mkIf config.sane.roles.client {
sane.fs."/var/lib/iwd/.secrets.psk.stamp" = {
wantedBeforeBy = [ "iwd.service" ];
generated.acl.mode = "0600";
# XXX: install-iwd uses sed, but that's part of the default systemd unit path, it seems
generated.script.script = builtins.readFile ../../../../scripts/install-iwd + ''
touch "/var/lib/iwd/.secrets.psk.stamp"
'';
generated.script.scriptArgs = [ "/run/secrets/iwd" "/var/lib/iwd" ];
};
};
}

View File

@@ -0,0 +1,6 @@
{ ... }:
{
imports = [
./client
];
}

80
hosts/modules/wg-home.nix Normal file
View File

@@ -0,0 +1,80 @@
{ config, lib, pkgs, ... }:
let
inherit (builtins) filter map;
inherit (lib) concatMap mapAttrsToList mkIf mkMerge mkOption optionalAttrs types;
cfg = config.sane.services.wg-home;
server-cfg = config.sane.hosts.by-name."servo".wg-home;
mkPeer = { ips, pubkey, endpoint }: {
publicKey = pubkey;
allowedIPs = map (k: "${k}/32") ips;
} // (optionalAttrs (endpoint != null) {
inherit endpoint;
# send keepalives every 25 seconds to keep NAT routes live.
# only need to do this from client -> server though, i think.
persistentKeepalive = 25;
# allows wireguard to notice DNS/hostname changes, with this much effective TTL.
dynamicEndpointRefreshSeconds = 600;
});
# make separate peers to route each given host
mkClientPeers = hosts: map (p: mkPeer {
inherit (p) pubkey endpoint;
ips = [ p.ip ];
}) hosts;
# make a single peer which routes all the given hosts
mkServerPeer = hosts: mkPeer {
inherit (server-cfg) pubkey endpoint;
ips = map (h: h.ip) hosts;
};
in
{
options = {
sane.services.wg-home.enable = mkOption {
type = types.bool;
default = false;
};
sane.services.wg-home.ip = mkOption {
type = types.str;
};
};
config = mkIf cfg.enable {
# generate a (deterministic) wireguard private key
sane.derived-secrets."/run/wg-home.priv" = {
len = 32;
encoding = "base64";
};
# wireguard VPN which allows everything on my domain to speak to each other even when
# not behind a shared LAN.
# this config defines both the endpoint (server) and client configs
# for convenience, have both the server and client use the same port for their wireguard connections.
networking.firewall.allowedUDPPorts = [ 51820 ];
networking.wireguard.interfaces.wg-home = {
listenPort = 51820;
privateKeyFile = "/run/wg-home.priv";
preSetup =
let
gen-key = config.sane.fs."/run/wg-home.priv".unit;
in
"${pkgs.systemd}/bin/systemctl start '${gen-key}'";
ips = [
"${cfg.ip}/24"
];
peers =
let
all-peers = mapAttrsToList (_: hostcfg: hostcfg.wg-home) config.sane.hosts.by-name;
peer-list = filter (p: p.ip != null && p.ip != cfg.ip && p.pubkey != null) all-peers;
in
if cfg.ip == server-cfg.ip then
# if we're the server, then we maintain the entire client list
mkClientPeers peer-list
else
# but if we're a client, we maintain a single peer -- the server -- which does the actual routing
[ (mkServerPeer peer-list) ];
};
};
}

View File

@@ -1,24 +0,0 @@
{ config, ... }:
# installer docs: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/installation-device.nix
{
# automatically log in at the virtual consoles.
# using root here makes sure we always have an escape hatch
services.getty.autologinUser = "root";
# gitea doesn't create the git user
users.users.git = {
description = "Gitea Service";
home = "/var/lib/gitea";
useDefaultShell = true;
group = "gitea";
isSystemUser = true;
# sendmail access (not 100% sure if this is necessary)
extraGroups = [ "postdrop" ];
};
# this is required to allow pleroma to send email.
# raw `sendmail` works, but i think pleroma's passing it some funny flags or something, idk.
# hack to fix that.
users.users.pleroma.extraGroups = [ "postdrop" ];
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 208377,
"content_type": "application/xml; charset=utf-8",
"description": "applieddivinitystudies@gmail.com",
"favicon": "",
"favicon_data_uri": "",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 20,
"last_updated": "2022-12-20T01:23:44.546000+00:00",
"score": 26,
"self_url": "https://applieddivinitystudies.com/atom.xml",
"site_name": "Applied Divinity Studies",
"site_url": "https://applieddivinitystudies.com",
"title": "Applied Divinity Studies",
"url": "https://applieddivinitystudies.com/atom.xml",
"velocity": 0.079,
"version": "atom10"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 19245,
"content_type": "text/xml; charset=utf-8",
"description": "Austin Vernon's Blog",
"favicon": "",
"favicon_data_uri": "",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 42,
"last_updated": "2023-01-05T00:00:00+00:00",
"score": 24,
"self_url": "",
"site_name": "Austin Vernon - Austin Vernon's Blog",
"site_url": "https://austinvernon.site",
"title": "Austin Vernon",
"url": "https://austinvernon.site/rss.xml",
"velocity": 0.063,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 453506,
"content_type": "text/xml; charset=utf-8",
"description": "Balaji Srinivasan's personal blog. Formerly CTO of Coinbase and General Partner at a16z, @balajis is an investor and founder.",
"favicon": "",
"favicon_data_uri": "",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 15,
"last_updated": "2022-04-28T18:22:11+00:00",
"score": 16,
"self_url": "https://balajis.com/rss/",
"site_name": "Balaji Srinivasan",
"site_url": "https://balajis.com",
"title": "Balaji Srinivasan",
"url": "https://balajis.com/rss/",
"velocity": 0.01,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 213052,
"content_type": "application/rss+xml; charset=utf-8",
"description": "",
"favicon": "https://images.squarespace-cdn.com/content/v1/50363cf324ac8e905e7df861/ebdb4645-db93-4967-881d-db698ee59c2c/favicon.ico?format=100w",
"favicon_data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAB4FBMVEUAAADmRjIBAADmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjLmRjL///8mIgRMAAAAnnRSTlMAAAA6W1pZTTESpvnryogzAeaCFKwboQv38vP6X449P0FPe8b8vw5mhe02aAif/VhCZx/h4PVD1xwEmQVt3i1uBwwWPpv0Ybu8vtLx7m/JSf5IniT28DWLOTxAUX3EzSgXaXJxc0URa+elCjSdnKLWGewykUv4VSB87zgmHs8iKbZlCbFXhLfHGOpKY9VTjaOuUDAG2tvLGidGL+iWJUyE2tMAAAJwSURBVHja7df5U1JRGMZxnxItw6Q0FdTCoowyWiSJMLXQrMAyU9ojWxQFc8+MijYL23db+VsbTsCZC9xkbu9JnTnfH58Z+MywvAN5MplMJpPJFjuoRoqszNelVVC4ajUpAxTFMlqjL15bYgAEIbx160sBUQivbAMgCuGVVwCkSKUxmakq9dZUEyM1GzclMtdu3mKJsbZuo0XqAF7p9ko2WnfQIjvBJ6B+FxttuwUgfNxjYuteeoSHfQ1srRaL2OPj/kaBCGA2xkfHAXEI4DzIxhoDNQKeq4m974eaQYu0tFYkOnzE3dYen0xHqW+Xo+NYouMnPGzxdjqFH8iTpwzCT31Xx+lWiD/1pu4zAEiRnt5UqVtf7Esh+Fs5I2fPnU924eKly3+cK/7kM+Bq37XrWbtxE9pOPfoHAmwdHEoiQW9MpRA0fuMBnYcdr0IggVjVkGFNCFtdt9hc7hSA8LnAEp9HRjlC9XLxYGbna2xcgdh6rel5JjQjwORUfDa6FcjY7fFgWr7pf0DusHnmrgIJhJGZVgS4d5/N9gdKJAK6Xyvo746xHg5RIo8A3mP3ExtbbX2gREJPdYny62afJT+vz6NkiGpzL5ghFLG+NAhHXr1mhkik4U0YzFAgfmSWC/K2q0rZVLve8a4lYmCPVyI9ZW3DikIT0zkhJe9rlU02fhj9CE5wJEseXy5ItriwIGINIk97SwmZ8ZEjFvsnZZ+/NJMjc+7ovLKoixwJfEVGlIj6N14iEllGSBhZIkY8swNN6XV+o0TUKlrxH5DBZYZ4xb9c+D7yI5A9/U8ypP6XX6XIPAWw8P94mUwmk8lki95vmJ/g9Xmlv3QAAAAASUVORK5CYII=",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 20,
"last_updated": "2022-12-14T09:43:49+00:00",
"score": 8,
"self_url": "",
"site_name": "Benedict Evans",
"site_url": "https://www.ben-evans.com",
"title": "Essays - Benedict Evans",
"url": "https://www.ben-evans.com/benedictevans?format=rss",
"velocity": 0.033,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 12669,
"content_type": "application/rss+xml; charset=utf-8",
"description": "The territory is a map of the map.",
"favicon": "http://benjaminrosshoffman.com/favicon.ico",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 10,
"last_seen": "2023-01-11T12:32:52.176940+00:00",
"last_updated": "2023-01-09T04:33:31+00:00",
"score": -15,
"self_url": "http://benjaminrosshoffman.com/comments/feed/",
"site_name": "Compass Rose",
"site_url": "http://benjaminrosshoffman.com",
"title": "Comments for Compass Rose",
"url": "http://benjaminrosshoffman.com/comments/feed/",
"velocity": 0.312,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 339384,
"content_type": "application/xml; charset=utf-8",
"description": "Yet another programming blog. Thoughts on software and related misadventures.",
"favicon": "https://bitbashing.io/favicon.ico",
"favicon_data_uri": "data:image/png;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAAAAAAP//AAD//wAA7/8AAO//AADv/wAA7/8AAO//AADvAwAA7/8AAO8DAADv/wAA7/8AAO//AADv/wAA//8AAP//AAD//wAA//8AAO//AADv/wAA7/8AAO//AADv/wAA7wMAAO//AADvAwAA7/8AAO//AADv/wAA7/8AAP//AAD//wAA",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 10,
"last_updated": "2022-11-22T00:00:00+00:00",
"score": 20,
"self_url": "https://bitbashing.io/feed.xml",
"site_name": "Bit Bashing",
"site_url": "https://bitbashing.io",
"title": "Bit Bashing",
"url": "https://bitbashing.io/feed.xml",
"velocity": 0.003,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 1,
"content_length": 343256,
"content_type": "text/xml; charset=utf-8",
"description": null,
"favicon": "",
"favicon_data_uri": "",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 60,
"last_updated": "2022-11-07T00:00:00+00:00",
"score": -4,
"self_url": "",
"site_name": "Daniel Janus \u2013 blog",
"site_url": "https://blog.danieljanus.pl",
"title": "code \u00b7 words \u00b7 emotions: Daniel Janus\u2019s blog",
"url": "https://blog.danieljanus.pl/atom.xml",
"velocity": 0.011,
"version": "atom10"
}

View File

@@ -0,0 +1,23 @@
{
"bozo": 0,
"content_length": 623592,
"content_type": "application/atom+xml; charset=utf-8",
"description": "I'm David Rosenthal, and this is a place to discuss the work I'm doing in Digital Preservation.",
"favicon": "",
"favicon_data_uri": "",
"hubs": [
"http://pubsubhubbub.appspot.com/"
],
"is_podcast": false,
"is_push": true,
"item_count": 25,
"last_updated": "2023-01-10T17:59:42.157000+00:00",
"score": 20,
"self_url": "https://www.blogger.com/feeds/4503292949532760618/posts/default",
"site_name": "DSHR's Blog",
"site_url": "https://blog.dshr.org",
"title": "DSHR's Blog",
"url": "https://blog.dshr.org/feeds/posts/default",
"velocity": 0.35,
"version": "atom10"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 45559,
"content_type": "application/rss+xml; charset=utf-8",
"description": "bunnie's blog",
"favicon": "https://www.bunniestudios.com/favicon.ico",
"favicon_data_uri": "data:image/png;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAFBQUADU1NQBdXV0AoKCgACYmJgBpaWkATk5OAIODgwAKCgoAfHx8ALi4uACxsbEAAgICAKOjowA+Pj4AAQEBAERERADy8vIABwcHABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAASAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAALAAAAAAAAAAAAABMAAAAAAAAAAAAAAAAABQAACgAAAAAPAAAAAAAAAAkAAAAAAAAOAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCQAAAAAAAAAAAAAAAAAAABANAAAAAAAAAAAAAAAAAP//AADAfQAAwTgAAMeZAADPnwAAz88AAM/PAADPzwAAz58AAMefAADDHwAAyD8AAM//AADP/wAAD/8AAA//AAA=",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 5,
"last_updated": "2023-01-04T15:49:57+00:00",
"score": 20,
"self_url": "https://www.bunniestudios.com/blog/?feed=rss2",
"site_name": " bunnie's blog",
"site_url": "https://www.bunniestudios.com",
"title": "bunnie's blog",
"url": "https://www.bunniestudios.com/blog/?feed=rss2",
"velocity": 0.114,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 15076852,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Congressional Dish is a twice-monthly podcast that aims to draw attention to where the American people truly have power: Congress. From the perspective of a fed up taxpayer with no allegiance to any political party, Jennifer Briney will fill you in on the must-know information about what our representatives do AFTER the elections and how their actions can and will affect our day to day lives. \nHosted by @JenBriney. \n\nLinks to information sources available at www.congressionaldish.com",
"favicon": "",
"favicon_data_uri": "",
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 269,
"last_updated": "2023-01-06T18:13:57+00:00",
"score": 0,
"self_url": "https://feeds.libsyn.com/39908/rss",
"site_name": "",
"site_url": "",
"title": "Congressional Dish",
"url": "https://feeds.libsyn.com/39908/rss",
"velocity": 0.071,
"version": "rss20"
}

File diff suppressed because one or more lines are too long

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