Compare commits

...

238 Commits

Author SHA1 Message Date
00c22c1ca7 fix flutter build (x86-64; arm is untested) 2022-09-21 04:29:44 -07:00
e66692eecd enable fluffychat -- though reproducibility may suffer
i've applied this patch, but modified the sha:
- <https://github.com/NixOS/nixpkgs/pull/186839>
2022-09-21 02:58:35 -07:00
18ca147b67 pkgs: add gpodder podcast player
the maintainer says it's CLI configurable, so long-term i should be able
to find a way to configure it with nix.
2022-09-21 01:59:40 -07:00
8f231cde33 update nixpkgs: 2022-09-16 -> 2022-09-18 (and sops)
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/da6a05816e7fa5226c3f61e285ef8d9dfc868f3c' (2022-09-16)
  → 'github:NixOS/nixpkgs/f677051b8dc0b5e2a9348941c99eea8c4b0ff28f' (2022-09-18)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/20929e1c5722a6db2f2dbe4cd36d4af0de0a9df0' (2022-09-11)
  → 'github:Mic92/sops-nix/bae718a9d1e31ec478ddfcb75149f66e9625a825' (2022-09-18)
• Updated input 'sops-nix/nixpkgs':
    'github:NixOS/nixpkgs/a25f0b9bbdfedee45305da5d1e1410c5bcbd48f6' (2022-09-10)
  → 'github:NixOS/nixpkgs/0cfb3c002b61807ca0bab3efe514476bdf2e5478' (2022-09-17)
• Updated input 'sops-nix/nixpkgs-22_05':
    'github:NixOS/nixpkgs/e6f053b6079c16e7df97531e3e0524ace1304d4d' (2022-09-11)
  → 'github:NixOS/nixpkgs/17989edb05615c4f61803b9c427d80b84c289c6b' (2022-09-17)
```
2022-09-20 22:31:49 -07:00
f9c8563506 switch to nixos-unstable. some notes:
- fluffychat doesn't build, so disabled (that's a known issue with the
  active flutter work).
- everything else builds, lappy boots OOTB fine.
        - brower works
        - vim works
        - Element starts
        - Sublime Music works
        - Discord works (verrry slow to load -- maybe just a first update thing)
2022-09-20 22:31:47 -07:00
3669a05db5 env: add krita to desktops 2022-09-20 21:02:41 -07:00
618b7b934e home: allow old Discord clients to start 2022-09-20 04:39:28 -07:00
fe2c0b47bc nix flake update (nixpkgs: 2022-09-17 -> 2022-09-19, plus sops)
but Discord is still out of date :'(

```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/f21492b413295ab60f538d5e1812ab908e3e3292' (2022-09-17)
  → 'github:NixOS/nixpkgs/20dc478985d6545df53f0153f4af125eb014083d' (2022-09-19)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/20929e1c5722a6db2f2dbe4cd36d4af0de0a9df0' (2022-09-11)
  → 'github:Mic92/sops-nix/bae718a9d1e31ec478ddfcb75149f66e9625a825' (2022-09-18)
• Updated input 'sops-nix/nixpkgs':
    'github:NixOS/nixpkgs/a25f0b9bbdfedee45305da5d1e1410c5bcbd48f6' (2022-09-10)
  → 'github:NixOS/nixpkgs/0cfb3c002b61807ca0bab3efe514476bdf2e5478' (2022-09-17)
• Updated input 'sops-nix/nixpkgs-22_05':
    'github:NixOS/nixpkgs/e6f053b6079c16e7df97531e3e0524ace1304d4d' (2022-09-11)
  → 'github:NixOS/nixpkgs/17989edb05615c4f61803b9c427d80b84c289c6b' (2022-09-17)
```
2022-09-20 04:22:42 -07:00
3b02fb5f48 RSS: add 60 minutes 2022-09-20 01:16:28 -07:00
355a982cf0 rmlint: don't output a json file 2022-09-18 02:34:32 -07:00
8ff7e22ac8 lappy: enable the LAN nix cache
might want to be smarter about this, but for now it lets us reuse large
packages built on desko instead of rebuilding them locally.
2022-09-18 02:07:34 -07:00
cb0c122080 rmlint: run as sudo 2022-09-18 02:04:50 -07:00
d84600cfcf update nixpkgs 2022-09-18 00:49:57 -07:00
dc44d8098e fix flutter build for aarch64 2022-09-16 04:49:15 -07:00
58c6c1dd7d try to get fluffychat building against nixpkgs master
it fails
```
$ nix log /nix/store/2hzd4bjscfxarzdq73nhiqxmqimbwkzd-fluffychat-1.2.0.drv
...
../tmp.lqD0WQYq9a/.pub-cache/hosted/pub.dartlang.org/flutter_typeahead-3.2.4/lib/src/flutter_typeahead.dart:936:9: Error: No named parameter with the name 'maxLengthEnforced'.
```
2022-09-16 01:58:56 -07:00
933996d34e ship fluffychat (Matrix client)
this works on lappy and is fairly responsive.
want to try it on moby.
2022-09-15 20:29:27 -07:00
2a1932d602 replace the local makemkv patch with upstream instead 2022-09-15 20:24:07 -07:00
a6fd6a0a6d firefox: uBlock: enable the GDPR cookie prompt blocker 2022-09-15 18:49:16 -07:00
b42b6e7ce2 browser: remove "i don't care about cookies" extension
the maintainer announced that it's aqcuired by Avast.
clear conflict of interest; i don't trust Avast.
2022-09-15 16:12:57 -07:00
e9da458179 nix-serve: open firewall port (for desko) 2022-09-14 18:19:56 -07:00
ee3793ad46 nixcache: use desko as a substituter 2022-09-14 14:45:33 -07:00
b8ab7c1fa9 desko: enable nix-serve 2022-09-14 14:45:07 -07:00
cdbde672d8 lift nix-serve out of servo
i'm going to enable it on desktop
2022-09-14 14:32:31 -07:00
08bd619ef9 update nixpkgs 2022-09-11 -> 2022-09-13
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/dd1f4d982445a7d1b1869baa42f8f0f9bc606714' (2022-09-11)
  → 'github:NixOS/nixpkgs/d86a4619b7e80bddb6c01bc01a954f368c56d1df' (2022-09-13)
```
2022-09-14 00:43:51 -07:00
c91948c565 nix flake update: nixpkgs 2022-09-09 -> 2022-09-11
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/45b56b5321aed52d4464dc9af94dc1b20d477ac5' (2022-09-09)
  → 'github:NixOS/nixpkgs/dd1f4d982445a7d1b1869baa42f8f0f9bc606714' (2022-09-11)
```
2022-09-12 19:35:49 -07:00
f3ba1d488d nix flake update: nixpkgs 2022-09-02 -> 2022-09-09 (and sops update)
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/67e45078141102f45eff1589a831aeaa3182b41e' (2022-09-02)
  → 'github:NixOS/nixpkgs/45b56b5321aed52d4464dc9af94dc1b20d477ac5' (2022-09-09)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/044ccfe24b349859cd9efc943e4465cc993ac84e' (2022-09-05)
  → 'github:Mic92/sops-nix/20929e1c5722a6db2f2dbe4cd36d4af0de0a9df0' (2022-09-11)
• Updated input 'sops-nix/nixpkgs':
    'github:NixOS/nixpkgs/21de2b973f9fee595a7a1ac4693efff791245c34' (2022-09-02)
  → 'github:NixOS/nixpkgs/a25f0b9bbdfedee45305da5d1e1410c5bcbd48f6' (2022-09-10)
• Updated input 'sops-nix/nixpkgs-22_05':
    'github:NixOS/nixpkgs/013e8d86d9a3f33074c903c8ffcab0d34087b1ed' (2022-09-03)
  → 'github:NixOS/nixpkgs/e6f053b6079c16e7df97531e3e0524ace1304d4d' (2022-09-11)
```
2022-09-11 00:22:56 -07:00
11a2dbd684 sway: add gnome-control-center 2022-09-10 03:49:36 -07:00
2fb4bae804 servo: tune ipfs resource use 2022-09-09 17:51:26 -07:00
61ce0e62e9 sway: configure displays for lappy, too. 2022-09-08 14:57:44 -07:00
315d9b8703 sway: enforce screen positioning 2022-09-06 23:16:42 -07:00
c5a69a401f sway: hide window borders if only window on workspace 2022-09-06 23:07:41 -07:00
b8e42a0ada programs: add speedtest-cli 2022-09-06 19:49:49 -07:00
1fa7724b35 sane-scripts: fix missing file input 2022-09-06 19:46:07 -07:00
10c6801ccd sane-which: only cat text-based files 2022-09-06 18:08:44 -07:00
8d051d319f flake: update (nixpkgs: 2022-08-25 -> 2022-09-02)
```
• Updated input 'impermanence':
    'github:nix-community/impermanence/e7c6fbbe9076109263175ef992ca6edc1050973c' (2022-08-22)
  → 'github:nix-community/impermanence/def994adbdfc28974e87b0e4c949e776207d5557' (2022-08-31)
• Updated input 'mobile-nixos':
    'github:nixos/mobile-nixos/87e579471c42def38f719028ad6c5d746f26027b' (2022-07-31)
  → 'github:nixos/mobile-nixos/09e388c42298fa777caa7738cd8d8d2b6d1ac8db' (2022-08-28)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/058de3818577db19d1965c21e2479916a3eaaf95' (2022-08-25)
  → 'github:NixOS/nixpkgs/67e45078141102f45eff1589a831aeaa3182b41e' (2022-09-02)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/6068774a8e85fea4b0177efcc90afb3c3b74430b' (2022-08-21)
  → 'github:Mic92/sops-nix/044ccfe24b349859cd9efc943e4465cc993ac84e' (2022-09-05)
• Updated input 'sops-nix/nixpkgs':
    'github:NixOS/nixpkgs/0cc6444e74cd21e8da8d81ef4cd778492e10f843' (2022-08-20)
  → 'github:NixOS/nixpkgs/21de2b973f9fee595a7a1ac4693efff791245c34' (2022-09-02)
• Updated input 'sops-nix/nixpkgs-22_05':
    'github:NixOS/nixpkgs/9a91318fffec81ad009b73fd3b640d2541d87909' (2022-08-20)
  → 'github:NixOS/nixpkgs/013e8d86d9a3f33074c903c8ffcab0d34087b1ed' (2022-09-03)
```
2022-09-06 15:48:18 -07:00
c0a41def22 impermanence: don't persist authorized_keys.d 2022-08-31 17:25:57 -07:00
f0334db736 secrets: update for moby keys 2022-08-31 17:25:21 -07:00
cd89ea884b secrets: update moby keys 2022-08-31 17:01:41 -07:00
13b937fbb7 fix up /mnt/desko-root to be usable as a remote /nix store 2022-08-30 22:25:22 -07:00
877870a522 net: hardcode the host/IPs for desko/servo/lappy 2022-08-30 21:56:04 -07:00
956545a795 move universal/env/users.nix -> universal/users.nix 2022-08-30 21:48:19 -07:00
cb98ac2a91 fs: add desko-root 2022-08-30 21:14:12 -07:00
85add7c531 add a script to mount servo root 2022-08-30 19:55:15 -07:00
df379a2a38 packages: only deploy makemkv to x86 machines 2022-08-26 22:20:21 -07:00
d49ac8c175 update nixpkgs 2022-08-12 -> 2022-08-25; impermanence, sops
```
• Updated input 'impermanence':
    'github:nix-community/impermanence/2f39baeb7d039fda5fc8225111bb79474138e6f4' (2022-03-01)
  → 'github:nix-community/impermanence/e7c6fbbe9076109263175ef992ca6edc1050973c' (2022-08-22)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/5c211b47aeadcc178c5320afd4e74c7eed5c389f' (2022-08-12)
  → 'github:NixOS/nixpkgs/058de3818577db19d1965c21e2479916a3eaaf95' (2022-08-25)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/34ee98b8c2ca153a23a63c1841a0a067313856d5' (2022-08-02)
  → 'github:Mic92/sops-nix/6068774a8e85fea4b0177efcc90afb3c3b74430b' (2022-08-21)
• Updated input 'sops-nix/nixpkgs':
    'github:NixOS/nixpkgs/a3fddd46a7f3418d7e3940ded94701aba569161d' (2022-07-30)
  → 'github:NixOS/nixpkgs/0cc6444e74cd21e8da8d81ef4cd778492e10f843' (2022-08-20)
• Updated input 'sops-nix/nixpkgs-22_05':
    'github:NixOS/nixpkgs/a26a6f4529878fbfe5f1f287dcdff4a287c58def' (2022-07-31)
  → 'github:NixOS/nixpkgs/9a91318fffec81ad009b73fd3b640d2541d87909' (2022-08-20)
```
2022-08-26 18:20:14 -07:00
5a4dd3b38d nixpatches: remove custom zecwallet-lite patch and point upstream instead 2022-08-25 19:12:31 -07:00
ed98b1702a packages: add MakeMKV (along with an update to 1.17.1)
MakeMKV doesn't allow old versions to run unregistered.

PR which updates MakeMKV in nixpkgs:
<https://github.com/NixOS/nixpkgs/pull/188342>
2022-08-25 19:09:06 -07:00
5b5103f660 packages: add gnome-system-monitor to gui systems 2022-08-25 16:03:07 -07:00
91d37f2532 vim: show tabs and expand them to spaces 2022-08-25 15:57:48 -07:00
66d79329d9 vim: set conceallevel=2 by default
and show pretty fractions in tex-conceal-vim
2022-08-25 00:59:13 -07:00
c6485a5e42 vim: highlight markdown-style code fences
e.g.
```tex
did you know $\frac29 == \frac4{18}$ ?
```
2022-08-25 00:17:33 -07:00
e54af3f571 RSS: add miniature-calendar.com 2022-08-24 19:46:23 -07:00
c39170be23 formatting nits 2022-08-24 19:46:10 -07:00
a532825761 add nabla vim plugin, but deactivate it. 2022-08-24 19:44:32 -07:00
4faa6d5d5f home: switch from youtube-dl -> yt-dlp
it's more actively maintained, or something.
2022-08-22 02:39:56 -07:00
fe09b08be2 gnome-feeds: reduce refresh threads 6 -> 3
this should make it less demanding on the pinephone
2022-08-20 12:49:35 -07:00
9e53053526 RSS: add Ian Henry 2022-08-20 12:49:09 -07:00
56036b13c3 sane-scripts: sane-dev-cargo-loop: add tput reset between runs 2022-08-19 02:26:59 -07:00
9ed4a13a6f sane-scripts: move src/bin/ -> src/ 2022-08-19 02:11:46 -07:00
1446f5e8ca new script: sane-dev-cargo-loop for running a build command on fs change 2022-08-19 02:01:27 -07:00
118007075f sane-scripts: package using resholve
this makes it easier to propagate paths in and such.
it does more sanity checking than e.g. `wrapProgram`,
plus it doesn't do any indirection -- rather, substitution.
2022-08-19 01:51:04 -07:00
25c75b10bf new script: sane-which: traces PATH lookups 2022-08-19 00:13:16 -07:00
56637bb649 RSS: add Daniel Janus 2022-08-18 19:47:58 -07:00
62d6c4d688 packages: add soundconverter 2022-08-18 04:00:12 -07:00
b05c256809 apps: add foliate, an epub viewer 2022-08-15 02:21:31 -07:00
a30d6fd51f servo: bump /tmp space from 16 GB -> 40 GB
this is necessary because kernel builds (for moby) are *huge*
2022-08-13 17:57:46 -07:00
da3070479f update nixpkgs: 2022-08-11 -> 2022-08-12
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/45c9736ed69800a6ff2164fb4538c9e40dad25d6' (2022-08-11)
  → 'github:NixOS/nixpkgs/5c211b47aeadcc178c5320afd4e74c7eed5c389f' (2022-08-12)
```
2022-08-13 14:27:21 -07:00
287547d46c gui packages: add pavucontrol 2022-08-11 17:14:39 -07:00
2f0bbef76b RSS: add SMBC, XKCD 2022-08-11 17:09:51 -07:00
2ba1678cd8 remove nixpkgs input from modules/ or machines/ 2022-08-11 17:05:10 -07:00
c162225789 moby: rework the cross-compiling situation
we build the `pkgs.cross` kernel, which can be emulated or
cross-compiled based on the specific target (`moby` v.s. `moby-cross`).
2022-08-11 17:02:41 -07:00
f052e2226d nit: home-manager: fix indentation 2022-08-11 15:47:40 -07:00
48774c8940 RSS: add IEEE spectrum 2022-08-11 15:45:35 -07:00
7a7e4c9df7 update flake: nixpkgs 2022-08-10 -> 2022-08-11
hoping there's a Discord update in here :-)

```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e4c9d950a3c54a0760b127d406f6528eb625eed8' (2022-08-10)
  → 'github:NixOS/nixpkgs/45c9736ed69800a6ff2164fb4538c9e40dad25d6' (2022-08-11)
```
2022-08-11 15:36:40 -07:00
de2bb05a04 update flake deps: nixpkgs 2022-08-07 -> 2022-08-10
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/92fe622fdfe477a85662bb77678e39fa70373f13' (2022-08-07)
  → 'github:NixOS/nixpkgs/e4c9d950a3c54a0760b127d406f6528eb625eed8' (2022-08-10)
```
2022-08-10 16:48:29 -07:00
65a4aa4135 pkgs: add emote emoji picker 2022-08-10 16:47:39 -07:00
0e611ba3d4 sublime: disable song notifications 2022-08-09 23:12:51 -07:00
c5b132b8c8 persist sublime music config
we encode the whole config as a secret. that's because it contains the
auth info. not *that* much else is of interest in it. it doesn't appear
to be stateful, thankfully: the state is in
~/.local/share/sublime-music.
2022-08-09 23:10:21 -07:00
8d2c8d44f3 disable kaiteki: its packaging is non-deterministic and i can't get a stable hash for which it builds 2022-08-09 19:49:09 -07:00
7b311eaf2d flake update: nixpkgs 2022-08-03 -> 2022-08-07
```
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/478f3cbc8448b5852539d785fbfe9a53304133be' (2022-08-03)
  → 'github:NixOS/nixpkgs/92fe622fdfe477a85662bb77678e39fa70373f13' (2022-08-07)
```
2022-08-09 18:03:48 -07:00
eecf51d344 moby: use megous linux kernel 2022-08-09 18:01:48 -07:00
eaef2f2325 desko: bump /tmp size to 64G
we need just shy of 30G to build a kernel: better to have too much /tmp
space than not enough
2022-08-09 17:58:35 -07:00
fc629082e6 moby: lift the kernel definition out into its own file 2022-08-09 15:26:41 -07:00
bbb384c70a pkg megi's kernel
this won't likely build cleanly: it uses floats in places, which isn't
supported in kernel build well.
2022-08-09 14:39:42 -07:00
e2f6977244 moby: package/ship the rtl8723cs bluetooth driver
with this, bluetooth works immediately after boot (well, maybe only
after the second boot after a deploy... logs are weird when NTP
activates).
2022-08-08 22:13:17 -07:00
05ab747650 moby: fix kernel config (remove CONFIG_ prefixes) 2022-08-08 20:36:39 -07:00
913c9e5fdf moby: cross-compile the kernel 2022-08-08 20:36:35 -07:00
f0b772d688 moby: research more RTL BT kernel config (from manjaro) 2022-08-08 16:43:27 -07:00
f328043966 moby: research some more RTL BT kernel configs 2022-08-08 16:37:39 -07:00
6758440ce3 moby: add the RTL8723CS wifi driver
it works! bluetooth still needs debugging.
2022-08-08 16:03:58 -07:00
9e4bfc2fce moby: switch from linux latest to linux 5.18
doesn't fix my WiFi issue, but will be easier to build on
2022-08-08 16:03:58 -07:00
d3193bc051 moby: bump to latest kernel (5.19) 2022-08-08 16:03:58 -07:00
c0b6d46575 moby: try building with mainline linux 2022-08-08 16:03:58 -07:00
808153f939 new package: lshw (list hardware) 2022-08-08 15:45:46 -07:00
78dfb03c2b x86: remove the useless kernelModules = []
i believe this is a relic from the original `nixos-generate-config` run,
which doesn't understand that this statement is useless
2022-08-06 19:37:52 -07:00
b1ae5b0f9c RSS: add blog: blog.dshr.org 2022-08-05 16:45:30 -07:00
7a6bb04e86 update nixpkgs: 2022-08-01 -> 2022-08-03 2022-08-05 15:49:35 -07:00
3565e96dc5 moby/phosh: try to enable bluetooth (doesn't seem to find adapter) 2022-08-05 15:47:53 -07:00
54754de6fa moby: enable mobile-nixos' firmware (notably: bluetooth) 2022-08-05 14:42:08 -07:00
281be29b90 home: move podcasts from gfeeds to vlc 2022-08-05 00:46:17 -07:00
465478271a new package: sublime-music music player 2022-08-04 23:49:53 -07:00
7003f7407e servo: add navidrome music streaming service 2022-08-04 23:33:34 -07:00
890e1b17e2 RSS: add some podcasts 2022-08-04 19:16:15 -07:00
34af63fab0 RSS: tag with content type (tech, rat, pol, uncat) 2022-08-04 16:43:36 -07:00
8e8a326dce RSS: add frequency tags to each feed 2022-08-04 16:35:04 -07:00
da3c25eff6 RSS: add more feeds 2022-08-04 16:17:51 -07:00
43782ae734 gnome-feeds: tune config 2022-08-04 14:20:21 -07:00
2204a54456 add a base config for gnome feeds
just copied what it stored in .config, and will tune this later
2022-08-04 14:16:37 -07:00
e80e37ae29 moby: persist the whole .librewolf dir 2022-08-04 14:05:24 -07:00
505a5f8b47 packages: add ffmpeg 2022-08-04 03:52:08 -07:00
216282a345 kitty: enable for even non-gui platforms
i don't get it entirely, but otherwise things start breaking
2022-08-04 03:33:42 -07:00
6f88302430 packages: lossless-cut: only deploy to x86 2022-08-03 18:39:03 -07:00
228f8c0a68 packages: add losslesscut video editor 2022-08-03 16:35:25 -07:00
a3111d250f moby: ship without mobile-nixos' stage-1
the stage-1 fails to handle impermanence
2022-08-03 16:23:36 -07:00
9976c82946 impermanence: don't persist _all_ of /etc/ssh -- just the important parts 2022-08-03 14:54:36 -07:00
42951a1382 home-packages: provide a way for the user to disable common gui packages -- without disabling the entire shell 2022-08-03 02:07:34 -07:00
e5ff11d14b packages: minor refactoring 2022-08-03 02:03:17 -07:00
95e7d86cc7 packages: address a TODO by moving extra stuff into home-manager 2022-08-03 01:51:15 -07:00
21c9ce21cc servo: packages: clarify why we include matrix-synapse explicitly 2022-08-03 01:42:56 -07:00
65bcaa939e make some shared boot/hardware settings universal 2022-08-03 01:39:19 -07:00
38cd3bdb96 home-manager: only enable kitty on GUI systems 2022-08-03 01:23:23 -07:00
8059477edd dhcpcd: automatically enable the user, if detected.
not sure this is the *best* place for it, but then, what is?
2022-08-03 00:41:59 -07:00
46a0e949f9 update nixpkgs 2022-07-31 -> 2022-08-01 2022-08-02 23:34:12 -07:00
f86c6390a5 image building instructions: no need to manually create /persist dirs anymore 2022-08-02 17:10:32 -07:00
b60a7ed7d5 image: fix issue that persist/ paths aren't created 2022-08-02 17:08:26 -07:00
d29e69e18a packages: add nmon
it's like htop, but does better for disk and network
2022-08-02 16:04:03 -07:00
042bd9340b image building: fix comment for relPath 2022-08-02 16:03:32 -07:00
c6fbbbab66 moby: fix missing / as tmpfs 2022-08-02 16:02:14 -07:00
b1205e964b moby: migrate the user definitions to phosh.nix 2022-08-02 16:00:37 -07:00
7d39a761cf flake: fix docs about root:nixbld ownership 2022-08-02 15:59:28 -07:00
8a0da17f05 duplicity: add TODO about impermanence support 2022-08-02 15:58:56 -07:00
de8f658dcd new package: unar
use as `unar path/to/archive`. can do gzip, cpio, etc.
2022-08-02 14:01:16 -07:00
5c2f33a550 add missing 'toString' in image builder 2022-08-01 23:11:16 -07:00
0ec48a9145 kitty: explore some color themes 2022-08-01 17:12:36 -07:00
408e817c39 rename modules/{nix -> nixcache}.nix 2022-08-01 15:10:40 -07:00
ba6d0b7e3d machines: moby: enable impermanence (experimental)
last time i tried to rebuild nixos on the pinephone it didn't switch,
IIRC. i don't know why, but i expect it'll be easier to manage my
machines if i keep more of the setup consistent across them.

likely i'll tune this to be more leniant on moby (e.g. persist all of
.librewolf).
2022-08-01 14:38:40 -07:00
4d7d96f4a4 machines: moby: remove w3m: it's already included in the common config 2022-08-01 14:38:10 -07:00
1a9dfe22ba image builder: integrate impermanence so that we create such things as /var/log
untested
2022-08-01 14:37:19 -07:00
8ae0d77938 image: document the config options 2022-08-01 14:01:46 -07:00
b53d2f945d impermanence: remove /srv
this is for "service directories": public, protocol-based fs access.
e.g. /srv/ftp might be a share which is exposed over FTP.
/srv/www might be a share which is exposed over www (or webdav).
2022-08-01 13:36:42 -07:00
f67ca0bd24 nixpatches: remove dead jackett, Discord patches 2022-08-01 13:30:47 -07:00
d196ce29ac pkgs: move logseq to x86-only package section 2022-08-01 13:25:57 -07:00
f03238daac update mobile-nixos: 2022-06-27 -> 2022-07-31; nixpkgs 2022-07-30 -> 2022-07-31 2022-08-01 13:19:12 -07:00
f9ab3b7cf1 sway: wifi: show signal strength
i'd prefer to show the essid instead of the interface name,
but there's no way to truncate that to just N characters,
so we overflow if we do that.
2022-08-01 00:50:57 -07:00
40bc4098ad lappy: disable guest account 2022-08-01 00:25:08 -07:00
451816f623 rename config.{colinsane -> sane} 2022-08-01 00:23:49 -07:00
9dea707eea kitty: ctrl+n opens a new OS terminal in the CWD 2022-07-31 23:42:13 -07:00
0875d5cb52 TODO: fix formatting 2022-07-31 18:11:02 -07:00
0de0749fb4 nixpatches: link to Discord opensar patches
maybe i'll remove this later, but i want them at least in the git
history :-)
2022-07-31 18:09:58 -07:00
ac772e72b8 document how to make Electron apps use wayland natively 2022-07-31 18:09:28 -07:00
d44db610cb switch vim => nvim
also install some plugins, like vim-surround and fzf
2022-07-31 18:09:01 -07:00
79b3bfc9e7 discord: fix urls to open in correct web-browser 2022-07-31 16:14:56 -07:00
6608e2bf6d vim: store swap files under ~/.cache/vim-swap
untested
2022-07-31 12:00:06 -07:00
19e0bd4780 update: nixpkgs: 2022-07-28 -> 2022-07-30
sops: 2022-07-24 -> 2022-07-31
2022-07-31 11:55:56 -07:00
18bb89ded0 lappy: enable guest account 2022-07-31 11:35:15 -07:00
4aa3e6cf24 update: nixpkgs: 2022-07-28 -> 2022-07-28 (same date version) 2022-07-30 14:22:38 -07:00
ee621cd132 pkgs: add visidata 2022-07-29 23:51:11 -07:00
641b32b8d0 fix jackett build (by disabling the check phase. manually verified: still works) 2022-07-29 20:08:35 -07:00
d69db1df37 update: nixpkgs: 2022-07-27 -> 2022-07-28 2022-07-29 13:57:43 -07:00
6d44c93b5a update: nixpkgs: 2022-07-26 -> 2022-07-27 2022-07-28 12:40:48 -07:00
32be025ec6 update: nixpkgs: 2022-07-25 -> 2022-07-26 2022-07-27 12:35:09 -07:00
ce5bfc68f5 update nixpkgs: 2022-07-24 -> 2022-07-25 2022-07-26 13:08:50 -07:00
b1773a9b54 update nixpkgs: 2022-07-22 -> 2022-07-24 2022-07-25 12:25:53 -07:00
3fe67e744f sway: fix waybar styling
apparently setting any `style` attribute clears all the defaults,
so if i want to set the font via the style then i need to include
all the defaults as well.
2022-07-25 00:00:11 -07:00
ea61d22764 Sway: add additional shortcuts for managing volume 2022-07-24 18:09:15 -07:00
d92994bcd2 sway: fixed-width network area 2022-07-24 13:50:06 -07:00
a5d14a643e obsidian: persist the .config/obsidian directory 2022-07-24 13:49:54 -07:00
4c1bc06441 update sops-nix 2022-07-24 13:18:34 -07:00
730b4f9d9b update nixpkgs: 2022-07-21 -> 2022-07-22 2022-07-23 02:20:36 -07:00
59f8191830 add nb personal knowledge manager, and its optional dep: w3m 2022-07-23 02:00:38 -07:00
af4e70c4c5 update nixpkgs: 2022-07-21 -> 2022-07-21
yes, two releases on the same day :o
2022-07-22 16:54:38 -07:00
5595da2c56 packages: add logseq (markdown/personal knowledge manager) 2022-07-22 14:12:27 -07:00
e52e2c8faa update nixpkgs 2022-07-16 -> 2022-07-21 2022-07-22 03:00:26 -07:00
7563090dd5 update nixpkgs 2022-07-14 -> 2022-07-16 2022-07-19 02:20:42 -07:00
bd44bd4434 home: packages: add Lollypop music player 2022-07-19 02:18:50 -07:00
430e594285 update nixpkgs 2022-07-13 -> 2022-07-14 2022-07-17 00:11:24 -07:00
8f88085eb5 desko: add steam 2022-07-16 03:10:57 -07:00
7375a55d4c home: add cheese webcam viewer 2022-07-15 23:15:58 -07:00
878f9fbe49 ssh: remove dead keys; update moby key 2022-07-15 14:23:33 -07:00
5ec0ee4524 add TODO: remove some dangling hardcoded uid numbers 2022-07-15 01:01:41 -07:00
2f3eda1800 uids/gids: resolve conflicts (prefer servo rules) 2022-07-15 00:15:37 -07:00
8c9c9ca6c9 migrate the rest of the uids/gids to 'allocations' system, but don't fix conflicts 2022-07-15 00:12:13 -07:00
42117f375b introduce an 'allocations' systems for things like uids/gids 2022-07-14 23:58:27 -07:00
ede10dd1c8 impermanence: don't persist /var/lib/nixos 2022-07-14 22:06:19 -07:00
a380e300bc desko: eliminate the non-determinism in /var/lib/nixos/auto-subuid-map 2022-07-14 22:00:53 -07:00
3773aebac0 desko: freeze uids/gids
this will allow (eventually) removing the /var/lib/nixos persisted
state.
2022-07-14 21:53:28 -07:00
8a61be18e1 update nixpkgs 2022-07-10 -> 2022-07-13 2022-07-14 19:15:43 -07:00
c07c106a68 machines: rescue: remove incorrect comment about tmpfs 2022-07-14 16:25:13 -07:00
1a159c8340 Merge branch 'master' of git.uninsane.org:colin/nix-files 2022-07-14 16:24:02 -07:00
6faed74958 home: packages: add gnome-disk-utility 2022-07-14 16:22:21 -07:00
d4d345ca12 machines: add a rescue machine for live-booting 2022-07-14 16:21:59 -07:00
a5b3677adc deps: update nixpkgs 2022-07-08 -> 2022-07-10 2022-07-12 15:08:34 -07:00
97374fdcf4 pks: add gthumb image viewer 2022-07-12 02:51:15 -07:00
1062a610c9 image building notes: mkdir /var/log, /var/lib 2022-07-12 02:51:15 -07:00
8f37edb402 transmission: specify download-dir and incomplete-dir instead of bind-mounting them
this appears to fix the permissions issue
2022-07-11 01:54:02 -07:00
99d55167f6 impermanence: only persist service directories if those services are enabled. 2022-07-10 17:58:16 -07:00
e2d7d63ebe impermanence: move application-level impermanence to their package definition 2022-07-10 17:43:57 -07:00
d0b903d50e home-packages: switch to a module.
this will allow for better configuration of packages in future.
2022-07-10 17:14:20 -07:00
9d71041530 impermanence: move the base persisted home-dirs into home-manager, alongside XDG dirs 2022-07-10 15:25:04 -07:00
31e404b04f impermanence: abstract the creation of service directories
better would be to not directly call out user/group, but force them to
be looked up.
2022-07-10 15:15:34 -07:00
01a47932f7 impermanence: abstract the creation of root-owned system directories 2022-07-10 15:07:56 -07:00
5c6f616c97 impermanence: abstract the creation of ~/ sub-dirs 2022-07-10 14:42:33 -07:00
89447d9fe9 update sops-nix: 2022-07-06 -> 2022-07-10 2022-07-10 14:19:50 -07:00
80ac5496be pkgs: ship zecwallet-lite as a patch instead of a custom pkg
this allows me to more easily upstream it.
2022-07-10 02:57:40 -07:00
ce46b3490a home packages: remove zola/gnumake; the repo for uninsane.org configures these now 2022-07-09 14:27:05 -07:00
678958f5cf update: nixpkgs 2022-07-06 -> 2022-07-08 2022-07-09 01:42:25 -07:00
292aa042f2 web browser: remove all bookmarks (migrated elsewhere)
see e.g. https://uninsane.org/links
2022-07-09 01:30:15 -07:00
b2bd8d5f89 persist: zcash directory 2022-07-09 01:00:17 -07:00
06989c613f pkgs: add zecwallet-lite to the home env 2022-07-09 00:55:36 -07:00
c6fbe3574d vpn: rename ovpnd -> ovpnd-us
this is needed to disambiguate it against the other regions.
2022-07-09 00:52:05 -07:00
f790147fb0 add ukraine VPN 2022-07-09 00:48:09 -07:00
dca68a019b pkgs: tor-browser: only enable on x86 2022-07-09 00:00:46 -07:00
fffeb95153 define new package: zecwallet-lite
it seems to work. still waiting for it to sync
2022-07-09 00:00:18 -07:00
461398143c add monero (as package and as persisted directory) 2022-07-08 21:56:49 -07:00
89aabda1a6 home packages: fix tor crash 2022-07-08 01:42:14 -07:00
54f6e86e20 home packages: add gnupg, sequoia 2022-07-08 00:43:56 -07:00
39ba149aab update nixpkgs 2022-07-05 -> 2022-07-06 2022-07-07 17:16:36 -07:00
01ce23130a new package: tor 2022-07-07 16:56:47 -07:00
dc6472f39f electrum: put on all GUI systems 2022-07-07 04:10:57 -07:00
db6dc8e08c persist Signal 2022-07-06 15:14:36 -07:00
3b0d10f05e TODO: remove video drivers item
it seems to be working
2022-07-06 14:47:22 -07:00
978017b4e7 sane-scripts: TODO: don't rely on the user's env 2022-07-06 14:43:59 -07:00
1dd3cab02b split web-browser out of toplevel home-manager.nix file 2022-07-06 14:41:19 -07:00
8fd42f49c2 home packages: remove gcc, rustup 2022-07-06 14:38:39 -07:00
7ec1879f90 home-manager: import from flake.nix, not env/home-manager.nix 2022-07-06 14:36:14 -07:00
c851f44a40 split home packages out of home manager 2022-07-06 14:35:01 -07:00
bcfd2cbdb1 split packages out into home v.s. system packages 2022-07-06 14:31:51 -07:00
c58df098d2 split "environment"-related settings into modules/universal/env 2022-07-06 14:23:49 -07:00
dfd1536d19 update sops-nix: 2022-07-03 -> 2022-07-06 2022-07-06 14:20:21 -07:00
3e774241af users.colin: explicitly set group to "users" 2022-07-06 14:19:43 -07:00
a100100e79 impermanence: move import into flake.nix 2022-07-06 14:17:29 -07:00
24fa857ee0 split nix --flake enabling out of modules/nix.nix into universal 2022-07-06 14:16:09 -07:00
6aa79e9e55 x86: remove empty swapDevices 2022-07-06 14:13:49 -07:00
0fa7cdaa76 remove dead reference to telegram 2022-07-06 14:03:45 -07:00
c673e1db92 remove unused nurpkgs 2022-07-06 14:03:28 -07:00
4d3caf6fde bump all deps 2022-07-06 02:50:47 -07:00
2ceb2637d8 remove unnecessary kernelModules
i can't notice any difference with these removed
2022-07-06 02:01:16 -07:00
eb8cfc682f remove opengl modules
they don't seem to be necessary:
- still able to run spirv/vulkan-accelerated stuff at the same rate.
- still able to watch videos at the same CPU load.

i think mesa packages solid drivers that make this part mostly
irrelevant.
2022-07-06 02:00:12 -07:00
85 changed files with 2458 additions and 859 deletions

View File

@@ -2,11 +2,11 @@ keys:
- &user_desko_colin age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x - &user_desko_colin age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x
- &user_lappy_colin age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g - &user_lappy_colin age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g
- &user_servo_colin age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu - &user_servo_colin age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu
- &user_moby_colin age1lt739n2tq7dmpglvntjr9j2r7426md7rat7x9w930gagtx4jyvnqwts2al - &user_moby_colin age1zsrsvd7j6l62fjxpfd2qnhqlk8wk4p8r0dtxpe4sdgnh2474095qdu7xj9
- &host_desko age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v - &host_desko age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v
- &host_lappy age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn - &host_lappy age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn
- &host_servo age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf - &host_servo age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf
- &host_moby age1t957gf0z865gya0khgc9x59wy76hzps3sgejjqtwcngn2xl273msxsmpe6 - &host_moby age18vq5ktwgeaysucvw9t67drqmg5zd5c5k3le34yqxckkfj7wqdqgsd4ejmt
creation_rules: creation_rules:
- path_regex: secrets/universal* - path_regex: secrets/universal*
key_groups: key_groups:

10
TODO.md
View File

@@ -1,12 +1,16 @@
# features/tweaks # features/tweaks
- iron out video drivers
- emoji picker application - emoji picker application
- find a Masto/Pleroma app which works on mobile - find a Masto/Pleroma app which works on mobile
- remove hardcoded uid/gids outside of allocations.nix (used in impermanence code -- replace with username/groupname)
# speed up cross compiling # speed up cross compiling
https://nixos.wiki/wiki/Cross_Compiling - <https://nixos.wiki/wiki/Cross_Compiling>
https://nixos.wiki/wiki/NixOS_on_ARM - <https://nixos.wiki/wiki/NixOS_on_ARM>
```nix
overlays = [{ ... }: { overlays = [{ ... }: {
nixpkgs.crossSystem.system = "aarch64-linux"; nixpkgs.crossSystem.system = "aarch64-linux";
}]; }];
```
- <https://github.com/nix-community/aarch64-build-box>
- apply for access to the community arm build box

71
flake.lock generated
View File

@@ -23,11 +23,11 @@
}, },
"impermanence": { "impermanence": {
"locked": { "locked": {
"lastModified": 1646131459, "lastModified": 1661933071,
"narHash": "sha256-GPmgxvUFvQ1GmsGfWHy9+rcxWrczeDhS9XnAIPHi9XQ=", "narHash": "sha256-RFgfzldpbCvS+H2qwH+EvNejvqs+NhPVD5j1I7HQQPY=",
"owner": "nix-community", "owner": "nix-community",
"repo": "impermanence", "repo": "impermanence",
"rev": "2f39baeb7d039fda5fc8225111bb79474138e6f4", "rev": "def994adbdfc28974e87b0e4c949e776207d5557",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -39,11 +39,11 @@
"mobile-nixos": { "mobile-nixos": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1656299939, "lastModified": 1661716773,
"narHash": "sha256-gODt71CCv0gnMNeU4GYdSBJkxsfmBy0uNv8owQC1oPs=", "narHash": "sha256-uxf0aC+kx8av3/IT8/UecxSMElC9i4UQvH25RHFwna4=",
"owner": "nixos", "owner": "nixos",
"repo": "mobile-nixos", "repo": "mobile-nixos",
"rev": "de9a88a70f0ae5fc0839ff94bf29e8a30af399f8", "rev": "09e388c42298fa777caa7738cd8d8d2b6d1ac8db",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -54,42 +54,26 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1656679828, "lastModified": 1663494472,
"narHash": "sha256-akGA97pR1BAQew1FrVTCME3p8qvYxJXB2X3a13aBphs=", "narHash": "sha256-fSowlaoXXWcAM8m9wA6u+eTJJtvruYHMA+Lb/tFi/qM=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "915f5a5b3cc4f8ba206afd0b70e52ba4c6a2796b", "rev": "f677051b8dc0b5e2a9348941c99eea8c4b0ff28f",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "id": "nixpkgs",
"ref": "nixos-22.05", "ref": "nixos-unstable",
"type": "indirect" "type": "indirect"
} }
}, },
"nixpkgs-21_11": {
"locked": {
"lastModified": 1656198488,
"narHash": "sha256-xe81o3Kin6a0jXA3mTxcR+jeA1jLKw3TCar5LUo/B5c=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "46af3303651699dc58cfc251d9b18c0f59d857da",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "release-21.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-22_05": { "nixpkgs-22_05": {
"locked": { "locked": {
"lastModified": 1656199498, "lastModified": 1663433994,
"narHash": "sha256-/BCpM7j7y1G4het6Z3idlnv9A87/s0O1glVmH7fnWvk=", "narHash": "sha256-Bpthhv1PdZRrIFct8KbHACNvOu9bsYAMEaqoH83cvqM=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "72a1f167077060a1a7b6e0104863245d0483fa7f", "rev": "17989edb05615c4f61803b9c427d80b84c289c6b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -101,11 +85,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1656130826, "lastModified": 1663419078,
"narHash": "sha256-g5Wo75ddDQmWnL70rJCMm+JJlvHbzPFUePUpuMNn5qk=", "narHash": "sha256-cxEeMnaTGMTeDAvXnZmqcF50qoyJOsQENhYxSnW9ZMs=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "72d1b0d0fac131df1ea254b65413c85609bdd2ee", "rev": "0cfb3c002b61807ca0bab3efe514476bdf2e5478",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -115,43 +99,26 @@
"type": "github" "type": "github"
} }
}, },
"nurpkgs": {
"locked": {
"lastModified": 1656786319,
"narHash": "sha256-MpdBL2+csFfnMu+2eUNkkACkrPt7UhUdpvXnhrLim0E=",
"owner": "nix-community",
"repo": "NUR",
"rev": "433704dc83b1491725e616bbb898ccd17fbe3d0e",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "NUR",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"home-manager": "home-manager", "home-manager": "home-manager",
"impermanence": "impermanence", "impermanence": "impermanence",
"mobile-nixos": "mobile-nixos", "mobile-nixos": "mobile-nixos",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nurpkgs": "nurpkgs",
"sops-nix": "sops-nix" "sops-nix": "sops-nix"
} }
}, },
"sops-nix": { "sops-nix": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nixpkgs-21_11": "nixpkgs-21_11",
"nixpkgs-22_05": "nixpkgs-22_05" "nixpkgs-22_05": "nixpkgs-22_05"
}, },
"locked": { "locked": {
"lastModified": 1656399028, "lastModified": 1663475375,
"narHash": "sha256-re66+rVHGR3y+0QsaDAwoAHCfoi3BlGV24t2EqRZsAE=", "narHash": "sha256-uIhMyLFkU8Tp0uxLd7tKn++G/yHsB9r7YRvsBdoGvsk=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "d26947f2d6252e2aae5ffddfe9b38b7c4b94e8f9", "rev": "bae718a9d1e31ec478ddfcb75149f66e9625a825",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -1,11 +1,11 @@
# docs: # docs:
# https://nixos.wiki/wiki/Flakes # - <https://nixos.wiki/wiki/Flakes>
# https://serokell.io/blog/practical-nix-flakes # - <https://serokell.io/blog/practical-nix-flakes>
{ {
inputs = { inputs = {
nixpkgs.url = "nixpkgs/nixos-22.05"; # nixpkgs.url = "nixpkgs/nixos-22.05";
# pkgs-telegram.url = "nixpkgs/33775ec9a2173a08e46edf9f46c9febadbf743e8";# 2022/04/18; telegram 3.7.3. fails: nix log /nix/store/y5kv47hnv55qknb6cnmpcyraicay79fx-telegram-desktop-3.7.3.drv: g++: fatal error: cannot execute '/nix/store/njk5sbd21305bhr7gwibxbbvgbx5lxvn-gcc-9.3.0/libexec/gcc/aarch64-unknown-linux-gnu/9.3.0/cc1plus': execv: No such file or directory nixpkgs.url = "nixpkgs/nixos-unstable";
mobile-nixos = { mobile-nixos = {
url = "github:nixos/mobile-nixos"; url = "github:nixos/mobile-nixos";
flake = false; flake = false;
@@ -14,12 +14,11 @@
url = "github:nix-community/home-manager/release-22.05"; url = "github:nix-community/home-manager/release-22.05";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nurpkgs.url = "github:nix-community/NUR";
sops-nix.url = "github:Mic92/sops-nix"; sops-nix.url = "github:Mic92/sops-nix";
impermanence.url = "github:nix-community/impermanence"; impermanence.url = "github:nix-community/impermanence";
}; };
outputs = { self, nixpkgs, mobile-nixos, home-manager, nurpkgs, sops-nix, impermanence }: outputs = { self, nixpkgs, mobile-nixos, home-manager, sops-nix, impermanence }:
let let
patchedPkgs = system: nixpkgs.legacyPackages.${system}.applyPatches { patchedPkgs = system: nixpkgs.legacyPackages.${system}.applyPatches {
name = "nixpkgs-patched-uninsane"; name = "nixpkgs-patched-uninsane";
@@ -27,57 +26,72 @@
patches = import ./nixpatches/list.nix nixpkgs.legacyPackages.${system}.fetchpatch; patches = import ./nixpatches/list.nix nixpkgs.legacyPackages.${system}.fetchpatch;
}; };
# return something which behaves like `pkgs`, for the provided system # return something which behaves like `pkgs`, for the provided system
nixpkgsFor = system: import (patchedPkgs system) { inherit system; }; # `local` = architecture of builder. `target` = architecture of the system beying deployed to
nixpkgsFor = local: target: import (patchedPkgs target) { crossSystem = target; localSystem = local; };
# evaluate ONLY our overlay, for the provided system # evaluate ONLY our overlay, for the provided system
customPackagesFor = system: import ./pkgs/overlay.nix (nixpkgsFor system) (nixpkgsFor system); customPackagesFor = local: target: import ./pkgs/overlay.nix (nixpkgsFor local target) (nixpkgsFor local target);
decl-machine = { name, system }: decl-machine = { name, local, target }:
let let
nixosSystem = import ((patchedPkgs system) + "/nixos/lib/eval-config.nix"); nixosSystem = import ((patchedPkgs target) + "/nixos/lib/eval-config.nix");
in (nixosSystem { in (nixosSystem {
inherit system; # by default the local system is the same as the target, employing emulation when they differ
specialArgs = { inherit nixpkgs mobile-nixos home-manager nurpkgs impermanence; }; system = target;
specialArgs = { inherit mobile-nixos home-manager impermanence; };
modules = [ modules = [
./modules ./modules
./machines/${name} ./machines/${name}
(import ./helpers/set-hostname.nix name) (import ./helpers/set-hostname.nix name)
home-manager.nixosModule
impermanence.nixosModule
sops-nix.nixosModules.sops sops-nix.nixosModules.sops
{ {
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
nixpkgs.overlays = [ nixpkgs.overlays = [
nurpkgs.overlay
(import "${mobile-nixos}/overlay/overlay.nix") (import "${mobile-nixos}/overlay/overlay.nix")
(import ./pkgs/overlay.nix) (import ./pkgs/overlay.nix)
(next: prev: {
# non-emulated packages build *from* local *for* target.
# for large packages like the linux kernel which are expensive to build under emulation,
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
cross = (nixpkgsFor local target) // (customPackagesFor local target);
})
]; ];
} }
]; ];
}); });
decl-bootable-machine = { name, system }: rec { decl-bootable-machine = { name, local, target }: rec {
nixosConfiguration = decl-machine { inherit name system; }; nixosConfiguration = decl-machine { inherit name local target; };
# this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition). # this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition).
# after building this: # after building this:
# - flash it to a bootable medium (SD card, flash drive, HDD) # - flash it to a bootable medium (SD card, flash drive, HDD)
# - resize the root partition (use cfdisk) # - resize the root partition (use cfdisk)
# - mount the part # - mount the part
# chown root:nixblkd <part>/nix/store # - chown root:nixbld <part>/nix/store
# chmod 775 <part>/nix/store # - chown root:root -R <part>/nix/store/*
# chown root:root -R <part>/nix/store/* # - chown root:root -R <part>/persist # if using impermanence
# populate any important things (persist/, home/colin/.ssh, etc) # - populate any important things (persist/, home/colin/.ssh, etc)
# - boot # - boot
# - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /` # - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /`
# - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS. # - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS.
# - `nixos-rebuild --flake './#<machine>' switch` # - `nixos-rebuild --flake './#<machine>' switch`
img = nixosConfiguration.config.system.build.img; img = nixosConfiguration.config.system.build.img;
}; };
machines.servo = decl-bootable-machine { name = "servo"; system = "aarch64-linux"; }; machines.servo = decl-bootable-machine { name = "servo"; local = "aarch64-linux"; target = "aarch64-linux"; };
machines.desko = decl-bootable-machine { name = "desko"; system = "x86_64-linux"; }; machines.desko = decl-bootable-machine { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; };
machines.lappy = decl-bootable-machine { name = "lappy"; system = "x86_64-linux"; }; machines.lappy = decl-bootable-machine { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; };
machines.moby = decl-bootable-machine { name = "moby"; system = "aarch64-linux"; }; machines.moby = decl-bootable-machine { name = "moby"; local = "aarch64-linux"; target = "aarch64-linux"; };
# special cross-compiled variant, to speed up deploys from an x86 box to the arm target
# note that these *do* produce different store paths, because the closure for the tools used to cross compile
# v.s. emulate differ.
# so deploying moby-cross and then moby incurs some rebuilding.
machines.moby-cross = decl-bootable-machine { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; };
machines.rescue = decl-bootable-machine { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; };
in { in {
nixosConfigurations = builtins.mapAttrs (name: value: value.nixosConfiguration) machines; nixosConfigurations = builtins.mapAttrs (name: value: value.nixosConfiguration) machines;
imgs = builtins.mapAttrs (name: value: value.img) machines; imgs = builtins.mapAttrs (name: value: value.img) machines;
packages.x86_64-linux = customPackagesFor "x86_64-linux"; packages.x86_64-linux = customPackagesFor "x86_64-linux" "x86_64-linux";
packages.aarch64-linux = customPackagesFor "aarch64-linux"; packages.aarch64-linux = customPackagesFor "aarch64-linux" "aarch64-linux";
}; };
} }

View File

@@ -1,28 +1,22 @@
{ pkgs, ... }: { config, pkgs, ... }:
{ {
imports = [ imports = [
./fs.nix ./fs.nix
]; ];
colinsane.home-manager.extraPackages = [ sane.gui.sway.enable = true;
pkgs.electrum sane.services.duplicity.enable = true;
]; sane.services.nixserve.enable = true;
colinsane.gui.sway.enable = true; sane.services.nixserve.sopsFile = ../../secrets/desko.yaml;
colinsane.services.duplicity.enable = true; sane.impermanence.enable = true;
colinsane.impermanence.enable = true;
boot.loader.generic-extlinux-compatible.enable = true;
boot.loader.efi.canTouchEfiVariables = false; boot.loader.efi.canTouchEfiVariables = false;
colinsane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ]; sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
hardware.opengl.extraPackages = with pkgs; [
rocm-opencl-icd
rocm-opencl-runtime
amdvlk
];
# needed to use libimobiledevice/ifuse, for iphone sync # needed to use libimobiledevice/ifuse, for iphone sync
services.usbmuxd.enable = true; services.usbmuxd.enable = true;
users.users.usbmux.uid = config.sane.allocations.usbmux-uid;
users.groups.usbmux.gid = config.sane.allocations.usbmux-gid;
# default config: https://man.archlinux.org/man/snapper-configs.5 # default config: https://man.archlinux.org/man/snapper-configs.5
# defaults to something like: # defaults to something like:
@@ -42,6 +36,17 @@
sopsFile = ../../secrets/desko.yaml; sopsFile = ../../secrets/desko.yaml;
}; };
programs.steam = {
enable = true;
# not sure if needed: stole this whole snippet from the wiki
remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
};
sane.impermanence.home-dirs = [
".steam"
".local/share/Steam"
];
# docs: https://nixos.org/manual/nixos/stable/options.html#opt-system.stateVersion # docs: https://nixos.org/manual/nixos/stable/options.html#opt-system.stateVersion
system.stateVersion = "21.05"; system.stateVersion = "21.05";
} }

View File

@@ -11,12 +11,14 @@
"defaults" "defaults"
]; ];
}; };
# we need a /tmp of default size (half RAM) for building large nix things # we need a /tmp for building large nix things.
# a cross-compiled kernel, particularly, will easily use 30+GB of tmp
fileSystems."/tmp" = { fileSystems."/tmp" = {
device = "none"; device = "none";
fsType = "tmpfs"; fsType = "tmpfs";
options = [ options = [
"mode=777" "mode=777"
"size=64G"
"defaults" "defaults"
]; ];
}; };

View File

@@ -4,18 +4,12 @@
./fs.nix ./fs.nix
]; ];
colinsane.gui.sway.enable = true; # sane.users.guest.enable = true;
colinsane.impermanence.enable = true; sane.gui.sway.enable = true;
boot.loader.generic-extlinux-compatible.enable = true; sane.impermanence.enable = true;
sane.nixcache.enable = true;
boot.loader.efi.canTouchEfiVariables = false; boot.loader.efi.canTouchEfiVariables = false;
colinsane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ]; sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
hardware.opengl.extraPackages = with pkgs; [
intel-compute-runtime
intel-media-driver # new
libvdpau-va-gl # new
vaapiIntel
];
# default config: https://man.archlinux.org/man/snapper-configs.5 # default config: https://man.archlinux.org/man/snapper-configs.5
# defaults to something like: # defaults to something like:

View File

@@ -1,50 +1,65 @@
{ pkgs, mobile-nixos, ... }: { config, pkgs, lib, mobile-nixos, ... }:
{ {
imports = [ imports = [
(import "${mobile-nixos}/lib/configuration.nix" { # (import "${mobile-nixos}/lib/configuration.nix" {
device = "pine64-pinephone"; # device = "pine64-pinephone";
}) # })
./firmware.nix ./firmware.nix
./fs.nix ./fs.nix
./kernel.nix
]; ];
# XXX colin: phosh doesn't work well with passwordless login # XXX colin: phosh doesn't work well with passwordless login
users.users.colin.initialPassword = "147147"; users.users.colin.initialPassword = "147147";
services.getty.autologinUser = "root"; # allows for emergency maintenance?
colinsane.home-manager.extraPackages = [ # usability compromises
# for web browsers see: https://forum.pine64.org/showthread.php?tid=13669 sane.impermanence.home-dirs = [
pkgs.angelfish # plasma mobile web browser; broken on phosh (poor wayland support) ".librewolf"
# pkgs.plasma5Packages.index # file browser
pkgs.plasma5Packages.konsole # terminal
# pkgs.plasma5Packages.pix # picture viewer
pkgs.plasma5Packages.kalk # calculator; broken on phosh
# pkgs.plasma5Packages.buho # (plasma mobile?) note application
pkgs.plasma5Packages.kasts # podcast app; works on phosh after setting QT envar
pkgs.plasma5Packages.koko # image gallery; broken on phosh
pkgs.plasma5Packages.kwave # media player.
# pkgs.plasma5Packages.neochat # matrix client. needs qcoro => no aarch64 support
# pkgs.plasma5Packages.plasma-dialer # phone dialer
# pkgs.plasma5Packages.plasma-mobile # the whole shebang?
# pkgs.plasma5Packages.plasma-settings
pkgs.plasma5Packages.bomber # arcade game; broken on phosh
pkgs.plasma5Packages.kapman # pacman
pkgs.w3m # text-based web browser; works!
pkgs.st # suckless terminal; broken on phosh
# pkgs.alacritty # terminal; crashes phosh
]; ];
colinsane.nixcache.enable = true; # sane.home-manager.extraPackages = [
colinsane.gui.phosh.enable = true; # # for web browsers see: https://forum.pine64.org/showthread.php?tid=13669
boot.loader.grub.enable = false; # pkgs.angelfish # plasma mobile web browser; broken on phosh (poor wayland support)
mobile.bootloader.enable = false; # # pkgs.plasma5Packages.index # file browser
boot.loader.generic-extlinux-compatible.enable = true; # pkgs.plasma5Packages.konsole # terminal
# # pkgs.plasma5Packages.pix # picture viewer
# pkgs.plasma5Packages.kalk # calculator; broken on phosh
# # pkgs.plasma5Packages.buho # (plasma mobile?) note application
# pkgs.plasma5Packages.kasts # podcast app; works on phosh after setting QT envar
# pkgs.plasma5Packages.koko # image gallery; broken on phosh
# pkgs.plasma5Packages.kwave # media player.
# # pkgs.plasma5Packages.neochat # matrix client. needs qcoro => no aarch64 support
# # pkgs.plasma5Packages.plasma-dialer # phone dialer
# # pkgs.plasma5Packages.plasma-mobile # the whole shebang?
# # pkgs.plasma5Packages.plasma-settings
# pkgs.plasma5Packages.bomber # arcade game; broken on phosh
# pkgs.plasma5Packages.kapman # pacman
# pkgs.st # suckless terminal; broken on phosh
# # pkgs.alacritty # terminal; crashes phosh
# ];
# sane.home-packages.enableGuiPkgs = false; # XXX faster builds/imaging for debugging
sane.home-manager.extraPackages = [
pkgs.plasma5Packages.konsole # terminal
];
# This value determines the NixOS release from which the default sane.nixcache.enable = true;
# settings for stateful data, like file locations and database versions sane.impermanence.enable = true;
# on your system were taken. Its perfectly fine and recommended to leave sane.gui.phosh.enable = true;
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option boot.loader.efi.canTouchEfiVariables = false;
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). # mobile.bootloader.enable = false;
system.stateVersion = "21.11"; # Did you read the comment? # mobile.boot.stage-1.enable = false;
# boot.initrd.systemd.enable = false;
# boot.initrd.services.swraid.enable = false; # attempt to fix dm_mod stuff
# mobile-nixos' /lib/firmware includes:
# rtl_bt (bluetooth)
# anx7688-fw.bin (USB-C -> HDMI bridge)
# ov5640_af.bin (camera module)
# hardware.firmware = [ config.mobile.device.firmware ];
hardware.firmware = [ pkgs.rtl8723cs-firmware ];
system.stateVersion = "21.11";
# defined: https://www.freedesktop.org/software/systemd/man/machine-info.html # defined: https://www.freedesktop.org/software/systemd/man/machine-info.html
# XXX colin: not sure which, if any, software makes use of this # XXX colin: not sure which, if any, software makes use of this
@@ -54,4 +69,6 @@
# enable rotation sensor # enable rotation sensor
hardware.sensor.iio.enable = true; hardware.sensor.iio.enable = true;
users.groups.feedbackd.gid = config.sane.allocations.feedbackd-gid;
} }

View File

@@ -2,8 +2,8 @@
{ {
# we need space in the GPT header to place tow-boot. # we need space in the GPT header to place tow-boot.
# only actually need 1 MB, but better to over-allocate than under-allocate # only actually need 1 MB, but better to over-allocate than under-allocate
colinsane.image.extraGPTPadding = 16 * 1024 * 1024; sane.image.extraGPTPadding = 16 * 1024 * 1024;
colinsane.image.firstPartGap = 0; sane.image.firstPartGap = 0;
system.build.img = pkgs.runCommandNoCC "nixos_full-disk-image.img" {} '' system.build.img = pkgs.runCommandNoCC "nixos_full-disk-image.img" {} ''
cp -v ${config.system.build.img-without-firmware}/nixos.img $out cp -v ${config.system.build.img-without-firmware}/nixos.img $out
chmod +w $out chmod +w $out

View File

@@ -1,7 +1,18 @@
{ ... }: { ... }:
{ {
# root is a tmpfs so that we have an ephemeral system ("impermanence" handles the state)
fileSystems."/" = { fileSystems."/" = {
device = "none";
fsType = "tmpfs";
options = [
"mode=755"
"size=1G"
"defaults"
];
};
fileSystems."/nix" = {
device = "/dev/disk/by-uuid/1f1271f8-53ce-4081-8a29-60a4a6b5d6f9"; device = "/dev/disk/by-uuid/1f1271f8-53ce-4081-8a29-60a4a6b5d6f9";
fsType = "btrfs"; fsType = "btrfs";
options = [ options = [

143
machines/moby/kernel.nix Normal file
View File

@@ -0,0 +1,143 @@
{ lib, pkgs, ... }:
let
# use the last commit on the 5.18 branch (5.18.14)
# manjaro's changes between kernel patch versions tend to be minimal if any.
manjaroBase = "https://gitlab.manjaro.org/manjaro-arm/packages/core/linux/-/raw/25bd828cd47b1c6e09fcbcf394a649b89d2876dd";
manjaroPatch = name: sha256: {
inherit name;
patch = pkgs.fetchpatch {
inherit name;
url = "${manjaroBase}/${name}?inline=false";
inherit sha256;
};
};
# the idea for patching off Manjaro's kernel comes from jakewaksbaum:
# - https://git.sr.ht/~jakewaksbaum/pi/tree/af20aae5653545d6e67a459b59ee3e1ca8a680b0/item/kernel/default.nix
# - he later abandoned this, i think because he's using the Pinephone Pro which received mainline support.
manjaroPatches = [
(manjaroPatch
"1001-arm64-dts-allwinner-add-hdmi-sound-to-pine-devices.patch"
"sha256-DApd791A+AxB28Ven/MVAyuyVphdo8KQDx8O7oxVPnc="
)
# these patches below are critical to enable wifi (RTL8723CS)
# - the alternative is a wholly forked kernel by megi/megous:
# - https://xnux.eu/howtos/build-pinephone-kernel.html#toc-how-to-build-megi-s-pinehpone-kernel
# - i don't know if these patches are based on megi's or original
(manjaroPatch
"2001-Bluetooth-Add-new-quirk-for-broken-local-ext-features.patch"
"sha256-CExhJuUWivegxPdnzKINEsKrMFx/m/1kOZFmlZ2SEOc="
)
(manjaroPatch
"2002-Bluetooth-btrtl-add-support-for-the-RTL8723CS.patch"
"sha256-dDdvOphTcP/Aog93HyH+L9m55laTgtjndPSE4/rnzUA="
)
(manjaroPatch
"2004-arm64-dts-allwinner-enable-bluetooth-pinetab-pinepho.patch"
"sha256-o43P3WzXyHK1PF+Kdter4asuyGAEKO6wf5ixcco2kCQ="
)
# XXX: this one has a Makefile, which hardcodes /sbin/depmod:
# - drivers/staging/rtl8723cs/Makefile
# - not sure if this is problematic?
(manjaroPatch
"2005-staging-add-rtl8723cs-driver.patch"
"sha256-6ywm3dQQ5JYl60CLKarxlSUukwi4QzqctCj3tVgzFbo="
)
];
# pinephone uses the linux dtb at arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
# - this includes sun50i-a64.dtsi
# - and sun50i-a64-cpu-opp.dtsi
# - no need to touch the allwinner-h6 stuff: that's the SBC pine product
# - i think it's safe to ignore sun9i stuff, but i don't know what it is
kernelConfig = with lib.kernel; {
# NB: nix adds the CONFIG_ prefix to each of these.
# if you add the prefix yourself nix will IGNORE YOUR CONFIG.
RTL8723CS = module;
BT_HCIUART_3WIRE = yes;
BT_HCIUART_RTL = yes;
RTL8XXXU_UNTESTED = yes;
BT_BNEP_MC_FILTER = yes;
BT_BNEP_PROTO_FILTER = yes;
BT_HS = yes;
BT_LE = yes;
# relevant configs inherited from nixos defaults (or above additions):
# CONFIG_BT=m
# CONFIG_BT_BREDR=y
# CONFIG_BT_RFCOMM=m
# CONFIG_BT_RFCOMM_TTY=y
# CONFIG_BT_BNEP=m
# CONFIG_BT_HIDP=m
# CONFIG_BT_RTL=m
# CONFIG_BT_HCIBTUSB=m
# CONFIG_BT_HCIBTUSB_BCM=y
# CONFIG_BT_HCIBTUSB_RTL=y
# CONFIG_BT_HCIUART=m
# CONFIG_BT_HCIUART_SERDEV=y
# CONFIG_BT_HCIUART_H4=y
# CONFIG_BT_HCIUART_LL=y
# CONFIG_RTL_CARDS=m
# CONFIG_RTLWIFI=m
# CONFIG_RTLWIFI_PCI=m
# CONFIG_RTLWIFI_USB=m
# CONFIG_RTLWIFI_DEBUG=y
# CONFIG_RTL8723_COMMON=m
# CONFIG_RTLBTCOEXIST=m
# CONFIG_RTL8XXXU=m
# CONFIG_RTLLIB=m
# consider adding (from mobile-nixos):
# maybe: CONFIG_BT_HCIUART_3WIRE=y
# maybe: CONFIG_BT_HCIUART_RTL=y
# maybe: CONFIG_RTL8XXXU_UNTESTED=y
# consider adding (from manjaro):
# CONFIG_BT_6LOWPAN=m (not listed as option in nixos kernel)
# these are referenced in the rtl8723 source, but not known to config (and not in mobile-nixos config
# maybe: CONFIG_RTL_ODM_WLAN_DRIVER
# maybe: CONFIG_RTL_TRIBAND_SUPPORT
# maybe: CONFIG_SDIO_HCI
# maybe: CONFIG_USB_HCI
};
# create a kernelPatch which overrides nixos' defconfig with extra options
patchDefconfig = config: {
# defconfig options. this method comes from here:
# - https://discourse.nixos.org/t/the-correct-way-to-override-the-latest-kernel-config/533/9
name = "sane-moby-defconfig";
patch = null;
extraStructuredConfig = config;
};
in
{
# use Megi's kernel:
# even with the Manjaro patches, stock 5.18 has a few issues on Pinephone:
# - no battery charging
# - phone rotation sensor is off by 90 degrees
# - ambient light sensor causes screen brightness to be shakey
# - phosh greeter may not appear after wake from sleep
boot.kernelPackages = pkgs.linuxPackagesFor pkgs.cross.linux-megous;
boot.kernelPatches = [
(patchDefconfig (kernelConfig //
(with lib.kernel; {
# disabling the sun5i_eink driver avoids this compilation error:
# CC [M] drivers/video/fbdev/sun5i-eink-neon.o
# aarch64-unknown-linux-gnu-gcc: error: unrecognized command line option '-mfloat-abi=softfp'
# 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
FB_SUN5I_EINK = no;
})
))
];
# alternatively, use nixos' kernel and add the stuff we want:
# # cross-compilation optimization:
# boot.kernelPackages =
# let p = (import nixpkgs { localSystem = "x86_64-linux"; });
# in p.pkgsCross.aarch64-multiplatform.linuxPackages_5_18;
# # non-cross:
# # boot.kernelPackages = pkgs.linuxPackages_5_18;
# boot.kernelPatches = manjaroPatches ++ [
# (patchDefconfig kernelConfig)
# ];
}

View File

@@ -0,0 +1,16 @@
{ config, pkgs, ... }:
{
imports = [
./fs.nix
];
boot.loader.generic-extlinux-compatible.enable = true;
boot.loader.efi.canTouchEfiVariables = false;
sane.image.extraBootFiles = [ pkgs.bootpart-uefi-x86_64 ];
users.users.dhcpcd.uid = config.sane.allocations.dhcpcd-uid;
users.groups.dhcpcd.gid = config.sane.allocations.dhcpcd-gid;
# docs: https://nixos.org/manual/nixos/stable/options.html#opt-system.stateVersion
system.stateVersion = "21.05";
}

12
machines/rescue/fs.nix Normal file
View File

@@ -0,0 +1,12 @@
{ ... }:
{
fileSystems."/" = {
device = "/dev/disk/by-uuid/44445555-6666-7777-8888-999900001111";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-uuid/2222-3333";
fsType = "vfat";
};
}

View File

@@ -12,26 +12,28 @@
./services/jackett.nix ./services/jackett.nix
./services/jellyfin.nix ./services/jellyfin.nix
./services/matrix.nix ./services/matrix.nix
./services/navidrome.nix
./services/nginx.nix ./services/nginx.nix
./services/nix-serve.nix
./services/pleroma.nix ./services/pleroma.nix
./services/postfix.nix ./services/postfix.nix
./services/postgres.nix ./services/postgres.nix
./services/transmission.nix ./services/transmission.nix
]; ];
colinsane.home-manager.enable = true; sane.home-manager.enable = true;
colinsane.home-manager.extraPackages = [ sane.home-manager.extraPackages = [
# for administering matrix
pkgs.matrix-synapse pkgs.matrix-synapse
]; ];
colinsane.impermanence.enable = true; sane.impermanence.enable = true;
colinsane.services.duplicity.enable = true; sane.services.duplicity.enable = true;
sane.services.nixserve.enable = true;
# TODO: validate this # TODO: look into the EFI stuff
boot.loader.grub.enable = false; boot.loader.grub.enable = false;
boot.loader.generic-extlinux-compatible.enable = true; boot.loader.generic-extlinux-compatible.enable = true;
boot.loader.efi.canTouchEfiVariables = false; boot.loader.efi.canTouchEfiVariables = false;
colinsane.image.extraBootFiles = [ pkgs.bootpart-u-boot-rpi-aarch64 ]; sane.image.extraBootFiles = [ pkgs.bootpart-u-boot-rpi-aarch64 ];
sops.secrets.duplicity_passphrase = { sops.secrets.duplicity_passphrase = {
sopsFile = ../../secrets/servo.yaml; sopsFile = ../../secrets/servo.yaml;

View File

@@ -16,7 +16,7 @@
device = "none"; device = "none";
fsType = "tmpfs"; fsType = "tmpfs";
options = [ options = [
"size=16G" "size=40G"
"mode=777" "mode=777"
"defaults" "defaults"
]; ];
@@ -38,16 +38,6 @@
# options = [ "bind" ]; # options = [ "bind" ];
# }; # };
# TODO: does transmission handle symlinks?
fileSystems."/var/lib/transmission/Downloads" = {
device = "/var/lib/uninsane/media";
options = [ "bind" ];
};
fileSystems."/var/lib/transmission/.incomplete" = {
device = "/var/lib/uninsane/media/incomplete";
options = [ "bind" ];
};
# in-memory compressed RAM (seems to be dynamically sized) # in-memory compressed RAM (seems to be dynamically sized)
zramSwap = { zramSwap = {
enable = true; enable = true;

View File

@@ -3,9 +3,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
# enables non-free firmware
hardware.enableRedistributableFirmware = true;
# i changed this becuse linux 5.10 didn't have rpi-400 device tree blob. # i changed this becuse linux 5.10 didn't have rpi-400 device tree blob.
# nixos-22.05 linux 5.15 DOES have these now. # nixos-22.05 linux 5.15 DOES have these now.
# it should be possible to remove this if desired, but i'm not sure how the rpi-specific kernel differs. # it should be possible to remove this if desired, but i'm not sure how the rpi-specific kernel differs.
@@ -38,16 +35,6 @@
"xhci_pci_renesas" "xhci_pci_renesas"
]; ];
# boot.initrd.compressor = "gzip"; # defaults to zstd # boot.initrd.compressor = "gzip"; # defaults to zstd
# hack in the `boot.shell_on_fail` arg since it doesn't seem to work otherwise
boot.initrd.preFailCommands = "allowShell=1";
# default: 4 (warn). 7 is debug
boot.consoleLogLevel = 7;
# boot.kernelParams = [
# "boot.shell_on_fail"
# # "boot.trace"
# # "systemd.log_level=debug"
# # "systemd.log_target=console"
# ];
# ondemand power scaling keeps the cpu at low frequency when idle, and sets to max frequency # ondemand power scaling keeps the cpu at low frequency when idle, and sets to max frequency
# when load is detected. (v.s. the "performance" default, which always uses the max frequency) # when load is detected. (v.s. the "performance" default, which always uses the max frequency)

View File

@@ -1,6 +1,11 @@
{ pkgs, lib, ... }: { config, pkgs, lib, ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode? could be more granular
{ user = "git"; group = "gitea"; directory = "/var/lib/gitea"; }
];
users.groups.gitea.gid = config.sane.allocations.gitea-gid;
services.gitea.enable = true; services.gitea.enable = true;
services.gitea.user = "git"; # default is 'gitea' services.gitea.user = "git"; # default is 'gitea'
services.gitea.database.type = "postgres"; services.gitea.database.type = "postgres";

View File

@@ -1,17 +1,29 @@
# admin:
# - view stats:
# - sudo -u ipfs -g ipfs ipfs -c /var/lib/ipfs/ stats bw
# - sudo -u ipfs -g ipfs ipfs -c /var/lib/ipfs/ stats dht
# - sudo -u ipfs -g ipfs ipfs -c /var/lib/ipfs/ bitswap stat
# - number of open peer connections:
# - sudo -u ipfs -g ipfs ipfs -c /var/lib/ipfs/ swarm peers | wc -l
{ ... }: { ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode? could be more granular
{ user = "261"; group = "261"; directory = "/var/lib/ipfs"; }
];
services.ipfs.enable = true; services.ipfs.enable = true;
services.ipfs.localDiscovery = true; services.ipfs.localDiscovery = true;
services.ipfs.swarmAddress = [ services.ipfs.swarmAddress = [
"/dns4/ipfs.uninsane.org/tcp/4001" # "/dns4/ipfs.uninsane.org/tcp/4001"
"/ip4/0.0.0.0/tcp/4001" # "/ip4/0.0.0.0/tcp/4001"
"/dns4/ipfs.uninsane.org/udp/4001/quic" "/dns4/ipfs.uninsane.org/udp/4001/quic"
"/ip4/0.0.0.0/udp/4001/quic" "/ip4/0.0.0.0/udp/4001/quic"
]; ];
services.ipfs.extraConfig = { services.ipfs.extraConfig = {
Addresses = { Addresses = {
Announce = [ Announce = [
"/dns4/ipfs.uninsane.org/tcp/4001" # "/dns4/ipfs.uninsane.org/tcp/4001"
"/dns4/ipfs.uninsane.org/udp/4001/quic" "/dns4/ipfs.uninsane.org/udp/4001/quic"
]; ];
}; };
@@ -19,5 +31,39 @@
# the gateway can only be used to serve content already replicated on this host # the gateway can only be used to serve content already replicated on this host
NoFetch = true; NoFetch = true;
}; };
Swarm = {
ConnMgr = {
# maintain between LowWater and HighWater peer connections
# taken from: https://github.com/ipfs/ipfs-desktop/pull/2055
# defaults are 600-900: https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmconnmgr
LowWater = 20;
HighWater = 40;
# default is 20s. i guess more grace period = less churn
GracePeriod = "1m";
};
ResourceMgr = {
# docs: https://github.com/libp2p/go-libp2p-resource-manager#resource-scopes
Enabled = true;
Limits = {
System = {
Conns = 196;
ConnsInbound = 128;
ConnsOutbound = 128;
FD = 512;
Memory = 1073741824; # 1GiB
Streams = 1536;
StreamsInbound = 1024;
StreamsOutbound = 1024;
};
};
};
Transports = {
Network = {
# disable TCP, force QUIC, for lighter resources
TCP = false;
QUIC = true;
};
};
};
}; };
} }

View File

@@ -1,6 +1,10 @@
{ ... }: { ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode? we only need this to save Indexer creds ==> migrate to config?
{ user = "root"; group = "root"; directory = "/var/lib/jackett"; }
];
services.jackett.enable = true; services.jackett.enable = true;
systemd.services.jackett.after = ["wg0veth.service"]; systemd.services.jackett.after = ["wg0veth.service"];

View File

@@ -1,5 +1,11 @@
{ ... }: { config, ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode? could be more granular
{ user = "jellyfin"; group = "jellyfin"; directory = "/var/lib/jellyfin"; }
];
users.users.jellyfin.uid = config.sane.allocations.jellyfin-uid;
users.groups.jellyfin.gid = config.sane.allocations.jellyfin-gid;
services.jellyfin.enable = true; services.jellyfin.enable = true;
} }

View File

@@ -3,6 +3,12 @@
{ config, ... }: { config, ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode?
# user and group are both "matrix-appservice-irc"
{ user = "993"; group = "992"; directory = "/var/lib/matrix-appservice-irc"; }
{ user = "224"; group = "224"; directory = "/var/lib/matrix-synapse"; }
];
services.matrix-synapse.enable = true; services.matrix-synapse.enable = true;
services.matrix-synapse.settings.server_name = "uninsane.org"; services.matrix-synapse.settings.server_name = "uninsane.org";

View File

@@ -0,0 +1,17 @@
{ ... }:
{
sane.impermanence.service-dirs = [
{ user = "navidrome"; group = "navidrome"; directory = "/var/lib/private/navidrome"; }
];
services.navidrome.enable = true;
services.navidrome.settings = {
# docs: https://www.navidrome.org/docs/usage/configuration-options/
Address = "127.0.0.1";
Port = 4533;
MusicFolder = "/var/lib/uninsane/media/Music";
CovertArtPriority = "*.jpg, *.JPG, *.png, *.PNG, embedded";
AutoImportPlaylists = false;
ScanSchedule = "@every 1h";
};
}

View File

@@ -213,6 +213,12 @@
}; };
}; };
services.nginx.virtualHosts."music.uninsane.org" = {
forceSSL = true;
enableACME = true;
locations."/".proxyPass = "http://127.0.0.1:4533";
};
services.nginx.virtualHosts."ipfs.uninsane.org" = { services.nginx.virtualHosts."ipfs.uninsane.org" = {
# don't default to ssl upgrades, since this may be dnslink'd from a different domain. # don't default to ssl upgrades, since this may be dnslink'd from a different domain.
# ideally we'd disable ssl entirely, but some places assume it? # ideally we'd disable ssl entirely, but some places assume it?
@@ -254,4 +260,12 @@
security.acme.acceptTerms = true; security.acme.acceptTerms = true;
security.acme.defaults.email = "admin.acme@uninsane.org"; security.acme.defaults.email = "admin.acme@uninsane.org";
users.users.acme.uid = config.sane.allocations.acme-uid;
users.groups.acme.gid = config.sane.allocations.acme-gid;
sane.impermanence.service-dirs = [
# TODO: mode?
{ user = "acme"; group = "acme"; directory = "/var/lib/acme"; }
{ user = "colin"; group = "users"; directory = "/var/lib/uninsane"; }
];
} }

View File

@@ -1,15 +0,0 @@
# docs: https://nixos.wiki/wiki/Binary_Cache
# to copy something to this machine's nix cache, do:
# nix copy --to ssh://nixcache.uninsane.org PACKAGE
{ config, ... }:
{
services.nix-serve = {
enable = true;
secretKeyFile = config.sops.secrets.nix_serve_privkey.path;
};
sops.secrets.nix_serve_privkey = {
sopsFile = ../../../secrets/servo.yaml;
};
}

View File

@@ -4,6 +4,12 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode? could be more granular
{ user = "pleroma"; group = "pleroma"; directory = "/var/lib/pleroma"; }
];
users.users.pleroma.uid = config.sane.allocations.pleroma-uid;
users.groups.pleroma.gid = config.sane.allocations.pleroma-gid;
services.pleroma.enable = true; services.pleroma.enable = true;
services.pleroma.secretConfigFile = config.sops.secrets.pleroma_secrets.path; services.pleroma.secretConfigFile = config.sops.secrets.pleroma_secrets.path;
services.pleroma.configs = [ services.pleroma.configs = [

View File

@@ -16,6 +16,11 @@ let
}; };
in in
{ {
sane.impermanence.service-dirs = [
# TODO: mode? could be more granular
{ user = "221"; group = "221"; directory = "/var/lib/opendkim"; }
{ user = "root"; group = "root"; directory = "/var/lib/postfix"; }
];
services.postfix.enable = true; services.postfix.enable = true;
services.postfix.hostname = "mx.uninsane.org"; services.postfix.hostname = "mx.uninsane.org";
services.postfix.origin = "uninsane.org"; services.postfix.origin = "uninsane.org";

View File

@@ -1,6 +1,10 @@
{ ... }: { ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode?
{ user = "71"; group = "71"; directory = "/var/lib/postgresql"; }
];
services.postgresql.enable = true; services.postgresql.enable = true;
# services.postgresql.dataDir = "/opt/postgresql/13"; # services.postgresql.dataDir = "/opt/postgresql/13";
# XXX colin: for a proper deploy, we'd want to include something for Pleroma here too. # XXX colin: for a proper deploy, we'd want to include something for Pleroma here too.

View File

@@ -1,6 +1,10 @@
{ ... }: { ... }:
{ {
sane.impermanence.service-dirs = [
# TODO: mode? we need this specifically for the stats tracking in .config/
{ user = "70"; group = "70"; directory = "/var/lib/transmission"; }
];
services.transmission.enable = true; services.transmission.enable = true;
services.transmission.settings = { services.transmission.settings = {
rpc-bind-address = "0.0.0.0"; rpc-bind-address = "0.0.0.0";
@@ -29,6 +33,9 @@
# see: https://git.zknt.org/mirror/transmission/commit/cfce6e2e3a9b9d31a9dafedd0bdc8bf2cdb6e876?lang=bg-BG # see: https://git.zknt.org/mirror/transmission/commit/cfce6e2e3a9b9d31a9dafedd0bdc8bf2cdb6e876?lang=bg-BG
anti-brute-force-enabled = false; anti-brute-force-enabled = false;
download-dir = "/var/lib/uninsane/media";
incomplete-dir = "/var/lib/uninsane/media/incomplete";
}; };
# 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";

View File

@@ -1,4 +1,4 @@
{ ... }: { config, ... }:
# installer docs: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/installation-device.nix # installer docs: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/installation-device.nix
{ {
@@ -12,6 +12,7 @@
home = "/var/lib/gitea"; home = "/var/lib/gitea";
useDefaultShell = true; useDefaultShell = true;
group = "gitea"; group = "gitea";
uid = config.sane.allocations.git-uid;
isSystemUser = true; isSystemUser = true;
# sendmail access (not 100% sure if this is necessary) # sendmail access (not 100% sure if this is necessary)
extraGroups = [ "postdrop" ]; extraGroups = [ "postdrop" ];

View File

@@ -6,8 +6,9 @@
./hardware ./hardware
./image.nix ./image.nix
./impermanence.nix ./impermanence.nix
./nix.nix ./nixcache.nix
./services/duplicity.nix ./services/duplicity.nix
./services/nixserve.nix
./universal ./universal
]; ];
} }

View File

@@ -2,7 +2,7 @@
with lib; with lib;
let let
cfg = config.colinsane.gui; cfg = config.sane.gui;
in in
{ {
imports = [ imports = [
@@ -14,13 +14,16 @@ in
options = { options = {
# doesn't directly create outputs. consumed by e.g. home-manager.nix module # doesn't directly create outputs. consumed by e.g. home-manager.nix module
colinsane.gui.enable = mkOption { sane.gui.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
colinsane.home-manager.enable = true; sane.home-packages.enableGuiPkgs = lib.mkDefault true;
sane.home-manager.enable = lib.mkDefault true;
# all GUIs use network manager?
users.users.nm-iodine.uid = config.sane.allocations.nm-iodine-uid;
}; };
} }

View File

@@ -2,18 +2,18 @@
with lib; with lib;
let let
cfg = config.colinsane.gui.gnome; cfg = config.sane.gui.gnome;
in in
{ {
options = { options = {
colinsane.gui.gnome.enable = mkOption { sane.gui.gnome.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
colinsane.gui.enable = true; sane.gui.enable = true;
# start gnome/gdm on boot # start gnome/gdm on boot
services.xserver.enable = true; services.xserver.enable = true;
services.xserver.desktopManager.gnome.enable = true; services.xserver.desktopManager.gnome.enable = true;

View File

@@ -1,19 +1,29 @@
{ lib, config, ... }: { lib, config, pkgs, ... }:
with lib; with lib;
let let
cfg = config.colinsane.gui.phosh; cfg = config.sane.gui.phosh;
in in
{ {
options = { options = {
colinsane.gui.phosh.enable = mkOption { sane.gui.phosh.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
colinsane.gui.enable = true; sane.gui.enable = true;
users.users.avahi.uid = config.sane.allocations.avahi-uid;
users.users.colord.uid = config.sane.allocations.colord-uid;
users.users.geoclue.uid = config.sane.allocations.geoclue-uid;
users.users.rtkit.uid = config.sane.allocations.rtkit-uid;
users.groups.avahi.gid = config.sane.allocations.avahi-gid;
users.groups.colord.gid = config.sane.allocations.colord-gid;
users.groups.geoclue.gid = config.sane.allocations.geoclue-gid;
users.groups.rtkit.gid = config.sane.allocations.rtkit-gid;
# docs: https://github.com/NixOS/nixpkgs/blob/nixos-22.05/nixos/modules/services/x11/desktop-managers/phosh.nix # docs: https://github.com/NixOS/nixpkgs/blob/nixos-22.05/nixos/modules/services/x11/desktop-managers/phosh.nix
services.xserver.desktopManager.phosh = { services.xserver.desktopManager.phosh = {
enable = true; enable = true;
@@ -28,6 +38,15 @@ in
}; };
}; };
# XXX: phosh enables networkmanager by default; can probably disable these lines
networking.useDHCP = false;
networking.networkmanager.enable = true;
networking.wireless.enable = lib.mkForce false;
# XXX: not clear if these are actually needed?
hardware.bluetooth.enable = true;
services.blueman.enable = true;
hardware.opengl.enable = true; hardware.opengl.enable = true;
hardware.opengl.driSupport = true; hardware.opengl.driSupport = true;
@@ -39,5 +58,10 @@ in
# phocConfig.xwayland should be disabled if you do this # phocConfig.xwayland should be disabled if you do this
NIXOS_OZONE_WL = "1"; NIXOS_OZONE_WL = "1";
}; };
sane.home-manager.extraPackages = with pkgs; [
# TODO: see about removing this if the in-built gnome-settings bluetooth manager can work
gnome.gnome-bluetooth
];
}; };
} }

View File

@@ -2,18 +2,18 @@
with lib; with lib;
let let
cfg = config.colinsane.gui.plasma-mobile; cfg = config.sane.gui.plasma-mobile;
in in
{ {
options = { options = {
colinsane.gui.plasma-mobile.enable = mkOption { sane.gui.plasma-mobile.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
colinsane.gui.enable = true; sane.gui.enable = true;
# start plasma-mobile on boot # start plasma-mobile on boot
services.xserver.enable = true; services.xserver.enable = true;
services.xserver.desktopManager.plasma5.mobile.enable = true; services.xserver.desktopManager.plasma5.mobile.enable = true;

View File

@@ -3,17 +3,19 @@
# docs: https://nixos.wiki/wiki/Sway # docs: https://nixos.wiki/wiki/Sway
with lib; with lib;
let let
cfg = config.colinsane.gui.sway; cfg = config.sane.gui.sway;
in in
{ {
options = { options = {
colinsane.gui.sway.enable = mkOption { sane.gui.sway.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
colinsane.gui.enable = true; sane.gui.enable = true;
users.users.greeter.uid = config.sane.allocations.greeter-uid;
users.groups.greeter.gid = config.sane.allocations.greeter-gid;
programs.sway = { programs.sway = {
# we configure sway with home-manager, but this enable gets us e.g. opengl and fonts # we configure sway with home-manager, but this enable gets us e.g. opengl and fonts
enable = true; enable = true;
@@ -47,12 +49,26 @@ in
networking.networkmanager.enable = true; networking.networkmanager.enable = true;
networking.wireless.enable = lib.mkForce false; networking.wireless.enable = lib.mkForce false;
colinsane.home-manager.windowManager.sway = { sane.home-manager.windowManager.sway = {
enable = true; enable = true;
wrapperFeatures.gtk = true; wrapperFeatures.gtk = true;
config = rec { config = rec {
terminal = "${pkgs.kitty}/bin/kitty"; terminal = "${pkgs.kitty}/bin/kitty";
window.border = 3; # pixel boundary between windows window = {
border = 3; # pixel boundary between windows
hideEdgeBorders = "smart"; # don't show border if only window on workspace
};
output = {
### DESKTOP
"Samsung Electric Company S22C300 0x00007F35" = { pos = "0,0"; res = "1920x1080"; };
"Goldstar Company Ltd LG ULTRAWIDE 0x00004E94" = { pos = "1920,0"; res = "3440x1440"; };
### LAPTOP
# shen TV
"Pioneer Electronic Corporation VSX-524 0x00000101" = { pos = "0,0"; res = "1920x1080"; };
# internal display
"Unknown 0x0637 0x00000000" = { pos = "1920,0"; res = "1920x1080"; };
};
# defaults; required for keybindings decl. # defaults; required for keybindings decl.
modifier = "Mod1"; modifier = "Mod1";
@@ -64,6 +80,7 @@ in
down = "j"; down = "j";
up = "k"; up = "k";
right = "l"; right = "l";
# XKB key names: https://wiki.linuxquestions.org/wiki/List_of_Keysyms_Recognised_by_Xmodmap
keybindings = { keybindings = {
"${modifier}+Return" = "exec ${terminal}"; "${modifier}+Return" = "exec ${terminal}";
"${modifier}+Shift+q" = "kill"; "${modifier}+Shift+q" = "kill";
@@ -147,6 +164,9 @@ in
XF86AudioLowerVolume = "exec '${pkgs.pulsemixer}/bin/pulsemixer --change-volume -5'"; XF86AudioLowerVolume = "exec '${pkgs.pulsemixer}/bin/pulsemixer --change-volume -5'";
XF86AudioMute = "exec '${pkgs.pulsemixer}/bin/pulsemixer --toggle-mute'"; XF86AudioMute = "exec '${pkgs.pulsemixer}/bin/pulsemixer --toggle-mute'";
"${modifier}+Page_Up" = "exec '${pkgs.pulsemixer}/bin/pulsemixer --change-volume +5'";
"${modifier}+Page_Down" = "exec '${pkgs.pulsemixer}/bin/pulsemixer --change-volume -5'";
"${modifier}+Print" = "exec '${pkgs.sway-contrib.grimshot}/bin/grimshot copy area'"; "${modifier}+Print" = "exec '${pkgs.sway-contrib.grimshot}/bin/grimshot copy area'";
}; };
@@ -163,7 +183,8 @@ in
# names = [ "monospace" "Noto Color Emoji" ]; # names = [ "monospace" "Noto Color Emoji" ];
# size = 8.0; # size = 8.0;
# names = [ "Font Awesome 6 Free" "DejaVu Sans" "Hack" ]; # names = [ "Font Awesome 6 Free" "DejaVu Sans" "Hack" ];
names = with config.fonts.fontconfig.defaultFonts; (emoji ++ monospace ++ serif ++ sansSerif); # names = with config.fonts.fontconfig.defaultFonts; (emoji ++ monospace ++ serif ++ sansSerif);
names = with config.fonts.fontconfig.defaultFonts; (monospace ++ emoji);
size = 24.0; size = 24.0;
}; };
trayOutput = "primary"; trayOutput = "primary";
@@ -201,9 +222,10 @@ in
}; };
}; };
colinsane.home-manager.programs.waybar = { sane.home-manager.programs.waybar = {
enable = true; enable = true;
# docs: https://github.com/Alexays/Waybar/wiki/Configuration # docs: https://github.com/Alexays/Waybar/wiki/Configuration
# format specifiers: https://fmt.dev/latest/syntax.html#syntax
settings = { settings = {
mainBar = { mainBar = {
layer = "top"; layer = "top";
@@ -232,11 +254,20 @@ in
on-scroll-down = "${pkgs.playerctl}/bin/playerctl previous"; on-scroll-down = "${pkgs.playerctl}/bin/playerctl previous";
}; };
network = { network = {
interval = 1; # docs: https://github.com/Alexays/Waybar/blob/master/man/waybar-network.5.scd
format-ethernet = "{ifname}: {ipaddr}/{cidr} up: {bandwidthUpBits} down: {bandwidthDownBits}"; interval = 2;
max-length = 40;
# custom :> format specifier explained here: https://github.com/Alexays/Waybar/pull/472
format-ethernet = " {bandwidthUpBits:>} {bandwidthDownBits:>}";
tooltip-format-ethernet = "{ifname} {bandwidthUpBits:>} {bandwidthDownBits:>}";
format-wifi = "{ifname} ({signalStrength}%) {bandwidthUpBits:>} {bandwidthDownBits:>}";
tooltip-format-wifi = "{essid} ({signalStrength}%) {bandwidthUpBits:>} {bandwidthDownBits:>}";
format-disconnected = "";
}; };
cpu = { cpu = {
format = "{usage}% "; format = " {usage:2}%";
tooltip = false; tooltip = false;
}; };
battery = { battery = {
@@ -259,6 +290,262 @@ in
}; };
}; };
}; };
# style docs: https://github.com/Alexays/Waybar/wiki/Styling
style = ''
* {
font-family: monospace;
}
/* defaults below: https://github.com/Alexays/Waybar/blob/master/resources/style.css */
window#waybar {
background-color: rgba(43, 48, 59, 0.5);
border-bottom: 3px solid rgba(100, 114, 125, 0.5);
color: #ffffff;
transition-property: background-color;
transition-duration: .5s;
}
window#waybar.hidden {
opacity: 0.2;
}
/*
window#waybar.empty {
background-color: transparent;
}
window#waybar.solo {
background-color: #FFFFFF;
}
*/
window#waybar.termite {
background-color: #3F3F3F;
}
window#waybar.chromium {
background-color: #000000;
border: none;
}
#workspaces button {
padding: 0 5px;
background-color: transparent;
color: #ffffff;
/* Use box-shadow instead of border so the text isn't offset */
box-shadow: inset 0 -3px transparent;
/* Avoid rounded borders under each workspace name */
border: none;
border-radius: 0;
}
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
#workspaces button:hover {
background: rgba(0, 0, 0, 0.2);
box-shadow: inset 0 -3px #ffffff;
}
#workspaces button.focused {
background-color: #64727D;
box-shadow: inset 0 -3px #ffffff;
}
#workspaces button.urgent {
background-color: #eb4d4b;
}
#mode {
background-color: #64727D;
border-bottom: 3px solid #ffffff;
}
#clock,
#battery,
#cpu,
#memory,
#disk,
#temperature,
#backlight,
#network,
#pulseaudio,
#custom-media,
#tray,
#mode,
#idle_inhibitor,
#mpd {
padding: 0 10px;
color: #ffffff;
}
#window,
#workspaces {
margin: 0 4px;
}
/* If workspaces is the leftmost module, omit left margin */
.modules-left > widget:first-child > #workspaces {
margin-left: 0;
}
/* If workspaces is the rightmost module, omit right margin */
.modules-right > widget:last-child > #workspaces {
margin-right: 0;
}
#clock {
background-color: #64727D;
}
#battery {
background-color: #ffffff;
color: #000000;
}
#battery.charging, #battery.plugged {
color: #ffffff;
background-color: #26A65B;
}
@keyframes blink {
to {
background-color: #ffffff;
color: #000000;
}
}
#battery.critical:not(.charging) {
background-color: #f53c3c;
color: #ffffff;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
label:focus {
background-color: #000000;
}
#cpu {
background-color: #2ecc71;
color: #000000;
}
#memory {
background-color: #9b59b6;
}
#disk {
background-color: #964B00;
}
#backlight {
background-color: #90b1b1;
}
#network {
background-color: #2980b9;
}
#network.disconnected {
background-color: #f53c3c;
}
#pulseaudio {
background-color: #f1c40f;
color: #000000;
}
#pulseaudio.muted {
background-color: #90b1b1;
color: #2a5c45;
}
#custom-media {
background-color: #66cc99;
color: #2a5c45;
min-width: 100px;
}
#custom-media.custom-spotify {
background-color: #66cc99;
}
#custom-media.custom-vlc {
background-color: #ffa000;
}
#temperature {
background-color: #f0932b;
}
#temperature.critical {
background-color: #eb4d4b;
}
#tray {
background-color: #2980b9;
}
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: #eb4d4b;
}
#idle_inhibitor {
background-color: #2d3436;
}
#idle_inhibitor.activated {
background-color: #ecf0f1;
color: #2d3436;
}
#mpd {
background-color: #66cc99;
color: #2a5c45;
}
#mpd.disconnected {
background-color: #f53c3c;
}
#mpd.stopped {
background-color: #90b1b1;
}
#mpd.paused {
background-color: #51a37a;
}
#language {
background: #00b093;
color: #740864;
padding: 0 5px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state {
background: #97e1ad;
color: #000000;
padding: 0 0px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state > label {
padding: 0 5px;
}
#keyboard-state > label.locked {
background: rgba(0, 0, 0, 0.2);
}
'';
# style = '' # style = ''
# * { # * {
# border: none; # border: none;
@@ -280,7 +567,7 @@ in
# } # }
# ''; # '';
}; };
colinsane.home-manager.extraPackages = with pkgs; [ sane.home-manager.extraPackages = with pkgs; [
swaylock swaylock
swayidle swayidle
wl-clipboard wl-clipboard
@@ -290,6 +577,7 @@ in
# pavucontrol # pavucontrol
sway-contrib.grimshot sway-contrib.grimshot
gnome.gnome-bluetooth gnome.gnome-bluetooth
gnome.gnome-control-center
]; ];
}; };
} }

40
modules/hardware/all.nix Normal file
View File

@@ -0,0 +1,40 @@
{ lib, pkgs, ... }:
{
boot.initrd.supportedFilesystems = [ "ext4" "btrfs" "ext2" "ext3" "vfat" ];
# useful emergency utils
boot.initrd.extraUtilsCommands = ''
copy_bin_and_libs ${pkgs.btrfs-progs}/bin/btrfstune
'';
boot.kernelParams = [ "boot.shell_on_fail" ];
# other kernelParams:
# "boot.trace"
# "systemd.log_level=debug"
# "systemd.log_target=console"
# hack in the `boot.shell_on_fail` arg since that doesn't always seem to work.
boot.initrd.preFailCommands = "allowShell=1";
# default: 4 (warn). 7 is debug
boot.consoleLogLevel = 7;
boot.loader.grub.enable = lib.mkDefault false;
boot.loader.generic-extlinux-compatible.enable = lib.mkDefault true;
# non-free firmware
hardware.enableRedistributableFirmware = true;
services.fwupd.enable = true;
# powertop will default to putting USB devices -- including HID -- to sleep after TWO SECONDS
powerManagement.powertop.enable = false;
# services.snapper.configs = {
# root = {
# subvolume = "/";
# extraConfig = {
# ALLOW_USERS = "colin";
# };
# };
# };
# services.snapper.snapshotInterval = "daily";
}

View File

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

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, config, ... }: { lib, pkgs, ... }:
with lib; with lib;
{ {
@@ -9,52 +9,18 @@ with lib;
"nvme" # to boot from nvme devices "nvme" # to boot from nvme devices
# efi_pstore evivars # efi_pstore evivars
]; ];
boot.initrd.kernelModules = [ ];
boot.initrd.supportedFilesystems = [ "ext4" "btrfs" "ext2" "ext3" "vfat" ];
# useful emergency utils
boot.initrd.extraUtilsCommands = ''
copy_bin_and_libs ${pkgs.btrfs-progs}/bin/btrfstune
'';
boot.kernelModules = [
"coretemp"
"kvm-intel"
"kvm-amd" # desktop
"amdgpu" # desktop
];
boot.extraModulePackages = [ ];
boot.kernelParams = [ "boot.shell_on_fail" ];
boot.consoleLogLevel = 7;
boot.loader.grub.enable = false;
# boot.loader.generic-extlinux-compatible.enable = true;
# enable cross compilation # enable cross compilation
boot.binfmt.emulatedSystems = [ "aarch64-linux" ]; boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
# nixpkgs.config.allowUnsupportedSystem = true;
# nixpkgs.crossSystem.system = "aarch64-linux"; # nixpkgs.crossSystem.system = "aarch64-linux";
powerManagement.cpuFreqGovernor = "powersave"; powerManagement.cpuFreqGovernor = "powersave";
hardware.enableRedistributableFirmware = true;
hardware.cpu.amd.updateMicrocode = true; # desktop hardware.cpu.amd.updateMicrocode = true; # desktop
hardware.cpu.intel.updateMicrocode = true; # laptop hardware.cpu.intel.updateMicrocode = true; # laptop
services.fwupd.enable = true;
# powertop will default to putting USB devices -- including HID -- to sleep after TWO SECONDS
powerManagement.powertop.enable = false;
hardware.opengl.driSupport = true; hardware.opengl.driSupport = true;
# For 32 bit applications # For 32 bit applications
hardware.opengl.driSupport32Bit = true; hardware.opengl.driSupport32Bit = true;
# TODO colin: does this *do* anything?
swapDevices = [ ];
# services.snapper.configs = {
# root = {
# subvolume = "/";
# extraConfig = {
# ALLOW_USERS = "colin";
# };
# };
# };
# services.snapper.snapshotInterval = "daily";
}; };
} }

View File

@@ -2,15 +2,29 @@
with lib; with lib;
let let
cfg = config.colinsane.image; cfg = config.sane.image;
in in
{ {
options = { options = {
colinsane.image.extraBootFiles = mkOption { # packages whose contents should be copied directly into the /boot partition.
# e.g. EFI loaders, u-boot bootloader, etc.
sane.image.extraBootFiles = mkOption {
default = []; default = [];
type = types.listOf types.package; type = types.listOf types.package;
}; };
colinsane.image.extraGPTPadding = mkOption { # extra (empty) directories to create in the rootfs.
# for example, /var/log might be required by the boot process, so ensure it exists.
sane.image.extraDirectories = mkOption {
default = [];
type = types.listOf types.str;
};
# the GPT header is fixed to Logical Block Address 1,
# but we can actually put the partition entries anywhere.
# this option reserves so many bytes after LBA 1 but *before* the partition entries.
# this is not universally supported, but is an easy hack to claim space near the start
# of the disk for other purposes (e.g. firmware blobs)
sane.image.extraGPTPadding = mkOption {
default = 0; default = 0;
# NB: rpi doesn't like non-zero values for this. # NB: rpi doesn't like non-zero values for this.
# at the same time, spinning disks REALLY need partitions to be aligned to 4KiB boundaries. # at the same time, spinning disks REALLY need partitions to be aligned to 4KiB boundaries.
@@ -18,7 +32,8 @@ in
# default = 2014 * 512; # standard is to start part0 at sector 2048 (versus 34 if no padding) # default = 2014 * 512; # standard is to start part0 at sector 2048 (versus 34 if no padding)
type = types.int; type = types.int;
}; };
colinsane.image.firstPartGap = mkOption { # optional space (in bytes) to leave unallocated after the GPT structure and before the first partition.
sane.image.firstPartGap = mkOption {
# align the first part to 16 MiB. # align the first part to 16 MiB.
# do this by inserting a gap of 16 MiB - gptHeaderSize # do this by inserting a gap of 16 MiB - gptHeaderSize
# and then multiply by 1MiB and subtract 1 because mobile-nixos # and then multiply by 1MiB and subtract 1 because mobile-nixos
@@ -26,7 +41,7 @@ in
default = (16 * 1024 * 1024 - 34 * 512) * 1024 * 1024 - 1; default = (16 * 1024 * 1024 - 34 * 512) * 1024 * 1024 - 1;
type = types.nullOr types.int; type = types.nullOr types.int;
}; };
colinsane.image.bootPartSize = mkOption { sane.image.bootPartSize = mkOption {
default = 512 * 1024 * 1024; default = 512 * 1024 * 1024;
type = types.int; type = types.int;
}; };
@@ -37,6 +52,7 @@ in
(builtins.substring 0 (builtins.stringLength sub) super) == sub (builtins.substring 0 (builtins.stringLength sub) super) == sub
); );
# return the (string) path to get from `stem` to `path` # return the (string) path to get from `stem` to `path`
# or errors if not a sub-path
relPath = stem: path: ( relPath = stem: path: (
builtins.head (builtins.match "^${stem}(.+)" path) builtins.head (builtins.match "^${stem}(.+)" path)
); );
@@ -47,14 +63,6 @@ in
# resolves to e.g. "nix/store", "/store" or "" # resolves to e.g. "nix/store", "/store" or ""
storeRelPath = relPath nixFs.mountPoint "/nix/store"; storeRelPath = relPath nixFs.mountPoint "/nix/store";
# return a list of all the `device` values -- one for each fileSystems."$x"
devices = builtins.attrValues (builtins.mapAttrs (mount: entry: entry.device) fileSystems);
# filter the devices to just those which sit under nixFs
subNixMounts = builtins.filter (a: startsWith (builtins.toString a) nixFs.mountPoint) devices;
# e.g. ["/nix/persist/var"] -> ["/persist/var"] if nixFs sits at /nix
subNixRelMounts = builtins.map (m: relPath nixFs.mountPoint m) subNixMounts;
makeSubNixMounts = builtins.toString (builtins.map (m: "mkdir -p ./${m};") subNixRelMounts);
uuidFromFs = fs: builtins.head (builtins.match "/dev/disk/by-uuid/(.+)" fs.device); uuidFromFs = fs: builtins.head (builtins.match "/dev/disk/by-uuid/(.+)" fs.device);
vfatUuidFromFs = fs: builtins.replaceStrings ["-"] [""] (uuidFromFs fs); vfatUuidFromFs = fs: builtins.replaceStrings ["-"] [""] (uuidFromFs fs);
@@ -104,11 +112,10 @@ in
populateCommands = populateCommands =
let let
closureInfo = buildPackages.closureInfo { rootPaths = config.system.build.toplevel; }; closureInfo = buildPackages.closureInfo { rootPaths = config.system.build.toplevel; };
extraRelPaths = builtins.toString (builtins.map (p: "./" + builtins.toString(relPath nixFs.mountPoint p)) cfg.extraDirectories);
in in
'' ''
mkdir -p ./${storeRelPath} mkdir -p ./${storeRelPath} ${extraRelPaths}
# TODO: we should create the dirs required for boot (/var/log?). the rest are populated automatically.
# $(makeSubNixMounts)
echo "Copying system closure..." echo "Copying system closure..."
while IFS= read -r path; do while IFS= read -r path; do
echo " Copying $path" echo " Copying $path"

View File

@@ -6,69 +6,71 @@
with lib; with lib;
let let
cfg = config.colinsane.impermanence; cfg = config.sane.impermanence;
in in
{ {
imports = [
# TODO: move to flake.nix?
impermanence.nixosModule
];
options = { options = {
colinsane.impermanence.enable = mkOption { sane.impermanence.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
sane.impermanence.home-dirs = mkOption {
default = [];
type = types.listOf (types.either types.str (types.attrsOf types.str));
};
sane.impermanence.service-dirs = mkOption {
default = [];
type = types.listOf (types.either types.str (types.attrsOf types.str));
};
}; };
config = mkIf cfg.enable { config = let
environment.persistence."/nix/persist" = { map-dir = defaults: dir: if isString dir then
directories = [ map-dir defaults { directory = "${defaults.directory}${dir}"; }
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/archive"; } else
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/dev"; } defaults // dir
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/records"; } ;
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/ref"; } map-dirs = defaults: dirs: builtins.map (map-dir defaults) dirs;
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/tmp"; }
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/use"; }
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/Music"; }
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/Pictures"; }
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/Videos"; }
map-home-dirs = map-dirs { user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/"; };
map-sys-dirs = map-dirs { user = "root"; group = "root"; mode = "0755"; directory = ""; };
map-service-dirs = map-dirs { user = "root"; group = "root"; mode = "0755"; directory = ""; };
in mkIf cfg.enable {
sane.image.extraDirectories = [ "/nix/persist/var/log" ];
environment.persistence."/nix/persist" = {
directories = (map-home-dirs ([
# cache is probably too big to fit on the tmpfs # cache is probably too big to fit on the tmpfs
# TODO: we could bind-mount it to something which gets cleared per boot, though. # TODO: we could bind-mount it to something which gets cleared per boot, though.
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.cache"; } ".cache"
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.cargo"; } ".cargo"
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.rustup"; } ".rustup"
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.ssh"; } ".ssh"
# intentionally omitted: # intentionally omitted:
# "/home/colin/.config" # managed by home-manager # ".config" # managed by home-manager
# "/home/colin/.local" # nothing useful in here # ".local" # nothing useful in here
# "/home/colin/.mozilla" # managed by home-manager ] ++ cfg.home-dirs)) ++ (map-sys-dirs [
# creds. TODO: can i manage this with home-manager? # TODO: this `0700` here clobbers the perms for /persist/etc, breaking boot on freshly-deployed devices
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.config/spotify"; } { mode = "0700"; directory = "/etc/NetworkManager/system-connections"; }
# creds, but also 200 MB of node modules, etc
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.config/discord"; }
# creds/session keys, etc
{ user = "colin"; group = "users"; mode = "0755"; directory = "/home/colin/.config/Element"; }
{ user = "root"; group = "root"; mode = "0700"; directory = "/etc/NetworkManager/system-connections"; }
# "/etc/nixos" # "/etc/nixos"
{ user = "root"; group = "root"; mode = "0755"; directory = "/etc/ssh"; } # "/etc/ssh" # persist only the specific files we want, instead
"/var/log"
"/var/backup" # for e.g. postgres dumps
]) ++ (map-service-dirs ([
# "/var/lib/AccountsService" # not sure what this is, but it's empty # "/var/lib/AccountsService" # not sure what this is, but it's empty
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/alsa"; } # preserve output levels, default devices "/var/lib/alsa" # preserve output levels, default devices
# "/var/lib/blueman" # files aren't human readable # "/var/lib/blueman" # files aren't human readable
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/bluetooth"; } # preserve bluetooth handshakes "/var/lib/bluetooth" # preserve bluetooth handshakes
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/colord"; } # preserve color calibrations (?) "/var/lib/colord" # preserve color calibrations (?)
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/duplicity"; } # we need this mostly because of the size of duplicity's cache
# "/var/lib/dhclient" # empty on lappy; dunno about desko # "/var/lib/dhclient" # empty on lappy; dunno about desko
# "/var/lib/fwupd" # not sure why this would need persistent state # "/var/lib/fwupd" # not sure why this would need persistent state
# "/var/lib/geoclue" # empty on lappy # "/var/lib/geoclue" # empty on lappy
# "/var/lib/lockdown" # empty on desko; might store secrets after iOS handshake? # "/var/lib/lockdown" # empty on desko; might store secrets after iOS handshake?
# "/var/lib/logrotate.status" # seems redundant with what's in /var/log? # "/var/lib/logrotate.status" # seems redundant with what's in /var/log?
{ user = "root"; group = "root"; mode = "0755"; directory = "/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.
# "/var/lib/misc" # empty on lappy # "/var/lib/misc" # empty on lappy
# "/var/lib/NetworkManager" # looks to be mostly impermanent state? # "/var/lib/NetworkManager" # looks to be mostly impermanent state?
# "/var/lib/NetworkManager-fortisslvpn" # empty on lappy # "/var/lib/NetworkManager-fortisslvpn" # empty on lappy
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/nixos"; } # has some uid/gid maps; not sure what happens if we lose this. # "/var/lib/nixos" # has some uid/gid maps, but we enforce these to be deterministic.
# "/var/lib/PackageKit" # wtf is this? # "/var/lib/PackageKit" # wtf is this?
# "/var/lib/power-profiles-daemon" # redundant with nixos declarations # "/var/lib/power-profiles-daemon" # redundant with nixos declarations
# "/var/lib/private" # empty on lappy # "/var/lib/private" # empty on lappy
@@ -77,36 +79,21 @@ in
# "/var/lib/upower" # historic charge data. unnecessary, but maybe used somewhere? # "/var/lib/upower" # historic charge data. unnecessary, but maybe used somewhere?
# #
# servo additions: # servo additions:
{ user = "998"; group = "996"; mode = "0755"; directory = "/var/lib/acme"; } # TODO: mode?
# "/var/lib/dhparams" # https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/security/dhparams.nix # "/var/lib/dhparams" # https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/security/dhparams.nix
# "/var/lib/dovecot" # "/var/lib/dovecot"
# "/var/lib/duplicity" # "/var/lib/duplicity"
{ user = "994"; group = "993"; mode = "0755"; directory = "/var/lib/gitea"; } # TODO: mode? could be more granular ] ++ cfg.service-dirs));
{ user = "261"; group = "261"; mode = "0755"; directory = "/var/lib/ipfs"; } # TODO: mode? could be more granular
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/jackett"; } # TODO: mode? we only need this to save Indexer creds ==> migrate to config?
{ user = "996"; group = "994"; mode = "0755"; directory = "/var/lib/jellyfin"; } # TODO: mode? could be more granular
{ user = "993"; group = "992"; mode = "0755"; directory = "/var/lib/matrix-appservice-irc"; } # TODO: mode?
{ user = "224"; group = "224"; mode = "0755"; directory = "/var/lib/matrix-synapse"; } # TODO: mode?
{ user = "221"; group = "221"; mode = "0755"; directory = "/var/lib/opendkim"; } # TODO: mode? move this to the nix config (SOPS)
{ user = "997"; group = "995"; mode = "0755"; directory = "/var/lib/pleroma"; } # TODO: mode? could be more granular
{ user = "71"; group = "71"; mode = "0755"; directory = "/var/lib/postgresql"; } # TODO: mode?
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/lib/postfix"; } # TODO: mode? could be more granular
{ user = "70"; group = "70"; mode = "0755"; directory = "/var/lib/transmission"; } # TODO: mode? we need this specifically for the stats tracking in .config/
{ user = "colin"; group = "users"; mode = "0755"; directory = "/var/lib/uninsane"; }
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/log"; }
{ user = "root"; group = "root"; mode = "0755"; directory = "/var/backup"; } # for e.g. postgres dumps
# TODO: what even GOES in /srv?
{ user = "root"; group = "root"; mode = "0755"; directory = "/srv"; }
];
files = [ files = [
"/etc/machine-id" "/etc/machine-id"
# "/home/colin/knowledge" "/etc/ssh/ssh_host_ed25519_key"
"/etc/ssh/ssh_host_ed25519_key.pub"
"/etc/ssh/ssh_host_rsa_key"
"/etc/ssh/ssh_host_rsa_key.pub"
"/home/colin/.zsh_history" "/home/colin/.zsh_history"
# # XXX these only need persistence because i have mutableUsers = true, i think # # XXX these only need persistence because i have mutableUsers = true, i think
# "/etc/group" # "/etc/group"
# "/etc/passwd" # "/etc/passwd"
# "/etc/shadow" # "/etc/shadow"
# { file = "/home/test2"; persistentStoragePath = "/nix/persist"; }
]; ];
}; };

View File

@@ -2,33 +2,30 @@
with lib; with lib;
let let
cfg = config.colinsane.nixcache; cfg = config.sane.nixcache;
in in
{ {
options = { options = {
colinsane.nixcache.enable = mkOption { sane.nixcache.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = { config = mkIf cfg.enable {
# use our own binary cache # use our own binary cache
nix.settings = mkIf cfg.enable { nix.settings = {
substituters = [ substituters = [
"https://nixcache.uninsane.org" "https://nixcache.uninsane.org"
"http://desko:5000"
"https://nix-community.cachix.org" "https://nix-community.cachix.org"
"https://cache.nixos.org/" "https://cache.nixos.org/"
]; ];
trusted-public-keys = [ trusted-public-keys = [
"nixcache.uninsane.org:r3WILM6+QrkmsLgqVQcEdibFD7Q/4gyzD9dGT33GP70=" "nixcache.uninsane.org:r3WILM6+QrkmsLgqVQcEdibFD7Q/4gyzD9dGT33GP70="
"desko:Q7mjjqoBMgNQ5P0e63sLur65A+D4f3Sv4QiycDIKxiI="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
]; ];
}; };
# allow `nix flake ...` command
nix.extraOptions = ''
experimental-features = nix-command flakes
'';
}; };
} }

View File

@@ -3,17 +3,20 @@
with lib; with lib;
let let
cfg = config.colinsane.services.duplicity; cfg = config.sane.services.duplicity;
in in
{ {
options = { options = {
colinsane.services.duplicity.enable = mkOption { sane.services.duplicity.enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
# we need this mostly because of the size of duplicity's cache
sane.impermanence.service-dirs = [ "/var/lib/duplicity" ];
services.duplicity.enable = true; services.duplicity.enable = true;
services.duplicity.targetUrl = ''"$DUPLICITY_URL"''; services.duplicity.targetUrl = ''"$DUPLICITY_URL"'';
services.duplicity.escapeUrl = false; services.duplicity.escapeUrl = false;
@@ -29,6 +32,7 @@ in
services.duplicity.secretFile = config.sops.secrets.duplicity_passphrase.path; services.duplicity.secretFile = config.sops.secrets.duplicity_passphrase.path;
# NB: manually trigger with `systemctl start duplicity` # NB: manually trigger with `systemctl start duplicity`
services.duplicity.frequency = "daily"; services.duplicity.frequency = "daily";
# TODO: this needs updating to handle impermanence changes
services.duplicity.exclude = [ services.duplicity.exclude = [
# impermanent/inconsequential data: # impermanent/inconsequential data:
"/dev" "/dev"

View File

@@ -0,0 +1,33 @@
# docs: https://nixos.wiki/wiki/Binary_Cache
# to copy something to this machine's nix cache, do:
# nix copy --to ssh://nixcache.uninsane.org PACKAGE
{ config, lib, ... }:
with lib;
let
cfg = config.sane.services.nixserve;
in
{
options = {
sane.services.nixserve.enable = mkOption {
default = false;
type = types.bool;
};
sane.services.nixserve.sopsFile = mkOption {
default = ../../secrets/servo.yaml;
type = types.path;
};
};
config = mkIf cfg.enable {
services.nix-serve = {
enable = true;
secretKeyFile = config.sops.secrets.nix_serve_privkey.path;
openFirewall = true; # not needed for servo; only desko
};
sops.secrets.nix_serve_privkey = {
sopsFile = cfg.sopsFile;
};
};
}

View File

@@ -0,0 +1,56 @@
{ lib, ... }:
with lib;
let
mkId = id: mkOption {
default = id;
type = types.int;
};
in
{
options = {
# legacy servo users, some are inconvenient to migrate
sane.allocations.dhcpcd-gid = mkId 991;
sane.allocations.dhcpcd-uid = mkId 992;
sane.allocations.gitea-gid = mkId 993;
sane.allocations.git-uid = mkId 994;
sane.allocations.jellyfin-gid = mkId 994;
sane.allocations.pleroma-gid = mkId 995;
sane.allocations.jellyfin-uid = mkId 996;
sane.allocations.acme-gid = mkId 996;
sane.allocations.pleroma-uid = mkId 997;
sane.allocations.acme-uid = mkId 998;
sane.allocations.greeter-uid = mkId 999;
sane.allocations.greeter-gid = mkId 999;
sane.allocations.colin-uid = mkId 1000;
sane.allocations.guest-uid = mkId 1100;
# found on all machines
sane.allocations.sshd-uid = mkId 2001; # 997
sane.allocations.sshd-gid = mkId 2001; # 997
sane.allocations.polkituser-gid = mkId 2002; # 998
sane.allocations.systemd-coredump-gid = mkId 2003; # 996
sane.allocations.nscd-uid = mkId 2004;
sane.allocations.nscd-gid = mkId 2004;
# found on graphical machines
sane.allocations.nm-iodine-uid = mkId 2101; # desko/moby/lappy
# found on desko machine
sane.allocations.usbmux-uid = mkId 2204;
sane.allocations.usbmux-gid = mkId 2204;
# originally found on moby machine
sane.allocations.avahi-uid = mkId 2304;
sane.allocations.avahi-gid = mkId 2304;
sane.allocations.colord-uid = mkId 2305;
sane.allocations.colord-gid = mkId 2305;
sane.allocations.geoclue-uid = mkId 2306;
sane.allocations.geoclue-gid = mkId 2306;
sane.allocations.rtkit-uid = mkId 2307;
sane.allocations.rtkit-gid = mkId 2307;
sane.allocations.feedbackd-gid = mkId 2308;
};
}

View File

@@ -2,8 +2,10 @@
{ {
imports = [ imports = [
./allocations.nix
./env
./fs.nix ./fs.nix
./home-manager.nix ./net.nix
./secrets.nix ./secrets.nix
./users.nix ./users.nix
./vpn.nix ./vpn.nix
@@ -23,11 +25,9 @@
}; };
}; };
# programs.vim.defaultEditor = true; # allow `nix flake ...` command
environment.variables = { nix.extraOptions = ''
EDITOR = "vim"; experimental-features = nix-command flakes
# git claims it should use EDITOR, but it doesn't! '';
GIT_EDITOR = "vim";
};
} }

21
modules/universal/env/default.nix vendored Normal file
View File

@@ -0,0 +1,21 @@
{ ... }:
{
imports = [
./home-manager.nix
./home-packages.nix
./system-packages.nix
];
# programs.vim.defaultEditor = true;
environment.variables = {
EDITOR = "vim";
# git claims it should use EDITOR, but it doesn't!
GIT_EDITOR = "vim";
# Electron apps should use native wayland backend:
# https://nixos.wiki/wiki/Slack#Wayland
# Discord under sway crashes with this.
# NIXOS_OZONE_WL = "1";
};
}

531
modules/universal/env/home-manager.nix vendored Normal file
View File

@@ -0,0 +1,531 @@
# docs:
# https://rycee.gitlab.io/home-manager/
# https://rycee.gitlab.io/home-manager/options.html
# man home-configuration.nix
#
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.sane.home-manager;
vim-swap-dir = ".cache/vim-swap";
# extract package from `extraPackages`
pkglist = pkgspec: builtins.map (e: e.pkg or e) pkgspec;
# extract `dir` from `extraPackages`
dirlist = pkgspec: builtins.concatLists (builtins.map (e: if e ? "dir" then [ e.dir ] else []) pkgspec);
in
{
options = {
sane.home-manager.enable = mkOption {
default = false;
type = types.bool;
};
# packages to deploy to the user's home
sane.home-manager.extraPackages = mkOption {
default = [ ];
# each entry can be either a package, or attrs:
# { pkg = package; dir = optional string;
type = types.listOf (types.either types.package types.attrs);
};
# attributes to copy directly to home-manager's `wayland.windowManager` option
sane.home-manager.windowManager = mkOption {
default = {};
type = types.attrs;
};
# extra attributes to include in home-manager's `programs` option
sane.home-manager.programs = mkOption {
default = {};
type = types.attrs;
};
};
config = lib.mkIf cfg.enable {
sops.secrets."aerc_accounts" = {
owner = config.users.users.colin.name;
sopsFile = ../../../secrets/universal/aerc_accounts.conf;
format = "binary";
};
sops.secrets."sublime_music_config" = {
owner = config.users.users.colin.name;
sopsFile = ../../../secrets/universal/sublime_music_config.json.bin;
format = "binary";
};
sane.impermanence.home-dirs = [
"archive"
"dev"
"records"
"ref"
"tmp"
"use"
"Music"
"Pictures"
"Videos"
vim-swap-dir
] ++ (dirlist cfg.extraPackages);
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
# XXX this weird rename + closure is to get home-manager's `config.lib.file` to exist.
# see: https://github.com/nix-community/home-manager/issues/589#issuecomment-950474105
home-manager.users.colin = let sysconfig = config; in { config, ... }: {
home.packages = pkglist cfg.extraPackages;
wayland.windowManager = cfg.windowManager;
home.stateVersion = "21.11";
home.username = "colin";
home.homeDirectory = "/home/colin";
# XDG defines things like ~/Desktop, ~/Downloads, etc.
# these clutter the home, so i mostly don't use them.
xdg.userDirs = {
enable = true;
createDirectories = false; # on headless systems, most xdg dirs are noise
desktop = "$HOME/.xdg/Desktop";
documents = "$HOME/dev";
download = "$HOME/tmp";
music = "$HOME/Music";
pictures = "$HOME/Pictures";
publicShare = "$HOME/.xdg/Public";
templates = "$HOME/.xdg/Templates";
videos = "$HOME/Videos";
};
xdg.mimeApps.enable = true;
xdg.mimeApps.defaultApplications = {
"text/html" = [ "librewolf.desktop" ];
"x-scheme-handler/http" = [ "librewolf.desktop" ];
"x-scheme-handler/https" = [ "librewolf.desktop" ];
"x-scheme-handler/about" = [ "librewolf.desktop" ];
"x-scheme-handler/unknown" = [ "librewolf.desktop" ];
"image/png" = [ "org.gnome.gThumb.desktop" ];
};
# convenience
home.file."knowledge".source = config.lib.file.mkOutOfStoreSymlink "/home/colin/dev/knowledge";
home.file."nixos".source = config.lib.file.mkOutOfStoreSymlink "/home/colin/dev/nixos";
# nb markdown/personal knowledge manager
home.file.".nb/knowledge".source = config.lib.file.mkOutOfStoreSymlink "/home/colin/dev/knowledge";
home.file.".nb/.current".text = "knowledge";
home.file.".nbrc".text = ''
# manage with `nb settings`
export NB_AUTO_SYNC=0
'';
# uBlock filter list configuration.
# specifically, enable the GDPR cookie prompt blocker.
# data.toOverwrite.filterLists is additive (i.e. it supplements the default filters)
# this configuration method is documented here:
# - <https://github.com/gorhill/uBlock/issues/2986#issuecomment-364035002>
# the specific attribute path is found via scraping ublock code here:
# - <https://github.com/gorhill/uBlock/blob/master/src/js/storage.js>
# - <https://github.com/gorhill/uBlock/blob/master/assets/assets.json>
home.file.".librewolf/managed-storage/uBlock0@raymondhill.net.json".text = ''
{
"name": "uBlock0@raymondhill.net",
"description": "ignored",
"type": "storage",
"data": {
"toOverwrite": "{\"filterLists\": [\"fanboy-cookiemonster\"]}"
}
}
'';
# aerc TUI mail client
xdg.configFile."aerc/accounts.conf".source =
config.lib.file.mkOutOfStoreSymlink sysconfig.sops.secrets.aerc_accounts.path;
# make Discord usable even when client is "outdated"
xdg.configFile."discord/settings.json".text = ''
{
"SKIP_HOST_UPDATE": true
}
'';
# sublime music player
xdg.configFile."sublime-music/config.json".source =
config.lib.file.mkOutOfStoreSymlink sysconfig.sops.secrets.sublime_music_config.path;
xdg.configFile."vlc/vlcrc".text =
let
podcast_urls = lib.strings.concatStringsSep "|" [
"https://lexfridman.com/feed/podcast/"
## Astral Codex Ten
"http://feeds.libsyn.com/108018/rss"
## Econ Talk
"https://feeds.simplecast.com/wgl4xEgL"
## Cory Doctorow
"https://feeds.feedburner.com/doctorow_podcast"
"https://congressionaldish.libsyn.com/rss"
## Civboot
"https://anchor.fm/s/34c7232c/podcast/rss"
"https://feeds.feedburner.com/80000HoursPodcast"
"https://allinchamathjason.libsyn.com/rss"
## Eric Weinstein
"https://rss.art19.com/the-portal"
"https://feeds.megaphone.fm/darknetdiaries"
"http://feeds.wnyc.org/radiolab"
"https://wakingup.libsyn.com/rss"
## 99% Invisible
"https://feeds.simplecast.com/BqbsxVfO"
"https://rss.acast.com/ft-tech-tonic"
"https://feeds.feedburner.com/dancarlin/history?format=xml"
## 60 minutes (NB: this features more than *just* audio?)
"https://www.cbsnews.com/latest/rss/60-minutes"
];
in ''
[podcast]
podcast-urls=${podcast_urls}
[core]
metadata-network-access=0
[qt]
qt-privacy-ask=0
'';
# gnome feeds RSS viewer
xdg.configFile."org.gabmus.gfeeds.json".text = builtins.toJSON {
feeds = {
# AGGREGATORS (> 1 post/day)
"https://www.lesswrong.com/feed.xml" = { tags = [ "hourly" "rat" ]; };
"http://www.econlib.org/index.xml" = { tags = [ "hourly" "pol" ]; };
# AGGREGATORS (< 1 post/day)
"https://palladiummag.com/feed" = { tags = [ "weekly" "uncat" ]; };
"https://profectusmag.com/feed" = { tags = [ "weekly" "uncat" ]; };
"https://semiaccurate.com/feed" = { tags = [ "weekly" "tech" ]; };
"https://linuxphoneapps.org/blog/atom.xml" = { tags = [ "infrequent" "tech" ]; };
"https://spectrum.ieee.org/rss" = { tags = [ "weekly" "tech" ]; };
## No Moods, Ads or Cutesy Fucking Icons
"https://www.rifters.com/crawl/?feed=rss2" = { tags = [ "weekly" "uncat" ]; };
# DEVELOPERS
"https://mg.lol/blog/rss/" = { tags = [ "infrequent" "tech" ]; };
## Ken Shirriff
"https://www.righto.com/feeds/posts/default" = { tags = [ "infrequent" "tech" ]; };
## Vitalik Buterin
"https://vitalik.ca/feed.xml" = { tags = [ "infrequent" "tech" ]; };
## ian (Sanctuary)
"https://sagacioussuricata.com/feed.xml" = { tags = [ "infrequent" "tech" ]; };
## Bunnie Juang
"https://www.bunniestudios.com/blog/?feed=rss2" = { tags = [ "infrequent" "tech" ]; };
"https://blog.danieljanus.pl/atom.xml" = { tags = [ "infrequent" "tech" ]; };
"https://ianthehenry.com/feed.xml" = { tags = [ "infrequent" "tech" ]; };
"https://bitbashing.io/feed.xml" = { tags = [ "infrequent" "tech" ]; };
"https://idiomdrottning.org/feed.xml" = { tags = [ "daily" "uncat" ]; };
# (TECH; POL) COMMENTATORS
"http://benjaminrosshoffman.com/feed" = { tags = [ "weekly" "pol" ]; };
## Ben Thompson
"https://www.stratechery.com/rss" = { tags = [ "weekly" "pol" ]; };
## Balaji
"https://balajis.com/rss" = { tags = [ "weekly" "pol" ]; };
"https://www.ben-evans.com/benedictevans/rss.xml" = { tags = [ "weekly" "pol" ]; };
"https://www.lynalden.com/feed" = { tags = [ "infrequent" "pol" ]; };
"https://austinvernon.site/rss.xml" = { tags = [ "infrequent" "tech" ]; };
"https://oversharing.substack.com/feed" = { tags = [ "daily" "pol" ]; };
## David Rosenthal
"https://blog.dshr.org/rss.xml" = { tags = [ "weekly" "pol" ]; };
## Matt Levine
"https://www.bloomberg.com/opinion/authors/ARbTQlRLRjE/matthew-s-levine.rss" = { tags = [ "weekly" "pol" ]; };
# RATIONALITY/PHILOSOPHY/ETC
"https://unintendedconsequenc.es/feed" = { tags = [ "infrequent" "rat" ]; };
"https://applieddivinitystudies.com/atom.xml" = { tags = [ "weekly" "rat" ]; };
"https://slimemoldtimemold.com/feed.xml" = { tags = [ "weekly" "rat" ]; };
"https://www.richardcarrier.info/feed" = { tags = [ "weekly" "rat" ]; };
"https://www.gwern.net/feed.xml" = { tags = [ "infrequent" "uncat" ]; };
## Jason Crawford
"https://rootsofprogress.org/feed.xml" = { tags = [ "weekly" "rat" ]; };
## Robin Hanson
"https://www.overcomingbias.com/feed" = { tags = [ "daily" "rat" ]; };
## Scott Alexander
"https://astralcodexten.substack.com/feed.xml" = { tags = [ "daily" "rat" ]; };
## Paul Christiano
"https://sideways-view.com/feed" = { tags = [ "infrequent" "rat" ]; };
## Sean Carroll
"https://www.preposterousuniverse.com/rss" = { tags = [ "infrequent" "rat" ]; };
# COMICS
"https://www.smbc-comics.com/comic/rss" = { tags = [ "daily" "visual" ]; };
"https://xkcd.com/atom.xml" = { tags = [ "daily" "visual" ]; };
# ART
"https://miniature-calendar.com/feed" = { tags = [ "daily" "visual" ]; };
};
dark_reader = false;
new_first = true;
# windowsize = {
# width = 350;
# height = 650;
# };
max_article_age_days = 90;
enable_js = false;
max_refresh_threads = 3;
# saved_items = {};
# read_items = [];
show_read_items = true;
full_article_title = true;
# views: "webview", "reader", "rsscont"
default_view = "rsscont";
open_links_externally = true;
full_feed_name = false;
refresh_on_startup = true;
tags = [
# hourly => aggregator
# daily => prolifiq writer
# weekly => i can keep up with most -- but maybe not all -- of their content
# infrequent => i can read everything in this category
"hourly" "daily" "weekly" "infrequent"
# rat[ionality] gets used interchangably with philosophy, here.
# pol[itical] gets used for social commentary and economics as well.
# visual gets used for comics/art
"uncat" "rat" "tech" "pol" "visual"
];
open_youtube_externally = false;
media_player = "vlc"; # default: mpv
};
programs = {
home-manager.enable = true; # this lets home-manager manage dot-files in user dirs, i think
zsh = {
enable = true;
enableSyntaxHighlighting = true;
enableVteIntegration = true;
dotDir = ".config/zsh";
initExtraBeforeCompInit = ''
# p10k instant prompt
# run p10k configure to configure, but it can't write out its file :-(
POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true
'';
# prezto = oh-my-zsh fork; controls prompt, auto-completion, etc.
# see: https://github.com/sorin-ionescu/prezto
prezto = {
enable = true;
pmodules = [
"environment"
"terminal"
"editor"
"history"
"directory"
"spectrum"
"utility"
"completion"
"prompt"
"git"
];
prompt = {
theme = "powerlevel10k";
};
};
};
kitty = {
enable = true;
# docs: https://sw.kovidgoyal.net/kitty/conf/
settings = {
# disable terminal bell (when e.g. you backspace too many times)
enable_audio_bell = false;
};
keybindings = {
"ctrl+n" = "new_os_window_with_cwd";
};
# 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
# extraConfig = "";
};
git = {
enable = true;
userName = "colin";
userEmail = "colin@uninsane.org";
};
neovim = {
# neovim: https://github.com/neovim/neovim
enable = true;
viAlias = true;
vimAlias = true;
plugins = with pkgs.vimPlugins; [
# docs: surround-nvim: https://github.com/ur4ltz/surround.nvim/
# docs: vim-surround: https://github.com/tpope/vim-surround
vim-surround
# docs: fzf-vim (fuzzy finder): https://github.com/junegunn/fzf.vim
fzf-vim
# docs: 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
'';
})
# nabla renders inline math in any document, but it's buggy.
# https://github.com/jbyuki/nabla.nvim
# ({
# plugin = pkgs.nabla;
# type = "lua";
# config = ''
# require'nabla'.enable_virt()
# '';
# })
# 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.withPlugins (_: pkgs.tree-sitter.allGrammars));
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()'
'';
})
];
extraConfig = ''
" 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:
'';
};
# XXX: although home-manager calls this option `firefox`, we can use other browsers and it still mostly works.
firefox = lib.mkIf (sysconfig.sane.gui.enable) {
enable = true;
package = import ./web-browser.nix pkgs;
};
# "command not found" will cause the command to be searched in nixpkgs
nix-index.enable = true;
} // cfg.programs;
home.shellAliases = {
":q" = "exit";
# common typos
"cd.." = "cd ..";
"cd../" = "cd ../";
};
};
};
}

152
modules/universal/env/home-packages.nix vendored Normal file
View File

@@ -0,0 +1,152 @@
{ config, lib, pkgs, ... }:
with lib;
with pkgs;
let
cfg = config.sane.home-packages;
universalPkgs = [
backblaze-b2
duplicity
gnupg
ifuse
ipfs
libimobiledevice
lm_sensors # for sensors-detect
lshw
ffmpeg
nb
networkmanager
nixpkgs-review
# nixos-generators
# nettools
nmon
oathToolkit # for oathtool
# ponymix
pulsemixer
python3
rmlint
sane-scripts
sequoia
snapper
sops
speedtest-cli
ssh-to-age
sudo
unar
visidata
w3m
wireguard-tools
# youtube-dl
yt-dlp
];
guiPkgs = [
# GUI only
aerc # email client
audacity
chromium
clinfo
electrum
# creds/session keys, etc
{ pkg = element-desktop; dir = ".config/Element"; }
emote # TODO: package [smile](https://github.com/mijorus/smile) for probably a better mobile experience.
evince # works on phosh
fluffychat
foliate
font-manager
gimp # broken on phosh
gnome.cheese
gnome.dconf-editor
gnome-feeds # RSS reader (with claimed mobile support)
gnome.file-roller
gnome.gnome-disk-utility
gnome.gnome-maps # works on phosh
gnome.nautilus
gnome-podcasts
gnome.gnome-system-monitor
gnome.gnome-terminal # works on phosh
gpodder
gthumb
inkscape
krita
libreoffice-fresh # XXX colin: maybe don't want this on mobile
lollypop
mesa-demos
networkmanagerapplet
# settings (electron app). TODO: can i manage these settings with home-manager?
{ pkg = obsidian; dir = ".config/obsidian"; }
pavucontrol
playerctl
soundconverter
# sublime music persists any downloaded albums here.
# it doesn't obey a conventional ~/Music/{Artist}/{Album}/{Track} notation, so no symlinking
# config (e.g. server connection details) is persisted in ~/.config/sublime-music/config.json
# possible to pass config as a CLI arg (sublime-music -c config.json)
{ pkg = sublime-music; dir = ".local/share/sublime-music"; }
tdesktop # broken on phosh
vlc # works on phosh
whalebird # pleroma client. input is broken on phosh
xterm # broken on phosh
]
++ (if pkgs.system == "x86_64-linux" then
[
# x86_64 only
# creds, but also 200 MB of node modules, etc
(let discord = (pkgs.discord.override {
# XXX 2022-07-31: fix to allow links to open in default web-browser:
# https://github.com/NixOS/nixpkgs/issues/78961
nss = pkgs.nss_latest;
}); in { pkg = discord; dir = ".config/discord"; })
# kaiteki # Pleroma client
# gnome.zenity # for kaiteki (it will use qarma, kdialog, or zenity)
logseq
losslesscut-bin
makemkv
# actual monero blockchain (not wallet/etc; safe to delete, just slow to regenerate)
{ pkg = monero-gui; dir = ".bitmonero"; }
# creds, media
{ pkg = signal-desktop; dir = ".config/Signal"; }
# creds. TODO: can i manage this with home-manager?
{ pkg = spotify; dir = ".config/spotify"; }
# hardenedMalloc solves a crash at startup
(tor-browser-bundle-bin.override { useHardenedMalloc = false; })
# zcash coins. safe to delete, just slow to regenerate (10-60 minutes)
{ pkg = zecwallet-lite; dir = ".zcash"; }
] else []);
# useful devtools:
# bison
# dtc
# flex
# gcc
# gcc-arm-embedded
# gcc_multi
# gnumake
# mix2nix
# rustup
# swig
in
{
options = {
sane.home-packages.enableGuiPkgs = mkOption {
default = false;
type = types.bool;
};
};
config = {
sane.home-manager.extraPackages = universalPkgs
++ (if cfg.enableGuiPkgs then guiPkgs else []);
};
}

View File

@@ -0,0 +1,38 @@
{ pkgs, ... }:
{
# general-purpose utilities that we want any user to be able to access
# (specifically: root, in case of rescue)
environment.systemPackages = with pkgs; [
btrfs-progs
cryptsetup
dig
efibootmgr
fatresize
fd
file
gptfdisk
hdparm
htop
iftop
inetutils # for telnet
iotop
iptables
jq
killall
lsof
netcat
nethogs
nmap
openssl
parted
pciutils
powertop
ripgrep
screen
smartmontools
socat
usbutils
wget
];
}

55
modules/universal/env/web-browser.nix vendored Normal file
View File

@@ -0,0 +1,55 @@
pkgs:
# common settings to toggle (at runtime, in about:config):
# > security.ssl.require_safe_negotiation
# librewolf is a forked firefox which patches firefox to allow more things
# (like default search engines) to be configurable at runtime.
# many of the settings below won't have effect without those patches.
# see: https://gitlab.com/librewolf-community/settings/-/blob/master/distribution/policies.json
pkgs.wrapFirefox pkgs.librewolf-unwrapped {
# inherit the default librewolf.cfg
# it can be further customized via ~/.librewolf/librewolf.overrides.cfg
inherit (pkgs.librewolf-unwrapped) extraPrefsFiles;
libName = "librewolf";
extraPolicies = {
NoDefaultBookmarks = true;
SearchEngines = {
Default = "DuckDuckGo";
};
AppUpdateURL = "https://localhost";
DisableAppUpdate = true;
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
DisableSystemAddonUpdate = true;
DisableFirefoxStudies = true;
DisableTelemetry = true;
DisableFeedbackCommands = true;
DisablePocket = true;
DisableSetDesktopBackground = false;
Extensions = {
Install = [
"https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/bypass-paywalls-clean/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/sidebery/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/ether-metamask/latest.xpi"
];
# remove many default search providers
Uninstall = [
"google@search.mozilla.org"
"bing@search.mozilla.org"
"amazondotcom@search.mozilla.org"
"ebay@search.mozilla.org"
"twitter@search.mozilla.org"
];
};
# XXX doesn't seem to have any effect...
# docs: https://github.com/mozilla/policy-templates#homepage
# Homepage = {
# HomepageURL = "https://uninsane.org/";
# StartPage = "homepage";
# };
# NewTabPage = true;
};
}

View File

@@ -1,33 +1,58 @@
{ pkgs, ... }: { pkgs, ... }:
let sshOpts = { let sshOpts = rec {
fsType = "fuse.sshfs"; fsType = "fuse.sshfs";
options = [ optionsBase = [
"x-systemd.automount" "x-systemd.automount"
"_netdev" "_netdev"
"user" "user"
"idmap=user"
"transform_symlinks"
"identityfile=/home/colin/.ssh/id_ed25519" "identityfile=/home/colin/.ssh/id_ed25519"
"allow_other" "allow_other"
"default_permissions" "default_permissions"
];
optionsColin = optionsBase ++ [
"transform_symlinks"
"idmap=user"
"uid=1000" "uid=1000"
"gid=100" "gid=100"
]; ];
optionsRoot = optionsBase ++ [
# we don't transform_symlinks because that breaks the validity of remote /nix stores
"sftp_server=/run/wrappers/bin/sudo\\040${pkgs.openssh}/libexec/sftp-server"
];
}; };
in in
{ {
fileSystems."/mnt/servo-media-wan" = { fileSystems."/mnt/servo-media-wan" = {
device = "colin@uninsane.org:/var/lib/uninsane/media"; device = "colin@uninsane.org:/var/lib/uninsane/media";
inherit (sshOpts) fsType options; inherit (sshOpts) fsType;
options = sshOpts.optionsColin;
}; };
fileSystems."/mnt/servo-media-lan" = { fileSystems."/mnt/servo-media-lan" = {
device = "colin@servo:/var/lib/uninsane/media"; device = "colin@servo:/var/lib/uninsane/media";
inherit (sshOpts) fsType options; inherit (sshOpts) fsType;
options = sshOpts.optionsColin;
};
fileSystems."/mnt/servo-root-wan" = {
device = "colin@uninsane.org:/";
inherit (sshOpts) fsType;
options = sshOpts.optionsRoot;
};
fileSystems."/mnt/servo-root-lan" = {
device = "colin@servo:/";
inherit (sshOpts) fsType;
options = sshOpts.optionsRoot;
}; };
fileSystems."/mnt/desko-home" = { fileSystems."/mnt/desko-home" = {
device = "colin@desko:/home/colin"; device = "colin@desko:/home/colin";
inherit (sshOpts) fsType options; inherit (sshOpts) fsType;
options = sshOpts.optionsColin;
};
fileSystems."/mnt/desko-root" = {
device = "colin@desko:/";
inherit (sshOpts) fsType;
options = sshOpts.optionsRoot;
}; };
environment.systemPackages = [ environment.systemPackages = [

View File

@@ -1,365 +0,0 @@
# docs:
# https://rycee.gitlab.io/home-manager/
# https://rycee.gitlab.io/home-manager/options.html
# man home-configuration.nix
#
{ home-manager, lib, config, pkgs, ... }:
with lib;
let
cfg = config.colinsane.home-manager;
in
{
imports = [
home-manager.nixosModule
];
options = {
colinsane.home-manager.enable = mkOption {
default = false;
type = types.bool;
};
colinsane.home-manager.extraPackages = mkOption {
default = [ ];
type = types.listOf types.package;
};
colinsane.home-manager.windowManager = mkOption {
default = {};
type = types.attrs;
};
colinsane.home-manager.programs = mkOption {
default = {};
type = types.attrs;
};
};
config = lib.mkIf cfg.enable {
sops.secrets."aerc_accounts" = {
owner = config.users.users.colin.name;
sopsFile = ../../secrets/universal/aerc_accounts.conf;
format = "binary";
};
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
# XXX this weird rename + closure is to get home-manager's `config.lib.file` to exist.
# see: https://github.com/nix-community/home-manager/issues/589#issuecomment-950474105
home-manager.users.colin = let sysconfig = config; in { config, ... }: {
home.stateVersion = "21.11";
home.username = "colin";
home.homeDirectory = "/home/colin";
# XDG defines things like ~/Desktop, ~/Downloads, etc.
# these clutter the home, so i mostly don't use them.
xdg.userDirs = {
enable = true;
createDirectories = false; # on headless systems, most xdg dirs are noise
desktop = "$HOME/.xdg/Desktop";
documents = "$HOME/dev";
download = "$HOME/tmp";
music = "$HOME/Music";
pictures = "$HOME/Pictures";
publicShare = "$HOME/.xdg/Public";
templates = "$HOME/.xdg/Templates";
videos = "$HOME/Videos";
};
xdg.mimeApps.enable = true;
xdg.mimeApps.defaultApplications = {
"text/html" = [ "librewolf.desktop" ];
"x-scheme-handler/http" = [ "librewolf.desktop" ];
"x-scheme-handler/https" = [ "librewolf.desktop" ];
"x-scheme-handler/about" = [ "librewolf.desktop" ];
"x-scheme-handler/unknown" = [ "librewolf.desktop" ];
};
# convenience
home.file."knowledge".source = config.lib.file.mkOutOfStoreSymlink "/home/colin/dev/knowledge";
home.file."nixos".source = config.lib.file.mkOutOfStoreSymlink "/home/colin/dev/nixos";
xdg.configFile."aerc/accounts.conf".source =
config.lib.file.mkOutOfStoreSymlink sysconfig.sops.secrets.aerc_accounts.path;
programs = {
home-manager.enable = true; # this lets home-manager manage dot-files in user dirs, i think
zsh = {
enable = true;
enableSyntaxHighlighting = true;
enableVteIntegration = true;
dotDir = ".config/zsh";
initExtraBeforeCompInit = ''
# p10k instant prompt
# run p10k configure to configure, but it can't write out its file :-(
POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true
'';
# prezto = oh-my-zsh fork; controls prompt, auto-completion, etc.
# see: https://github.com/sorin-ionescu/prezto
prezto = {
enable = true;
pmodules = [
"environment"
"terminal"
"editor"
"history"
"directory"
"spectrum"
"utility"
"completion"
"prompt"
"git"
];
prompt = {
theme = "powerlevel10k";
};
};
};
kitty = {
enable = true;
settings.enable_audio_bell = false;
};
git = {
enable = true;
userName = "colin";
userEmail = "colin@uninsane.org";
};
vim = {
enable = true;
extraConfig = ''
" wtf vim project: NOBODY LIKES MOUSE FOR VISUAL MODE
set mouse-=a
" copy/paste to system clipboard
set clipboard=unnamedplus
" <tab> completion menu settings
set wildmenu
set wildmode=longest,list,full
" highlight all matching searches (using / and ?)
set hlsearch
" allow backspace to delete empty lines in insert mode
set backspace=indent,eol,start
" built-in syntax highlighting
syntax enable
" show line/col number in bottom right
set ruler
" highlight trailing space & related syntax errors (does this work?)
let c_space_errors=1
let python_space_errors=1
'';
};
firefox = lib.mkIf (sysconfig.colinsane.gui.enable) {
# common settings to toggle (at runtime, in about:config):
# > security.ssl.require_safe_negotiation
enable = true;
# librewolf is a forked firefox which patches firefox to allow more things
# (like default search engines) to be configurable at runtime.
# many of the settings below won't have effect without those patches.
# see: https://gitlab.com/librewolf-community/settings/-/blob/master/distribution/policies.json
package = pkgs.wrapFirefox pkgs.librewolf-unwrapped {
# inherit the default librewolf.cfg
# it can be further customized via ~/.librewolf/librewolf.overrides.cfg
inherit (pkgs.librewolf-unwrapped) extraPrefsFiles;
libName = "librewolf";
extraPolicies = {
NoDefaultBookmarks = true;
SearchEngines = {
Default = "DuckDuckGo";
};
AppUpdateURL = "https://localhost";
DisableAppUpdate = true;
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
DisableSystemAddonUpdate = true;
DisableFirefoxStudies = true;
DisableTelemetry = true;
DisableFeedbackCommands = true;
DisablePocket = true;
DisableSetDesktopBackground = false;
Extensions = {
Install = [
"https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/i-dont-care-about-cookies/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/bypass-paywalls-clean/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/sidebery/latest.xpi"
"https://addons.mozilla.org/firefox/downloads/latest/ether-metamask/latest.xpi"
];
# remove many default search providers
Uninstall = [
"google@search.mozilla.org"
"bing@search.mozilla.org"
"amazondotcom@search.mozilla.org"
"ebay@search.mozilla.org"
"twitter@search.mozilla.org"
];
};
# XXX doesn't seem to have any effect...
# docs: https://github.com/mozilla/policy-templates#homepage
# Homepage = {
# HomepageURL = "https://uninsane.org/";
# StartPage = "homepage";
# };
# NewTabPage = true;
# docs: https://chromeenterprise.google/policies/?policy=ManagedBookmarks
# docs: https://github.com/mozilla/policy-templates#managedbookmarks
ManagedBookmarks = [
{
toplevel_name = "bookmarks";
}
{
name = "Pleroma";
url = "https://fed.uninsane.org/";
}
{
name = "Home Manager Config";
url = "https://nix-community.github.io/home-manager/options.html";
}
{
name = "Delightful Apps";
url = "https://delightful.club/";
}
{
name = "Linux Phone Apps";
url = "https://linuxphoneapps.org/mobile-compatibility/5/";
}
{
name = "Crowdsupply";
url = "https://www.crowdsupply.com/";
}
{
name = "Mempool";
url = "https://jochen-hoenicke.de/queue";
}
];
};
};
};
# "command not found" will cause the command to be searched in nixpkgs
nix-index.enable = true;
} // cfg.programs;
home.shellAliases = {
":q" = "exit";
# common typos
"cd.." = "cd ..";
"cd../" = "cd ../";
};
wayland.windowManager = cfg.windowManager;
# devtools:
# bison
# dtc
# flex
# gcc-arm-embedded
# gcc_multi
# swig
home.packages = with pkgs; [
backblaze-b2
btrfs-progs
cryptsetup
dig
duplicity
efibootmgr
fatresize
fd
file
gcc
gnumake
gptfdisk
hdparm
htop
iftop
ifuse
inetutils # for telnet
iotop
ipfs
iptables
jq
killall
libimobiledevice
lm_sensors # for sensors-detect
lsof
mix2nix
netcat
nethogs
networkmanager
nixpkgs-review
# nixos-generators
# nettools
nmap
oathToolkit # for oathtool
openssl
parted
pciutils
# ponymix
powertop
pulsemixer
python3
ripgrep
rmlint
rustup
sane-scripts
screen
smartmontools
snapper
socat
sops
ssh-to-age
sudo
usbutils
wget
wireguard-tools
youtube-dl
zola
]
++ (if sysconfig.colinsane.gui.enable then
with pkgs;
[
# GUI only
aerc # email client
audacity
chromium
clinfo
element-desktop # broken on phosh
evince # works on phosh
font-manager
gimp # broken on phosh
gnome.dconf-editor
gnome-feeds # RSS reader (with claimed mobile support)
gnome.file-roller
gnome.gnome-maps # works on phosh
gnome.nautilus
gnome-podcasts
gnome.gnome-terminal # works on phosh
inkscape
libreoffice-fresh # XXX colin: maybe don't want this on mobile
mesa-demos
networkmanagerapplet
obsidian
playerctl
tdesktop # broken on phosh
vlc # works on phosh
whalebird # pleroma client. input is broken on phosh
xterm # broken on phosh
] else [])
++ (if sysconfig.colinsane.gui.enable && pkgs.system == "x86_64-linux" then
with pkgs;
[
# x86_64 only
discord
kaiteki # Pleroma client
gnome.zenity # for kaiteki (it will use qarma, kdialog, or zenity)
signal-desktop
spotify
] else [])
++ cfg.extraPackages;
};
};
}

12
modules/universal/net.nix Normal file
View File

@@ -0,0 +1,12 @@
{ config, ... }:
{
# 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" ];
};
}

View File

@@ -1,52 +1,120 @@
{ pkgs, lib, ... }: { config, pkgs, lib, ... }:
# installer docs: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/installation-device.nix # installer docs: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/installation-device.nix
with lib;
let
cfg = config.sane.users;
# see nixpkgs/nixos/modules/services/networking/dhcpcd.nix
hasDHCP = config.networking.dhcpcd.enable &&
(config.networking.useDHCP || any (i: i.useDHCP == true) (attrValues config.networking.interfaces));
in
{ {
# Users are exactly these specified here; options = {
# old ones will be deleted (from /etc/passwd, etc) upon upgrade. sane.users.guest.enable = mkOption {
users.mutableUsers = false; default = false;
type = types.bool;
# docs: https://nixpkgs-manual-sphinx-markedown-example.netlify.app/generated/options-db.xml.html#users-users };
users.users.colin = {
# sets group to "users" (?)
isNormalUser = true;
home = "/home/colin";
uid = 1000;
# XXX colin: this is what the installer has, but is it necessary?
# group = "users";
extraGroups = [
"wheel"
"nixbuild"
"networkmanager"
# phosh/mobile. XXX colin: unsure if necessary
"video"
"feedbackd"
"dialout" # required for modem access
];
initialPassword = lib.mkDefault "";
shell = pkgs.zsh;
# shell = pkgs.bashInteractive;
# XXX colin: create ssh key for THIS user by logging in and running:
# ssh-keygen -t ed25519
openssh.authorizedKeys.keys = [
# TODO: is this key dead?
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGSDe/y0e9PSeUwYlMPjzhW0UhNsGAGsW3lCG3apxrD5 colin@colin.desktop"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDpmFdNSVPRol5hkbbCivRhyeENzb9HVyf9KutGLP2Zu colin@lappy"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPU5GlsSfbaarMvDA20bxpSZGWviEzXGD8gtrIowc1pX colin@desko"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPS1qFzKurAdB9blkWomq8gI1g0T3sTs9LsmFOj5VtqX colin@servo"
# TODO: should probably only let this authenticate to my server
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGCLCA9KbjXaXNNMJJvqbPO5KQQ64JCdG8sg88AfdKzi colin@moby"
];
}; };
security.sudo = { config = {
enable = true; # Users are exactly these specified here;
wheelNeedsPassword = false; # old ones will be deleted (from /etc/passwd, etc) upon upgrade.
}; users.mutableUsers = false;
services.openssh = { # docs: https://nixpkgs-manual-sphinx-markedown-example.netlify.app/generated/options-db.xml.html#users-users
enable = true; users.users.colin = {
permitRootLogin = "no"; # sets group to "users" (?)
passwordAuthentication = false; isNormalUser = true;
home = "/home/colin";
uid = config.sane.allocations.colin-uid;
# i don't get exactly what this is, but nixos defaults to this non-deterministically
# in /var/lib/nixos/auto-subuid-map and i don't want that.
subUidRanges = [
{ startUid=100000; count=1; }
];
group = "users";
extraGroups = [
"wheel"
"nixbuild"
"networkmanager"
# phosh/mobile. XXX colin: unsure if necessary
"video"
"feedbackd"
"dialout" # required for modem access
];
initialPassword = lib.mkDefault "";
shell = pkgs.zsh;
# shell = pkgs.bashInteractive;
# XXX colin: create ssh key for THIS user by logging in and running:
# ssh-keygen -t ed25519
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDpmFdNSVPRol5hkbbCivRhyeENzb9HVyf9KutGLP2Zu colin@lappy"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPU5GlsSfbaarMvDA20bxpSZGWviEzXGD8gtrIowc1pX colin@desko"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPS1qFzKurAdB9blkWomq8gI1g0T3sTs9LsmFOj5VtqX colin@servo"
# moby doesn't need to login to any other devices yet
# "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICrR+gePnl0nV/vy7I5BzrGeyVL+9eOuXHU1yNE3uCwU colin@moby"
];
};
sane.impermanence.service-dirs = mkIf cfg.guest.enable [
{ user = "guest"; group = "users"; directory = "/home/guest"; }
];
users.users.guest = mkIf cfg.guest.enable {
isNormalUser = true;
home = "/home/guest";
uid = config.sane.allocations.guest-uid;
subUidRanges = [
{ startUid=200000; count=1; }
];
group = "users";
initialPassword = lib.mkDefault "";
shell = pkgs.zsh;
openssh.authorizedKeys.keys = [
# TODO: insert pubkeys that should be allowed in
];
};
users.users.dhcpcd = mkIf hasDHCP {
uid = config.sane.allocations.dhcpcd-uid;
};
users.groups.dhcpcd = mkIf hasDHCP {
gid = config.sane.allocations.dhcpcd-gid;
};
security.sudo = {
enable = true;
wheelNeedsPassword = false;
};
services.openssh = {
enable = true;
permitRootLogin = "no";
passwordAuthentication = false;
};
# affix some UIDs which were historically auto-generated
users.users.sshd.uid = config.sane.allocations.sshd-uid;
users.groups.polkituser.gid = config.sane.allocations.polkituser-gid;
users.groups.sshd.gid = config.sane.allocations.sshd-gid;
users.groups.systemd-coredump.gid = config.sane.allocations.systemd-coredump-gid;
users.users.nscd.uid = config.sane.allocations.nscd-uid;
users.groups.nscd.gid = config.sane.allocations.nscd-gid;
# guarantee determinism in uid/gid generation for users:
assertions = let
uidAssertions = builtins.attrValues (builtins.mapAttrs (name: user: {
assertion = user.uid != null;
message = "non-deterministic uid detected for: ${name}";
}) config.users.users);
gidAssertions = builtins.attrValues (builtins.mapAttrs (name: group: {
assertion = group.gid != null;
message = "non-deterministic gid detected for: ${name}";
}) config.users.groups);
autoSubAssertions = builtins.attrValues (builtins.mapAttrs (name: user: {
assertion = !user.autoSubUidGidRange;
message = "non-deterministic subUids/Guids detected for: ${name}";
}) config.users.users);
in uidAssertions ++ gidAssertions ++ autoSubAssertions;
}; };
} }

View File

@@ -1,7 +1,7 @@
{ config, ... }: { config, ... }:
{ {
networking.wg-quick.interfaces.ovpnd = { networking.wg-quick.interfaces.ovpnd-us = {
address = [ address = [
"172.27.237.218/32" "172.27.237.218/32"
"fd00:0000:1337:cafe:1111:1111:ab00:4c8f/128" "fd00:0000:1337:cafe:1111:1111:ab00:4c8f/128"
@@ -20,12 +20,39 @@
publicKey = "VW6bEWMOlOneta1bf6YFE25N/oMGh1E1UFBCfyggd0k="; publicKey = "VW6bEWMOlOneta1bf6YFE25N/oMGh1E1UFBCfyggd0k=";
} }
]; ];
privateKeyFile = config.sops.secrets.wg_ovpnd_privkey.path; privateKeyFile = config.sops.secrets.wg_ovpnd_us_privkey.path;
# to start: `systemctl start wg-quick-ovpnd` # to start: `systemctl start wg-quick-ovpnd-us`
autostart = false; autostart = false;
}; };
sops.secrets."wg_ovpnd_privkey" = { networking.wg-quick.interfaces.ovpnd-ukr = {
address = [
"172.18.180.159/32"
"fd00:0000:1337:cafe:1111:1111:ec5c:add3/128"
];
dns = [
"46.227.67.134"
"192.165.9.158"
];
peers = [
{
allowedIPs = [
"0.0.0.0/0"
"::/0"
];
endpoint = "vpn96.prd.kyiv.ovpn.com:9929";
publicKey = "CjZcXDxaaKpW8b5As1EcNbI6+42A6BjWahwXDCwfVFg=";
}
];
privateKeyFile = config.sops.secrets.wg_ovpnd_ukr_privkey.path;
# to start: `systemctl start wg-quick-ovpnd-ukr`
autostart = false;
};
sops.secrets."wg_ovpnd_us_privkey" = {
sopsFile = ../../secrets/universal.yaml;
};
sops.secrets."wg_ovpnd_ukr_privkey" = {
sopsFile = ../../secrets/universal.yaml; sopsFile = ../../secrets/universal.yaml;
}; };
} }

View File

@@ -0,0 +1,40 @@
diff --git a/pkgs/applications/networking/instant-messengers/fluffychat/default.nix b/pkgs/applications/networking/instant-messengers/fluffychat/default.nix
index 565c44f72e9..f20a3d4e9be 100644
--- a/pkgs/applications/networking/instant-messengers/fluffychat/default.nix
+++ b/pkgs/applications/networking/instant-messengers/fluffychat/default.nix
@@ -4,13 +4,19 @@
, olm
, imagemagick
, makeDesktopItem
+, stdenv
}:
+let vendorHashes = {
+ x86_64-linux = "sha256-PSZK5frmQGeiTuEJNZ6Fh8NXSLIrLnoOzQk1Xa4jqHw=";
+ aarch64-linux = "sha256-gPz/j7oHO2f3DVNNy7DpY/8XTjWt2Kcf3XjFmH81HDs=";
+};
+in
flutter.mkFlutterApp rec {
pname = "fluffychat";
version = "1.6.1";
- vendorHash = "sha256-SelMRETFYZgTStV90gRoKhazu1NPbcSMO9mYebSQskQ=";
+ vendorHash = vendorHashes."${stdenv.hostPlatform.system}" or (throw "unsupported system: ${stdenv.hostPlatform.system}");
src = fetchFromGitLab {
owner = "famedly";
diff --git a/pkgs/development/compilers/flutter/default.nix b/pkgs/development/compilers/flutter/default.nix
index 9eba6773448..e9d352169b2 100644
--- a/pkgs/development/compilers/flutter/default.nix
+++ b/pkgs/development/compilers/flutter/default.nix
@@ -19,6 +19,10 @@ let
url = "${dartSourceBase}/stable/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip";
sha256 = "sha256-PMY6DCFQC8XrlnFzOEPcwgBAs5/cAvNd78969Z+I1Fk=";
};
+ "${dartVersion}-aarch64-linux" = fetchurl {
+ url = "${dartSourceBase}/stable/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip";
+ sha256 = "sha256-3p0cUoNn+Du9GSvVZa9bfZ1I9295uqTA5M9kcj4/uL4=";
+ };
};
};
in {

View File

@@ -1,19 +1,24 @@
fetchpatch: [ fetchpatch: [
# phosh: allow fractional scaling
(fetchpatch {
url = "https://github.com/NixOS/nixpkgs/pull/175872.diff";
sha256 = "sha256-mEmqhe8DqlyCxkFWQKQZu+2duz69nOkTANh9TcjEOdY=";
})
# for raspberry pi: allow building u-boot for rpi 4{,00} # for raspberry pi: allow building u-boot for rpi 4{,00}
# TODO: remove after upstreamed: https://github.com/NixOS/nixpkgs/pull/176018 # TODO: remove after upstreamed: https://github.com/NixOS/nixpkgs/pull/176018
# (it's a dupe of https://github.com/NixOS/nixpkgs/pull/112677 )
./02-rpi4-uboot.patch ./02-rpi4-uboot.patch
# alternative to https://github.com/NixOS/nixpkgs/pull/173200
./04-dart-2.7.0.patch
# whalebird: suuport aarch64
(fetchpatch { (fetchpatch {
url = "https://github.com/NixOS/nixpkgs/pull/176476.diff"; url = "https://github.com/NixOS/nixpkgs/pull/186839.diff";
sha256 = "sha256-126DljM06hqPZ3fjLZ3LBZR64nFbeTfzSazEu72d4y8="; sha256 = "sha256-NdIfie+eTy4V1vgqiiRPtWdnxZ5ZHsvCMfkEDUv9SC8=";
}) })
# # # Flutter: 3.0.4->3.3.2, flutter.dart: 2.17.5->2.18.1
# # (fetchpatch {
# # url = "https://github.com/NixOS/nixpkgs/pull/189338.diff";
# # sha256 = "sha256-MppSk1D3qQT8Z4lzEZ93UexoidT8yqM7ASPec4VvxCI=";
# # })
# enable aarch64 support for flutter's dart package
./10-flutter-arm64.patch
# TODO: upstream # TODO: upstream
./07-duplicity-rich-url.patch ./07-duplicity-rich-url.patch
] ]

View File

@@ -1,6 +1,8 @@
{ pkgs }: { pkgs }:
(pkgs.jackett.overrideAttrs (upstream: { (pkgs.jackett.overrideAttrs (upstream: {
# 2022-07-29: check phase segfaults on arm (with or without my patches)
doCheck = false;
patches = (upstream.patches or []) ++ [ patches = (upstream.patches or []) ++ [
# bind to an IP address which is usable behind a netns # bind to an IP address which is usable behind a netns
./01-fix-bind-host.patch ./01-fix-bind-host.patch

View File

@@ -0,0 +1,21 @@
{ lib, buildPackages, fetchFromGitHub, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args:
with lib;
buildLinux (args // rec {
version = "5.18.14";
# modDirVersion needs to be x.y.z, will automatically add .0 if needed
modDirVersion = if (modDirVersionArg == null) then concatStringsSep "." (take 3 (splitVersion "${version}.0")) else modDirVersionArg;
# branchVersion needs to be x.y
extraMeta.branch = versions.majorMinor version;
src = fetchFromGitHub {
owner = "megous";
repo = "linux";
# branch: orange-pi-5.18
rev = "3ef835b665191e4833ae1363245be48e96013df6";
sha256 = "sha256-nQsBXeGLZhpem1p7Vnc8z7XB354AO1mn7VTj/hH5twY=";
};
} // (args.argsOverride or { }))

14
pkgs/nabla/default.nix Normal file
View File

@@ -0,0 +1,14 @@
{ pkgs, fetchFromGitHub, ... }:
# buildVimPluginFrom2Nix {
pkgs.vimUtils.buildVimPlugin {
pname = "nabla";
version = "2022-08-17";
src = fetchFromGitHub {
owner = "jbyuki";
repo = "nabla.nvim";
rev = "5379635d71b9877eaa4df822e8a2a5c575d808b0";
sha256 = "sha256-1VabgTnOSsfdhmHnfXl/h9djgNV3Gqro5VOr8ZbUlWw=";
};
meta.homepage = "https://github.com/jbyuki/nabla.nvim/";
}

View File

@@ -12,6 +12,13 @@
# not sure why i can't just do pkgs = next here # not sure why i can't just do pkgs = next here
pkgs = prev // { inherit ubootRaspberryPi4_64bit; }; pkgs = prev // { inherit ubootRaspberryPi4_64bit; };
}; };
rtl8723cs-firmware = prev.callPackage ./rtl8723cs-firmware { };
linux-megous = prev.callPackage ./linux-megous {
kernelPatches = [
prev.kernelPatches.bridge_stp_helper
prev.kernelPatches.request_key_helper
];
};
#### customized packages #### customized packages
# nixos-unstable pleroma is too far out-of-date for our db # nixos-unstable pleroma is too far out-of-date for our db
@@ -28,5 +35,6 @@
#### TEMPORARY: PACKAGES WAITING TO BE UPSTREAMED #### TEMPORARY: PACKAGES WAITING TO BE UPSTREAMED
kaiteki = prev.callPackage ./kaiteki { }; kaiteki = prev.callPackage ./kaiteki { };
nabla = prev.callPackage ./nabla { };
}) })

View File

@@ -0,0 +1,36 @@
{ lib, stdenv, fetchFromGitHub }:
with lib;
stdenv.mkDerivation {
pname = "rtl8723cs-firmware";
version = "2020-07-05";
src = fetchFromGitHub {
owner = "anarsoul";
repo = "rtl8723bt-firmware";
rev = "8840b1052b4ee426f348cb35e4994c5cafc5fbbd";
sha256 = "sha256-z6OZNDvGbU1g+U9aL/Pq6fB3l7Fxwq6EHSeHgrkqt78=";
};
dontBuild = true;
installPhase = ''
mkdir -p "$out/lib/firmware"
cp -R rtl_bt "$out/lib/firmware"
'';
meta = with lib; {
description = "Firmware for rtl8723bs and rtl8723cs";
# there are many sources for this, none of them authoritative.
# the original binaries likely come from some Realtek SDK, hardcoded into a C array
# if consistent with other drivers, but Realtek does not list this model in their
# downloads page.
# other sources:
# - <https://megous.com/git/linux-firmware>
# - <https://github.com/armbian/firmware>
homepage = "https://github.com/anarsoul/rtl8723bt-firmware";
license = licenses.unfreeRedistributableFirmware;
maintainers = with maintainers; [ colinsane ];
platforms = with platforms; linux;
};
}

View File

@@ -1,19 +1,73 @@
{ lib { lib
, pkgs , pkgs
, stdenv , resholve
}: }:
stdenv.mkDerivation { # resholve documentation:
name = "sane-scripts"; # - nix: https://github.com/nixos/nixpkgs/blob/master/pkgs/development/misc/resholve/README.md
# - generic: https://github.com/abathur/resholve
resholve.mkDerivation {
pname = "sane-scripts";
version = "0.1.0";
src = ./src; src = ./src;
# See: https://nixos.org/nixpkgs/manual/#ssec-stdenv-dependencies solutions = {
buildInputs = [ pkgs.rsync ]; default = {
# note: `scripts` refers to the store path here
scripts = [ "bin/*" ];
interpreter = "${pkgs.bash}/bin/bash";
inputs = with pkgs; [
coreutils
curl
file
findutils
gnugrep
ifuse
inotifyTools
ncurses
oath-toolkit
openssh
rmlint
rsync
ssh-to-age
sops
sudo
which
];
keep = {
# we write here: keep it
"/tmp/rmlint.sh" = true;
# intentionally escapes (into user code)
"$external_cmd" = true;
};
fake = {
external = [
# https://github.com/abathur/resholve/issues/29
"umount"
"sudo"
# this is actually internal; probably a better fix
"sane-mount-servo"
];
};
# list of programs which *can* or *cannot* exec their arguments
execer = [
"cannot:${pkgs.ifuse}/bin/ifuse"
"cannot:${pkgs.oath-toolkit}/bin/oathtool"
"cannot:${pkgs.openssh}/bin/ssh-keygen"
"cannot:${pkgs.rmlint}/bin/rmlint"
"cannot:${pkgs.rsync}/bin/rsync"
"cannot:${pkgs.ssh-to-age}/bin/ssh-to-age"
"cannot:${pkgs.sops}/bin/sops"
];
};
};
installPhase = '' installPhase = ''
mkdir -p "$out" mkdir -p "$out/bin"
cp -R * "$out"/ cp -R * "$out"/bin/
''; '';
meta = { meta = {

View File

@@ -1,4 +0,0 @@
#!/usr/bin/env bash
echo vpn: $(curl https://ipinfo.io/ip)
sudo systemctl stop wg-quick-ovpnd
echo plain: $(curl https://ipinfo.io/ip)

View File

@@ -1,4 +0,0 @@
#!/usr/bin/env bash
echo plain: $(curl https://ipinfo.io/ip)
sudo systemctl start wg-quick-ovpnd
echo vpn: $(curl https://ipinfo.io/ip)

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
# watches PWD for any changes underneath it and re-runs `cargo build --a>
# optionally, provide your own build command as the first argument
external_cmd="cargo build --all"
if [ "x$1" != "x" ]
then
external_cmd=$1
fi
# run this once before starting the inotify
$external_cmd
# other interesting commands to monitor:
# - -e move
# - -e create
# - -e delete
# - -e close_write
# but most (except close_write) seem to cause multiple events per vim :w
# TODO: consider using watchman: https://facebook.github.io/watchman/
# - watchman waits for the root to settle before invoking my command
# so, fewer runs
inotifywait --monitor --recursive \
--timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
-e modify ./ |
while read -r date time dir file
do
tput reset
$external_cmd
done

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -ex
mnt=/mnt/servo-root-wan
# if lan not mounted, then try to mount it
if ! (test -d /mnt/servo-root-lan/nix)
then
sudo mount /mnt/servo-root-lan && mnt=/mnt/servo-root-lan
fi
# if the needed mount isn't mounted, mount it
if ! (test -d $mnt/nix)
then
sudo mount $mnt
fi
# symlink the fastest mount point into place
sudo ln -sf $mnt /mnt/servo-root

View File

@@ -3,12 +3,13 @@ set -ex
# script to reclaim some hard drive space # script to reclaim some hard drive space
sudo nix-collect-garbage sudo nix-collect-garbage
# identify duplicate files in the nix store # identify duplicate files in the nix store
rmlint --types="duplicates" --config=sh:handler=clone --output=sh:/tmp/rmlint.sh --progress /nix/store rmlint --types="duplicates" --config=sh:handler=clone --output=sh:/tmp/rmlint.sh --output=json:/dev/null --progress /nix/store
# link the dupes together (uses ioctl_fideduperange) # link the dupes together (uses ioctl_fideduperange)
# see: https://btrfs.wiki.kernel.org/index.php/Deduplication # see: https://btrfs.wiki.kernel.org/index.php/Deduplication
# see: https://rmlint.readthedocs.io/en/latest/tutorial.html # see: https://rmlint.readthedocs.io/en/latest/tutorial.html
sudo mount -o remount,rw /nix/store sudo mount -o remount,rw /nix/store
/tmp/rmlint.sh -d || true # on failure, we still want to remount ro # XXX: does rmlint really need to be invoked as root?
sudo /tmp/rmlint.sh -d || true # on failure, we still want to remount ro
# XXX this doesn't work: 'mount point is busy.' # XXX this doesn't work: 'mount point is busy.'
sudo mount -o remount,ro /nix/store sudo mount -o remount,ro /nix/store

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
# first arg should be the region, e.g. `us` or `ukr`
case $1 in
ukr)
iface=wg-quick-ovpnd-ukr;;
us)
iface=wg-quick-ovpnd-us;;
*)
echo "invalid vpn name '$1'"; exit 1;;
esac
echo vpn: $(curl https://ipinfo.io/ip)
sudo systemctl stop $iface
echo plain: $(curl https://ipinfo.io/ip)

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
# first arg should be the region, e.g. `us` or `ukr`
case $1 in
ukr)
iface=wg-quick-ovpnd-ukr;;
us)
iface=wg-quick-ovpnd-us;;
*)
echo "invalid vpn name '$1'"; exit 1;;
esac
echo plain: $(curl https://ipinfo.io/ip)
sudo systemctl start $iface
echo vpn: $(curl https://ipinfo.io/ip)

View File

@@ -0,0 +1,24 @@
#!/usr/bin/env bash
# traces a PATH lookup by printing the source, resolution, and any symlinks traversed
# finally, prints the content of the file
echo $1
v=$(which $1)
# this probably doesn't handle paths with spaces
while [ "$(readlink $v || echo $v)" != "$v" ]
do
# TODO: this doesn't handle relative symlinks
echo '->' "$v"
v=$(readlink "$v")
done
echo '->' "$v"
echo ''
case $(file --brief --mime "$v") in
(*text*)
cat "$v"
;;
(*)
echo $(file "$v")
;;
esac

View File

@@ -0,0 +1,30 @@
{ lib, fetchurl, appimageTools }:
appimageTools.wrapType2 rec {
pname = "zecwallet-lite";
version = "1.7.13";
src = fetchurl {
url = "https://github.com/adityapk00/zecwallet-lite/releases/download/v${version}/Zecwallet.Lite-${version}.AppImage";
hash = "sha256-uBiLGHBgm0vurfvOJjJ+RqVoGnVccEHTFO2T7LDqUzU=";
};
extraInstallCommands =
let contents = appimageTools.extract { inherit pname version src; };
in ''
mv $out/bin/${pname}-${version} $out/bin/${pname}
install -m 444 -D ${contents}/${pname}.desktop -t $out/share/applications
substituteInPlace $out/share/applications/${pname}.desktop \
--replace 'Exec=AppRun' 'Exec=${pname}'
cp -r ${contents}/usr/share/icons $out/share
'';
meta = with lib; {
description = "A fully featured shielded wallet for Zcash";
homepage = "https://www.zecwallet.co/";
license = licenses.mit;
maintainers = with maintainers; [ colinsane ];
platforms = [ "x86_64-linux" ];
};
}

View File

@@ -9,7 +9,7 @@ nix flake show
``` ```
# secrets ## secrets
i use [sops](https://github.com/Mic92/sops-nix) for secrets. i use [sops](https://github.com/Mic92/sops-nix) for secrets.
see `modules/universal/secrets.nix` for some tips. see `modules/universal/secrets.nix` for some tips.

View File

@@ -1,4 +1,6 @@
duplicity_passphrase: ENC[AES256_GCM,data:rzUfcxe5YPloOrqgVwdCjsccexWc5RvmFf1i3Xs459iVTfWHlVJeT/IqReY6ZqdAkPJteTtrUZzak2GXyRUkE13+W0kE8isnDjPX/YDQwoK2sa+dwc4xGTekboc0gf6HH3vQpF1aiJDBfb3GtGyDVLH9MVIRPJGXSztZBduUDezA2wAx2wI=,iv:EHJg8kE/07v+ySSFDtW4FA4y1y/+fcGxfNCWoainwBI=,tag:S3ecM4DbDl8jqXLRKipZmQ==,type:str] duplicity_passphrase: ENC[AES256_GCM,data:rzUfcxe5YPloOrqgVwdCjsccexWc5RvmFf1i3Xs459iVTfWHlVJeT/IqReY6ZqdAkPJteTtrUZzak2GXyRUkE13+W0kE8isnDjPX/YDQwoK2sa+dwc4xGTekboc0gf6HH3vQpF1aiJDBfb3GtGyDVLH9MVIRPJGXSztZBduUDezA2wAx2wI=,iv:EHJg8kE/07v+ySSFDtW4FA4y1y/+fcGxfNCWoainwBI=,tag:S3ecM4DbDl8jqXLRKipZmQ==,type:str]
#ENC[AES256_GCM,data:yU9cr6MXjS4m69BeIUjUw477wt4c1djYof3Qlfr4Dytv8hWqCuqThDwQTMY5jfHdv5ipS0aEjf7GWu2M2t9W88fYdxnTN2m8IfYZp76YcjxO4fup5BXiLGIjnm+qI0g=,iv:nPo8FyGiyLRQozE4kZ6Rei6CObvbVynOs3jdMvdkpZw=,tag:+4esxPiewSsjwao6ZhAMxA==,type:comment]
nix_serve_privkey: ENC[AES256_GCM,data:/Ph9J00cV7PcfpJw/NWcBpkQR+a0SQyHv1jmF4CkH+Uj8l+cRcXWynAc2APenMSfHdighXMqjsXuwRbGo0S57YuMXQjFbI8jhbXEhhAWlmET1q7uRaaZRSgq34qABw==,iv:LLYgLauPsD+3mx1GTjEUkiXgdWsnqixCJl4UfSdS5Ac=,tag:S7V6GKezS/JsbZVfq9DjjA==,type:str]
sops: sops:
kms: [] kms: []
gcp_kms: [] gcp_kms: []
@@ -32,8 +34,8 @@ sops:
Si9kT0ZMUnJJWlhUZ3FFakZFaDlPdEEKXtWfh6wdGPin1h/UUs21cdspddpW1YDq Si9kT0ZMUnJJWlhUZ3FFakZFaDlPdEEKXtWfh6wdGPin1h/UUs21cdspddpW1YDq
rCKS2DI2KWdgciih9FnmWGAwGUhB3uhimUr6hgho4z+dZfLrpoP1PA== rCKS2DI2KWdgciih9FnmWGAwGUhB3uhimUr6hgho4z+dZfLrpoP1PA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2022-06-10T08:41:13Z" lastmodified: "2022-09-14T21:34:55Z"
mac: ENC[AES256_GCM,data:51N4a+P+eXVAdPFAI3h4TFKsR6IOGBnyusW4k7ZrMOleH1l4C3khYaUmCoE1nnLlmD2q+kmtdGdU6FWyB7BYiSytjqvQa0WumEhf5PpOtj5k+55c1sljvtK58BxQd7N5Th+R4VmlqZ7LXviwzIb8OkoiCf0yC+jxZRi/2MQiKC4=,iv:Jjrrnp7isbmEP9vAYZ+lVRit2RNbrq2unXzuZD8C/2Q=,tag:HvKUFKdhE3O75o8hX+hIsA==,type:str] mac: ENC[AES256_GCM,data:Zex69KG2a2Rxyodyci40azr9qGbA5XwH4Qhip0BDbrJymHjZzqCeRDKjdHjAWXPdPyglvUY0kADfm7xxlE1zU84oOahI9FldADtQrGUWS0elU+a3F93LVNGlhlKc+g8JGzUyBvPr6Toi52L2hI18K5bmWFPesczWedL07r85s9M=,iv:W+SMAX0HY5GbAqqgXWbSxm4wbzXZt5PEsLhwWcxkRWY=,tag:VPnw2X+6i0EyiFB3rkon8Q==,type:str]
pgp: [] pgp: []
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.7.3 version: 3.7.3

View File

@@ -1,4 +1,5 @@
wg_ovpnd_privkey: ENC[AES256_GCM,data:qmyCOcD5TA7SKqSDCTZOTahkfYVZMJUGuyselmQbqj1uer3e4cBRSMuIiRI=,iv:jnHvGgVu/8HWT8MkI2wtGqlCs6wTu0C8huHpkdDmBYk=,tag:a0r0f/6LTBUuhvLGu+SFug==,type:str] wg_ovpnd_us_privkey: ENC[AES256_GCM,data:5YkQ4r7HNWiRr/5pa1XfexxtJAz6kDjX+hNiZcheUWCXVIuK0/AuyzcdQ/0=,iv:vr1UHSlsWFnTwEfZj3pBLxvaibQxhSum3SL0Uaqtceo=,tag:dN2U+TkQAgJejgDDYIWdOA==,type:str]
wg_ovpnd_ukr_privkey: ENC[AES256_GCM,data:5zfhsZnBk0Kb9Nb/3igsV/fN0ZDjwTAGTKyMLMly/l7MlJe6MEmd5Lv+JT8=,iv:Mov9eUP8WfvzfZ6NljgLolJ49GSqR7eSV+k0dgE1+1I=,tag:O9UtGX2qt+qEvabcsA0vIA==,type:str]
sops: sops:
kms: [] kms: []
gcp_kms: [] gcp_kms: []
@@ -8,77 +9,77 @@ sops:
- recipient: age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x - recipient: age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmMUNtRnRkSXhlK0tOM0x2 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzUWc2dnNnWDVVZCtlNUJ6
Qlc4cFdFc3FvVERDWXF2ajkzZlhOcGlMclhvCndWL0FYY0plMFllcVJkeHh0UXpa d3JCYU9CZ0prMEVUM3piWENIdVl6WEIzQVJZCjZaeUNoU2ZiZGR4YWpQMlQ3am5W
eGtYZ0VLK0ZRVHZhWFNqSmVTdnpScW8KLS0tIHZkOGIwSEVVQStrSmowM3JlSzdo OFdBVjZiaUpjeG43ZGRoUjBHOFlRNDQKLS0tIHVaMXVnZ3VodHBpb1M0V0wxeXRD
WElESWFBZ3U2UEFSdGVpSzZFcFJIZjQKXsem6B+/so57tcfM8itjmisnaMeWI39w TklUbXp3RE50ZnlEQ08wVVlHWHJGc0kKMEG/wxRp4WoQfRqUQFu0vQzKkVObWk6s
kL53mQMod2eu01XnDdMtLqNTTJM1dw6Sn0ggEUoTYXyUDvEkLjaTzA== UuJzzD53Hvi2rtLY8oquYLL66dDqS02+DnSxwsiYRGxo6jXHmomTgQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g - recipient: age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSUXdGcC8vb3hiWm0rTFVF YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqaFBMbTg0dUVVc0NLcjVN
cTR3QlRMZEhoV3FkYy83eDY3WldZQmJyMUNBCjJvTHpqL1loWUdrQUd6TDlUQmZU R1o5T3NQQXNXNVZ3ZGhEZjVnSWlWbTNocUJZCll6UkcxRjVSSkVuSjNMd0lSUlFO
MmhlUmE0WjUzK1ZaNzJzUE5DK3FVZlEKLS0tIHRFQ0RIWmovSVdWRWF1cEQxQXkx WGcvaHhRenNwVzN6MmtxWXJGR1g3dDAKLS0tIEZ0b2wzRW50ZGJiVUdXT2xnMTJt
TVBoZXhVV2IxVVNRNDY4S1cwNjZlU3cK783VjOQA2vOHDLMa9gfgKBv9rXr28XEA dW1OK3ZoR3NjM1NObmZieGpCdnVvWGMKFOSOMKler0bl30njGwuInTYWwaTL7iW1
+0uIeCZMkxpBWsRCt+enFKOHzuqYwYR/bpaaUH85okCTmrPRjPJmyQ== U0KYCklGRCG+rLiBFbzjnde4iOvtwnJQQymnzv68W7OzXN6VxZN0SA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu - recipient: age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1UGR4Zi9ydlEwS2I1TjFt YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsOFMwa0lpVlRXMzMwcDBP
d2I1cURUemxZTGJ3VE9ZemMyT2RwbVliSWhFCk1XVXp3V1REMTlNWW45ZUg3c2N6 MG1YQnF1TXZTaTRYTW5nZUJ5YmlzZHBMK0ZRCm9GMmNRRmF0OWVBbTRwQ2VLQ1o5
WDkrczZsb3ZGMW5XeW8zWHdtNnl4ajQKLS0tIE8zdm05RXNmWGJsZGVxRXl2bmI3 T2QvMUlNQkx4V1lPY3VGekhKQWNyd2sKLS0tIDdxcHk3NUhPck14aGEzTGJJNzdw
OEZxTTh0UE9QRXhwYTAyejZWNlFiVG8KYVwqMlwGkOaKh/6ISi+FOz9Tn5eeZR0t TjJtRXVQdUlHb1IwaHUzYmR1MndkY1kKSDpEwnjNwLA8EU1jB1lC6Fe4/sK7+Dj4
XGU5OoYuJg7OEgxLYkuXxro0eGYrgAQQVIGPP4W8eOHeQDLiUnXoqg== DMCj/RIyhaNgMhdo0MRv8iFxGy1kl+sOOMuaCiTgNq00bmem1ulz9g==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1lt739n2tq7dmpglvntjr9j2r7426md7rat7x9w930gagtx4jyvnqwts2al - recipient: age1zsrsvd7j6l62fjxpfd2qnhqlk8wk4p8r0dtxpe4sdgnh2474095qdu7xj9
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA2Zk4vYyswbzNFdDRyaUdS YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4ZE1vMlBPSk5qVWkzTXF4
ckt2eGd4ckhLS0tsOWluOEo3WnN0Y3pWekZNCitDYktFbm1Rd1RnWFZnNnYvbU1Y L1huNEUyVHRLQk5lWEhuNFdUR3U5ZnBtdmpvCitSZEZQbzR5NkhDMzNJMFpVQXlh
ZTh2SFI3MGI1ZDBmTEt4cENHd3JNOEkKLS0tIHozY1dlZFpHam9ERHkzZFZtUndV MXNnTU9wVUpQZmJGdDBsVGREODNDUVEKLS0tIExkSU9rNTZEcloxUVY2OFJ6UkpP
aHFFdDF0YXpxczZsQy9KcUx4bjZubzQKVn+jFIqSgUl6unVNdey7l358Sq5v0XyD eWhKUDN5SVFBdWg0VG9oRVFzSGxWaHcKdU0Z6MRA8660aH350a5fNBSeuqCCIvcA
OIY2ICPC6Y/jQ6GttvA5eJveCUq5OGmZ3csFSXH6Vk5RUS/p9Qc3Jw== y94690xSN5jMHJsk+mAta8kW8mXxM8sjjFtGRDB40lAUqD0AapcTNg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v - recipient: age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDNkhPKzU4Q0pmWUl0YUNP YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkWVZ0bDlMbnN1eDVUN2du
WHowVGtHZUdHU0dnNTE5K25pRnh6NXZkLzA4CmV3MTdrNWlINmxaN0RwbDNsaXla cnRDWFdPN1Z0VXI3QkpPUElGU2lCTEdSSW1jCmRFbVFvaDZXcHZ0V1kxWSt3cCsv
ZzJ0NUpRVVVpNnE4bE84eXp4UHM1aWsKLS0tIGxWVVdGSTdycGVXeTJhZEgwOTZs TEd1VWd1N0RqM0djd0d4U3RJOU8yQWcKLS0tIDlQUTR2aHl1NTdVYTRjR0tQNzY2
cEU3dzZ5c2JLblg0QW5JN0owT0ZISmMK63ZpM6CfYAIo7syEnhOzbRaQ6mBx4D9f VUIxaVRMd2FaM3VVNDZyWGJmaXMwY00Kjlk53H34uejwIWcVpSlZsg62LTglUz2i
RaGl7KhnSCSHPMWPzlKSrvk76nEUdZUWvgEwE4aGLrqL4hcpoW7fsg== Emqwl9X+71lsa7GOplp1AWpoJKaGOaR6ntrDhUnx0z0TdDTbjFCSvw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn - recipient: age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCQllDVUh1NHJ6Slcrcjlo YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZUzk1SExjbEFKaFlqVjRJ
WWVlTWxMa09TTysydmY5aVdRelEvYlBUWFhNCkNlbmNKUHZodHRsZVdXZGhkanEr RExoNVVKOGVjZFVaT29BRElLaVMxcVpsN1I4CkVuTURZNXhHU2w0RFNrMjJyQllM
bzhyNEUzWk0xT0xsbHVtUDdEY2Z3V2sKLS0tIHE0dmZUNXQ1YjNIL1FXTDNxbW41 VzBhbFZ0Nk8yMDlaWnF4MzVwbUFFOVUKLS0tIG91NXJnRHI3eFlHNVU5QXcvYnpZ
bWQrMzBXV3l3UVJWVVU2V2RQK3VwZUUKdJob/7tk8vPwIlfVU66fIW9ft2Y+7JCr enJHQmV3c3hZWWNHakNTTEMxYk1iL28KeKadqZ3dflo4hCv75OgvYvFQzKnyka4T
L9f+AFgy0XD8e+DfQlJGNDeEm5Yu6cW0vWlbJtrRWes4gIF52bq9YA== WDI9j31vyiGgmzzb4uE+2B6MxHJcs3isnmeeFFxNGbWScTdteKE03A==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf - recipient: age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTOU5sL29KTVQ0VS92QzN2 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUaHNCSTgvdXV1S1dRTVBp
K2liNmxMdGN4TDdaQWp0ZHlyWjBwQStXQjMwCmNuMUZJMmZncFlRVE9GUFlkV1NT Yng3OVgyQWhSUEF4bkxaUlBOZEd6bUVhV2pFCjNwRDNDNjV3ZVFQUG0vcXlEQy9Y
cHEvcUgyY2F4bG9ITks0OVZZVkFOUGMKLS0tIG5yeS85T0FqeGZrUEg1WlJnMUUz aFNiYzhESjFNdHAzSE83RWtYdi9sbU0KLS0tIFMwRFRVWnNGWkp1YzJFdHVBdGtO
d1poZjE0TkFqbVNFZDl0cm5sWmJmMzAK/S7ePeCRqeZLJvk49CoatP5J6la4yfEN OTBvNm1QS3pXN00xOHlMVFZlTHBwM00KY0hXHQ81uc+XunH2cQvBMzJeq+ERqTLr
C81ivlh7SVDfyW8nJPLw+DIX4SU6e66zva/T+RQO3QnNJSDuw+gHAA== RVTInNt42xAto/DE0wbUDBi0MdFie9LgrP8CkLPN8CDjv5BUC+Lk0Q==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1t957gf0z865gya0khgc9x59wy76hzps3sgejjqtwcngn2xl273msxsmpe6 - recipient: age18vq5ktwgeaysucvw9t67drqmg5zd5c5k3le34yqxckkfj7wqdqgsd4ejmt
enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXZ25CaGtiY0tDVnIyWkIz YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUYVdrcXp1N2FtTDBLTnhz
QzFlQXhHMkhUMDlIemxzdUhrVTJtSzhkRTNvCmhDdUdqdml0VWd0TmluSGF5QStG UU5XaXNFMzJ4dmxTamNrdG42RFArT3pJSmxJCnhCdmpOc3hZdUx6WWEweTVaSnZn
Rk1leW1ac09LMGZhaHpva2NMS2Z2a00KLS0tIFBwNTRwQm15UFNEdkJNTmh3eTJh OVlEVHptb0NEOFFvNzRGdEt3UWpYazAKLS0tIEFNU21XYlNnd3o4SXhjUlM5N2Vh
T1ZLaWRwWFJkNE82NC80QTdjZ1l1Zm8K7QhAMCO/65Z0N4coN+sc7WYNVI+BvV01 YmhsY0FaSW5oWVNJMlhUSDRCeWQ4KzAKaQp321XYtAZ98f4QMl5PxivAYm6VMF43
q5DXWTtePrPRQ8ZCqT7gWdSQc8iS410HEZ2Nya5IA+ktGxMO9h1EXA== wCThiQgvYAP59jvVDTZngvfWAD5PyWVVvMNbjHGvAzK5WnsTPmxlsg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2022-06-21T09:01:02Z" lastmodified: "2022-07-09T07:48:24Z"
mac: ENC[AES256_GCM,data:G6crbY/fKKHjiCI7m+uOIRHrW2CJFM6DPD598h/vqRwYI0laIkasr7vUMuV72RyqAW52F90kIYyLY5qhu4uTOBqHK5aJHAxNo55knHrpXYQemMMt5UGC3AwgswLWkqze43EhIj7NrA6LTFF4MX+rD3yhFC+IAQOgZ1HiIk9h0sY=,iv:kDDHyNlaCCq9AVSr5qaF1OYZxNAGgxSGL5bxYL3Q79w=,tag:5FNaXMHjTyjyPScOXgep6Q==,type:str] mac: ENC[AES256_GCM,data:j5Rvh2EcWyi42lWhiKF5/t6isowgPZPqwHQIW+H6T7eb1YCRUusqnK69KSIBUvk/19ZXQXxcYqFSxilAEiuinKglXqmK5Tq2hSF+vJjqW9cunuPgeQl58GeA9PyjxrRo+HNjsXqGND9/fcZf+cqvZEQnhQdPE7mCzZaJ3kAXMKY=,iv:BsDIVtzO8nSStlKYYoFktZs2sRwVk5EgQ3GBkCk+1UE=,tag:pxQyFn6Y8bbDF9hQMJqTvA==,type:str]
pgp: [] pgp: []
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.7.3 version: 3.7.3

View File

@@ -8,35 +8,35 @@
"age": [ "age": [
{ {
"recipient": "age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x", "recipient": "age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmQXFUV0NVb0I3UjF6d2lx\nQXlCZURBai9qSERxWlYyQ3k2VGNhVnhPWGxRCk01aVZPbE96NDZ3WVUyRkp1UzFm\ndWNGb1JPNFBWS2hzTEVnTzFsOFRPWFEKLS0tIHVVT2Q0bDkvcmZOYzZqQVZJclVO\nWEpHRS9jUFpuVHZrS2paWHNuRzN4ZzAKOioqqTsqyD4Wa+amWaRNgb/6ZspWDI1K\nKvrIZ8uqunnUjjjNSJJlM8dl1OfyJlrRWEi8QOkqD21FcBTQiljVgg==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDdDR3YitDWkxvVFpOWTFS\nQXNrbHZHSzZzanpnR1Z0bE82aFpiUmNMR3djCitYT0J4K0daZmlXTzhJbWR3K0tY\nZFA0QS9rdXV5bVVXRXVuUStVd3RMeUEKLS0tIExicUdTcEFMZHZEOEFmdkV1T0tE\nc01seHdzS3RyMjc4dXF0ME1seEUzUFUKvctFuHiqCIBYGqIKQhMO7imfylxlKXBY\nezzfi0MMlfoSMmz8XqkCYT1kdgYVM1cCOwtBBmTzE2muhWK7o0zPCQ==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g", "recipient": "age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtT2gwSnJENUgrcUZQS21K\nL05BOW15ajJDVkhGajNzZE1pQTc5WVlwM3hVCjJMVFJDT1laOTlUNk9qM2ppMDZn\ndEdNOXBmMmw4Z1hMMFhIcjlsbFAzNFkKLS0tIFdIS0xzZm5vOGg0S0x5SzJXL1Bt\nWHcyeTVBRkdwS0FzTWU1eTJ6dGhiNkUK6YycEWUOh8M9iYF+2SSnU6cTcxtsFctD\nPcOfrTp+OBX18yXjRraWNLq2+jNj+IQtoRVFBUv2VsZAFFjz7d2oyQ==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxWnhldzk0UFdIcU03UUtE\nZ0VRVzBBRHp2cFA5Q2RjbU9kT3V4eHR1SFE0CkJRSndMZ3JOVjFRVytXSXBIbEk1\nKzBUR2pZWTVXTTRhQ2J5VlR0ejRpa00KLS0tIDZveWl3dUJZL0tIVUhKTDJPalBF\nVFVWcDBDdUt4ZlBZejQ4MGNJTGNzSGcKM9jHMEkRCmil2GO4DRVJMdPd4wikyNyP\nbI86+Z7llsMSWZdl+M/ZcTuJSq9Lh69hVNzKObuuW2GgApwoju9Lsg==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu", "recipient": "age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoZGZBN1FSQno0bmcrdmJs\nZFBFb3RRUitZVGFDQkh6S05xSUxGS3l2Z1dFCmNSL3VxZjY1MFNnMlpZbW1MQmUx\nS0FCbnNCREZlSzJiTE1WUDN2U2RQS1UKLS0tICtjeHhzY01XSE4ydFJsLzYrZlND\nOUFURnA4WHhySVBnc0I1cUNwWVlETlkKmvoUt+hvm9QknH12NTEKvilnBUaN8uhx\nYhPEbZkOr1QC8Eakn+b4G8A//COsxzm6cQW10FAiEBOrUybQGopW0g==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5NUJpc2hpY0Vwb09GbHUv\nRWRjbjRHS2xxWWNhN3BlbHlOcUgranYxZG5jCnhQOWdBM1dKdGNTL2ZuamxjSlNS\nU2VCYTZQZVJTOE1sWEYvV0cyZUlNMmcKLS0tIHk0WXNyZHIxaHJ1Wm1xVk5ZZ1lj\nL1JnTjZrK3JjK25FdEFEdzlvTURrV0UKL0HMaRQBg4KJTW+pb8RWe6iZVMJhtwrI\naH83tABhElaf1JKx8YiCG9+RHkis35nzxqSoJDN0bN5jRgVVG6C1iw==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1lt739n2tq7dmpglvntjr9j2r7426md7rat7x9w930gagtx4jyvnqwts2al", "recipient": "age1zsrsvd7j6l62fjxpfd2qnhqlk8wk4p8r0dtxpe4sdgnh2474095qdu7xj9",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsYm5qaVhqb2t6c2ZFUVBr\nYUlSb3FsS3FyTWhOL3prblBSK08zMmRmckdFCmxmK2NabGVmMWZiQnRUNHRDdUhK\nejlwbnZvbm1ndmIvdzIxR0k4U3M5TFkKLS0tIFYyRFhJQXhkdEN5TDN2d1M3Rytq\nc2tZNjQxVGNnUnFvayttbzBPN2dYRjgK2vKIWq3BMn2v+FgZ+F13703FPGMsEGsr\nHYtrnbDnd2fnPz4PTFUwvKldBTOtEymnRd5nfxqAAz9OdZBsahzRxA==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxbGt3d0k1SlZCemd2V01z\nd2R2NVAxZVlJdWpkVVh3bXBUcTZ0T05kTmtFCkQzWFVqd2pQelAzNGE5MnFSeVQr\nbjRjaUJKVVN6aGlQSWdTUGdHRjR1QWcKLS0tIGdrTTF6eUl6UHFlaTlQMENiMzFP\nQlJJWlZwMjdvNUdhVnBiRlRKL3hzcXMKNF9IEoY0seK15jiJqxWrOtMSPmBUU0jS\ndSY9KXeYLQNHuCzSC2T01UHmq5FDxDszRH3O8JQ+rBSLxNx3dLpetg==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v", "recipient": "age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmZlBQR0txRVh2YUFmdjBJ\naG50NU5FVjY2S20rM3I4ZlVrOTVrdHRTZ1NnCklUVGYxUDdza1hmbW5Gc2sxUmw4\nb0hDS3MxbENqclU2QWxic2d4RC9KZVUKLS0tIFhwaURkelNUdlFMWWJlTUN0dUJo\nWWhQaEVmTTJlNE5qS2wvcmtuK2pNSEEKuKeGKXPLLTA9RWoOSacIVEZ2l3/uW96s\nM91c2ezYFOTV6Md23jYAmAnje7dTivTCmFPnPuWdbEGXYbHLzz/O9Q==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCMEdCbHhFNWNuODRSNDU2\na0FzK09MME8rUWw0QnhpNG9NK0twNVp5RWcwCnBxZXJrZCtMRkFSR0lnRzl0TC9s\nUkpoQjFiU2t4djJNamt4NzQweUdOR1UKLS0tIFNoQTB4ODM1RTkrdGJxaCtSOG1D\nbFNUWktMRWZueWpDc2dkL2I0OTA3V0kKhWPOoRDueGpQntCeofze8yKgMtXH7Hn9\n04tlU0BFAWML7Rv2n9OeHAFcPe+n1DBoIZDF6U7ChItomIVmsYQZcg==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn", "recipient": "age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFUVN4WEpEcnpjdkFucXlE\nVTRjRlZHM0k2SVVXTkh1V0hLTXl0TVpZSG5rCnl0N2JuR2NsV1BUeXRPZStqRnJl\nR0wzb3l3Ymc2NytlZkw4ZmpoN09kcDAKLS0tIDRVTll5VmdFOWpPV1UwTithNElp\nWnVzU0s2YXR2Y25HcmZ4VUpleFM4TGcKFxi53+wTYdoaIMGvgcy0C6yTPDDPgZps\naWZcXfkberil26xNhRsRV6KwBje61Qd6vwU8hEa7P+hDcbBEavXwhw==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2cFRvc3BVOVFwb3QyaFBs\ndURLUlFWRGhqV2lpRkRrdDA3dFQ5c2V3aEhvCno2QmFDWEt1SGVRTGtkWnhHRUJn\nWTNmVlh4Tm8wZUpYSG11czBxS0hIRmMKLS0tIGZmd2NHWlhmTTVhSVVmS25XL1dp\naFVsQmJPdTF4K1g2WnBCKzJ4aDg4R3cK27ztxAUVvTFhaKvO4RorZaHNFtJ3LPv4\nFzpsko2dXTaksBHukBLsESCF89NlvxIJosgOMSqJzHwhODUeBPYwIQ==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf", "recipient": "age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuYjZWaXJpdVoyZHpVbkhW\nbEErbUNQa0M4Ty9iakkwblE4TDVBY2ozVFZvCnpiNlRPRTFxbTBQR1E0cGxYdmN2\nUUhSQVFWZ3VyV2VVR2lPNWhpY28rWTQKLS0tIDhLQlFGTncrKzErNnVCTDZZb0NW\nTFZxR2RFR3pBQkY0aVl5bWw2ZDlwOGMKakhqNNF7R4pgXEsXSaO7F5LGCw3yE53d\nItWXIoyCa0c78xk+YdMUNUOlzn39y8itXXpZAH2ZAC1sUrvq0elRew==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4SXZDNFgzL1VBMFRlWlhx\nY21SYyt6aVdSdW41a0RYU3dIOXM4OThPMXlVCjllbk1VbVNpRmc0QkZwMGtmZERR\nMitjWjI0bkQ3ZlVLcWhjaE95Y3lFdnMKLS0tIGxYTnlEclhkc3dub2kvalVyUHZC\nak5IVTdaTjI5NHU2VHVWSWw3K004OG8KK2E91q5yKGXCqtjC49f7snkvZtfSRQhM\nh7d7ZcudW4OzrFaPFzmoj9OdD1kBMHR5QQQHu/aCV+ObFrp+by0utw==\n-----END AGE ENCRYPTED FILE-----\n"
}, },
{ {
"recipient": "age1t957gf0z865gya0khgc9x59wy76hzps3sgejjqtwcngn2xl273msxsmpe6", "recipient": "age18vq5ktwgeaysucvw9t67drqmg5zd5c5k3le34yqxckkfj7wqdqgsd4ejmt",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzdHpmNks0Q3FLV3NiRThx\ncTVTODdYTStiUmdpM0gyaGZCdzNLRUlqalZnClNXbVI2dU9XMGNXTlh1U2trTnFi\ncEkvZllmM09WZDBBKzFTNDVuUjBpTE0KLS0tIDc5ZGJPTHJ6b2ZOaVdWUWl0Tng5\ndm1jRTRrZnltVm5sbW1uVjhTNnRyZGsKq9o7VkxWsf8k9wGi7ICC1M782MMdvQrY\nDDVlH7ITiDpJ1GGRDWAbfxB4izyb3MWoRqkhvcvcHt0WXR51FNa5NA==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWU0xDUFRJZXVocGwreEVo\nSVFqRWpLSktBaFpoTXYvMTNYMHEzZjRraTI0CmoyN2pHL003TnBUdnFpSE1NdnJZ\nd0k3Q1ZvaXk3aWZtNEo2dWpTU1N5Y1EKLS0tIHdRNklxOWI4YytWcC9NSVVxTkhn\nTnZ5SzZaMnV5Rms5Q2NrZFkrSGRtT1UK/yBKQzkC+HQveQJtAJ+qulDCxjEhwJ1/\nSqEojNY/OV8q7YSR+PNJBsllQYS64z72hCyPpkQ67v5C2Xk5LCd+PQ==\n-----END AGE ENCRYPTED FILE-----\n"
} }
], ],
"lastmodified": "2022-06-21T07:13:52Z", "lastmodified": "2022-06-21T07:13:52Z",

View File

@@ -0,0 +1,48 @@
{
"data": "ENC[AES256_GCM,data:ZoBVQMh7lhApeM3jmGARDienH0WjooHQ0EDuYTKWcZMHcQK8EFu80rvN4sRofAeAA5hx95nuTn3PtdlTFOlJJFOqJFOq4hhQVnDjLwJUMPE5tltDiZzsDJwUr3REvOffwrtFjw/OBjGDdKFUHmPKLWZh9tT6Fl6fxm58HL7cYirqAaHEhtt51KjR32afr5RtW5oPAdd4xtDHlI9GSKv82rlHnckiYBQ/rpKb8Vz+rVdGXkZtFzahgL612hyeRj6nd7FfSsb5SWUdSIcDqlHn1EWV5gqvz6OS8mmuRI8q40EUAlE+R2576BbqW13dIbV68BB84wxWZtZ7flkAo3VfaJFBeZ8WLr27bfL+RzEeuJsBn2ajmMHfsYcJmOA6+N7NQre6SFxV1ZKGWJybfpkVuVKfHCQM1g8uqCat92ObEbwPNan5JtUshtmvilxAuQI1sxsGi6BJjNcSZ+0pLSFqajYSqo/3dgkLesk2kVu81l2ytoRQXwERU0zm8b4dtfAvWLbEcJYntjC+a9MnOtdfRW7yTgbsbdG0vy3CmQpLNrTkV7Mdq+k3zUz/kAZ8yJ11tGFNjWmNCZ97CLZPWwkZBKuuhwmitYBACqBkYzZovtGW+VkhjgBdi4M58jDo8ry4c6n5aJXJ5y17t9XyZcvl2PNNNDwse4Oz0QEq+b2DTimVsczHB6q91Ht/gkcsELrAYVUaGcG8e9pk3/o7GYfBdATNmcEZpx00U3HNF205HdN2ieCGqFIxRNI1iNAKlUWxUTRTCrbYYwdsa+NHuyFbCGtWBhWoqpUA6Th3u8Fk2g1G3gyk2OYTauseZvb1p4rioSHCwiYMYrTIrHGwY5x/xQ4w4ma/WLLABsnNA/ECj57cKq2Ecjt1FhkymCPs5qIFOEg1kcrVV7DWapWOZ+QKQVoZKz1N0uVkIHZCGe+hBykp1Wr7nXNvdnuFvbD3NTHDuUQoYcuriHP8UVu6aCcchYqt+/Gg47QIKzqBJ98iKQ56XNxxCuH097U/nilyvC6Epgo5JEkdnyUTODT3htVyFjl6GxwTgIFsxIh7ORAdx6Z2Y+DQ+y90HGpV/qx2EXnCIA7XEXZpEgXiUyCZh+Ve6gzRgaZ4x7cN+IJYWh33vb4LlUpe8oJsSJ3fwMWJQ1o4aB5n96f7ZGY94ycsnWkfFVlUPmv2iwGQUPUEcPI8etzlFQScXJLWHjLDqIlhyakiVweQdJYtWT7S+CFilp1wod+ySXXxlPw6FVJsGPebPTUk8W/VuQ9ZwABHeyD99KOqpHBNisG+1z5+efHOY8225vWpIxmSMtLN2ja49d1QhE2m9tLlMtLOTvd/SYKuySXj0AW9eMrJ7HBFtUQzMn/zz2jnvBv6WGbKWtp/f0vZ/8+zJJzchTcOV6rcSACcwUCfBb/Wgboxxj0E3Qc6KybhiRWSGPeQPJBk4njLSe1mF441qBRVH1QNqO9K2f+4bPj+eBawopp07lqxUEx4nPqtPNgB8HlHG6e4bNC5xJ5+y05YNBes29jMr8PtKHCzbkbVKUkPDqw92mM85b7DdoUHmJo0erDbEgZ+4QztCIH1t2ngcqEIERScdPAYZRkoXhQbcAZuf+Qrrhvm6UaUy2QilP68dVOQezPOFPnikeXPeLX0G8vObtC28bKqlaK9j/eu7Me6JbR45qOu3oFofvDy2NHqMiu2RSqCPUYbBWb0ppB5WgA=,iv:hyiFjL6HhFgw2gFbUlZo5GuMCmIg0PTfMa//c0lxxII=,tag:HBvxO8dl+hRrr4/wm+XKyA==,type:str]",
"sops": {
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": [
{
"recipient": "age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxYmxWMDZoQXR4ZjN2aDV0\nN1pZaXpJTGJyOTdnY0ZjN2tPclJrTnlGRFY4CmNZazlOVDNYY0pSWm1LcFdXcUhk\nZjgzSndHdFFBNXlhZTRhRlhiLzZwc2sKLS0tIEN0SWRJMUJyWnRPZnhvZVkvUDN1\nMXBVWUVFMExaVFdEUFZxa0RvZjRQdlEKqpUPDwN9fqB66LZuDd51ANl6o+OXoIe1\nSYb8n/hOUC1QOTLb1i1k+Myzbdu+SVs2Wn25sBi4z66nhnOBcCF39Q==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRWDZSZi9paGxVbnpML2xq\nSDRaS1ZMQVhSYkJNbGJlK2dGNkozRlNCOXdNClBidFN6WlYyaktmWHNMemJFY1I5\nSW5adU13aDNpa2lyVkNFR2hzV1RnV1EKLS0tIHYzdVdGWHY1MW5mbXUxbzh3OFZL\nV1FUbzlDb3ZRMWNXQkZzdW53TDdrVEUKVzyl9Rsado15s4Qe8rPQ0lXKP0ENS5C8\nBHu260eP+AhH+iR76Lfs41cvEV4VfnLUUi8u+9wtd8QvJBPfpUS0fA==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3Q0l3RDlvdGVkVjVBU2FB\nUDc5cXo0WlJpZHZ6SDdrQWMzaVR0Wm5wVzBjClVSNWV0UGFvWTBPMzFUU3ZpbDBr\nTFdPOVhtMnUyZTJvYi84dURhVllFTjgKLS0tIDZnNlZGbWY1QUdqL1ZUaDJpTzA4\nb05FMExLT3Y0M2xNeGh3Qng1bjFLOXcKdimvuj6pfppDHmPVZFxDsn/J2uBifgRk\nk7KxjgM/xyjnMa+rnFBWymONwJhuoXmKROrwcS7XGlx7IyrXERG0vg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1zsrsvd7j6l62fjxpfd2qnhqlk8wk4p8r0dtxpe4sdgnh2474095qdu7xj9",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGbFJ4VkhQSXNZenpDbHVI\nVk9ZblNhTnZIMXNidTVYT0pMTnJqV093YlZzCk1JcXJJeVZTUHdrZlZaQ1MzamtJ\nWGVJS1lIZlMxVFlHMHhhNzRIcERWZHMKLS0tIFJRR2NLOFZUTTVtdE9VSFRSMmpl\nZ1JZWDFKSEtpTVBXMXRqd1ZPakVXVUUKd3EwiIlwtHTNvjqtZdP3h6k0h61l5hlO\n+/631VWCccAxWwDHNRVVJZFmZUuPCEhrJEduZVdr5woxtLB852ZiEg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSByc0IvUE1DSWIzM21XU3JW\nVHpHYTJyM3diUWErOEY4YWE3a3RhMVUwcjNvCmpFdU1vNnpHZ3R1Z0hkQVpRSC9N\nRXVRYTJKQmE5aHF6TEdBOURMRkYzYjgKLS0tIHhoNmk5Q2NJNkN3bDYxWmFvWi82\neVErNDZuWDRwYVJzYUFROElDYzRXUHcKiYg+LkqEtzqLvMtGjCkNbcbqy0F3anKR\nhF81aQfbEoQhARy5sPG9L8xccbp1E0GHnmNSUt21VVVz3gk8tui21A==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxeFpHMmJDYUpTMmpzYUlV\nMVRxd3JJRGE3ajdHMFB1UFI1a1BlaGd0bnlzClpNL29HNm1XYVhvNHV6N05NMEQx\nenZuM2pMS2krN2hLNTV4bEtiM1VHQUEKLS0tIGgxcHNPT2hoaGFRa1lpU0tBbmRm\nTDJyellYNm5objR4TnVLSEFjQ1EwTTQKsByLYLgw1g7ILxai9eKGkMKiV/gdsZXT\nzLwTAfOTMOzbSyOHnAr+CJMhc6V+sFUYf0XLE5y1DceGKEL2JzqdpQ==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyUzJmRWxlTTBqT3NZcFhZ\nNmhETmNaMWJPdkVGMWhqWFZjK2EvZlRqbFM4CnRabVJ4QTdRSzVRc0RiQ3ZzSkFr\nUzdDL3NNMkZtTEtabFhHRjZLTlo1NHcKLS0tIGxDaEtTcEwxMnBPdFVuRzUzTGth\nMWk3emZYNkt2ck80THloQkpsbG02UlkKBIG/UVQPa68k5S0PduqWa6mc2WNQOFtQ\nj9sSBcK0lWMwIuW+rs7aZJ1ZZ6i6F0KwTaRXSJTUZAFgF0jlWN0oPw==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age18vq5ktwgeaysucvw9t67drqmg5zd5c5k3le34yqxckkfj7wqdqgsd4ejmt",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqczE0RnlXb2NnUVJEQVZD\nQmw3ZU5kYnd4Q29yTU91dzJaOVlTTTFFNmswCi9aYlM1ZjFXa1VmUXNOZjczeC9U\nRWFjR2Fzd1NlL1NEeHNob3NRTVNNeGsKLS0tIG5qcFJxTWpEQ0JVVFc5MW9IZCtq\nZHQrRkdvWWpWVWRLZ2tlS1NCVDRYL1kKx2ZuKMdvtQkN/x7TLg+deDxPFqXjPYNc\nUVrryXoei8/4LCJXIvouugnUe0Fz7SQekiymgd7aP35lgXn1yVSCsg==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2022-08-10T06:12:46Z",
"mac": "ENC[AES256_GCM,data:OYtBbqUPCvFfraXhOLNOAHPMJQhRN+9PZQrpl84fB5lLuhTRtwcnjKwEytia8JkwZTJy79UzvhK0ePHFMx+ompSIOFCvEN8+Bra4BEKtyYU1JebxDor2k9eQJR4Y2pY6GQe/sCnNbeXVtgPj2Dvac/Id3XmOaNC6ZT7J7Rlp9so=,iv:7RiXcuYeafNL3MQjD6mFJSoqF8KNhu0M6bZBOYJqS20=,tag:he0Y4SavRVKdi4XxI3XvJA==,type:str]",
"pgp": null,
"unencrypted_suffix": "_unencrypted",
"version": "3.7.3"
}
}