1 Commits

Author SHA1 Message Date
f85a008741 set checks on individual languages 2024-02-07 23:04:08 -05:00
113 changed files with 944 additions and 1716 deletions

View File

@ -1,164 +0,0 @@
name: Arrow
run-name: Arrow - ${{ inputs.rebuild && 'Rebuild and ' || '' }}${{ inputs.action == 'create' && 'Create' || ( inputs.action == 'destroy' && 'Destroy' || 'No Action' ) }}
env:
TERRAFORM_DIRECTORY: hosts/arrow
DEPLOY_IDENTITY_BASE64: ${{ secrets.DEPLOY_IDENTITY_BASE64 }}
ARROW_IDENTITY_BASE64: ${{ secrets.ARROW_IDENTITY_BASE64 }}
CLOUDFLARE_R2_ENDPOINT: "${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com"
AWS_ACCESS_KEY_ID: ${{ secrets.CLOUDFLARE_R2_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.CLOUDFLARE_R2_SECRET_KEY }}
AWS_DEFAULT_REGION: auto
AWS_ENDPOINT_URL_S3: "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com"
TF_VAR_vultr_api_key: ${{ secrets.VULTR_API_KEY }}
ZONE_NAME: masu.rs
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }}
on:
workflow_dispatch:
inputs:
rebuild:
type: boolean
default: false
action:
type: choice
required: true
default: create
options:
- create
- destroy
- nothing
plan:
type: choice
required: false
options:
- vc2-1c-1gb # 25 GB / $5
- vc2-1c-2gb # 55 GB / $10 (default)
- vc2-2c-2gb # 65 GB / $15
- vc2-2c-4gb # 80 GB / $20
- vc2-4c-8gb # 160 GB / $40
- vc2-6c-16gb # 320 GB / $80
jobs:
build-deploy:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout Repo Code
uses: actions/checkout@v4
# Enable access to KVM, required to build an image
- name: Enable KVM group perms
if: inputs.rebuild && inputs.action != 'destroy'
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
# Install Nix
- name: Install Nix
if: inputs.rebuild && inputs.action != 'destroy'
uses: cachix/install-nix-action@v17
# Build the image
- name: Build Image
if: inputs.rebuild && inputs.action != 'destroy'
run: nix build .#image.arrow
- name: Upload Image to S3
if: inputs.rebuild && inputs.action != 'destroy'
run: |
aws s3 cp \
result/iso/nixos.iso \
s3://noahmasur-arrow-images/arrow.iso \
--endpoint-url "https://${{ env.CLOUDFLARE_R2_ENDPOINT }}"
# # Copy the image to S3
# - name: Upload Image to Cache
# env:
# NIX_CACHE_PRIVATE_KEY: ${{ secrets.NIX_CACHE_PRIVATE_KEY }}
# run: |
# echo "$NIX_CACHE_PRIVATE_KEY" > cache.key
# nix store sign --key-file cache.key $(readlink result)
# nix copy --to s3://t2-aws-nixos-test $(readlink result)
# rm cache.key
# Installs the Terraform binary and some other accessory functions.
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
# Checks whether Terraform is formatted properly. If this fails, you
# should install the pre-commit hook.
- name: Check Formatting
working-directory: ${{ env.TERRAFORM_DIRECTORY }}
run: |
terraform fmt -no-color -check -diff -recursive
# Connects to remote state backend and download providers.
- name: Terraform Init
working-directory: ${{ env.TERRAFORM_DIRECTORY }}
run: terraform init
# Deploys infrastructure or changes to infrastructure.
- name: Terraform Apply
if: inputs.action == 'create'
working-directory: ${{ env.TERRAFORM_DIRECTORY }}
env:
TF_VAR_vultr_plan: ${{ inputs.plan }}
run: |
terraform apply \
-auto-approve \
-input=false
# Removes infrastructure.
- name: Terraform Destroy
if: inputs.action == 'destroy'
working-directory: ${{ env.TERRAFORM_DIRECTORY }}
run: |
terraform destroy \
-auto-approve \
-input=false
- name: Get Host IP
if: inputs.action == 'create'
id: host
working-directory: ${{ env.TERRAFORM_DIRECTORY }}
run: terraform output -raw host_ip
- name: Wait on SSH
if: inputs.action == 'create'
run: |
for i in $(seq 1 15); do
if $(nc -z -w 3 ${{ steps.host.outputs.stdout }} 22); then
exit 0
fi
sleep 10
done
- name: Write Identity Keys to Files
if: inputs.action == 'create'
run: |
echo "${{ env.DEPLOY_IDENTITY_BASE64 }}" | base64 -d > deploy_ed25519
chmod 0600 deploy_ed25519
echo "${{ env.ARROW_IDENTITY_BASE64 }}" | base64 -d > arrow_ed25519
chmod 0600 arrow_ed25519
- name: Copy Identity File to Host
if: inputs.action == 'create'
run: |
ssh -i deploy_ed25519 -o StrictHostKeyChecking=accept-new noah@${{ steps.host.outputs.stdout }} 'mkdir -pv .ssh'
scp -i deploy_ed25519 arrow_ed25519 noah@${{ steps.host.outputs.stdout }}:~/.ssh/id_ed25519
- name: Wipe Records
if: ${{ inputs.action == 'destroy' }}
run: |
RECORD_ID=$(curl --request GET \
--url https://api.cloudflare.com/client/v4/zones/${{ env.CLOUDFLARE_ZONE_ID }}/dns_records \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${{ env.CLOUDFLARE_API_TOKEN }}" | jq -r '.result[] | select(.name == "transmission.${{ env.ZONE_NAME }}") | .id')
curl --request DELETE \
--url https://api.cloudflare.com/client/v4/zones/${{ env.CLOUDFLARE_ZONE_ID }}/dns_records/${RECORD_ID} \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${{ env.CLOUDFLARE_API_TOKEN }}"

1
.gitignore vendored
View File

@ -1,7 +1,6 @@
.DS_Store .DS_Store
*.bak *.bak
*.db *.db
*.qcow2
**/.direnv/** **/.direnv/**
result result
private/** private/**

View File

@ -25,7 +25,7 @@ configuration may be difficult to translate to a non-Nix system.
| Dotfiles | [Home-Manager](https://github.com/nix-community/home-manager) | [Link](./modules/common) | | Dotfiles | [Home-Manager](https://github.com/nix-community/home-manager) | [Link](./modules/common) |
| Terminal | [Kitty](https://sw.kovidgoyal.net/kitty/) | [Link](./modules/common/applications/kitty.nix) | | Terminal | [Kitty](https://sw.kovidgoyal.net/kitty/) | [Link](./modules/common/applications/kitty.nix) |
| Shell | [Fish](https://fishshell.com/) | [Link](./modules/common/shell/fish) | | Shell | [Fish](https://fishshell.com/) | [Link](./modules/common/shell/fish) |
| Shell Prompt | [Starship](https://starship.rs/) | [Link](./modules/common/shell/starship.nix) | | Shell Prompt | [Starship](https://starship.rs/) | [Link](./modules/common/shell/starhip.nix) |
| Colorscheme | [Gruvbox](https://github.com/morhetz/gruvbox) | [Link](./colorscheme/gruvbox/default.nix) | | Colorscheme | [Gruvbox](https://github.com/morhetz/gruvbox) | [Link](./colorscheme/gruvbox/default.nix) |
| Wallpaper | [Road](https://gitlab.com/exorcist365/wallpapers/-/blob/master/gruvbox/road.jpg) | [Link](./hosts/tempest/default.nix) | | Wallpaper | [Road](https://gitlab.com/exorcist365/wallpapers/-/blob/master/gruvbox/road.jpg) | [Link](./hosts/tempest/default.nix) |
| Text Editor | [Neovim](https://neovim.io/) | [Link](./modules/common/neovim/config) | | Text Editor | [Neovim](https://neovim.io/) | [Link](./modules/common/neovim/config) |
@ -43,7 +43,11 @@ configuration may be difficult to translate to a non-Nix system.
# Diagram # Diagram
![Diagram](https://github.com/nmasur/dotfiles/assets/7386960/4cc22285-cea1-4831-b387-a82241184381) ![Diagram](https://github.com/nmasur/dotfiles/assets/7386960/ed3e7202-09c4-4a9c-9b14-0272c01647f6)
- [flake.nix](./flake.nix)
- [hosts](./hosts/)
- [modules](./modules/)
--- ---

View File

@ -1,38 +1,41 @@
{ disk, ... }: { disk, ... }: {
{
disk = { disk = {
boot = { boot = {
type = "disk"; type = "disk";
device = disk; device = disk;
content = { content = {
type = "gpt"; type = "table";
partitions = { format = "gpt";
partitions = [
# Boot partition # Boot partition
ESP = rec { {
size = "512MiB"; name = "ESP";
type = "EF00"; start = "0";
label = "boot"; end = "512MiB";
device = "/dev/disk/by-label/${label}"; fs-type = "fat32";
bootable = true;
content = { content = {
type = "filesystem"; type = "filesystem";
format = "vfat"; format = "vfat";
mountpoint = "/boot"; mountpoint = "/boot";
extraArgs = [ "-n ${label}" ]; extraArgs = [ "-n boot" ];
}; };
}; }
# Root partition ext4 # Root partition ext4
root = rec { {
size = "100%"; name = "root";
label = "nixos"; start = "512MiB";
device = "/dev/disk/by-label/${label}"; end = "100%";
part-type = "primary";
bootable = true;
content = { content = {
type = "filesystem"; type = "filesystem";
format = "ext4"; format = "ext4";
mountpoint = "/"; mountpoint = "/";
extraArgs = [ "-L ${label}" ]; extraArgs = [ "-L nixos" ];
}; };
}; }
}; ];
}; };
}; };
}; };

View File

@ -1,5 +1,4 @@
{ pool, disks, ... }: { pool, disks, ... }: {
{
disk = lib.genAttrs disks (disk: { disk = lib.genAttrs disks (disk: {
"${disk}" = { "${disk}" = {
type = "disk"; type = "disk";
@ -7,18 +6,16 @@
content = { content = {
type = "table"; type = "table";
format = "gpt"; format = "gpt";
partitions = [ partitions = [{
{ type = "partition";
type = "partition"; name = "zfs";
name = "zfs"; start = "128MiB";
start = "128MiB"; end = "100%";
end = "100%"; content = {
content = { type = "zfs";
type = "zfs"; pool = pool;
pool = pool; };
}; }];
}
];
}; };
}; };
}); });

View File

@ -57,7 +57,6 @@ Launch a new shell. Then use Nix to switch to the macOS configuration:
```bash ```bash
sudo rm /etc/bashrc sudo rm /etc/bashrc
sudo rm /etc/nix/nix.conf sudo rm /etc/nix/nix.conf
export NIX_SSL_CERT_FILE="$HOME/Documents/t2-ca-bundle.pem"
nix \ nix \
--extra-experimental-features flakes \ --extra-experimental-features flakes \
--extra-experimental-features nix-command \ --extra-experimental-features nix-command \

View File

@ -63,20 +63,3 @@ Use this mysqldump command:
sudo -u nextcloud mysqldump -S /run/mysqld/mysqld.sock --default-character-set=utf8mb4 nextcloud > backup.sql sudo -u nextcloud mysqldump -S /run/mysqld/mysqld.sock --default-character-set=utf8mb4 nextcloud > backup.sql
``` ```
## Converting to Postgres
Same as MySQL, but run this command instead:
```
sudo -u nextcloud nextcloud-occ db:convert-type pgsql nextcloud /run/postgresql/ nextcloud
```
Then set the `dbtype` to `pgsql`.
## Backing Up Postgres Database
Use this pg_dump command:
```
sudo -u nextcloud pg_dump nextcloud > backup.sql
```

243
flake.lock generated
View File

@ -1,5 +1,22 @@
{ {
"nodes": { "nodes": {
"Comment-nvim-src": {
"flake": false,
"locked": {
"lastModified": 1681214440,
"narHash": "sha256-48hy+hiaDJLlgWqC7IeZI3dT+VwWkRo4atQbyPxu/ys=",
"owner": "numToStr",
"repo": "Comment.nvim",
"rev": "e51f2b142d88bb666dcaa77d93a07f4b419aca70",
"type": "github"
},
"original": {
"owner": "numToStr",
"ref": "v0.8.0",
"repo": "Comment.nvim",
"type": "github"
}
},
"baleia-nvim-src": { "baleia-nvim-src": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -16,22 +33,6 @@
"type": "github" "type": "github"
} }
}, },
"base16-nvim-src": {
"flake": false,
"locked": {
"lastModified": 1708139024,
"narHash": "sha256-l0BO2boIy6mwK8ISWS3D68f8egqHYwsGSAnzjbB5aOE=",
"owner": "RRethy",
"repo": "base16-nvim",
"rev": "b3e9ec6a82c05b562cd71f40fe8964438a9ba64a",
"type": "github"
},
"original": {
"owner": "RRethy",
"repo": "base16-nvim",
"type": "github"
}
},
"bufferline-nvim-src": { "bufferline-nvim-src": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -52,17 +53,17 @@
"bypass-paywalls-clean": { "bypass-paywalls-clean": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1713012522, "lastModified": 1706880406,
"narHash": "sha256-35KuPa3k6j8//gKXD3JY3Y318DRBxXNo/JuzatFXG5M=", "narHash": "sha256-8z2Gc3ITluXXbDij4Ltahpkxs7zdnMITvIAjotab/QU=",
"ref": "refs/heads/master", "owner": "magnolia1234",
"rev": "724d4fcff64a433e988d9e54f7a08573523f2ca5", "repo": "bpc-uploads",
"revCount": 1, "rev": "c91cfd510390ab5a138f412ad2890b2cb2a2eafd",
"type": "git", "type": "gitlab"
"url": "https://git.masu.rs/noah/bpc-uploads"
}, },
"original": { "original": {
"type": "git", "owner": "magnolia1234",
"url": "https://git.masu.rs/noah/bpc-uploads" "repo": "bpc-uploads",
"type": "gitlab"
} }
}, },
"cmp-nvim-lsp-src": { "cmp-nvim-lsp-src": {
@ -81,23 +82,6 @@
"type": "github" "type": "github"
} }
}, },
"comment-nvim-src": {
"flake": false,
"locked": {
"lastModified": 1681214440,
"narHash": "sha256-48hy+hiaDJLlgWqC7IeZI3dT+VwWkRo4atQbyPxu/ys=",
"owner": "numToStr",
"repo": "Comment.nvim",
"rev": "e51f2b142d88bb666dcaa77d93a07f4b419aca70",
"type": "github"
},
"original": {
"owner": "numToStr",
"ref": "v0.8.0",
"repo": "Comment.nvim",
"type": "github"
}
},
"darwin": { "darwin": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@ -105,11 +89,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1711763326, "lastModified": 1706833576,
"narHash": "sha256-sXcesZWKXFlEQ8oyGHnfk4xc9f2Ip0X/+YZOq3sKviI=", "narHash": "sha256-w7BL0EWRts+nD1lbLECIuz6fRzmmV+z8oWwoY7womR0=",
"owner": "lnl7", "owner": "lnl7",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "36524adc31566655f2f4d55ad6b875fb5c1a4083", "rev": "bdbae6ecff8fcc322bf6b9053c0b984912378af7",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -126,11 +110,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1712612224, "lastModified": 1706491084,
"narHash": "sha256-Tv4C8OSPVmm4LbpJGLFSODyvJy6DqrisEGPCQdNVOeY=", "narHash": "sha256-eaEv+orTmr2arXpoE4aFZQMVPOYXCBEbLgK22kOtkhs=",
"owner": "nix-community", "owner": "nix-community",
"repo": "disko", "repo": "disko",
"rev": "79eab0e82cb126bf4ac170f44af82479f0895ab5", "rev": "f67ba6552845ea5d7f596a24d57c33a8a9dc8de9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -163,11 +147,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1712623312, "lastModified": 1707007453,
"narHash": "sha256-6NlzHMtxCdlF+Zq1Y10YnVr5M/AgMcVhEMZlxlQyeNo=", "narHash": "sha256-vs7uACn2/8GOApZJv52gAVsLfpjQWFgkHN2QJ7aVkl8=",
"owner": "bandithedoge", "owner": "bandithedoge",
"repo": "nixpkgs-firefox-darwin", "repo": "nixpkgs-firefox-darwin",
"rev": "49b3ee7dbb9fdbb6388bd5d47895a9a9992b771e", "rev": "d839feb516758ad28bc1cef43008d55e749c1d6a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -231,11 +215,11 @@
"hmts-nvim-src": { "hmts-nvim-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1710430870, "lastModified": 1706900289,
"narHash": "sha256-bsOQX56ciQ8ni7Zh4ZNtTvptvy/YaDPG318AsEaZRpE=", "narHash": "sha256-kw3YJ21nhs/x9Jp7kvnL+9FuiSgLB1hO/ON3QeeZx9g=",
"owner": "calops", "owner": "calops",
"repo": "hmts.nvim", "repo": "hmts.nvim",
"rev": "473d74cf54da8f51aaa9993ec3e6bfae278eb47b", "rev": "ba1239972a1f56b94252d4f85a43e777ac419662",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -251,11 +235,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1712688495, "lastModified": 1706985585,
"narHash": "sha256-NrVLXkpT9ZigiI8md6NIzHS+3lE4QTj30IgXG57O9iM=", "narHash": "sha256-ptshv4qXiC6V0GCfpABz88UGGPNwqs5tAxaRUKbk1Qo=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "b00d0e4fe9cba0047f54e77418ddda5f17e6ef2c", "rev": "1ca210648a6ca9b957efde5da957f3de6b1f0c45",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -268,11 +252,11 @@
"kitty-scrollback-nvim-src": { "kitty-scrollback-nvim-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1712336907, "lastModified": 1706891759,
"narHash": "sha256-wDNYvNa9UEHg6lRKaonN+6vg4XJ4umUaVriziEJejKE=", "narHash": "sha256-p7RPqLHO6D5CCTDQzUrEqTu9+jg+V7wtYfGbY4qjE9A=",
"owner": "mikesmithgh", "owner": "mikesmithgh",
"repo": "kitty-scrollback.nvim", "repo": "kitty-scrollback.nvim",
"rev": "2d4c6970e9b6155b857755a5499cdce313d923b3", "rev": "12f7687ac049d46a987c39b2b4f657fdf540fa4e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -323,7 +307,7 @@
"nextcloud-snappymail": { "nextcloud-snappymail": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1712695892, "lastModified": 1707018069,
"narHash": "sha256-UeZXoZFEPJj7zEVNTXJ3IYNt/wI7VFq3Pjh1ubMHCBo=", "narHash": "sha256-UeZXoZFEPJj7zEVNTXJ3IYNt/wI7VFq3Pjh1ubMHCBo=",
"type": "tarball", "type": "tarball",
"url": "https://snappymail.eu/repository/nextcloud/snappymail-2.32.0-nextcloud.tar.gz" "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.32.0-nextcloud.tar.gz"
@ -341,11 +325,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1707832982, "lastModified": 1706886721,
"narHash": "sha256-Jsrj8HJyo+PmjrHIDhq4gjZCE0eYCVmmTrx24cG8eOQ=", "narHash": "sha256-iDYxsE5xYoK8Ww2TYZDmgRQNIZl+QHJfChOxWh45g0k=",
"owner": "gytis-ivaskevicius", "owner": "gytis-ivaskevicius",
"repo": "nix2vim", "repo": "nix2vim",
"rev": "2fb1328cf058fc967b02f9a5330a99253b4c247e", "rev": "29253dcf0f645a44847006d436b096369ef42fd8",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -356,11 +340,11 @@
}, },
"nixlib": { "nixlib": {
"locked": { "locked": {
"lastModified": 1712450863, "lastModified": 1693701915,
"narHash": "sha256-K6IkdtMtq9xktmYPj0uaYc8NsIqHuaAoRBaMgu9Fvrw=", "narHash": "sha256-waHPLdDYUOHSEtMKKabcKIMhlUOHPOOPQ9UyFeEoovs=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixpkgs.lib", "repo": "nixpkgs.lib",
"rev": "3c62b6a12571c9a7f65ab037173ee153d539905f", "rev": "f5af57d3ef9947a70ac86e42695231ac1ad00c25",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -377,11 +361,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1712537332, "lastModified": 1706085261,
"narHash": "sha256-yYlxv1sg/TNl6hghjAe0ct+/p5PwXiT1mpuaExjhR88=", "narHash": "sha256-7PgpHRHyShINcqgevPP1fJ6N8kM5ZSOJnk3QZBrOCQ0=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixos-generators", "repo": "nixos-generators",
"rev": "d942db8df8ee860556a38754f15b8d03bf7e6933", "rev": "896f6589db5b25023b812bbb6c1f5d3a499b1132",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -392,11 +376,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1712791164, "lastModified": 1706732774,
"narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", "narHash": "sha256-hqJlyJk4MRpcItGYMF+3uHe8HvxNETWvlGtLuVpqLU0=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", "rev": "b8b232ae7b8b144397fdb12d20f592e5e7c1a64d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -406,34 +390,34 @@
"type": "github" "type": "github"
} }
}, },
"nur": { "null-ls-nvim-src": {
"flake": false,
"locked": { "locked": {
"lastModified": 1712692796, "lastModified": 1691810493,
"narHash": "sha256-q3Tx4kS+nH4IDcEsZSv8o2IuCn475mGhCYBXxfxZ2gY=", "narHash": "sha256-cWA0rzkOp/ekVKaFee7iea1lhnqKtWUIU+fW5M950wI=",
"owner": "nix-community", "owner": "jose-elias-alvarez",
"repo": "nur", "repo": "null-ls.nvim",
"rev": "ee4ce451f46a08778d1a9f9837eff0750714b08b", "rev": "0010ea927ab7c09ef0ce9bf28c2b573fc302f5a7",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "jose-elias-alvarez",
"repo": "nur", "repo": "null-ls.nvim",
"type": "github" "type": "github"
} }
}, },
"nvim-lint-src": { "nur": {
"flake": false,
"locked": { "locked": {
"lastModified": 1712680602, "lastModified": 1707013032,
"narHash": "sha256-FgHWOiF+oMXVISP/k2rt7epEEjFS/sYLnEpe85B5Ox0=", "narHash": "sha256-9kEY/D0Q6sF+p6vJRefVXDK4QQdwK4Q0lSQdsYICad0=",
"owner": "mfussenegger", "owner": "nix-community",
"repo": "nvim-lint", "repo": "nur",
"rev": "4055dc856d5ac8f6b85748006fd8fa6457e086e8", "rev": "ab432acea15134873882610c0e936a882319bc8a",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "mfussenegger", "owner": "nix-community",
"repo": "nvim-lint", "repo": "nur",
"type": "github" "type": "github"
} }
}, },
@ -457,11 +441,11 @@
"nvim-tree-lua-src": { "nvim-tree-lua-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1712366921, "lastModified": 1706571452,
"narHash": "sha256-6pbOeklf+otsJIjt9IUyUfuTAedShnwERYq1IfhyrJs=", "narHash": "sha256-b0LIqLC8cCRX1NyJx4eH5c4v5Fqqw5mMleAnQ2VRctM=",
"owner": "kyazdani42", "owner": "kyazdani42",
"repo": "nvim-tree.lua", "repo": "nvim-tree.lua",
"rev": "81eb8d519233c105f30dc0a278607e62b20502fd", "rev": "f39f7b6fcd3865ac2146de4cb4045286308f2935",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -473,11 +457,11 @@
"nvim-treesitter-src": { "nvim-treesitter-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1712690702, "lastModified": 1706952848,
"narHash": "sha256-iWP5nIswAs+7oNBhJpPzBqJ5BLXEt8+kHPi22RtAK3Q=", "narHash": "sha256-pNjEODR+QJPDL58O4NM7SjzZEN8D3bXDHbKLNOS3fL8=",
"owner": "nvim-treesitter", "owner": "nvim-treesitter",
"repo": "nvim-treesitter", "repo": "nvim-treesitter",
"rev": "c16f66cca0c38b4e21371d8330b7f2ad6404f6dc", "rev": "4fbf150a1621d52f17b099506e1a32f107079210",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -490,14 +474,14 @@
"proton-ge": { "proton-ge": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1710987994, "lastModified": 1700610476,
"narHash": "sha256-NqBzKonCYH+hNpVZzDhrVf+r2i6EwLG/IFBXjE2mC7s=", "narHash": "sha256-IoClZ6hl2lsz9OGfFgnz7vEAGlSY2+1K2lDEEsJQOfU=",
"type": "tarball", "type": "tarball",
"url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton9-2/GE-Proton9-2.tar.gz" "url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-25/GE-Proton8-25.tar.gz"
}, },
"original": { "original": {
"type": "tarball", "type": "tarball",
"url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton9-2/GE-Proton9-2.tar.gz" "url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-25/GE-Proton8-25.tar.gz"
} }
}, },
"ren": { "ren": {
@ -519,11 +503,11 @@
"rep": { "rep": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1707216692, "lastModified": 1705833236,
"narHash": "sha256-/dH+mNtNHaYFndVhoqmz4Sc3HeemoQt1HGD98mb9Qhw=", "narHash": "sha256-hm+v+b97z1HnY/7QHZxc0GygCq9W0mJauyjnz48ddaM=",
"owner": "robenkleene", "owner": "robenkleene",
"repo": "rep-grep", "repo": "rep-grep",
"rev": "10510d47e392cb9d30a861c69f702fd194b3fa88", "rev": "365acc5d599934e94dc066eb85b7ddd684ba508b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -534,12 +518,11 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"Comment-nvim-src": "Comment-nvim-src",
"baleia-nvim-src": "baleia-nvim-src", "baleia-nvim-src": "baleia-nvim-src",
"base16-nvim-src": "base16-nvim-src",
"bufferline-nvim-src": "bufferline-nvim-src", "bufferline-nvim-src": "bufferline-nvim-src",
"bypass-paywalls-clean": "bypass-paywalls-clean", "bypass-paywalls-clean": "bypass-paywalls-clean",
"cmp-nvim-lsp-src": "cmp-nvim-lsp-src", "cmp-nvim-lsp-src": "cmp-nvim-lsp-src",
"comment-nvim-src": "comment-nvim-src",
"darwin": "darwin", "darwin": "darwin",
"disko": "disko", "disko": "disko",
"fidget-nvim-src": "fidget-nvim-src", "fidget-nvim-src": "fidget-nvim-src",
@ -554,8 +537,8 @@
"nix2vim": "nix2vim", "nix2vim": "nix2vim",
"nixos-generators": "nixos-generators", "nixos-generators": "nixos-generators",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"null-ls-nvim-src": "null-ls-nvim-src",
"nur": "nur", "nur": "nur",
"nvim-lint-src": "nvim-lint-src",
"nvim-lspconfig-src": "nvim-lspconfig-src", "nvim-lspconfig-src": "nvim-lspconfig-src",
"nvim-tree-lua-src": "nvim-tree-lua-src", "nvim-tree-lua-src": "nvim-tree-lua-src",
"nvim-treesitter-src": "nvim-treesitter-src", "nvim-treesitter-src": "nvim-treesitter-src",
@ -660,11 +643,11 @@
"tree-sitter-bash": { "tree-sitter-bash": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1710290046, "lastModified": 1705686017,
"narHash": "sha256-6Rfxh8Y6dg2wyQ9jYnbOaXm1SVfQDQ1B1tNqgpz6sY4=", "narHash": "sha256-+Mpks0FyQLl26TX63J6WhaAl/QDUR1k9wSUY5SFwL+w=",
"owner": "tree-sitter", "owner": "tree-sitter",
"repo": "tree-sitter-bash", "repo": "tree-sitter-bash",
"rev": "f3f26f47a126797c011c311cec9d449d855c3eab", "rev": "f7239f638d3dc16762563a9027faeee518ce1bd9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -693,11 +676,11 @@
"tree-sitter-lua": { "tree-sitter-lua": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1710150044, "lastModified": 1694072484,
"narHash": "sha256-uFaEptW4wPrqgHfB1mYmVltf+4no61L2cPgpsr5qBIU=", "narHash": "sha256-5t5w8KqbefInNbA12/jpNzmky/uOUhsLjKdEqpl1GEc=",
"owner": "MunifTanjim", "owner": "MunifTanjim",
"repo": "tree-sitter-lua", "repo": "tree-sitter-lua",
"rev": "a24dab177e58c9c6832f96b9a73102a0cfbced4a", "rev": "9668709211b2e683f27f414454a8b51bf0a6bda1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -710,11 +693,11 @@
"tree-sitter-puppet": { "tree-sitter-puppet": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1709480423, "lastModified": 1690231696,
"narHash": "sha256-Lwfiby7amjTIOz8QRoC4RdZyFPfFikmQ2sqta4akyH8=", "narHash": "sha256-YEjjy9WLwITERYqoeSVrRYnwVBIAwdc4o0lvAK9wizw=",
"owner": "amaanq", "owner": "amaanq",
"repo": "tree-sitter-puppet", "repo": "tree-sitter-puppet",
"rev": "5849f9694197a6e822872945b415429c285fdd54", "rev": "9ce9a5f7d64528572aaa8d59459ba869e634086b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -726,11 +709,11 @@
"tree-sitter-python": { "tree-sitter-python": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1712321561, "lastModified": 1700218345,
"narHash": "sha256-L6iEej6bPqfaZdH5GNoJyNxZWdnIyn7+Cut+zYnMI88=", "narHash": "sha256-hXNxa895SyNOG7PH2vAIkWbcMjZDjWYDsCafBZuvnT0=",
"owner": "tree-sitter", "owner": "tree-sitter",
"repo": "tree-sitter-python", "repo": "tree-sitter-python",
"rev": "a22761025cdac6c314b7e3aa48fb44fa9e594d6a", "rev": "4bfdd9033a2225cc95032ce77066b7aeca9e2efc",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -743,11 +726,11 @@
"tree-sitter-rasi": { "tree-sitter-rasi": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1707776004, "lastModified": 1678701563,
"narHash": "sha256-7zhQ5wGm0FFyuTiBVN2KgvUTw8G6fwUGR8HKJ69kR+c=", "narHash": "sha256-2nYZoLcrxxxiOJEySwHUm93lzMg8mU+V7LIP63ntFdA=",
"owner": "Fymyte", "owner": "Fymyte",
"repo": "tree-sitter-rasi", "repo": "tree-sitter-rasi",
"rev": "43196d934a9a6ab3c7093a8683efd0111bb03db1", "rev": "371dac6bcce0df5566c1cfebde69d90ecbeefd2d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -759,11 +742,11 @@
"tree-sitter-vimdoc": { "tree-sitter-vimdoc": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1711210668, "lastModified": 1705491128,
"narHash": "sha256-spj8h1ZDY+6sWi+FCALapBsG+ig9H1u3bjkI2+UP0ds=", "narHash": "sha256-q5Ln8WPFrtKBfZnaAAlMh3Q/eczEt6wCMZAtx+ISCKg=",
"owner": "neovim", "owner": "neovim",
"repo": "tree-sitter-vimdoc", "repo": "tree-sitter-vimdoc",
"rev": "a75a932449675bbd260213a95f4cd8b3193286f0", "rev": "ed8695ad8de39c3f073da130156f00b1148e2891",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -797,11 +780,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1710519878, "lastModified": 1706867893,
"narHash": "sha256-0dbc10OBFUVYyXC+C+N6vRUd8xyBSRxkcZ4Egipbx0M=", "narHash": "sha256-c5bADvtL35S3vsJaXR5YWTXe08W0gSwOrTOXfpJB4Ac=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NixOS-WSL", "repo": "NixOS-WSL",
"rev": "aef95bdb6800a3a2af7aa7083d6df03067da6592", "rev": "bcae8dc73b931b7f0fc65f1f1ef93dc379dfd66b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -813,11 +796,11 @@
"zenyd-mpv-scripts": { "zenyd-mpv-scripts": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1707704915, "lastModified": 1706283438,
"narHash": "sha256-9P/8q/OZXfaJMS08acQP4h3/zUA5mKRQee0JmkXcz1w=", "narHash": "sha256-hpLZDtt5q18aZ8d9LHfT852wtBosKUTJ7Bx+cbjBLcg=",
"owner": "zenyd", "owner": "zenyd",
"repo": "mpv-scripts", "repo": "mpv-scripts",
"rev": "9bdce0050144cb24f92475f7bdd77180e0e4c26b", "rev": "7100d19d18d111ce77fc9e6e8947c0d542a86397",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -60,10 +60,6 @@
}; };
# Neovim plugins # Neovim plugins
base16-nvim-src = {
url = "github:RRethy/base16-nvim";
flake = false;
};
nvim-lspconfig-src = { nvim-lspconfig-src = {
# https://github.com/neovim/nvim-lspconfig/tags # https://github.com/neovim/nvim-lspconfig/tags
url = "github:neovim/nvim-lspconfig/v0.1.7"; url = "github:neovim/nvim-lspconfig/v0.1.7";
@ -73,12 +69,16 @@
url = "github:hrsh7th/cmp-nvim-lsp"; url = "github:hrsh7th/cmp-nvim-lsp";
flake = false; flake = false;
}; };
null-ls-nvim-src = {
url = "github:jose-elias-alvarez/null-ls.nvim";
flake = false;
};
baleia-nvim-src = { baleia-nvim-src = {
# https://github.com/m00qek/baleia.nvim/tags # https://github.com/m00qek/baleia.nvim/tags
url = "github:m00qek/baleia.nvim"; url = "github:m00qek/baleia.nvim";
flake = false; flake = false;
}; };
comment-nvim-src = { Comment-nvim-src = {
# https://github.com/numToStr/Comment.nvim/releases # https://github.com/numToStr/Comment.nvim/releases
url = "github:numToStr/Comment.nvim/v0.8.0"; url = "github:numToStr/Comment.nvim/v0.8.0";
flake = false; flake = false;
@ -124,10 +124,6 @@
url = "github:mikesmithgh/kitty-scrollback.nvim"; url = "github:mikesmithgh/kitty-scrollback.nvim";
flake = false; flake = false;
}; };
nvim-lint-src = {
url = "github:mfussenegger/nvim-lint";
flake = false;
};
# Tree-Sitter Grammars # Tree-Sitter Grammars
tree-sitter-bash = { tree-sitter-bash = {
@ -180,15 +176,14 @@
proton-ge = { proton-ge = {
# https://github.com/GloriousEggroll/proton-ge-custom/releases # https://github.com/GloriousEggroll/proton-ge-custom/releases
url = url =
"https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton9-2/GE-Proton9-2.tar.gz"; "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-25/GE-Proton8-25.tar.gz";
flake = false; flake = false;
}; };
# Firefox addon from outside the extension store # Firefox addon from outside the extension store
bypass-paywalls-clean = { bypass-paywalls-clean = {
# https://gitlab.com/magnolia1234/bpc-uploads/-/commits/master/?ref_type=HEADS # https://gitlab.com/magnolia1234/bpc-uploads/-/commits/master/?ref_type=HEADS
url = url = "gitlab:magnolia1234/bpc-uploads";
"git+https://git.masu.rs/noah/bpc-uploads"; # temporary, shouldn't rely on myself
flake = false; flake = false;
}; };
@ -238,9 +233,7 @@
hostnames = { hostnames = {
git = "git.${baseName}"; git = "git.${baseName}";
influxdb = "influxdb.${baseName}"; influxdb = "influxdb.${baseName}";
irc = "irc.${baseName}";
metrics = "metrics.${baseName}"; metrics = "metrics.${baseName}";
minecraft = "minecraft.${baseName}";
prometheus = "prom.${baseName}"; prometheus = "prom.${baseName}";
paperless = "paper.${baseName}"; paperless = "paper.${baseName}";
secrets = "vault.${baseName}"; secrets = "vault.${baseName}";
@ -248,7 +241,6 @@
content = "cloud.${baseName}"; content = "cloud.${baseName}";
books = "books.${baseName}"; books = "books.${baseName}";
download = "download.${baseName}"; download = "download.${baseName}";
transmission = "transmission.${baseName}";
}; };
}; };
@ -282,7 +274,6 @@
# Contains my full system builds, including home-manager # Contains my full system builds, including home-manager
# nixos-rebuild switch --flake .#tempest # nixos-rebuild switch --flake .#tempest
nixosConfigurations = { nixosConfigurations = {
arrow = import ./hosts/arrow { inherit inputs globals overlays; };
tempest = import ./hosts/tempest { inherit inputs globals overlays; }; tempest = import ./hosts/tempest { inherit inputs globals overlays; };
hydra = import ./hosts/hydra { inherit inputs globals overlays; }; hydra = import ./hosts/hydra { inherit inputs globals overlays; };
flame = import ./hosts/flame { inherit inputs globals overlays; }; flame = import ./hosts/flame { inherit inputs globals overlays; };
@ -309,8 +300,6 @@
diskoConfigurations = { root = import ./disks/root.nix; }; diskoConfigurations = { root = import ./disks/root.nix; };
packages = let packages = let
arrow = system:
import ./hosts/arrow { inherit inputs globals overlays system; };
aws = system: aws = system:
import ./hosts/aws { inherit inputs globals overlays system; }; import ./hosts/aws { inherit inputs globals overlays system; };
staff = system: staff = system:
@ -322,18 +311,8 @@
colors = (import ./colorscheme/gruvbox-dark).dark; colors = (import ./colorscheme/gruvbox-dark).dark;
}; };
in { in {
x86_64-linux.arrow = arrow "x86_64-linux";
x86_64-linux.aws = aws "x86_64-linux"; x86_64-linux.aws = aws "x86_64-linux";
x86_64-linux.staff = staff "x86_64-linux"; x86_64-linux.staff = staff "x86_64-linux";
x86_64-linux.image = {
arrow = inputs.nixos-generators.nixosGenerate {
system = "x86_64-linux";
format = "iso";
modules = import ./hosts/arrow/modules.nix {
inherit inputs globals overlays;
};
};
};
# Package Neovim config into standalone package # Package Neovim config into standalone package
x86_64-linux.neovim = neovim "x86_64-linux"; x86_64-linux.neovim = neovim "x86_64-linux";
@ -354,46 +333,28 @@
# Used to run commands and edit files in this repo # Used to run commands and edit files in this repo
default = pkgs.mkShell { default = pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [ git stylua nixfmt shfmt shellcheck ];
git
stylua
nixfmt-rfc-style
shfmt
shellcheck
];
}; };
}
);
checks = forAllSystems ( });
system:
let
pkgs = import nixpkgs { inherit system overlays; };
in
{
neovim =
pkgs.runCommand "neovim-check-health" { buildInputs = [ inputs.self.packages.${system}.neovim ]; }
''
mkdir -p $out
export HOME=$TMPDIR
nvim -c "checkhealth" -c "write $out/health.log" -c "quitall"
# Check for errors inside the health log checks = forAllSystems (system:
if $(grep "ERROR" $out/health.log); then let pkgs = import nixpkgs { inherit system overlays; };
cat $out/health.log in {
exit 1 neovim = pkgs.runCommand "neovim-check-health" {
fi buildInputs = [ inputs.self.packages.${system}.neovim ];
''; } ''
} mkdir -p $out
); export HOME=$TMPDIR
nvim -c "checkhealth" -c "write $out/health.log" -c "quitall"
formatter = forAllSystems ( # Check for errors inside the health log
system: if $(grep "ERROR" $out/health.log); then
let cat $out/health.log
pkgs = import nixpkgs { inherit system overlays; }; exit 1
in fi
pkgs.nixfmt-rfc-style '';
); });
# Templates for starting other projects quickly # Templates for starting other projects quickly
templates = rec { templates = rec {
@ -414,10 +375,6 @@
path = ./templates/haskell; path = ./templates/haskell;
description = "Haskell template"; description = "Haskell template";
}; };
rust = {
path = ./templates/rust;
description = "Rust template";
};
}; };
}; };

View File

@ -1,26 +0,0 @@
{
inputs,
globals,
overlays,
...
}:
inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { };
modules = import ./modules.nix { inherit inputs globals overlays; } ++ [
{
# This is the root filesystem containing NixOS
fileSystems."/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
};
# This is the boot filesystem for Grub
fileSystems."/boot" = {
device = "/dev/disk/by-label/boot";
fsType = "vfat";
};
}
];
}

View File

@ -1,99 +0,0 @@
terraform {
backend "s3" {
bucket = "noahmasur-terraform"
key = "arrow.tfstate"
region = "auto"
skip_credentials_validation = true
skip_metadata_api_check = true
skip_region_validation = true
skip_requesting_account_id = true
skip_s3_checksum = true
use_path_style = true
/*
ENVIRONMENT VARIABLES
---------------------
AWS_ACCESS_KEY_ID - R2 token
AWS_SECRET_ACCESS_KEY - R2 secret
AWS_ENDPOINT_URL_S3 - R2 location: https://ACCOUNT_ID.r2.cloudflarestorage.com
*/
}
required_version = ">= 1.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.42.0"
}
vultr = {
source = "vultr/vultr"
version = "2.19.0"
}
}
}
# locals {
# image_file = one(fileset(path.root, "result/iso/nixos.iso"))
# }
# variable "cloudflare_r2_endpoint" {
# type = string
# description = "Domain for the Cloudflare R2 endpoint"
# }
variable "vultr_api_key" {
type = string
description = "API key for Vultr management"
sensitive = true
}
# https://api.vultr.com/v2/plans
variable "vultr_plan" {
type = string
description = "Size of instance to launch"
default = "vc2-1c-2gb" # 55 GB SSD ($10/mo)
}
provider "aws" {
region = "auto"
skip_credentials_validation = true
skip_metadata_api_check = true
skip_region_validation = true
skip_requesting_account_id = true
}
provider "vultr" {
api_key = var.vultr_api_key
}
# data "aws_s3_bucket" "images" {
# bucket = "noahmasur-arrow-images"
# }
#
# resource "aws_s3_object" "image" {
# bucket = data.aws_s3_bucket.images.id
# key = "arrow.iso"
# source = local.image_file
# etag = filemd5(local.image_file)
# acl = "public-read"
# }
resource "vultr_iso_private" "image" {
# url = "https://${var.cloudflare_account_id}.r2.cloudflarestorage.com/${data.aws_s3_bucket.images.id}/${aws_s3_object.image.key}"
url = "https://arrow-images.masu.rs/arrow.iso"
}
resource "vultr_instance" "arrow" {
plan = var.vultr_plan
region = "ewr"
iso_id = vultr_iso_private.image.id
label = "arrow"
tags = ["arrow"]
enable_ipv6 = false
disable_public_ipv4 = false
backups = "disabled"
ddos_protection = false
activation_email = false
}
output "host_ip" {
value = vultr_instance.arrow.main_ip
}

View File

@ -1,42 +0,0 @@
{
inputs,
globals,
overlays,
}:
[
globals
inputs.home-manager.nixosModules.home-manager
{
nixpkgs.overlays = overlays;
networking.hostName = "arrow";
physical = false;
server = true;
gui.enable = false;
theme.colors = (import ../../colorscheme/gruvbox).dark;
publicKeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s personal"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKpPU2G9rSF8Q6waH62IJexDCQ6lY+8ZyVufGE3xMDGw deploy"
];
identityFile = "/home/${globals.user}/.ssh/id_ed25519";
cloudflare.enable = true;
services.openssh.enable = true;
services.caddy.enable = true;
services.transmission.enable = true;
# nix-index seems to each up too much memory for Vultr
home-manager.users.${globals.user}.programs.nix-index.enable = inputs.nixpkgs.lib.mkForce false;
virtualisation.vmVariant = {
virtualisation.forwardPorts = [
{
from = "host";
host.port = 2222;
guest.port = 22;
}
];
};
}
../../modules/common
../../modules/nixos
]

View File

@ -1,41 +1,27 @@
{ { inputs, system, globals, overlays, ... }:
inputs,
system,
globals,
overlays,
...
}:
inputs.nixos-generators.nixosGenerate { inputs.nixos-generators.nixosGenerate {
inherit system; inherit system;
format = "amazon"; format = "amazon";
modules = modules = [
[ globals
globals inputs.home-manager.nixosModules.home-manager
inputs.home-manager.nixosModules.home-manager {
{ nixpkgs.overlays = overlays;
nixpkgs.overlays = overlays; networking.hostName = "sheep";
networking.hostName = "sheep"; gui.enable = false;
gui.enable = false; theme.colors = (import ../../colorscheme/gruvbox).dark;
theme.colors = (import ../../colorscheme/gruvbox).dark; passwordHash = null;
passwordHash = null; publicKey =
publicKeys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s";
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s personal" # AWS settings require this
]; permitRootLogin = "prohibit-password";
# AWS settings require this }
permitRootLogin = "prohibit-password"; ../../modules/common
} ../../modules/nixos
../../modules/common ../../modules/nixos/services/sshd.nix
../../modules/nixos ] ++ [
../../modules/nixos/services/sshd.nix # Required to fix diskSize errors during build
] ({ ... }: { amazonImage.sizeMB = 16 * 1024; })
++ [ ];
# Required to fix diskSize errors during build
(
{ ... }:
{
amazonImage.sizeMB = 16 * 1024;
}
)
];
} }

View File

@ -7,12 +7,7 @@
# https://blog.korfuri.fr/posts/2022/08/nixos-on-an-oracle-free-tier-ampere-machine/ # https://blog.korfuri.fr/posts/2022/08/nixos-on-an-oracle-free-tier-ampere-machine/
# These days, probably use nixos-anywhere instead. # These days, probably use nixos-anywhere instead.
{ { inputs, globals, overlays, ... }:
inputs,
globals,
overlays,
...
}:
inputs.nixpkgs.lib.nixosSystem { inputs.nixpkgs.lib.nixosSystem {
system = "aarch64-linux"; system = "aarch64-linux";
@ -31,11 +26,7 @@ inputs.nixpkgs.lib.nixosSystem {
# Not sure what's necessary but too afraid to remove anything # Not sure what's necessary but too afraid to remove anything
imports = [ (inputs.nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") ]; imports = [ (inputs.nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") ];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [ "xhci_pci" "virtio_pci" "usbhid" ];
"xhci_pci"
"virtio_pci"
"usbhid"
];
# File systems must be declared in order to boot # File systems must be declared in order to boot
@ -58,9 +49,7 @@ inputs.nixpkgs.lib.nixosSystem {
gui.enable = false; gui.enable = false;
# Still require colors for programs like Neovim, K9S # Still require colors for programs like Neovim, K9S
theme = { theme = { colors = (import ../../colorscheme/gruvbox).dark; };
colors = (import ../../colorscheme/gruvbox).dark;
};
# Programs and services # Programs and services
atuin.enable = true; atuin.enable = true;
@ -70,7 +59,6 @@ inputs.nixpkgs.lib.nixosSystem {
giteaRunner.enable = true; giteaRunner.enable = true;
services.caddy.enable = true; services.caddy.enable = true;
services.grafana.enable = true; services.grafana.enable = true;
services.thelounge.enable = true;
services.openssh.enable = true; services.openssh.enable = true;
services.victoriametrics.enable = true; services.victoriametrics.enable = true;
services.influxdb2.enable = true; services.influxdb2.enable = true;
@ -83,7 +71,8 @@ inputs.nixpkgs.lib.nixosSystem {
enable = true; enable = true;
id = "bd250ee1-ed2e-42d2-b627-039f1eb5a4d2"; id = "bd250ee1-ed2e-42d2-b627-039f1eb5a4d2";
credentialsFile = ../../private/cloudflared-flame.age; credentialsFile = ../../private/cloudflared-flame.age;
ca = "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK/6oyVqjFGX3Uvrc3VS8J9sphxzAnRzKC85xgkHfYgR3TK6qBGXzHrknEj21xeZrr3G2y1UsGzphWJd9ZfIcdA= open-ssh-ca@cloudflareaccess.org"; ca =
"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK/6oyVqjFGX3Uvrc3VS8J9sphxzAnRzKC85xgkHfYgR3TK6qBGXzHrknEj21xeZrr3G2y1UsGzphWJd9ZfIcdA= open-ssh-ca@cloudflareaccess.org";
}; };
# Nextcloud backup config # Nextcloud backup config
@ -94,9 +83,8 @@ inputs.nixpkgs.lib.nixosSystem {
}; };
# Disable passwords, only use SSH key # Disable passwords, only use SSH key
publicKeys = [ publicKey =
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s personal" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s";
];
# # Wireguard config for Transmission # # Wireguard config for Transmission
# wireguard.enable = true; # wireguard.enable = true;
@ -126,6 +114,7 @@ inputs.nixpkgs.lib.nixosSystem {
# # VPN port forwarding # # VPN port forwarding
# services.transmission.settings.peer-port = 57599; # services.transmission.settings.peer-port = 57599;
} }
]; ];
} }

View File

@ -3,12 +3,7 @@
# See [readme](../README.md) to explain how this file works. # See [readme](../README.md) to explain how this file works.
{ { inputs, globals, overlays, ... }:
inputs,
globals,
overlays,
...
}:
inputs.nixpkgs.lib.nixosSystem { inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
@ -37,7 +32,8 @@ inputs.nixpkgs.lib.nixosSystem {
startMenuLaunchers = true; startMenuLaunchers = true;
nativeSystemd = true; nativeSystemd = true;
wslConf.network.generateResolvConf = true; # Turn off if it breaks VPN wslConf.network.generateResolvConf = true; # Turn off if it breaks VPN
interop.includePath = false; # Including Windows PATH will slow down Neovim command mode interop.includePath =
false; # Including Windows PATH will slow down Neovim command mode
}; };
neovim.enable = true; neovim.enable = true;

View File

@ -1,12 +1,7 @@
# The Looking Glass # The Looking Glass
# System configuration for my work Macbook # System configuration for my work Macbook
{ { inputs, globals, overlays, ... }:
inputs,
globals,
overlays,
...
}:
inputs.darwin.lib.darwinSystem { inputs.darwin.lib.darwinSystem {
system = "aarch64-darwin"; system = "aarch64-darwin";
@ -14,14 +9,11 @@ inputs.darwin.lib.darwinSystem {
modules = [ modules = [
../../modules/common ../../modules/common
../../modules/darwin ../../modules/darwin
( (globals // rec {
globals user = "Noah.Masur";
// rec { gitName = "Noah-Masur_1701";
user = "Noah.Masur"; gitEmail = "${user}@take2games.com";
gitName = "Noah-Masur_1701"; })
gitEmail = "${user}@take2games.com";
}
)
inputs.home-manager.darwinModules.home-manager inputs.home-manager.darwinModules.home-manager
{ {
nixpkgs.overlays = [ inputs.firefox-darwin.overlay ] ++ overlays; nixpkgs.overlays = [ inputs.firefox-darwin.overlay ] ++ overlays;

View File

@ -1,53 +1,43 @@
# The Staff # The Staff
# ISO configuration for my USB drive # ISO configuration for my USB drive
{ { inputs, system, overlays, ... }:
inputs,
system,
overlays,
...
}:
inputs.nixos-generators.nixosGenerate { inputs.nixos-generators.nixosGenerate {
inherit system; inherit system;
format = "install-iso"; format = "install-iso";
modules = [ modules = [{
{ nixpkgs.overlays = overlays;
nixpkgs.overlays = overlays; networking.hostName = "staff";
networking.hostName = "staff"; users.extraUsers.root.openssh.authorizedKeys.keys = [
users.extraUsers.root.openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s" ];
]; services.openssh = {
services.openssh = { enable = true;
enable = true; ports = [ 22 ];
ports = [ 22 ]; allowSFTP = true;
allowSFTP = true; settings = {
settings = { GatewayPorts = "no";
GatewayPorts = "no"; X11Forwarding = false;
X11Forwarding = false; PasswordAuthentication = false;
PasswordAuthentication = false; PermitRootLogin = "yes";
PermitRootLogin = "yes";
};
}; };
environment.systemPackages = };
let environment.systemPackages =
pkgs = import inputs.nixpkgs { inherit system overlays; }; let pkgs = import inputs.nixpkgs { inherit system overlays; };
in in with pkgs; [
with pkgs; git
[ vim
git wget
vim curl
wget (import ../../modules/common/neovim/package {
curl inherit pkgs;
(import ../../modules/common/neovim/package { colors = (import ../../colorscheme/gruvbox).dark;
inherit pkgs; })
colors = (import ../../colorscheme/gruvbox).dark; ];
}) nix.extraOptions = ''
]; experimental-features = nix-command flakes
nix.extraOptions = '' warn-dirty = false
experimental-features = nix-command flakes '';
warn-dirty = false }];
'';
}
];
} }

View File

@ -3,12 +3,7 @@
# See [readme](../README.md) to explain how this file works. # See [readme](../README.md) to explain how this file works.
{ { inputs, globals, overlays, ... }:
inputs,
globals,
overlays,
...
}:
inputs.nixpkgs.lib.nixosSystem { inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
@ -28,13 +23,8 @@ inputs.nixpkgs.lib.nixosSystem {
networking.hostName = "swan"; networking.hostName = "swan";
# Not sure what's necessary but too afraid to remove anything # Not sure what's necessary but too afraid to remove anything
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules =
"xhci_pci" [ "xhci_pci" "ahci" "nvme" "usb_storage" "sd_mod" ];
"ahci"
"nvme"
"usb_storage"
"sd_mod"
];
# Required for transcoding # Required for transcoding
boot.initrd.kernelModules = [ "amdgpu" ]; boot.initrd.kernelModules = [ "amdgpu" ];
@ -66,18 +56,8 @@ inputs.nixpkgs.lib.nixosSystem {
devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; }); devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
}; };
boot.zfs = { # Automatically load the ZFS pool on boot
# Automatically load the ZFS pool on boot boot.zfs.extraPools = [ "tank" ];
extraPools = [ "tank" ];
# Only try to decrypt datasets with keyfiles
requestEncryptionCredentials = [
"tank/archive"
"tank/generic"
"tank/nextcloud"
];
# If password is requested and fails, continue to boot eventually
passwordTimeout = 300;
};
# Theming # Theming
@ -85,9 +65,7 @@ inputs.nixpkgs.lib.nixosSystem {
gui.enable = false; gui.enable = false;
# Still require colors for programs like Neovim, K9S # Still require colors for programs like Neovim, K9S
theme = { theme = { colors = (import ../../colorscheme/gruvbox).dark; };
colors = (import ../../colorscheme/gruvbox).dark;
};
# Programs and services # Programs and services
atuin.enable = true; atuin.enable = true;
@ -112,7 +90,8 @@ inputs.nixpkgs.lib.nixosSystem {
enable = true; enable = true;
id = "646754ac-2149-4a58-b51a-e1d0a1f3ade2"; id = "646754ac-2149-4a58-b51a-e1d0a1f3ade2";
credentialsFile = ../../private/cloudflared-swan.age; credentialsFile = ../../private/cloudflared-swan.age;
ca = "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCHF/UMtJqPFrf6f6GRY0ZFnkCW7b6sYgUTjTtNfRj1RdmNic1NoJZql7y6BrqQinZvy7nsr1UFDNWoHn6ah3tg= open-ssh-ca@cloudflareaccess.org"; ca =
"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCHF/UMtJqPFrf6f6GRY0ZFnkCW7b6sYgUTjTtNfRj1RdmNic1NoJZql7y6BrqQinZvy7nsr1UFDNWoHn6ah3tg= open-ssh-ca@cloudflareaccess.org";
}; };
# Send regular backups and litestream for DBs to an S3-like bucket # Send regular backups and litestream for DBs to an S3-like bucket
@ -123,9 +102,8 @@ inputs.nixpkgs.lib.nixosSystem {
}; };
# Disable passwords, only use SSH key # Disable passwords, only use SSH key
publicKeys = [ publicKey =
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s personal" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s";
];
} }
]; ];
} }

View File

@ -3,12 +3,7 @@
# See [readme](../README.md) to explain how this file works. # See [readme](../README.md) to explain how this file works.
{ { inputs, globals, overlays, ... }:
inputs,
globals,
overlays,
...
}:
inputs.nixpkgs.lib.nixosSystem { inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
@ -25,14 +20,8 @@ inputs.nixpkgs.lib.nixosSystem {
networking.hostName = "tempest"; networking.hostName = "tempest";
# Not sure what's necessary but too afraid to remove anything # Not sure what's necessary but too afraid to remove anything
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules =
"nvme" [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ];
"xhci_pci"
"ahci"
"usb_storage"
"usbhid"
"sd_mod"
];
# Graphics and VMs # Graphics and VMs
boot.initrd.kernelModules = [ "amdgpu" ]; boot.initrd.kernelModules = [ "amdgpu" ];
@ -114,7 +103,6 @@ inputs.nixpkgs.lib.nixosSystem {
mullvad.enable = false; mullvad.enable = false;
nixlang.enable = true; nixlang.enable = true;
rust.enable = true; rust.enable = true;
terraform.enable = true;
yt-dlp.enable = true; yt-dlp.enable = true;
gaming = { gaming = {
dwarf-fortress.enable = true; dwarf-fortress.enable = true;
@ -122,23 +110,27 @@ inputs.nixpkgs.lib.nixosSystem {
steam.enable = true; steam.enable = true;
legendary.enable = true; legendary.enable = true;
lutris.enable = true; lutris.enable = true;
leagueoflegends.enable = true;
ryujinx.enable = true; ryujinx.enable = true;
}; };
services.vmagent.enable = true; # Enables Prometheus metrics services.vmagent.enable = true; # Enables Prometheus metrics
services.openssh.enable = true; # Required for Cloudflare tunnel and identity file services.openssh.enable =
true; # Required for Cloudflare tunnel and identity file
# Allows private remote access over the internet # Allows private remote access over the internet
cloudflareTunnel = { cloudflareTunnel = {
enable = true; enable = true;
id = "ac133a82-31fb-480c-942a-cdbcd4c58173"; id = "ac133a82-31fb-480c-942a-cdbcd4c58173";
credentialsFile = ../../private/cloudflared-tempest.age; credentialsFile = ../../private/cloudflared-tempest.age;
ca = "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPY6C0HmdFCaxYtJxFr3qV4/1X4Q8KrYQ1hlme3u1hJXK+xW+lc9Y9glWHrhiTKilB7carYTB80US0O47gI5yU4= open-ssh-ca@cloudflareaccess.org"; ca =
"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPY6C0HmdFCaxYtJxFr3qV4/1X4Q8KrYQ1hlme3u1hJXK+xW+lc9Y9glWHrhiTKilB7carYTB80US0O47gI5yU4= open-ssh-ca@cloudflareaccess.org";
}; };
# Allows requests to force machine to wake up # Allows requests to force machine to wake up
# This network interface might change, needs to be set specifically for each machine. # This network interface might change, needs to be set specifically for each machine.
# Or set usePredictableInterfaceNames = false # Or set usePredictableInterfaceNames = false
networking.interfaces.enp5s0.wakeOnLan.enable = true; networking.interfaces.enp5s0.wakeOnLan.enable = true;
} }
]; ];
} }

View File

@ -4,4 +4,3 @@ ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHVknmPi7sG6ES0G0jcsvebzKGWWaMfJTYgvOue6EULI flame ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHVknmPi7sG6ES0G0jcsvebzKGWWaMfJTYgvOue6EULI flame
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ9mwXlZnIALt9SnH3FOZvdgHLM5ZqwYUERXBbM7Rwh6 swan ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ9mwXlZnIALt9SnH3FOZvdgHLM5ZqwYUERXBbM7Rwh6 swan
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC3yHivgEXr2ecwe58h9bkhwTYivf3GwL8xenQKMeiUb tempest ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC3yHivgEXr2ecwe58h9bkhwTYivf3GwL8xenQKMeiUb tempest
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICmGHIWBZzRx35/yFgnPJSHN2+35WJ30G9c5tDhPsCrl arrow

View File

@ -16,6 +16,7 @@
unfreePackages = [ unfreePackages = [
(lib.mkIf config._1password.enable "onepassword-password-manager") (lib.mkIf config._1password.enable "onepassword-password-manager")
"okta-browser-plugin" "okta-browser-plugin"
"wappalyzer"
]; ];
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
@ -40,10 +41,12 @@
okta-browser-plugin okta-browser-plugin
reddit-enhancement-suite reddit-enhancement-suite
return-youtube-dislikes return-youtube-dislikes
snowflake
sponsorblock sponsorblock
ublock-origin ublock-origin
ublacklist ublacklist
vimium vimium
wappalyzer
]; ];
settings = { settings = {
"app.update.auto" = false; "app.update.auto" = false;
@ -163,11 +166,6 @@
}; };
xdg.mimeApps = {
associations.added = { "text.html" = [ "firefox.desktop" ]; };
defaultApplications = { "text.html" = [ "firefox.desktop" ]; };
};
xsession.windowManager.i3.config.keybindings = xsession.windowManager.i3.config.keybindings =
lib.mkIf pkgs.stdenv.isLinux { lib.mkIf pkgs.stdenv.isLinux {
"${ "${

View File

@ -57,7 +57,7 @@
allow_remote_control = "socket-only"; allow_remote_control = "socket-only";
listen_on = "unix:/tmp/kitty"; listen_on = "unix:/tmp/kitty";
action_alias = action_alias =
"kitty_scrollback_nvim kitten ${pkgs.vimPlugins.kitty-scrollback-nvim}/python/kitty_scrollback_nvim.py"; "kitty_scrollback_nvim kitten ${pkgs.kitty-scrollback-nvim}/python/kitty_scrollback_nvim.py";
# Colors (adapted from: https://github.com/kdrag0n/base16-kitty/blob/master/templates/default-256.mustache) # Colors (adapted from: https://github.com/kdrag0n/base16-kitty/blob/master/templates/default-256.mustache)
background = config.theme.colors.base00; background = config.theme.colors.base00;
@ -103,8 +103,8 @@
color21 = config.theme.colors.base06; color21 = config.theme.colors.base06;
# Scrollback # Scrollback
scrollback_lines = 10000; scrolling_lines = 10000;
scrollback_pager_history_size = 300; # MB scrollback_pager_history_size = 10; # MB
# Window # Window
window_padding_width = 6; window_padding_width = 6;

View File

@ -75,10 +75,6 @@
type = lib.types.str; type = lib.types.str;
description = "Hostname for metrics server."; description = "Hostname for metrics server.";
}; };
minecraft = lib.mkOption {
type = lib.types.str;
description = "Hostname for Minecraft server.";
};
paperless = lib.mkOption { paperless = lib.mkOption {
type = lib.types.str; type = lib.types.str;
description = "Hostname for document server (paperless-ngx)."; description = "Hostname for document server (paperless-ngx).";
@ -111,20 +107,44 @@
type = lib.types.str; type = lib.types.str;
description = "Hostname for download services."; description = "Hostname for download services.";
}; };
irc = lib.mkOption {
type = lib.types.str;
description = "Hostname for IRC services.";
};
transmission = lib.mkOption {
type = lib.types.str;
description = "Hostname for peer2peer downloads (Transmission).";
};
}; };
}; };
config = let stateVersion = "23.05"; config = let stateVersion = "23.05";
in { in {
nix = {
# Enable features in Nix commands
extraOptions = ''
experimental-features = nix-command flakes
warn-dirty = false
'';
gc = {
automatic = true;
options = "--delete-older-than 7d";
};
settings = {
# Add community Cachix to binary cache
# Don't use with macOS because blocked by corporate firewall
builders-use-substitutes = true;
substituters = lib.mkIf (!pkgs.stdenv.isDarwin)
[ "https://nix-community.cachix.org" ];
trusted-public-keys = lib.mkIf (!pkgs.stdenv.isDarwin) [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
# Scans and hard links identical files in the store
# Not working with macOS: https://github.com/NixOS/nix/issues/7273
auto-optimise-store = lib.mkIf (!pkgs.stdenv.isDarwin) true;
};
};
# Basic common system packages for all devices # Basic common system packages for all devices
environment.systemPackages = with pkgs; [ git vim wget curl ]; environment.systemPackages = with pkgs; [ git vim wget curl ];

View File

@ -176,7 +176,6 @@
extraAccounts = { extraAccounts = {
check-mail = "5m"; check-mail = "5m";
check-mail-cmd = "${pkgs.isync}/bin/mbsync -a"; check-mail-cmd = "${pkgs.isync}/bin/mbsync -a";
check-mail-timeout = "15s";
}; };
}; };

View File

@ -9,6 +9,8 @@
programs.himalaya = { enable = true; }; programs.himalaya = { enable = true; };
accounts.email.accounts.home.himalaya = { accounts.email.accounts.home.himalaya = {
enable = true; enable = true;
backend = "imap";
sender = "smtp";
settings = { settings = {
downloads-dir = config.userDirs.download; downloads-dir = config.userDirs.download;
smtp-insecure = true; smtp-insecure = true;

View File

@ -8,7 +8,7 @@
}; };
config = { config = {
plugins = [ pkgs.vimPlugins.base16-nvim ]; plugins = [ pkgs.vimPlugins.nvim-base16 ];
setup.base16-colorscheme = config.colors; setup.base16-colorscheme = config.colors;
# Telescope isn't working, shut off for now # Telescope isn't working, shut off for now

View File

@ -1,112 +1,120 @@
{ pkgs, lib, config, dsl, ... }: { { pkgs, lib, config, dsl, ... }: {
# Terraform optional because non-free # Terraform optional because non-free
options.terraform = lib.mkEnableOption "Whether to enable Terraform LSP";
options.github = lib.mkEnableOption "Whether to enable GitHub features"; options.github = lib.mkEnableOption "Whether to enable GitHub features";
options.kubernetes = options.kubernetes =
lib.mkEnableOption "Whether to enable Kubernetes features"; lib.mkEnableOption "Whether to enable Kubernetes features";
options.python = lib.mkEnableOption "Whether to enable Python LSP";
options.terraform = lib.mkEnableOption "Whether to enable Terraform LSP";
config = { config =
plugins = [
pkgs.vimPlugins.nvim-lspconfig
pkgs.vimPlugins.conform-nvim
pkgs.vimPlugins.fidget-nvim
pkgs.vimPlugins.nvim-lint
];
setup.fidget = { }; let
use.lspconfig.lua_ls.setup = dsl.callWith { terraformFormat = if config.terraform then ''
settings = { Lua = { diagnostics = { globals = [ "vim" "hs" ]; }; }; }; require("null-ls").builtins.formatting.terraform_fmt.with({
capabilities = command = "${pkgs.terraform}/bin/terraform",
dsl.rawLua "require('cmp_nvim_lsp').default_capabilities()"; extra_filetypes = { "hcl" },
cmd = [ "${pkgs.lua-language-server}/bin/lua-language-server" ]; }),
}; '' else
"";
use.lspconfig.nil_ls.setup = dsl.callWith { pythonFormat = if config.python then ''
cmd = [ "${pkgs.nil}/bin/nil" ]; require("null-ls").builtins.formatting.black.with({ command = "${pkgs.black}/bin/black" }),
capabilities = require("null-ls").builtins.diagnostics.ruff.with({ command = "${pkgs.ruff}/bin/ruff" }),
dsl.rawLua "require('cmp_nvim_lsp').default_capabilities()"; '' else
}; "";
use.lspconfig.pyright.setup = dsl.callWith { in {
cmd = [ "${pkgs.pyright}/bin/pyright-langserver" "--stdio" ]; plugins = [
}; pkgs.vimPlugins.nvim-lspconfig
pkgs.vimPlugins.null-ls-nvim
pkgs.vimPlugins.fidget-nvim
];
use.lspconfig.terraformls.setup = dsl.callWith { setup.fidget = { };
cmd = if config.terraform then [
"${pkgs.terraform-ls}/bin/terraform-ls"
"serve"
] else
[ "echo" ];
};
use.lspconfig.rust_analyzer.setup = dsl.callWith { use.lspconfig.lua_ls.setup = dsl.callWith {
cmd = [ "${pkgs.rust-analyzer}/bin/rust-analyzer" ]; settings = { Lua = { diagnostics = { globals = [ "vim" "hs" ]; }; }; };
settings = { capabilities =
"['rust-analyzer']" = { dsl.rawLua "require('cmp_nvim_lsp').default_capabilities()";
check = { command = "clippy"; }; cmd = [ "${pkgs.lua-language-server}/bin/lua-language-server" ];
files = { excludeDirs = [ ".direnv" ]; }; };
use.lspconfig.nil_ls.setup = dsl.callWith {
cmd = [ "${pkgs.nil}/bin/nil" ];
capabilities =
dsl.rawLua "require('cmp_nvim_lsp').default_capabilities()";
};
use.lspconfig.pyright.setup = dsl.callWith {
cmd = if config.python then [
"${pkgs.pyright}/bin/pyright-langserver"
"--stdio"
] else
[ "echo" ];
};
use.lspconfig.terraformls.setup = dsl.callWith {
cmd = if config.terraform then [
"${pkgs.terraform-ls}/bin/terraform-ls"
"serve"
] else
[ "echo" ];
};
use.lspconfig.rust_analyzer.setup = dsl.callWith {
cmd = [ "${pkgs.rust-analyzer}/bin/rust-analyzer" ];
settings = {
"['rust-analyzer']" = { check = { command = "clippy"; }; };
}; };
}; };
vim.api.nvim_create_augroup = dsl.callWith [ "LspFormatting" { } ];
lua = ''
${builtins.readFile ./lsp.lua}
-- Prevent infinite log size (change this when debugging)
vim.lsp.set_log_level("off")
require("null-ls").setup({
sources = {
require("null-ls").builtins.formatting.stylua.with({ command = "${pkgs.stylua}/bin/stylua" }),
require("null-ls").builtins.formatting.fish_indent.with({ command = "${pkgs.fish}/bin/fish_indent" }),
require("null-ls").builtins.formatting.nixfmt.with({ command = "${pkgs.nixfmt}/bin/nixfmt" }),
require("null-ls").builtins.formatting.rustfmt.with({ command = "${pkgs.rustfmt}/bin/rustfmt" }),
require("null-ls").builtins.diagnostics.shellcheck.with({ command = "${pkgs.shellcheck}/bin/shellcheck" }),
require("null-ls").builtins.formatting.shfmt.with({
command = "${pkgs.shfmt}/bin/shfmt",
extra_args = { "-i", "4", "-ci" },
}),
${pythonFormat}
${terraformFormat}
},
on_attach = function(client, bufnr)
if client.supports_method("textDocument/formatting") then
-- Auto-format on save
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
vim.api.nvim_create_autocmd("BufWritePre", {
group = augroup,
buffer = bufnr,
callback = function()
vim.lsp.buf.format({ bufnr = bufnr })
end,
})
-- Use internal formatting for bindings like gq.
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(args)
vim.bo[args.buf].formatexpr = nil
end,
})
end
end,
})
'';
}; };
setup.conform = {
format_on_save = {
# These options will be passed to conform.format()
timeout_ms = 1500;
lsp_fallback = true;
};
formatters_by_ft = {
lua = [ "stylua" ];
python = [ "black" ];
fish = [ "fish_indent" ];
nix = [ "nixfmt" ];
rust = [ "rustfmt" ];
sh = [ "shfmt" ];
terraform = if config.terraform then [ "terraform_fmt" ] else [ ];
hcl = if config.terraform then [ "terraform_fmt" ] else [ ];
};
formatters = {
lua.command = "${pkgs.stylua}/bin/stylua";
black.command = "${pkgs.black}/bin/black";
fish_indent.command = "${pkgs.fish}/bin/fish_indent";
nixfmt.command = "${pkgs.nixfmt-rfc-style}/bin/nixfmt";
rustfmt = {
command = "${pkgs.rustfmt}/bin/rustfmt";
prepend_args = [ "--edition" "2021" ];
};
shfmt = {
command = "${pkgs.shfmt}/bin/shfmt";
prepend_args = [ "-i" "4" "-ci" ];
};
terraform_fmt.command =
if config.terraform then "${pkgs.terraform}/bin/terraform" else "";
};
};
use.lint = {
linters_by_ft = dsl.toTable {
python = [ "ruff" ];
sh = [ "shellcheck" ];
};
};
vim.api.nvim_create_autocmd = dsl.callWith [
(dsl.toTable [ "BufEnter" "BufWritePost" ])
(dsl.rawLua "{ callback = function() require('lint').try_lint() end }")
];
lua = ''
${builtins.readFile ./lsp.lua}
local ruff = require('lint').linters.ruff; ruff.cmd = "${pkgs.ruff}/bin/ruff"
local shellcheck = require('lint').linters.shellcheck; shellcheck.cmd = "${pkgs.shellcheck}/bin/shellcheck"
-- Prevent infinite log size (change this when debugging)
vim.lsp.set_log_level("off")
'';
};
} }

View File

@ -8,7 +8,7 @@
pkgs.vimPlugins.glow-nvim # Markdown preview popup pkgs.vimPlugins.glow-nvim # Markdown preview popup
pkgs.vimPlugins.nvim-colorizer-lua # Hex color previews pkgs.vimPlugins.nvim-colorizer-lua # Hex color previews
pkgs.vimPlugins.which-key-nvim # Keybind helper pkgs.vimPlugins.which-key-nvim # Keybind helper
pkgs.vimPlugins.kitty-scrollback-nvim # Scrollback pager for kitty pkgs.kitty-scrollback-nvim # Scrollback pager for kitty
]; ];
# Initialize some plugins # Initialize some plugins

View File

@ -1,12 +1,12 @@
{ pkgs, lib, ... }: { { pkgs, lib, config, ... }: {
plugins = [ plugins = [
(pkgs.vimPlugins.nvim-treesitter.withPlugins (_plugins: (pkgs.vimPlugins.nvim-treesitter.withPlugins (_plugins:
with pkgs.tree-sitter-grammars; [ with pkgs.tree-sitter-grammars;
[
tree-sitter-bash tree-sitter-bash
tree-sitter-c tree-sitter-c
tree-sitter-fish tree-sitter-fish
tree-sitter-hcl
tree-sitter-ini tree-sitter-ini
tree-sitter-json tree-sitter-json
tree-sitter-lua tree-sitter-lua
@ -14,24 +14,23 @@
tree-sitter-markdown-inline tree-sitter-markdown-inline
tree-sitter-nix tree-sitter-nix
tree-sitter-puppet tree-sitter-puppet
tree-sitter-python
tree-sitter-rasi tree-sitter-rasi
tree-sitter-toml tree-sitter-toml
tree-sitter-vimdoc tree-sitter-vimdoc
tree-sitter-yaml tree-sitter-yaml
])) ] ++ (if config.python.enable then [ tree-sitter-python ] else [ ])
++ (if config.terraform.enable then [ tree-sitter-hcl ] else [ ])))
pkgs.vimPlugins.vim-matchup # Better % jumping in languages pkgs.vimPlugins.vim-matchup # Better % jumping in languages
pkgs.vimPlugins.playground # Tree-sitter experimenting pkgs.vimPlugins.playground # Tree-sitter experimenting
pkgs.vimPlugins.nginx-vim pkgs.vimPlugins.nginx-vim
pkgs.vimPlugins.vim-helm pkgs.baleia-nvim # Clean ANSI from kitty scrollback
pkgs.vimPlugins.baleia-nvim # Clean ANSI from kitty scrollback # pkgs.hmts-nvim # Tree-sitter injections for home-manager
# pkgs.vimPlugins.hmts-nvim # Tree-sitter injections for home-manager
(pkgs.vimUtils.buildVimPlugin { (pkgs.vimUtils.buildVimPlugin {
pname = "nmasur"; pname = "nmasur";
version = "0.1"; version = "0.1";
src = ../plugin; src = ../plugin;
}) })
]; ] ++ (if config.kubernetes.enable then [ pkgs.vimPlugins.vim-helm ] else [ ]);
setup."nvim-treesitter.configs" = { setup."nvim-treesitter.configs" = {
highlight = { enable = true; }; highlight = { enable = true; };

View File

@ -5,9 +5,11 @@ let
neovim = import ./package { neovim = import ./package {
inherit pkgs; inherit pkgs;
colors = config.theme.colors; colors = config.theme.colors;
terraform = config.terraform.enable; c = config.c.enable;
github = true; github = true;
kubernetes = config.kubernetes.enable; kubernetes = config.kubernetes.enable;
python = config.python.enable;
terraform = config.terraform.enable;
}; };
in { in {

View File

@ -0,0 +1 @@
{ lib, ... }: { options.c.enable = lib.mkEnableOption "C language tools."; }

View File

@ -7,9 +7,12 @@
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
home.packages = with pkgs; [ home.packages = with pkgs; [
nixfmt-rfc-style # Nix file formatter nixfmt # Nix file formatter
nil # Nix language server nil # Nix language server
]; ];
}; };
}; };
} }

View File

@ -31,10 +31,6 @@ STATUS=$?
# because tesseract adds .txt to the given file path anyways. So if we were to # because tesseract adds .txt to the given file path anyways. So if we were to
# specify /tmp/ocr.txt as the file path, tesseract would out the text to # specify /tmp/ocr.txt as the file path, tesseract would out the text to
# /tmp/ocr.txt.txt # /tmp/ocr.txt.txt
cd /tmp || {
echo "Failed to jump to directory."
exit 1
}
tesseract "$IMAGE_FILE" "${TEXT_FILE//\.txt/}" tesseract "$IMAGE_FILE" "${TEXT_FILE//\.txt/}"
# Check if the text was detected by checking number # Check if the text was detected by checking number

View File

@ -12,6 +12,5 @@
./nixpkgs.nix ./nixpkgs.nix
./starship.nix ./starship.nix
./utilities.nix ./utilities.nix
./work.nix
]; ];
} }

View File

@ -18,5 +18,5 @@ bind -M insert \cn 'commandline -r "nix shell nixpkgs#"'
bind -M default \cn 'commandline -r "nix shell nixpkgs#"' bind -M default \cn 'commandline -r "nix shell nixpkgs#"'
bind -M insert \x11F nix-fzf bind -M insert \x11F nix-fzf
bind -M default \x11F nix-fzf bind -M default \x11F nix-fzf
bind -M insert \ch '_atuin_search --filter-mode global' bind -M insert \ch _atuin_search --filter-mode global
bind -M default \ch '_atuin_search --filter-mode global' bind -M default \ch _atuin_search --filter-mode global

View File

@ -28,22 +28,11 @@ in {
userName = config.gitName; userName = config.gitName;
userEmail = config.gitEmail; userEmail = config.gitEmail;
extraConfig = { extraConfig = {
core.pager =
"${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight | less -F";
interactive.difffilter =
"${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight";
pager = { branch = "false"; }; pager = { branch = "false"; };
safe = { directory = config.dotfilesPath; }; safe = { directory = config.dotfilesPath; };
pull = { ff = "only"; }; pull = { ff = "only"; };
push = { autoSetupRemote = "true"; }; push = { autoSetupRemote = "true"; };
init = { defaultBranch = "master"; }; init = { defaultBranch = "master"; };
rebase = { autosquash = "true"; };
gpg = {
format = "ssh";
ssh.allowedSignersFile = "~/.config/git/allowed-signers";
};
# commit.gpgsign = true;
# tag.gpgsign = true;
}; };
ignores = [ ".direnv/**" "result" ]; ignores = [ ".direnv/**" "result" ];
includes = [{ includes = [{
@ -56,17 +45,8 @@ in {
# TODO: fix with variables # TODO: fix with variables
xdg.configFile."git/personal".text = '' xdg.configFile."git/personal".text = ''
[user] [user]
name = "${config.fullName}" name = "Noah Masur"
email = "7386960+nmasur@users.noreply.github.com" email = "7386960+nmasur@users.noreply.github.com"
signingkey = ~/.ssh/id_ed25519
[commit]
gpgsign = true
[tag]
gpgsign = true
'';
xdg.configFile."git/allowed-signers".text = ''
7386960+nmasur@users.noreply.github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s
''; '';
programs.fish.shellAbbrs = { programs.fish.shellAbbrs = {

View File

@ -48,7 +48,7 @@
esac esac
selected=$(gh repo list "$organization" \ selected=$(gh repo list "$organization" \
--limit 100 \ --limit 50 \
--no-archived \ --no-archived \
--json=name,description,isPrivate,updatedAt,primaryLanguage \ --json=name,description,isPrivate,updatedAt,primaryLanguage \
| jq -r '.[] | .name + "," + if .description == "" then "-" else .description |= gsub(","; " ") | .description end + "," + .updatedAt + "," + .primaryLanguage.name' \ | jq -r '.[] | .name + "," + if .description == "" then "-" else .description |= gsub(","; " ") | .description end + "," + .updatedAt + "," + .primaryLanguage.name' \

View File

@ -4,6 +4,7 @@
home-manager.users.${config.user}.programs.jujutsu = { home-manager.users.${config.user}.programs.jujutsu = {
enable = true; enable = true;
enableFishIntegration = true;
# https://github.com/martinvonz/jj/blob/main/docs/config.md # https://github.com/martinvonz/jj/blob/main/docs/config.md
settings = { settings = {

View File

@ -72,12 +72,6 @@
fi fi
''); '');
# Set automatic generation cleanup for home-manager
nix.gc = {
automatic = config.nix.gc.automatic;
options = config.nix.gc.options;
};
}; };
nix = { nix = {
@ -94,34 +88,6 @@
# For security, only allow specific users # For security, only allow specific users
settings.allowed-users = [ "@wheel" config.user ]; settings.allowed-users = [ "@wheel" config.user ];
# Enable features in Nix commands
extraOptions = ''
experimental-features = nix-command flakes
warn-dirty = false
'';
gc = {
automatic = true;
options = "--delete-older-than 10d";
};
settings = {
# Add community Cachix to binary cache
# Don't use with macOS because blocked by corporate firewall
builders-use-substitutes = true;
substituters =
lib.mkIf (!pkgs.stdenv.isDarwin) [ "https://nix-community.cachix.org" ];
trusted-public-keys = lib.mkIf (!pkgs.stdenv.isDarwin) [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
# Scans and hard links identical files in the store
# Not working with macOS: https://github.com/NixOS/nix/issues/7273
auto-optimise-store = lib.mkIf (!pkgs.stdenv.isDarwin) true;
};
}; };
} }

View File

@ -20,8 +20,6 @@ in {
home.packages = with pkgs; [ home.packages = with pkgs; [
age # Encryption age # Encryption
bc # Calculator bc # Calculator
delta # Fancy diffs
difftastic # Other fancy diffs
dig # DNS lookup dig # DNS lookup
fd # find fd # find
htop # Show system processes htop # Show system processes

View File

@ -1,46 +0,0 @@
{ config, pkgs, lib, ... }:
{
home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
home.packages = let
ldap_scheme = "ldaps";
magic_number = "2";
magic_end_seq = "corp";
magic_prefix = "take";
ldap_host =
"${magic_prefix}${magic_number}.t${magic_number}.${magic_end_seq}";
ldap_port = 636;
ldap_dc_1 = "${magic_prefix}${magic_number}";
ldap_dc_2 = "t${magic_number}";
ldap_dc_3 = magic_end_seq;
ldap_script = pkgs.writeShellScriptBin "ldap" ''
# if ! [ "$LDAP_HOST" ]; then
# echo "No LDAP_HOST specified!"
# exit 1
# fi
SEARCH_FILTER="$@"
ldapsearch -LLL \
-B -o ldif-wrap=no \
-H "${ldap_scheme}://${ldap_host}:${builtins.toString ldap_port}" \
-D "${pkgs.lib.toUpper magic_prefix}${magic_number}\\${
pkgs.lib.toLower config.user
}" \
-w "$(${pkgs._1password}/bin/op item get T${magic_number} --fields label=password)" \
-b "DC=${ldap_dc_1},DC=${ldap_dc_2},DC=${ldap_dc_3}" \
-s "sub" -x "(cn=$SEARCH_FILTER)" \
| jq --slurp \
--raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
'';
ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
'';
ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
${ldap_script}/bin/ldap "$@" | jq '[ .[].member] | add'
'';
in [ ldap_script ldapm_script ldapg_script ];
};
}

View File

@ -16,7 +16,6 @@
firefox = "${pkgs.firefox-bin}/Applications/Firefox.app"; firefox = "${pkgs.firefox-bin}/Applications/Firefox.app";
discord = "${pkgs.discord}/Applications/Discord.app"; discord = "${pkgs.discord}/Applications/Discord.app";
kitty = "${pkgs.kitty}/Applications/kitty.app"; kitty = "${pkgs.kitty}/Applications/kitty.app";
obsidian = "${pkgs.obsidian}/Applications/Obsidian.app";
slack = "${pkgs.slack}/Applications/Slack.app"; slack = "${pkgs.slack}/Applications/Slack.app";
}; };
xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source = xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source =

View File

@ -8,8 +8,24 @@ obj.name = "Launcher"
obj.version = "0.1" obj.version = "0.1"
obj.license = "MIT - https://opensource.org/licenses/MIT" obj.license = "MIT - https://opensource.org/licenses/MIT"
local screen = hs.screen.primaryScreen() local width = hs.screen.mainScreen():fullFrame().w
local switcherWidth = 500 local switcherWidth = 500
obj.canvas = hs.canvas.new({
x = width / 2 - switcherWidth / 2,
y = 1,
h = 3,
w = switcherWidth,
})
-- Draw switcher
obj.canvas[#obj.canvas + 1] = {
action = "build",
type = "rectangle",
}
obj.canvas[#obj.canvas + 1] = {
type = "rectangle",
fillColor = { alpha = 1, red = 0.8, green = 0.6, blue = 0.3 },
action = "fill",
}
function obj:init() function obj:init()
-- Begin launcher mode -- Begin launcher mode
@ -23,29 +39,13 @@ function obj:init()
-- Behaviors on enter -- Behaviors on enter
function self.launcher:entered() function self.launcher:entered()
-- hs.alert("Entered mode") -- hs.alert("Entered mode")
obj.canvas = hs.canvas.new({
x = (screen:fullFrame().x + screen:fullFrame().w) / 2 - switcherWidth / 2,
y = 1,
h = 3,
w = switcherWidth,
})
-- Draw switcher
obj.canvas[#obj.canvas + 1] = {
action = "build",
type = "rectangle",
}
obj.canvas[#obj.canvas + 1] = {
type = "rectangle",
fillColor = { alpha = 1, red = 0.8, green = 0.6, blue = 0.3 },
action = "fill",
}
obj.canvas:show() obj.canvas:show()
end end
-- Behaviors on exit -- Behaviors on exit
function self.launcher:exited() function self.launcher:exited()
-- hs.alert("Exited mode") -- hs.alert("Exited mode")
obj.canvas:delete(0.2) obj.canvas:hide()
end end
-- Use escape to exit launcher mode -- Use escape to exit launcher mode
@ -80,7 +80,7 @@ function obj:init()
self:switch("Messages.app") self:switch("Messages.app")
end) end)
self.launcher:bind("", "O", function() self.launcher:bind("", "O", function()
self:switch("@obsidian@") self:switch("Obsidian.app")
end) end)
self.launcher:bind("", "P", function() self.launcher:bind("", "P", function()
self:switch("System Preferences.app") self:switch("System Preferences.app")

View File

@ -56,7 +56,7 @@ function obj:init()
local frame = win:frame() local frame = win:frame()
-- maximize if possible -- maximize if possible
local max = win:screen():fullFrame() local max = win:screen():fullFrame()
frame.x = (max.x * 2 + max.w) / 2 frame.x = max.w / 2
frame.y = max.y frame.y = max.y
frame.w = max.w / 2 frame.w = max.w / 2
frame.h = max.h frame.h = max.h

View File

@ -51,7 +51,6 @@ local function worklayout()
local laptop = { local laptop = {
{ "Firefox", nil, LAPTOP_MONITOR, u(0, 0, 1, 1), nil, nil, visible = true }, { "Firefox", nil, LAPTOP_MONITOR, u(0, 0, 1, 1), nil, nil, visible = true },
{ "Obsidian", nil, LAPTOP_MONITOR, u(0, 0, 1, 1), nil, nil, visible = true }, { "Obsidian", nil, LAPTOP_MONITOR, u(0, 0, 1, 1), nil, nil, visible = true },
{ "Calendar", nil, LAPTOP_MONITOR, u(0, 0, 1, 1), nil, nil, visible = true },
} }
local layout = concat(left, right, laptop) local layout = concat(left, right, laptop)
hs.layout.apply(layout) hs.layout.apply(layout)

View File

@ -3,6 +3,7 @@
# MacOS-specific settings for Kitty # MacOS-specific settings for Kitty
home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
programs.kitty = { programs.kitty = {
darwinLaunchOptions = [ "--start-as=fullscreen" ];
font.size = lib.mkForce 20; font.size = lib.mkForce 20;
settings = { settings = {
shell = "/run/current-system/sw/bin/fish"; shell = "/run/current-system/sw/bin/fish";

View File

@ -88,21 +88,6 @@
orientation = "bottom"; orientation = "bottom";
show-recents = false; show-recents = false;
tilesize = 44; tilesize = 44;
persistent-apps = [
"/Applications/1Password.app"
"${pkgs.slack}/Applications/Slack.app"
"/System/Applications/Calendar.app"
"${pkgs.firefox-bin}/Applications/Firefox.app"
"/System/Applications/Messages.app"
"/System/Applications/Mail.app"
"/Applications/zoom.us.app"
"${pkgs.discord}/Applications/Discord.app"
"${pkgs.obsidian}/Applications/Obsidian.app"
"${pkgs.kitty}/Applications/kitty.app"
"/System/Applications/System Settings.app"
];
}; };
finder = { finder = {
@ -145,6 +130,22 @@
"com.apple.dock" = { "com.apple.dock" = {
magnification = true; magnification = true;
largesize = 48; largesize = 48;
persistent-apps = let
dockText = app:
"<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>${app}</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>";
in map dockText [
"/Applications/1Password.app"
"${pkgs.slack}/Applications/Slack.app"
"/System/Applications/Calendar.app"
"${pkgs.firefox-bin}/Applications/Firefox.app"
"/System/Applications/Messages.app"
"/System/Applications/Mail.app"
"/Applications/zoom.us.app"
"${pkgs.discord}/Applications/Discord.app"
"${pkgs.obsidian}/Applications/Obsidian.app"
"${pkgs.kitty}/Applications/kitty.app"
"/System/Applications/System Settings.app"
];
}; };
# Require password immediately after screen saver begins # Require password immediately after screen saver begins
"com.apple.screensaver" = { "com.apple.screensaver" = {
@ -191,13 +192,15 @@
''; '';
# User-level settings # User-level settings
activationScripts.postUserActivation.text = '' activationScripts.postUserActivation.text = let
persistentApps = lib.concatMapStrings (x: ''"'' + x + ''" '')
config.system.defaults.CustomUserPreferences."com.apple.dock".persistent-apps;
in ''
echo "Show the ~/Library folder" echo "Show the ~/Library folder"
chflags nohidden ~/Library chflags nohidden ~/Library
echo "Reduce Menu Bar padding" echo "Choose and order dock icons"
defaults write -globalDomain NSStatusItemSelectionPadding -int 6 defaults write com.apple.dock persistent-apps -array ${persistentApps}
defaults write -globalDomain NSStatusItemSpacing -int 6
''; '';
}; };

View File

@ -7,7 +7,7 @@
home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
home.packages = with pkgs; [ home.packages = with pkgs; [
visidata # CSV inspector # visidata # CSV inspector
dos2unix # Convert Windows text files dos2unix # Convert Windows text files
inetutils # Includes telnet inetutils # Includes telnet
youtube-dl # Convert web videos youtube-dl # Convert web videos
@ -16,7 +16,6 @@
mpv # Video player mpv # Video player
gnupg # Encryption gnupg # Encryption
awscli2 awscli2
ssm-session-manager-plugin
awslogs awslogs
google-cloud-sdk google-cloud-sdk
vault-bin vault-bin

View File

@ -36,12 +36,23 @@
# Set Nautilus as default for opening directories # Set Nautilus as default for opening directories
xdg.mimeApps = { xdg.mimeApps = {
associations.added."inode/directory" = [ "org.gnome.Nautilus.desktop" ]; associations.added."inode/directory" = [ "org.gnome.Nautilus.desktop" ];
# associations.removed = {
# "inode/directory" = [ "kitty-open.desktop" ];
# };
defaultApplications."inode/directory" = defaultApplications."inode/directory" =
lib.mkBefore [ "org.gnome.Nautilus.desktop" ]; lib.mkBefore [ "org.gnome.Nautilus.desktop" ];
}; };
}; };
# # Set default for opening directories
# xdg.mime = {
# addedAssociations."inode/directory" = [ "org.gnome.Nautilus.desktop" ];
# removedAssociations = { "inode/directory" = [ "kitty-open.desktop" ]; };
# defaultApplications."inode/directory" =
# lib.mkForce [ "org.gnome.Nautilus.desktop" ];
# };
# Delete Trash files older than 1 week # Delete Trash files older than 1 week
systemd.user.services.empty-trash = { systemd.user.services.empty-trash = {
description = "Empty Trash on a regular basis"; description = "Empty Trash on a regular basis";

View File

@ -3,6 +3,7 @@
imports = [ imports = [
./chiaki.nix ./chiaki.nix
./dwarf-fortress.nix ./dwarf-fortress.nix
./leagueoflegends.nix
./legendary.nix ./legendary.nix
./lutris.nix ./lutris.nix
./minecraft-server.nix ./minecraft-server.nix

View File

@ -0,0 +1,32 @@
{ config, pkgs, lib, ... }: {
options.gaming.leagueoflegends.enable =
lib.mkEnableOption "League of Legends";
config =
lib.mkIf (config.gaming.leagueoflegends.enable && pkgs.stdenv.isLinux) {
# League of Legends anti-cheat requirement
boot.kernel.sysctl = { "abi.vsyscall32" = 0; };
environment.systemPackages = with pkgs; [
# Lutris requirement to install the game
lutris
amdvlk
wineWowPackages.stable
# vulkan-tools
# Required according to https://lutris.net/games/league-of-legends/
openssl
gnome.zenity
# Don't remember if this is required
dconf
];
environment.sessionVariables = { QT_X11_NO_MITSHM = "1"; };
};
}

View File

@ -44,8 +44,6 @@ in {
networking.firewall.allowedTCPPorts = [ publicPort ]; networking.firewall.allowedTCPPorts = [ publicPort ];
cloudflare.noProxyDomains = [ config.hostnames.minecraft ];
## Automatically start and stop Minecraft server based on player connections ## Automatically start and stop Minecraft server based on player connections
# Adapted shamelessly from: # Adapted shamelessly from:

View File

@ -9,14 +9,6 @@
programs.steam = { programs.steam = {
enable = true; enable = true;
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
package = pkgs.steam.override {
# Adapted in part from: https://github.com/Shawn8901/nix-configuration/blob/1c48be94238a9f463cf0bbd1e1842a4454286514/modules/nixos/steam-compat-tools/default.nix
# Based on: https://github.com/NixOS/nixpkgs/issues/73323
extraEnv = {
STEAM_EXTRA_COMPAT_TOOLS_PATHS =
lib.makeBinPath [ pkgs.proton-ge-custom ];
};
};
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
@ -30,6 +22,11 @@
]; ];
# Adapted in part from: https://github.com/Shawn8901/nix-configuration/blob/1c48be94238a9f463cf0bbd1e1842a4454286514/modules/nixos/steam-compat-tools/default.nix
# Based on: https://github.com/NixOS/nixpkgs/issues/73323
environment.sessionVariables.STEAM_EXTRA_COMPAT_TOOLS_PATHS =
lib.makeBinPath [ pkgs.proton-ge-custom ];
# Seems like NetworkManager can help speed up Steam launch # Seems like NetworkManager can help speed up Steam launch
# https://www.reddit.com/r/archlinux/comments/qguhco/steam_startup_time_arch_1451_seconds_fedora_34/hi8opet/ # https://www.reddit.com/r/archlinux/comments/qguhco/steam_startup_time_arch_1451_seconds_fedora_34/hi8opet/
networking.networkmanager.enable = true; networking.networkmanager.enable = true;

View File

@ -141,7 +141,7 @@
format-volume = "<ramp-volume> <label-volume>"; format-volume = "<ramp-volume> <label-volume>";
# format-volume-background = colors.background; # format-volume-background = colors.background;
# label-volume-background = colors.background; # label-volume-background = colors.background;
format-volume-foreground = config.theme.colors.base04; format-volume-foreground = config.theme.colors.base0B;
label-volume = "%percentage%%"; label-volume = "%percentage%%";
label-muted = "󰝟 ---"; label-muted = "󰝟 ---";
label-muted-foreground = config.theme.colors.base03; label-muted-foreground = config.theme.colors.base03;
@ -197,7 +197,7 @@
date = "%d %b %l:%M %p"; date = "%d %b %l:%M %p";
date-alt = "%Y-%m-%d %H:%M:%S"; date-alt = "%Y-%m-%d %H:%M:%S";
label = "%date%"; label = "%date%";
label-foreground = config.theme.colors.base06; label-foreground = config.theme.colors.base0A;
# format-background = colors.background; # format-background = colors.background;
}; };
"module/keyboard" = { "module/keyboard" = {

View File

@ -27,7 +27,7 @@
if keystatus --shift ; then if keystatus --shift ; then
set timeout=-1 set timeout=-1
else else
set timeout=3 set timeout=0
fi fi
''; '';
}; };

View File

@ -1,19 +0,0 @@
{ config, lib, modulesPath, ... }:
{
# options.iso.enable = lib.mkEnableOption "Enable creating as an ISO.";
#
# imports = [ "${toString modulesPath}/installer/cd-dvd/iso-image.nix" ];
# config = lib.mkIf config.iso.enable {
#
# # EFI booting
# isoImage.makeEfiBootable = true;
#
# # USB booting
# isoImage.makeUsbBootable = true;
#
# };
}

View File

@ -1,6 +1,6 @@
{ config, pkgs, lib, ... }: { { config, pkgs, ... }: {
config = lib.mkIf config.physical { config = {
services.xserver = { services.xserver = {

View File

@ -147,9 +147,6 @@ in {
} }
]; ];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.download ];
# Enable Prometheus exporters # Enable Prometheus exporters
systemd.services = lib.mapAttrs' (name: attrs: { systemd.services = lib.mapAttrs' (name: attrs: {
name = "prometheus-${name}-exporter"; name = "prometheus-${name}-exporter";

View File

@ -48,9 +48,6 @@ in {
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.books ];
# Grant user access to Calibre directories # Grant user access to Calibre directories
users.users.${config.user}.extraGroups = [ "calibre-web" ]; users.users.${config.user}.extraGroups = [ "calibre-web" ];

View File

@ -46,12 +46,6 @@ in {
options.cloudflare.enable = lib.mkEnableOption "Use Cloudflare."; options.cloudflare.enable = lib.mkEnableOption "Use Cloudflare.";
options.cloudflare.noProxyDomains = lib.mkOption {
type = lib.types.listOf lib.types.str;
description = "Domains to use for dyndns without CDN proxying.";
default = [ ];
};
config = lib.mkIf config.cloudflare.enable { config = lib.mkIf config.cloudflare.enable {
# Forces Caddy to error if coming from a non-Cloudflare IP # Forces Caddy to error if coming from a non-Cloudflare IP
@ -66,7 +60,7 @@ in {
dns = { dns = {
provider = { provider = {
name = "cloudflare"; name = "cloudflare";
api_token = "{env.CLOUDFLARE_API_TOKEN}"; api_token = "{env.CF_API_TOKEN}";
}; };
resolvers = [ "1.1.1.1" ]; resolvers = [ "1.1.1.1" ];
}; };
@ -75,79 +69,18 @@ in {
}]; }];
# Allow Caddy to read Cloudflare API key for DNS validation # Allow Caddy to read Cloudflare API key for DNS validation
systemd.services.caddy.serviceConfig.EnvironmentFile = systemd.services.caddy.serviceConfig.EnvironmentFile =
config.secrets.cloudflare-api.dest; config.secrets.cloudflareApi.dest;
# API key must have access to modify Cloudflare DNS records # API key must have access to modify Cloudflare DNS records
secrets.cloudflare-api = { secrets.cloudflareApi = {
source = ../../../private/cloudflare-api.age; source = ../../../private/cloudflare-api.age;
dest = "${config.secretsDirectory}/cloudflare-api"; dest = "${config.secretsDirectory}/cloudflare-api";
owner = "caddy"; owner = "caddy";
group = "caddy"; group = "caddy";
}; };
# Wait for secret to exist
systemd.services.caddy = {
after = [ "cloudflare-api-secret.service" ];
requires = [ "cloudflare-api-secret.service" ];
};
# Allows Nextcloud to trust Cloudflare IPs # Allows Nextcloud to trust Cloudflare IPs
services.nextcloud.settings.trusted_proxies = cloudflareIpRanges; services.nextcloud.extraOptions.trusted_proxies = cloudflareIpRanges;
# Allows Transmission to trust Cloudflare IPs
services.transmission.settings.rpc-whitelist =
builtins.concatStringsSep "," ([ "127.0.0.1" ] ++ cloudflareIpRanges);
services.cloudflare-dyndns = lib.mkIf
((builtins.length config.services.cloudflare-dyndns.domains) > 0) {
enable = true;
proxied = true;
deleteMissing = true;
apiTokenFile = config.secrets.cloudflare-api.dest;
};
# Wait for secret to exist to start
systemd.services.cloudflare-dyndns =
lib.mkIf config.services.cloudflare-dyndns.enable {
after = [ "cloudflare-api-secret.service" ];
requires = [ "cloudflare-api-secret.service" ];
};
# Run a second copy of dyn-dns for non-proxied domains
# Adapted from: https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/networking/cloudflare-dyndns.nix
systemd.services.cloudflare-dyndns-noproxy =
lib.mkIf ((builtins.length config.cloudflare.noProxyDomains) > 0) {
description = "CloudFlare Dynamic DNS Client (no proxy)";
after = [ "network.target" "cloudflare-api-secret.service" ];
requires = [ "cloudflare-api-secret.service" ];
wantedBy = [ "multi-user.target" ];
startAt = "*:0/5";
environment = {
CLOUDFLARE_DOMAINS = toString config.cloudflare.noProxyDomains;
};
serviceConfig = {
Type = "simple";
DynamicUser = true;
StateDirectory = "cloudflare-dyndns-noproxy";
EnvironmentFile = config.services.cloudflare-dyndns.apiTokenFile;
ExecStart = let
args =
[ "--cache-file /var/lib/cloudflare-dyndns-noproxy/ip.cache" ]
++ (if config.services.cloudflare-dyndns.ipv4 then
[ "-4" ]
else
[ "-no-4" ]) ++ (if config.services.cloudflare-dyndns.ipv6 then
[ "-6" ]
else
[ "-no-6" ])
++ lib.optional config.services.cloudflare-dyndns.deleteMissing
"--delete-missing";
in "${pkgs.cloudflare-dyndns}/bin/cloudflare-dyndns ${toString args}";
};
};
}; };
} }

View File

@ -11,8 +11,6 @@
./calibre.nix ./calibre.nix
./cloudflare-tunnel.nix ./cloudflare-tunnel.nix
./cloudflare.nix ./cloudflare.nix
./identity.nix
./irc.nix
./gitea-runner.nix ./gitea-runner.nix
./gitea.nix ./gitea.nix
./gnupg.nix ./gnupg.nix

View File

@ -49,6 +49,7 @@ in {
extraConfig = null; extraConfig = null;
}; };
networking.firewall.allowedTCPPorts = [ 122 ];
users.users.${config.user}.extraGroups = [ "gitea" ]; users.users.${config.user}.extraGroups = [ "gitea" ];
caddy.routes = [ caddy.routes = [
@ -78,9 +79,6 @@ in {
} }
]; ];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.git ];
# Scrape the metrics endpoint for Prometheus. # Scrape the metrics endpoint for Prometheus.
prometheus.scrapeTargets = [ prometheus.scrapeTargets = [
"127.0.0.1:${ "127.0.0.1:${

View File

@ -50,7 +50,6 @@ in {
dashboards.settings.providers = [{ dashboards.settings.providers = [{
name = "test"; name = "test";
type = "file"; type = "file";
allowUiUpdates = true;
options.path = "${ options.path = "${
(pkgs.writeTextDir "dashboards/dashboard.json" (builtins.toJSON { (pkgs.writeTextDir "dashboards/dashboard.json" (builtins.toJSON {
annotations = { annotations = {
@ -2330,9 +2329,6 @@ in {
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.metrics ];
}; };
} }

View File

@ -1,22 +0,0 @@
{ config, ... }: {
# Wait for secret to be placed on the machine
systemd.services.wait-for-identity = {
description = "Wait until identity file exists on the machine";
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
for i in $(seq 1 10); do
if [ -f ${config.identityFile} ]; then
echo "Identity file found."
exit 0
fi
sleep 6
done
'';
};
}

View File

@ -5,7 +5,7 @@
{ config, lib, ... }: { { config, lib, ... }: {
config = lib.mkIf config.services.influxdb2.enable { config = {
services.influxdb2 = { services.influxdb2 = {
provision = { provision = {
@ -56,9 +56,6 @@
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.influxdb ];
}; };
} }

View File

@ -1,35 +0,0 @@
{ config, lib, ... }: {
config = lib.mkIf config.services.thelounge.enable {
services.thelounge = {
public = false;
port = 9000;
extraConfig = {
reverseProxy = true;
maxHistory = 10000;
};
};
# Adding new users:
# nix shell nixpkgs#thelounge
# sudo su - thelounge -s /bin/sh -c "thelounge add myuser"
# Allow web traffic to Caddy
caddy.routes = [{
match = [{ host = [ config.hostnames.irc ]; }];
handle = [{
handler = "reverse_proxy";
upstreams = [{
dial =
"localhost:${builtins.toString config.services.thelounge.port}";
}];
}];
}];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.irc ];
};
}

View File

@ -30,9 +30,6 @@
} }
]; ];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.stream ];
# Create videos directory, allow anyone in Jellyfin group to manage it # Create videos directory, allow anyone in Jellyfin group to manage it
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d /var/lib/jellyfin 0775 jellyfin media" "d /var/lib/jellyfin 0775 jellyfin media"

View File

@ -12,14 +12,13 @@
maxUploadSize = "50G"; maxUploadSize = "50G";
config = { config = {
adminpassFile = config.secrets.nextcloud.dest; adminpassFile = config.secrets.nextcloud.dest;
dbtype = "pgsql"; dbtype = "mysql";
}; };
settings = { extraOptions = {
default_phone_region = "US"; default_phone_region = "US";
# Allow access when hitting either of these hosts or IPs # Allow access when hitting either of these hosts or IPs
trusted_domains = [ config.hostnames.content ]; trusted_domains = [ config.hostnames.content ];
trusted_proxies = [ "127.0.0.1" ]; trusted_proxies = [ "127.0.0.1" ];
maintenance_window_start = 4; # Run jobs at 4am UTC
}; };
extraAppsEnable = true; extraAppsEnable = true;
extraApps = with config.services.nextcloud.package.packages.apps; { extraApps = with config.services.nextcloud.package.packages.apps; {
@ -148,9 +147,6 @@
terminal = true; terminal = true;
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.content ];
# Create credentials file for nextcloud # Create credentials file for nextcloud
secrets.nextcloud = { secrets.nextcloud = {
source = ../../../private/nextcloud.age; source = ../../../private/nextcloud.age;

View File

@ -36,9 +36,6 @@
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.paperless ];
secrets.paperless = { secrets.paperless = {
source = ../../../private/prometheus.age; source = ../../../private/prometheus.age;
dest = "${config.secretsDirectory}/paperless"; dest = "${config.secretsDirectory}/paperless";
@ -51,12 +48,23 @@
before = [ "paperless.service" ]; before = [ "paperless.service" ];
}; };
# Fix permissions on a regular schedule
systemd.timers.paperless-permissions = {
timerConfig = {
OnCalendar = "*-*-* *:0/5"; # Every 5 minutes
Unit = "paperless-permissions.service";
};
wantedBy = [ "timers.target" ];
};
# Fix paperless shared permissions # Fix paperless shared permissions
systemd.services.paperless-web.serviceConfig.UMask = lib.mkForce "0026"; systemd.services.paperless-permissions = {
systemd.services.paperless-scheduler.serviceConfig.UMask = description = "Allow group access to paperless files";
lib.mkForce "0026"; serviceConfig = { Type = "oneshot"; };
systemd.services.paperless-task-queue.serviceConfig.UMask = script = ''
lib.mkForce "0026"; find ${config.services.paperless.mediaDir} -type f -exec chmod 640 -- {} +
'';
};
}; };

View File

@ -3,17 +3,9 @@
services.postgresql = { services.postgresql = {
package = pkgs.postgresql_15; package = pkgs.postgresql_15;
settings = { }; settings = { };
authentication = '' identMap = "";
local all postgres peer map=root
local all admin peer map=admin
'';
identMap = ''
root postgres postgres
root root postgres
admin ${config.user} admin
'';
ensureUsers = [{ ensureUsers = [{
name = "admin"; name = config.user;
ensureClauses = { ensureClauses = {
createdb = true; createdb = true;
createrole = true; createrole = true;

View File

@ -107,13 +107,6 @@
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains =
if (config.services.prometheus.enable && isServer) then
[ config.hostnames.prometheus ]
else
[ ];
}; };
} }

View File

@ -68,8 +68,6 @@
description = "Decrypt secret for ${name}"; description = "Decrypt secret for ${name}";
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
bindsTo = [ "wait-for-identity.service" ];
after = [ "wait-for-identity.service" ];
serviceConfig.Type = "oneshot"; serviceConfig.Type = "oneshot";
script = '' script = ''
echo "${attrs.prefix}$( echo "${attrs.prefix}$(

View File

@ -3,8 +3,8 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
options = { options = {
publicKeys = lib.mkOption { publicKey = lib.mkOption {
type = lib.types.nullOr (lib.types.listOf lib.types.str); type = lib.types.nullOr lib.types.str;
description = "Public SSH key authorized for this system."; description = "Public SSH key authorized for this system.";
default = null; default = null;
}; };
@ -28,7 +28,7 @@
}; };
users.users.${config.user}.openssh.authorizedKeys.keys = users.users.${config.user}.openssh.authorizedKeys.keys =
lib.mkIf (config.publicKeys != null) config.publicKeys; lib.mkIf (config.publicKey != null) [ config.publicKey ];
# Implement a simple fail2ban service for sshd # Implement a simple fail2ban service for sshd
services.sshguard.enable = true; services.sshguard.enable = true;

View File

@ -3,33 +3,37 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
options = {
transmissionServer = lib.mkOption {
type = lib.types.nullOr lib.types.str;
description = "Hostname for Transmission";
default = null;
};
};
config = let config = let
namespace = config.networking.wireguard.interfaces.wg0.interfaceNamespace; namespace = config.networking.wireguard.interfaces.wg0.interfaceNamespace;
vpnIp = lib.strings.removeSuffix "/32" vpnIp = lib.strings.removeSuffix "/32"
(builtins.head config.networking.wireguard.interfaces.wg0.ips); (builtins.head config.networking.wireguard.interfaces.wg0.ips);
in lib.mkIf config.services.transmission.enable { in lib.mkIf (config.transmissionServer != null) {
# Setup transmission # Setup transmission
services.transmission = { services.transmission = {
enable = true;
settings = { settings = {
port-forwarding-enabled = false; port-forwarding-enabled = false;
rpc-authentication-required = true; rpc-authentication-required = true;
rpc-port = 9091; rpc-port = 9091;
rpc-bind-address = "0.0.0.0"; rpc-bind-address = "0.0.0.0";
rpc-username = config.user; rpc-username = config.user;
# This is a salted hash of the real password rpc-host-whitelist = config.transmissionServer;
# https://github.com/tomwijnroks/transmission-pwgen
rpc-password = "{c4c5145f6e18bcd3c7429214a832440a45285ce26jDOBGVW";
rpc-host-whitelist = config.hostnames.transmission;
rpc-host-whitelist-enabled = true; rpc-host-whitelist-enabled = true;
rpc-whitelist = lib.mkDefault "127.0.0.1"; # Overwritten by Cloudflare rpc-whitelist = "127.0.0.1,${vpnIp}";
rpc-whitelist-enabled = true; rpc-whitelist-enabled = config.wireguard.enable;
}; };
credentialsFile = config.secrets.transmission.dest;
}; };
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.transmission ];
# Bind transmission to wireguard namespace # Bind transmission to wireguard namespace
systemd.services.transmission = lib.mkIf config.wireguard.enable { systemd.services.transmission = lib.mkIf config.wireguard.enable {
bindsTo = [ "netns@${namespace}.service" ]; bindsTo = [ "netns@${namespace}.service" ];
@ -40,23 +44,18 @@
}; };
# Create reverse proxy for web UI # Create reverse proxy for web UI
caddy.routes = let caddy.routes = lib.mkAfter [{
# Set if the download domain is the same as the Transmission domain group = if (config.hostnames.download == config.transmissionServer) then
useDownloadDomain = config.hostnames.download "download"
== config.hostnames.transmission; else
in lib.mkAfter [{ "transmission";
group = if useDownloadDomain then "download" else "transmission";
match = [{ match = [{
host = [ config.hostnames.transmission ]; host = [ config.transmissionServer ];
path = if useDownloadDomain then [ "/transmission*" ] else null; path = [ "/transmission*" ];
}]; }];
handle = [{ handle = [{
handler = "reverse_proxy"; handler = "reverse_proxy";
upstreams = [{ upstreams = [{ dial = "localhost:9091"; }];
dial = "localhost:${
builtins.toString config.services.transmission.settings.rpc-port
}";
}];
}]; }];
}]; }];
@ -80,6 +79,14 @@
''; '';
}; };
# Create credentials file for transmission
secrets.transmission = {
source = ../../../private/transmission.json.age;
dest = "${config.secretsDirectory}/transmission.json";
owner = "transmission";
group = "transmission";
};
}; };
} }

View File

@ -52,9 +52,6 @@ in {
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ config.hostnames.secrets ];
## Backup config ## Backup config
# Open to groups, allowing for backups # Open to groups, allowing for backups

View File

@ -69,13 +69,6 @@ in {
}]; }];
}]; }];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains =
if config.services.victoriametrics.enable then
[ config.hostnames.prometheus ]
else
[ ];
# VMAgent # VMAgent
services.vmagent.prometheusConfig = prometheusConfig; # Overwritten below services.vmagent.prometheusConfig = prometheusConfig; # Overwritten below

View File

@ -1,19 +1,19 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
# This setting only applies to NixOS, different on Darwin # This setting only applies to NixOS, different on Darwin
nix.gc.dates = "09:03"; # Run every morning (but before upgrade) nix.gc.dates = "03:03"; # Run every morning (but before upgrade)
# Update the system daily by pointing it at the flake repository # Update the system daily by pointing it at the flake repository
system.autoUpgrade = { system.autoUpgrade = {
enable = config.server; # Only auto upgrade servers enable = config.server; # Only auto upgrade servers
dates = "09:33"; dates = "03:33";
flake = "git+${config.dotfilesRepo}"; flake = "git+${config.dotfilesRepo}";
randomizedDelaySec = "25min"; randomizedDelaySec = "25min";
operation = "switch"; operation = "switch";
allowReboot = true; allowReboot = true;
rebootWindow = { rebootWindow = {
lower = "09:01"; lower = "00:01";
upper = "11:00"; upper = "06:00";
}; };
}; };

View File

@ -1,4 +1,4 @@
{ config, pkgs, lib, ... }: { { config, lib, ... }: {
options = { options = {
@ -31,22 +31,11 @@
}; };
# Allow writing custom scripts outside of Nix
# Probably shouldn't make this a habit
environment.localBinInPath = true;
home-manager.users.${config.user}.xdg = { home-manager.users.${config.user}.xdg = {
# Allow Nix to manage the default applications list # Allow Nix to manage the default applications list
mimeApps.enable = true; mimeApps.enable = true;
# Create a desktop option for Burp
desktopEntries.burp = lib.mkIf pkgs.stdenv.isLinux {
name = "Burp";
exec = "${config.homePath}/.local/bin/burp.sh";
categories = [ "Application" ];
};
# Set directories for application defaults # Set directories for application defaults
userDirs = { userDirs = {
enable = true; enable = true;

View File

@ -1,2 +1,4 @@
# Disable dunst so that it's not attempting to reach a non-existent dunst service # Disable dunst so that it's not attempting to reach a non-existent dunst service
_final: prev: { betterlockscreen = prev.betterlockscreen.override { withDunst = false; }; } _final: prev: {
betterlockscreen = prev.betterlockscreen.override { withDunst = false; };
}

View File

@ -7,7 +7,7 @@ inputs: _final: prev: {
in prev.stdenv.mkDerivation rec { in prev.stdenv.mkDerivation rec {
pname = "bypass-paywalls-clean"; pname = "bypass-paywalls-clean";
version = "3.4.9.0"; version = "3.4.9.0";
src = inputs.bypass-paywalls-clean + "/bypass_paywalls_clean-3.6.3.0.xpi"; src = inputs.bypass-paywalls-clean + "/bypass_paywalls_clean-latest.xpi";
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = true; allowSubstitutes = true;
buildCommand = '' buildCommand = ''
@ -16,4 +16,5 @@ inputs: _final: prev: {
install -v -m644 "${src}" "$dst/${addonId}.xpi" install -v -m644 "${src}" "$dst/${addonId}.xpi"
''; '';
}; };
} }

View File

@ -5,8 +5,10 @@ inputs: _final: prev:
let let
plugins = [ "github.com/caddy-dns/cloudflare" ]; plugins = [ "github.com/caddy-dns/cloudflare" ];
goImports = prev.lib.flip prev.lib.concatMapStrings plugins (pkg: " _ \"${pkg}\"\n"); goImports =
goGets = prev.lib.flip prev.lib.concatMapStrings plugins (pkg: "go get ${pkg}\n "); prev.lib.flip prev.lib.concatMapStrings plugins (pkg: " _ \"${pkg}\"\n");
goGets = prev.lib.flip prev.lib.concatMapStrings plugins
(pkg: "go get ${pkg}\n ");
main = '' main = ''
package main package main
import ( import (
@ -18,9 +20,9 @@ let
caddycmd.Main() caddycmd.Main()
} }
''; '';
in
{ in {
caddy-cloudflare = prev.buildGo122Module { caddy-cloudflare = prev.buildGo120Module {
pname = "caddy-cloudflare"; pname = "caddy-cloudflare";
version = prev.caddy.version; version = prev.caddy.version;
runVend = true; runVend = true;
@ -29,17 +31,15 @@ in
src = prev.caddy.src; src = prev.caddy.src;
vendorHash = "sha256-zeuvCk7kZa/W/roC12faCQDav4RB8RT1dR2Suh2yjD8="; vendorHash = "sha256:pr2MI2Nv9y357lCEEh6aNdmD9FiCaJIkRfHaoWgdQIE=";
overrideModAttrs = ( overrideModAttrs = (_: {
_: { preBuild = ''
preBuild = '' echo '${main}' > cmd/caddy/main.go
echo '${main}' > cmd/caddy/main.go ${goGets}
${goGets} '';
''; postInstall = "cp go.sum go.mod $out/ && ls $out/";
postInstall = "cp go.sum go.mod $out/ && ls $out/"; });
}
);
postPatch = '' postPatch = ''
echo '${main}' > cmd/caddy/main.go echo '${main}' > cmd/caddy/main.go
@ -53,12 +53,10 @@ in
meta = with prev.lib; { meta = with prev.lib; {
homepage = "https://caddyserver.com"; homepage = "https://caddyserver.com";
description = "Fast, cross-platform HTTP/2 web server with automatic HTTPS"; description =
"Fast, cross-platform HTTP/2 web server with automatic HTTPS";
license = licenses.asl20; license = licenses.asl20;
maintainers = with maintainers; [ maintainers = with maintainers; [ Br1ght0ne techknowlogick ];
Br1ght0ne
techknowlogick
];
}; };
}; };
} }

View File

@ -1,3 +1,5 @@
# Add disko to nixpkgs from its input flake # Add disko to nixpkgs from its input flake
inputs: _final: prev: { disko = inputs.disko.packages.${prev.system}.disko; } inputs: _final: prev: {
disko = inputs.disko.packages.${prev.system}.disko;
}

View File

@ -1,6 +1,6 @@
_final: prev: { _final: prev: {
gh-collaborators = prev.buildGo122Module rec { gh-collaborators = prev.buildGo120Module rec {
pname = "gh-collaborators"; pname = "gh-collaborators";
version = "2.0.2"; version = "2.0.2";
@ -19,5 +19,7 @@ _final: prev: {
"-X github.com/katiem0/gh-collaborators/cmd.Version=${version}" "-X github.com/katiem0/gh-collaborators/cmd.Version=${version}"
# "-X main.Version=${version}" # "-X main.Version=${version}"
]; ];
}; };
} }

View File

@ -1,13 +0,0 @@
diff --git a/lua/kitty-scrollback/health.lua b/lua/kitty-scrollback/health.lua
index 9d87dfa..a231b8d 100644
--- a/lua/kitty-scrollback/health.lua
+++ b/lua/kitty-scrollback/health.lua
@@ -234,7 +234,7 @@ local function check_kitty_debug_config()
end
local function check_kitty_scrollback_nvim_version()
- local current_version = nil
+ local current_version = 'master'
local tag_cmd = { 'git', 'describe', '--exact-match', '--tags' }
local ksb_dir =
vim.fn.fnamemodify(vim.api.nvim_get_runtime_file('lua/kitty-scrollback', false)[1], ':h:h')

View File

@ -8,8 +8,10 @@ inputs: _final: prev: {
src = inputs.zenyd-mpv-scripts + "/delete_file.lua"; src = inputs.zenyd-mpv-scripts + "/delete_file.lua";
dontBuild = true; dontBuild = true;
dontUnpack = true; dontUnpack = true;
installPhase = "install -Dm644 ${src} $out/share/mpv/scripts/delete_file.lua"; installPhase =
"install -Dm644 ${src} $out/share/mpv/scripts/delete_file.lua";
passthru.scriptName = "delete_file.lua"; passthru.scriptName = "delete_file.lua";
}; };
}; };
} }

View File

@ -5,45 +5,37 @@ inputs: _final: prev:
let let
# Use nixpkgs vimPlugin but with source directly from plugin author # Use nixpkgs vimPlugin but with source directly from plugin author
withSrc = withSrc = pkg: src: pkg.overrideAttrs (_: { inherit src; });
pkg: src:
pkg.overrideAttrs (_: {
inherit src;
});
# Package plugin - for plugins not found in nixpkgs at all # Package plugin - for plugins not found in nixpkgs at all
plugin = plugin = pname: src:
pname: src:
prev.vimUtils.buildVimPlugin { prev.vimUtils.buildVimPlugin {
inherit pname src; inherit pname src;
version = "master"; version = "master";
}; };
in
{
vimPlugins = prev.vimPlugins // { in {
nvim-lspconfig = withSrc prev.vimPlugins.nvim-lspconfig inputs.nvim-lspconfig-src; nvim-lspconfig = withSrc prev.vimPlugins.nvim-lspconfig inputs.nvim-lspconfig;
cmp-nvim-lsp = withSrc prev.vimPlugins.cmp-nvim-lsp inputs.cmp-nvim-lsp-src; cmp-nvim-lsp = withSrc prev.vimPlugins.cmp-nvim-lsp inputs.cmp-nvim-lsp;
comment-nvim = withSrc prev.vimPlugins.comment-nvim inputs.comment-nvim-src; null-ls-nvim = withSrc prev.vimPlugins.null-ls-nvim inputs.null-ls-nvim;
nvim-treesitter = withSrc prev.vimPlugins.nvim-treesitter inputs.nvim-treesitter-src; comment-nvim = withSrc prev.vimPlugins.comment-nvim inputs.comment-nvim;
telescope-nvim = withSrc prev.vimPlugins.telescope-nvim inputs.telescope-nvim-src; nvim-treesitter =
telescope-project-nvim = withSrc prev.vimPlugins.telescope-project-nvim inputs.telescope-project-nvim-src; withSrc prev.vimPlugins.nvim-treesitter inputs.nvim-treesitter;
toggleterm-nvim = withSrc prev.vimPlugins.toggleterm-nvim inputs.toggleterm-nvim-src; telescope-nvim = withSrc prev.vimPlugins.telescope-nvim inputs.telescope-nvim;
bufferline-nvim = withSrc prev.vimPlugins.bufferline-nvim inputs.bufferline-nvim-src; telescope-project-nvim = withSrc prev.vimPlugins.telescope-project-nvim
nvim-tree-lua = withSrc prev.vimPlugins.nvim-tree-lua inputs.nvim-tree-lua-src; inputs.telescope-project-nvim;
fidget-nvim = withSrc prev.vimPlugins.fidget-nvim inputs.fidget-nvim-src; toggleterm-nvim =
nvim-lint = withSrc prev.vimPlugins.nvim-lint inputs.nvim-lint-src; withSrc prev.vimPlugins.toggleterm-nvim inputs.toggleterm-nvim;
bufferline-nvim =
withSrc prev.vimPlugins.bufferline-nvim inputs.bufferline-nvim;
nvim-tree-lua = withSrc prev.vimPlugins.nvim-tree-lua inputs.nvim-tree-lua;
fidget-nvim = withSrc prev.vimPlugins.fidget-nvim inputs.fidget-nvim;
# Packaging plugins entirely with Nix
baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
kitty-scrollback-nvim =
plugin "kitty-scrollback-nvim" inputs.kitty-scrollback-nvim-src;
# Packaging plugins entirely with Nix
base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
kitty-scrollback-nvim = prev.vimUtils.buildVimPlugin {
pname = "kitty-scrollback-nvim";
src = inputs.kitty-scrollback-nvim-src;
version = "master";
patches = [ ./kitty-scrollback-nvim.patch ];
};
};
} }

View File

@ -22,4 +22,5 @@ inputs: _final: prev: {
license = "agpl3Plus"; license = "agpl3Plus";
}; };
}; };
} }

View File

@ -5,16 +5,11 @@
inputs: _final: prev: { inputs: _final: prev: {
proton-ge-custom = prev.stdenv.mkDerivation (finalAttrs: rec { proton-ge-custom = prev.stdenv.mkDerivation (finalAttrs: rec {
name = "proton-ge-custom"; name = "proton-ge-custom";
version = prev.lib.removeSuffix "\n" ( version = "0.1"; # Made up
builtins.head (builtins.match ".*GE-Proton(.*)" (builtins.readFile "${inputs.proton-ge}/version"))
);
src = inputs.proton-ge; src = inputs.proton-ge;
# Took from https://github.com/AtaraxiaSjel/nur/blob/cf83b14b102985a587a498ba2c56f9f2bd9b9eb6/pkgs/proton-ge/default.nix
installPhase = '' installPhase = ''
runHook preBuild
mkdir -p $out/bin mkdir -p $out/bin
cp -r ${src}/* -t $out/bin/ cp -r ${src}/* -t $out/bin/
runHook postBuild
''; '';
}); });
} }

View File

@ -13,4 +13,5 @@ inputs: _final: prev: {
# src = inputs.rep; # src = inputs.rep;
# cargoHash = "sha256-GEr3VvQ0VTKHUbW/GFEgwLpQWP2ZhS/4KYjDvfFLgxo="; # cargoHash = "sha256-GEr3VvQ0VTKHUbW/GFEgwLpQWP2ZhS/4KYjDvfFLgxo=";
# }; # };
} }

View File

@ -3,20 +3,18 @@ inputs: _final: prev: {
# Fix: bash highlighting doesn't work as of this commit: # Fix: bash highlighting doesn't work as of this commit:
# https://github.com/NixOS/nixpkgs/commit/49cce41b7c5f6b88570a482355d9655ca19c1029 # https://github.com/NixOS/nixpkgs/commit/49cce41b7c5f6b88570a482355d9655ca19c1029
tree-sitter-bash = prev.tree-sitter-grammars.tree-sitter-bash.overrideAttrs (old: { tree-sitter-bash = prev.tree-sitter-grammars.tree-sitter-bash.overrideAttrs
src = inputs.tree-sitter-bash; (old: { src = inputs.tree-sitter-bash; });
});
# Fix: invalid node in position. Broken as of this commit (replaced with newer): # Fix: invalid node in position. Broken as of this commit (replaced with newer):
# https://github.com/NixOS/nixpkgs/commit/8ec3627796ecc899e6f47f5bf3c3220856ead9c5 # https://github.com/NixOS/nixpkgs/commit/8ec3627796ecc899e6f47f5bf3c3220856ead9c5
tree-sitter-python = prev.tree-sitter-grammars.tree-sitter-python.overrideAttrs (old: { tree-sitter-python =
src = inputs.tree-sitter-python; prev.tree-sitter-grammars.tree-sitter-python.overrideAttrs
}); (old: { src = inputs.tree-sitter-python; });
# Fix: invalid structure in position. # Fix: invalid structure in position.
tree-sitter-lua = prev.tree-sitter-grammars.tree-sitter-lua.overrideAttrs (old: { tree-sitter-lua = prev.tree-sitter-grammars.tree-sitter-lua.overrideAttrs
src = inputs.tree-sitter-lua; (old: { src = inputs.tree-sitter-lua; });
});
# Add grammars not in nixpks # Add grammars not in nixpks
tree-sitter-ini = prev.tree-sitter.buildGrammar { tree-sitter-ini = prev.tree-sitter.buildGrammar {
@ -40,4 +38,5 @@ inputs: _final: prev: {
src = inputs.tree-sitter-vimdoc; src = inputs.tree-sitter-vimdoc;
}; };
}; };
} }

View File

@ -1,17 +1,15 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBDNTh4 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBhNzEr
dERZY3Q1cyt6d2RwODR3aWd0dUx6UUR6WWUxUERFV3Zwb1lVU0MwClZZTzY1bXd4 aFRkQ3luWWhBbmdTTEtNOGc0c3ZPcTlRbktxd2xQZHFyMDF1c1ZVCkMwWDF5UlJH
dnVMS2haWnA3dURhZFgyWFR0c0J1SGhvUEZ3OFJtTmJObzgKLT4gc3NoLWVkMjU1 RTBhMXI0ZEhkQm5takh0QUpiZm5rbTk3M3REdUhQV0lOdmMKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIFNMSWJZSCtzTTBlbm4zd0hJWXJSYWdJcUd3RGY1ZkZWTmJPZGtz MTkgWXlTVU1RIHdGOVptZzNIRlp1NUlFY1k2b1FtN3JRczMrZ054ZlhUbVlvRVVS
Ym0yUVEKWnFtSDVNZDNNd0FBUURmN1ZJbnJjNlNIdVduM1hSRmlGNlVVMWliOUE0 NEZCaTQKUmMwWFBBVDdBMlBpekVCSC9EMERHdXlKNGpubXRmY0FxalRxbTNnREky
SQotPiBzc2gtZWQyNTUxOSBuanZYNUEgVEVlTkFidE1UWnh2NGJibDR6dkh6aEZY ZwotPiBzc2gtZWQyNTUxOSBuanZYNUEgeGhzMDRONFJjMEJZWUlDeHp6SHZERXJS
eElpWE81UUNQcHlVc0JXU2RqUQpneC9ueFFVTldVZzhjN3NrK05IcXhrY1BHempF VjNLb25adVJ2V0MxMm9DUE5Gawo2RlhSNDY3K2oyQ2VGZ3p1MHRreU0ydmZjRkZQ
R0p2RVA3bi9XN2dVaXprCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBlR2RlN0dsQkNZ bHZsbkxXdzNsN1A2alBBCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBqL2FWZis5N2l6
R2Ixd0YwdnE0dkhIa1RucUlOWTBLMlJRMVVuOUoreUZJClcwWDdwZVlrSkZWZ1BT T0lYUVRBcDBWQ0sxRFd5V3JydzVTVUZZaDZyL1ZGaUJvClRPazdXOWM5MUhrLys4
WjBWK2RNUDFKdXNibVJUQlVhdGs1Yk9IdC92UDAKLT4gc3NoLWVkMjU1MTkgejFP OWp2SVg5S0pnVE51MzRwMU1hRThKVFJZSHJzY1kKLS0tIGl1UjBtUzhVZTArZkVt
Y1p3IGNDM1RiVWtWU1FsaG1tQVVkeGtyYlJzZldHUkZnelozVFVQcG1XQ1hSVmsK RVhMMlJNQVlBS0Z5bTByQ1hpSGQvZVprL29oS0UKZGsWBbEUiDIJhoBOEaLF7cnW
MFRMS2dNL01VY3pJVWtCWlZmM21BcFZvM1c1djdCcUxCcnQzYTJuV3FDdwotLS0g FMcg1pxgmlioqsRbKdcYlZWEKDYUa0ZctJEYo0m+eGxilTV/qctyiEIYsoKU1t0Y
MU5LTzREZ2p0dW1RMWhsWExHb1FtRUJlL0pUdFpKRThpWnVTYS8zbVdIRQrUKXp+ +kCTYQk+RbtKfQ7xEStmJ2cdZDE=
0HWMPJHIieCvle5qXgzr4iMUL9VxH9ydVl6gkOLM/r7DO36kVkgqr4whSsk8mihY
boq66cjj1dUVij2fMD3zf62n948EQnPZHIBwnDS05eOW4A==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,17 +1,15 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBkckt3 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBRckNo
c1NtVEo1bm1XREk2ZE9PL1FkOFd0LzQ1R0J4TXN4VGd2clVrZ25NCjZKenFTdHFK MkttVHF3WWhKMGtCY1ZoL251SlhEb0YxUEZSSDBLVHhQK3o1QW1rCkp5WHFTb0xE
MWVZSXI0NXdVTkhJQXRFRFBRRnIxRHZaOHY1UWVDYW9vTm8KLT4gc3NoLWVkMjU1 amRrM05XRGxzMkRPUWx3Z1BVMFRsRGxvemRLckZEY0E0QmMKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIHBmRERwcXdGanBVV0JOczg0Q0hOa1dVM09EeGMxWmJDMm9YU2Mx MTkgWXlTVU1RIEhrV0E4b3VkOUZwYjBXTkF3UUhVVklLWXF0QkpYRjErY1l2dnFh
djhxQkUKS2U2aHVza2JNdzltRW5wcWhqaTVPUEZoZGNWN2szQXlVYjZ3eXpwc2ZE VWZvVkEKUGd2VGtVaEFqc0lpZS9Jd0pSQ2IydHBUN1JWTGE4MzZZT2RXRUt2eVFI
OAotPiBzc2gtZWQyNTUxOSBuanZYNUEgbWU0WXA4RjVZWFdPcXZ5M1UwT3lON1JD YwotPiBzc2gtZWQyNTUxOSBuanZYNUEgelFPWGtneFhDWmFoc2FIL0RwejZuS3Zr
cGhlRXZ2NEhWMHdEMitLWERqRQpKRGgwMUhISWE1Uk1ka1dteGo0dlhZcmNjVjN6 ZzBUREMvTUtpYlNqdmV0cHBscwpOMitLS1NoVkZwYmZFcnJRWkRWVFJ4Sm1oTmhG
QmJBQWo0Mko4aE5jUm9rCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBLaU9sSmRzMlFG WHRjaWQvZWNLcVl5ZURvCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBRMTdyOTRWV3NQ
NjBYYTBYeFErNXJwZGVtZ1kvVmVCOXBDZWVoNWhDZ2hrCnE2dkJJSk8rbDRvSHYy T1I0Wk1jOE5KSVFFaUEwTm9iRElCd1pscG80czF1U0E4CmREU3BNVklzOXZKVFFp
bEVTdXg0VTg1RzZUNi84K1ZvOVB2aUJzNHVPRkEKLT4gc3NoLWVkMjU1MTkgejFP UWRoYXp2UXRxR2ZhbzlYSng5akV5Zy9hZC9uWHcKLS0tIFFjdE5KN2lxMFQ2emJh
Y1p3IEM0Mnlockc2SlA1bXJhdnpQNXFnQ2w5bzFSTWpIajJybTBIM3VuNTN5bFUK d1NwRm8xaHpZNGxQbFUzSTh3MWxJRXViUjVBUFkKr/OxDAiV2XR3YZDdT1DSPUPk
bXNIUVVhTzlRMUJTSEpJUURUMXZjRU5zczNjYnBUVVFmMDVEZllONjFjWQotLS0g XQrbpI/urpfXPyQAzXH2IwqRU2H56JHH2Q+z1OK6/BDzpxyFf1HmK/N9p/00osK5
NXdIUWduN2Q2eXFzNlFueFR6OWxITVBranpsNTdXaktiSFZ0TTBxRFNlNAr9JzVO WPeBVcNDMmWD/RlgEyooxyajK6Q=
Rhx5rG7CSGdYfeMcuzye4jyE2yiVKi5TVr/qp3vbDpyDQKZLlAUSF/K0rTY9K7Rm
ocY+y/V9ffh3LO2m1Y6BkRqWRJ7v4wcsc3jNGjDHlSB7EqnOwMCXyQAg
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,19 +1,17 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBYY0c1 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyB6R2Vp
bldPMVdwRGhia0xzNm1mSGQ0eVVZZzFLMWVUdFhYVW1KY3QwTERJCm1UUDBqN1Jr T2d4eDRDdGdIZVdZelRUY09oRWtwTFpDbGFEKytiOGxxQjgwakRrCnBveWptbm5P
VjRlSjROTFZEQ3UrME81Y2FyRkxjZHFvUFN1eEZNa2cwWkUKLT4gc3NoLWVkMjU1 Q2lkaG4vSWZkS0RjM0VuUWtsalovZkJVamJzV1pWbGlDTzAKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIFM4ZURETk0yQ1NKN3owaDB5S3djeThtWkphS0xUaVd2MnBlS244 MTkgWXlTVU1RIEtuMnZvcGExWmJZU0tsdTJXa0ljeXYzOEJKV1Qrc0xNSnE0emJI
d0V5bUUKKzE5UzZYUlpwTy9ydFQ3L2NmWFZBMEZCWWppYlFZQzhTVFhUc3BBRlpR czdQbjgKM0NFc29UZTFUbVVrbFIzUDZhUlkrbGxSSXl6SldnYXh6a0hXSVlHQ25v
dwotPiBzc2gtZWQyNTUxOSBuanZYNUEgbS9HaVFFRjU4VzMvSVZ1SlExZ1BBNWxK TQotPiBzc2gtZWQyNTUxOSBuanZYNUEgc3R0Qjh0Vy9mSnR1eE5rajU5ZG56OFVR
RVRESEVmeWxyMW5Pclk5UU4xOApaZ0hHMnlsb1BuMThsTG82d1k1Rm94VEFMcTBH UUNLYmJyVHYxcUlsbzlTVGRUNApzcW4xVXp3dTVaVmhnVXdoUnZ2MlNESnUvVVk0
TFoxRWpRSXJWQUJVWGN3Ci0+IHNzaC1lZDI1NTE5IENxSU9VQSBOK1AvRW5nNUlK ZkRFVVBhdjZsMzhHRzZvCi0+IHNzaC1lZDI1NTE5IENxSU9VQSA1MW8wdXBYdXBl
NnB1UDhKdmFibTEwV2JhOGxKRGg1SnlMdytXaVQ1eW1NCnVIcjNnclVMSEJ3eDVk VjM3Ukc4U2tSWFc2WDJaVWo3aldvazgwckJBZXVKbkFVCjFaaHhENHVQOWx3Q25F
eExnY1EvbWg1OW4xR3FydDlzeUdLQW11UGRmclkKLT4gc3NoLWVkMjU1MTkgejFP NnBnSXNJRjlwWk0zLzY1NVE2Z1M3dFhLMzVBT2sKLS0tIDk4TTBhNHpjS2lPRTlk
Y1p3IHNxbDlpSkpPdEZVRGhwV3NKdTNJV0NTeUZoVVg3b0ZlRWdqelNaTDRWamMK VllRbmV4YU9xYUtEaVNWRVRrb2ZheSthWTAxcVEK9nC0bUWE1W8lmXZABR8IJAnI
N1czMXlEcWZzQ1g0dkxBTnNUQjdTdnZMUE9VRGphTjB4SjJyemJiU2w5NAotLS0g to/at+EBAj4gV+UvTpqBmQ9xy5q9ih+L9VH+WolUQg5To5nzSKDbhwybzwEj1YUd
VlgyN24vMGl3a2N6ZGs1SjhOZmttWEl3WEFOK29EOUlkZ0N3blBBcHZQOArP/uJx 5Oqm1waFqasvLe4tNkNZ1aEVbc5VFY6OBCw3nVRESVR8AeuDnL8rRZyYpZjEwCZu
SBFvBV0rLzRbo/8nhhizuT2TtKsJSJDIsFJxAOtF8ZwIbYwauBt1tJudtJaXgbv5 Qay0cQUSJPJQIKES/UzSrUj+HAw2LxPPAZ9xrDa+QuU36RfPHzmAoVMZ82MxtLxf
JIk53sS3lelOwH11yx0aGcBNCR2UwpuYn1IwoW0qrt3ugi8rmQPRG8c8gSyNn2u7 vLgxoUM9INybdIoBncihj90U+o8PC8Mud2DBm/FGkx0=
PnAj/NdAjieLGGLltwdq2wJhkbv800WmKx5sGgPNT1AdBS1b84h5ipQFnFf3Fi0N
FJa9/j5qc7JtWEy4ecU6D03zcZD+CTCoN8SIW4+fldos1u7N2v2X5/YUw7T6jQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,19 +1,17 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBuU1BO YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyA0bkg4
ZGdOVFRTekN3SFRhQWYwcWt6OHpLZXM0aENsQ3d1VWpxYUhXN3k4CnNwNWpQcU90 WkZTODJsOFN0RGtzQ0F5RzhmQ0ViUDBobXEvVFFidXNtNTRaSFI4CjBraW5mUmgy
elR0eWVyMWFUUkhORFRQeVdsdTErWUgzNW9mN1BWS2szbUUKLT4gc3NoLWVkMjU1 QzJPOStxdmRXSVY4NlNkZUUrcThGUUhpZUFxVm0yVENoNVkKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIDRRS0VESG5NNWpxbm1DTjBkY2ExR3I3aE1PUTNVTXBFZ2wwVC9j MTkgWXlTVU1RIDc4MCttZk5aUlNoVjZZY2RwVW54SE8xT2gyYk5KSXFFQjFjT2ln
WDIrMTgKaXkwWk1xRWp6Z3c3NFZZS0cybHFqcUVRczNMZ05tSmxPNjBlVmRHK2h3 aUNhZ1UKSTJzdTJTTXBPZTVYVXRMb1M0c3FtSDlyd2MvdVdHYURMSHV1WUF0TTZT
SQotPiBzc2gtZWQyNTUxOSBuanZYNUEgYWI1SkhBZ0Jrb3hzbDRwcnRMeHhGSlpB MAotPiBzc2gtZWQyNTUxOSBuanZYNUEgeEd6Zy9CYWRKUFNjUHRZd3ZEMmR4VCtK
aWt5ZmRxaGhmbXFDQWdNamxRbwpXMWo0TjZhbHM3ejFYNVU5WlkxWTJSbVBPOEhr cGR5UWdFSmRyLy9iblpJNVRtbworVEdkL01YazZyZHA0NmRXKzl1NTIyM0FZK2hW
MUt3akxMU3QzN3Z4M0lFCi0+IHNzaC1lZDI1NTE5IENxSU9VQSA1dmdFRE1QSU55 emlKWGhiUjl1T3lpcVhZCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBBN21XTy9qQldX
WUVuOU9OTHJjM0RxVWhmTlEvdk1mNU1iUEwyNlFqRFZvCldleVNGQ1RZdU1tU2J2 enRxcE5pSVl2YXQwckIyQ1NueG5lbk1neGpDdThkSm5ZCm9HZlB2dWpSUWkrZUht
dWxGZlVkaDBWNEZRUFNBcEIvTEdkODdDS25GdGsKLT4gc3NoLWVkMjU1MTkgejFP S21wMDE4anZrMUdSUUdnTFJmWnhXUks2ZmhyQzAKLS0tIE5JekNmSkdjUHcxeDdP
Y1p3IG5SbVpVZldPSkJXYm9BZ3B6OXZXMlB4T2Z5RHptR1pqbVRVUS9LVEZyUzgK YVpLODlCemZkallwODRlOVVaOEk0UEVYY0Nxd00Km4HzHO0ciIVLi9jVf1WL0v70
ZlVTZWlUQ2VoWVNuOGE5Wk5vZGdVVldzbUZKRERyUFN0eVJ4TWpmL2gwcwotLS0g 9tdZZIXF1aklkmvwpKZyIBSJc2cDm583czRyrhy5/W2h2xLYSOXdL0NVKJyVgJj2
MlJmTlVkdHhHQ25JWm0xVmdjVDFYM1lHaE9WdnJSVkVMMnNwV0c4eXc0QQpYTchD Y8Iq3+nLStZ8p0TL9MuFyY5HXkQpJzFeIrdFRj2vcQPVP1txZd90se8WrUP4k/9h
DCiEm4rOav4/IwK26gSgi2B4qq4RETyAbF4oa87cvFM8zVXo7W8nF+eWzeWGNZrc xrC+MHllDYR5lDXhAUhS42y746Ixm3iabVlPDzcccPJS7nvT4w5HBwkhWaVvb1/1
yRFfOYf4gtlNCVLc+UAapvM1rKuw1IOQeJLAwGCHygXKWY7zSXdT2ERACXESvCCz cHD2guHpi4e3BbT5ozKADmOHajfjRy+j+gwFTl0AjGg=
b7W62NVx0Pc4mAAQB3QU995HFVFuHLa939PPPlkgxqepNWCKrmUFl/qjRpOoVrV6
GwRgIo36PhcfZVCswyVXgcc4M3CCG5ZuWInuuljqTB70OzBVkKCaUeiRaRIZJg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,19 +1,17 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBMMDZj YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBEVnpD
dkdOSTc1bHgybjAwcUVHUXFhY0I0NE45K1B5SEh4NGN4T0tpREhjCnViQzVXTVk3 S3FrMlhVZXpEZ1IzMVJpTGh3UnUyaEo0VU5iR01JL0dKVWpCUGpjCmdoWHUzRzBh
dzB5ZEY5d1hvcHVDSXVubElOdEVQQ0Fja2dnL0ZnVG4wNEUKLT4gc3NoLWVkMjU1 NCtMK25aNG8rVktpcDFkVW9yd1dOSExxNUo5RG9CWDgyUzgKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIHRiVkNzRCs4V3EvL2szNG8zSlRYSVloRlVsSTk3a0hnSFMyUzRN MTkgWXlTVU1RIE41U2Y5QUwxZVYxTEVCVlczMjlUWmxYbG5oOEd1YnR2UUJOZ0hG
K0lyMzQKWDhIOTVzMGJkaGpVQmNtS0pPQnNTSjRmK1dYck1SUFd5VnVvYnJSWkhs ZU9GemMKaS9pYzQvSG1yR242UDlFQ2M4U0F0YjlHSzZBOUtvRCsybmhOclJkZkI1
YwotPiBzc2gtZWQyNTUxOSBuanZYNUEgUy9kWmxsc0p2L0pFWDlPMGlzeVBHNjJ2 OAotPiBzc2gtZWQyNTUxOSBuanZYNUEgUVdES1BCdFljL2JRTzJSSWpFcWw2b2hQ
a05ycmZtbUJrOXRBVVgxVjVtZwo4RVM3Sms2M2krdjU0K1ZHREhhRkdMcENTbTJr MFZqZTlyWC8rSzZ6RnI3ckdHbwo0cnBDNHdVNWFlMmxCZEVHWW9Tb2ZQMXc3WGw4
UEh6cWcvOGNIRUNJZUFvCi0+IHNzaC1lZDI1NTE5IENxSU9VQSA5d0FwTWJzZEpJ WUszNUc5aTk2MDVERXRrCi0+IHNzaC1lZDI1NTE5IENxSU9VQSB6VXJBMit0UytG
UEJaZi91YXZOOFhGVlVVekEvSVRnK3Y2VFdhL216SVZrCkRURE9OYnIvSGVtMWNl N1l4cHd6cTZudlBzWEcvNkhHVldOMnQvK2JWWVh4VGhJCmh0VVUrd0dEMk9XNVlD
MWFGSTEwUVBITTlnaWVXc1hpMFpqdFdMcFY2NHMKLT4gc3NoLWVkMjU1MTkgejFP eERYc1VtdjBHUEZZQ0pNWjF1aXRmUTFZc0phaDAKLS0tIHhVVTFDcjVucElUOHlw
Y1p3IDhkUk9KTE1UMysvajY3WEx5MFdLeEdlVnBmSUx6TTlnYWdqaWorYm0rRGMK T0VMUWVTL0R5ek16VmlDY1dZWGk2aWV3TjdQMVkKbBB/Ixe0nuEQ4WkOguVk6oRI
SlhaRFNLaTZHVkpRR3U5eE5JOTBPWWM3OTFka1ZWSHJMaFFhZG1CSzNVTQotLS0g h7gasRs0CYNvKoIjAf66tJ4IC6CumJIo2JRkH0CU94nOJhPqdPL5VS2IrJOznrWY
THNSTmNzK3JvbVN5S3RaVlQwdDRiOWFkVGZ3WUtyT2IyMWtPSVNtajF5YwoCUWHU bZolkeTJxq+IDUZVTNk6b/7TSmhPsKNgAZZdEQp+HSwz3sy1wZIBTkc7Lxml0Vvy
KSe09W6BaVEW2x0ieBXN6KkL4FNPAP8zCom8fNVjyjAZpxd2t0kisJjJ45xg8eG4 pBjh36wBjPLYJy69KAxsI13YYlT8gGw6dHQutBlVRzH6zL+To8TQ/TMDAwKHxkJA
x9sj+hG9EsWIFvVpnF7LUIEXcRMjvRlNXED8HmYR0qzUhc89VQ9N4EoQPJYN1dME 6Bv3SyF5AvVYtJhnhT2Ic9fmkbbkohes6illUlpZTPU=
kxAzH8p5HBidxfJLpACaG5QHGb97chJXTDrT+ZKt+hPfZ16OhsKBj2s0gvHbcCQH
sdqQT4+FlJshDiRiauTmqF/umnCnzl4+H4Xe8kLVrZxDOAv1iwuTX8zcaNOFNw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,17 +1,15 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBiVDgy YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBzTVNj
QmFNcGNSeWx4bS9VVHdocFVFUndkQ2g0ZU9LdEdaTU5Mc1JGZ1I0CkExek1Pd1Ry R1FPalhwL01tWkg0REtwZ2M0Yno5RVVDSjJsQ1VUS1dWak9aeWgwClI2V1c2bE1w
Z3RGR3JIdXdJNHNyYTlJeEIrR1NVa3JTbjBzZmFDZk5YL00KLT4gc3NoLWVkMjU1 RzFyVWlibVZzV1NGWEd3OWNOWG9jRXV1dHRTV2k0RzEreUkKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIHUxN1BvTFJwby9mUC82QzFRMGNwaEovcnRJVE9YU2doM2djazVw MTkgWXlTVU1RIG1nZjVqbzlnUEZtSkxmTUtVNDdFS1NQanVmL1RSeWRNbk4rRjdP
K2oveTAKaldCZ0haUlNoK1BtK0NQR3VyTmNDbmlKSnBlZGNSazlFYzRsV2xWNHNI YWw0WEUKdFp0NGtuMEtQdUhlNTN6MmdxRDY5b3lPajhoRVAvT0llQml5cGZLdFlm
OAotPiBzc2gtZWQyNTUxOSBuanZYNUEgaVFUbnZ4eU83K0JlRXozSW5Yekc4MVlF UQotPiBzc2gtZWQyNTUxOSBuanZYNUEgY0xkSFM5Q1pDRTlCbjRZT2FnN0JxR2h3
QmdlbEV4NHpWN3BwdVVUZFhCQQpkVExtZlhKeHlVZzNtZU9vQmlNRGhqQTl3WVIz ZmM5NGJkNGo5M0tzak9iOGZUOApiVmNic2RpSjB6M3Jma1V6OGJjTGlmL0xYK3pP
cnYxMkFiT3pBZEo5Z1B3Ci0+IHNzaC1lZDI1NTE5IENxSU9VQSBGaE1YdmRaSFNK a3ZHYVhMMDBGZkQ4TUlFCi0+IHNzaC1lZDI1NTE5IENxSU9VQSA2K1lBMlFaVEp3
L25uSVp2SjNhME1PUVFNeVJDNDFBSnZKeVE5NGxHcEZnCmJjS0czOHA0bTIyVTMv cTZNZ0duTGlXc3JmUUo3MkYyK1ZVRWM2VTMxekNhNHdZClE3RDlub1Jab2VhbjFx
SHY0blBLY3d5Y29vR2RiM3JHOVlIb01LSzNTSzQKLT4gc3NoLWVkMjU1MTkgejFP RHhOSHNnMGhEcjN0ZytsZWV4N1AzRFRDT1d6N0kKLS0tIFJSMEFkaWhMMGxQaTlL
Y1p3IGdWRUYxbjJySXdHK2UvdnlPaWNMcTZuUklacnNwY2dKNTh0MklYYit1bTAK MW12UldodHcrclFvQ080OEJBekh1VTZCNFEybWsKo6mw3I7uX/jwJ6moOGpqSltT
Uk1OMExEOC9DMTZRbHNOZ2R4aWI1dVppNHZGenh4dStCYzV2bjlQamVlTQotLS0g BRsBwTeNrIdc+FR60l4sP8nRI9KV/7wyce9aFhqtiFTBNnGDXRcjJDrqactCiGcB
cUJud2k1SmxoUWxnUEJsdnNFQVlJZG9qSjVQWXA0ZWQwK09Uci9QNnh2awqOJikC Geuhsjc9ZMwjJEATbQ==
R8H3k0kHUew/tr0Oi8ASuS15La6bb6NxIpC/7edoNf996pxToLeHy8fOJlnPKSEb
hw+GvqIsP+6F7BD3rCOh2d+1ZbIHjcOkX94u
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,17 +1,14 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBkaUhZ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBhUEdQ
NHE3L2gwaU8rVjlkR0JOL0d4YVdYVHdnSkJzUERTM1NyRlNmV1FnCldOTkd1Z1Jj ejFtQWFabkl3YTJmUmRDS2M1elBrMU5yVHhWWlFLMHdOdlNsNEFRCmREU3ZZWlZi
clVxNGZzZDExdDNTMWZIQ0pKbzE2UXNpb3BhbmxuZ0FNMEUKLT4gc3NoLWVkMjU1 R1RLQVorT2dDbFRXc2toMExpNWR1WUEvaVlzUFJ5ZUU3azQKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIHZ3NXc5WDVwQXY1ODRzamQrY2JaK051WXJwYWtDYmhkOXpPWGZS MTkgWXlTVU1RIDY5OGpSWlFTT2EvUzV4ajQwUG5YL3loSWhGbjV6U2J4TkFhQm5Y
RHY4ek0KdGQ3QjhnRVRVUHNUaHNxa0I3NVFXUFZ0WjlUZXFNTnM1MGYrTXZVSGkw RWhvMXcKbUVpQm5wRmtLRGV2SWYzb2c3dnZYREdRSnRtdjJJcjRKTk0rbnMyZmVB
SQotPiBzc2gtZWQyNTUxOSBuanZYNUEga3V5MmQyMkdCYjN0cUlkRWNlTXh4ZFRW cwotPiBzc2gtZWQyNTUxOSBuanZYNUEgd0o4WGhTQnlkVGhhWG44MmQ1UXFVWjFO
aURLK2cySk9wbmo4MGFaUHNSOAo2NFdadi9ENmZ3a3hBeUdGeVNGRkU5Y3drWXZo MS9JcVpEOEIvd3ZuNmVmN2d3dwpYNXF5V05WbHRobVlIWVM2VHN1TjcyVG81cHp1
eEFKdEVHVk9palA2cTBVCi0+IHNzaC1lZDI1NTE5IENxSU9VQSAxazl3UkNTcFI0 V0pnWTduZFFWQks2ZFY0Ci0+IHNzaC1lZDI1NTE5IENxSU9VQSBkWXlRejFNdHJk
MDJHQTdwZ01BdEh3czZWaWszcnZ5dmsxSjNteDluTEVRCmZidGJiT0xuWmdpQm5u azg0aUpzL1JMSWUvWkdXUmpLc3pVUEZTNGFwTG0rRlNrCjMyVTE5c1pjRlowVlJ4
TEpCTlF4QVVBVzFMQnRteUZ0cStZc0tRMHFMVkUKLT4gc3NoLWVkMjU1MTkgejFP YmFtRzEzV1dCU0FoeUJPMjQzWHErc0h4RWhLbDgKLS0tIHhzK20vTzFPdVROVW44
Y1p3IDhicExSMnVtNUl4L0Q3ZGlpQVF1eXlzOVZpMlR2TnVadk5XU1loK3NXQTAK MkNhb2VWZHBqeXY0MWZuTDFUMXdNazMwTG8yZTQK1CrrD2tin/3ZhV2D1XJvkbUN
bktxWkFqTitQaFdCdEtvRHNDZ21lMzl0ckliT0JsMkErdnVKWmVmeGF6YwotLS0g 2Nw4ASdPdRXaQJw5CMhlrW6rgSnC81j0249F7D7ZfAlo62ANOfLyL9Lv2FVGzg==
VStoT1QwdmF6ZGNpbjdmeXA5bFNhWUFxamx1SXRiYVkvNGQvYkVEb29kVQoNyF4F
azoWnxojKxAIC2qBM80EdVCvcRdhKm4iSzyWYMt06cb6IrEutOzC+FCx37A6KKVU
tNYcXpGcJX2ge805
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,17 +1,14 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBBWHpP YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBmTnVo
ZmxVTFpQOVhXdVRvTjZuVGlRVUpHRzk4ZTd0VTdDaUcyalJid0ZjCmtWcERqSW1k eFlINGttSEZYTlZucVVWemlMMk0reHNKcjF3SmhCQllXdmw5RzBBCnl0NWZVb1ZW
Q3ozaEQvT0Rja1VvT3NoRWxFeWxqbzFtMEdUVkJEcURGMGMKLT4gc3NoLWVkMjU1 MWRzc05pNVVWTlRyNzNRaDlYTm5TSVF3ZGNMclhyY0R3bUkKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIDZvWHpFRWVFVTRTSUlzcm1Ca1JNbFhNQWNISkkyTXp2SVFRVmpt MTkgWXlTVU1RIEppTjJPUmxlamdLY2xxRVBwcFBmTTdOM3dLU3h3YnA2TlhRWXRu
Q0JxUXcKYThwazdBekZFdUc2aVRaSUVjUmFxWjF4NXpCSm5rME1yeUJDUUdEZXAw OGJrR28KMW9JQUFDcXFLOTk4NDVHQmJucEZuOElLaG5Eb1lyK1NGTUJaMkFONit1
YwotPiBzc2gtZWQyNTUxOSBuanZYNUEga1ZZRVRSQTJpVnhzekpVQU00MlB0TzQ3 dwotPiBzc2gtZWQyNTUxOSBuanZYNUEgZkF5MVNGK3FRV2JPVDFGMkY5SWxGWVVK
QzBnSUZaVTIxS1Z3R1UzWm9RTQpEeHlyQm4zSWhYODYxalZXakdVZWJBeTFwVzEr YThUVFk2VGZZNXN6UWx3eFJ6MAp0d3NGWTRuLzNOb0VxdVUvZ1YwR0lWemc2NDR2
S2NVODFBTm95bnI3ZjJjCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBMbVVWamlEVU4w VFI2eWRjS242SEJrQWx3Ci0+IHNzaC1lZDI1NTE5IENxSU9VQSBpY2JoaGRKY0ZR
WHNWbVQ0OXBnY2ZSL005bUVuekNWTTgwd1pLditoZ3dNCmFtWk1PaXZ3c1g4eExX Y2txWFM1ODJyaW03b0xuRGlJMkVidEVZMGdiU1pTZ1hVCk0yeGF6VWU5LzF0Z1dL
dndXUXJqWC9lU3dVVjRqZWFVUWxyZTFiVmxpQ3MKLT4gc3NoLWVkMjU1MTkgejFP cnlDUCtLL01EWWo2Q0dYcjdtSjRtSnFjUHNWdzAKLS0tIEI4aWpNc0xqU3ZsLzcz
Y1p3IGdOZHRHMkVqeWtzYldIMTRwb2w5M2lrc0FiOUdmT25kWWJ3U3dLZFpEUWcK TThFNXd0YjQ2MEMzc0JOQXZnTnBaTVg0V1hITzgK8GYZG8/fGXk6ELSB6rnLX0ke
UEFWMndhaDFBUzZrMHl6eUtNMXhIQ2RBQjQwTG5pQnIxZE03L3BpcUNBSQotLS0g QqiztfVnV/fpgEgJ/K60Ea3aBe3ELpejzFKZfno+jesvnL5DCMGz7QRRpnThLQ==
dXVZNWdJY2hMaHNqdHVEYzRXNlpzOVA3ZnRyaWV2SVNJaG5FL2FPVjN3QQrunATj
0/HE6CeyvFHIYDazDseUaebDS+A/CaYPpOo+3OvMRXFwbZ7KzAzZCdT1iNLWOc3E
Im2nMI/yWSLo2n5f
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,16 +1,14 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBQeWZS YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyB4R0xH
Wkg1TDBxZmVQS09CTE1VVzMxTHh4dnAzSlpHQkhDVU0ycm9DaHlRCnd6QXVLREx1 NU0rdGUzb0FaeC9JWUtJNUd1V3dFYWpKbm1ONG5MbFE0dE1obDIwClduT1ZTL3o5
T2xpaTlnL1V1OUJaQ1U0UWxOZnFZTlMxSHU0dGVReUFsdXcKLT4gc3NoLWVkMjU1 MGNHamh6cWF5S3RlTGxGRWJnRE1xU0FRYkpETDgzTUpLSGMKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIHp5ZCtUeWhzVWNBRXdkRkJCdERhQkxTb2I1UFhUYjlCeVcxWWN2 MTkgWXlTVU1RIFhJektxUE84aC9BeVVlalJxUDFabTM0dWRHN1ZMY2tMb1JVSDZw
bmJYeE0KYlJFdzJuRTNqWHJUVUJWWnI0dVVFUEQrYnZlb2NZZmNVbHltL3BrdU9E RHhTQ0UKQzhlTVU4djJKUENEVXpoQVU2azRBQU93d2JGamwzRjNxc3VCNVhEbVVH
cwotPiBzc2gtZWQyNTUxOSBuanZYNUEgM0RVMGxqcFZ0RjJ5Y3VXWEZKaGlSL0tS TQotPiBzc2gtZWQyNTUxOSBuanZYNUEgZXZnUWt6ZHFxTW1mN2RtYy9IdXBtL21N
M2VCbmNPY0t4K0M1Z1Mwb2lRTQpvSmRnM09Lb3ZpcnNDemk1SUR0cTVaczNwZnFa NG9wMEQ3WFRNTGF4M2NYU0ZtVQpRMllFVk9GV2dCeERIakpXZnIydXNLMWJwNGds
S2p0cStmZm0vVVJVamdvCi0+IHNzaC1lZDI1NTE5IENxSU9VQSAvR2RaVUZQeUZo dEhyNjRSL29COU1uQlBNCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBiVjdTWlAwaytl
TGRsdWh3aGtET0hrdEliRHB3YmFvU0dad2FtNndYcngwCjdZNStmTFZIZGRRUDhM aWJwTkZNTTNwQVhNUGl0ejRiRHppWWhaWi9kWWk4QlhzCmJxcExjK2loWUtwZDND
cDVVdVR3MkZXeFJPRGlUYXdsVDVTY0Jxc0lGRlUKLT4gc3NoLWVkMjU1MTkgejFP WjBXRUFCVGFLbTlKdlVieTdSZ1hlL0ZaTkNubFUKLS0tIDNVQ2NCdDVHNGUvZXFM
Y1p3IDB4NTd2US92UmJtUEc2dUJ1RW85VlB4TVlVNXYyMUZRdzdraWtUMVR4UzAK azdWUmh6azAwMnJ4Wm5UOEdGTmRBenJSdUY1eGMKx3sYbX/g7JVCFrwVe7UNLkWn
TE5idjJFR3JlS1pLdXpjcEgwdFFkSng2YW1jUlBTbDZRSmNMRWhteSsxdwotLS0g 1p+MbGJcRS0ucxNIEniCBafaVnXDiRAHtaWSCqtbvZ4SVg==
NWZ3WXVuWm5wSy8veTFsazM0OEJFcjRYTTM1SUpBNlRJMmxHZHFVYVpuUQrvQ8GS
sSz17HKJKfkSR1yPs9uAK8JleCgGmqemt0KTzT3beutowD6fCBYZl8nPzTsQc5J5
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

View File

@ -1,16 +1,14 @@
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBHZTF6 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBJQUVJ
RlExdGpEOXVodFV0R1FEeis0b1FJM0l3dGxnVjFQRm1jNjZXMmpFCmVWdmVtaE4v aHZzMHNaME1zUDR2dXVHMTFvc2pqZnV2Z09YZ3FTM20wdGo4ckFrCkFOc1lCQmhv
T3JaMkpocHlNYXVlai9jeEsvWXJJQUVPcUtKS3N2ZVUzajgKLT4gc3NoLWVkMjU1 STNpT2RlcWhNdzYxbEFvNzV4cmtoYm9waWc5cXhkWEM4eUkKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIGVtT24vYWlkWldsOUNSNVk5UEsvRWZEb2pvK01ndk5NeE5FbzVj MTkgWXlTVU1RIHliSURYL0syL1N5bUxWQ2NOQzhWR09kNUNqaGpWa3lrR1M5Qldv
bEhta1EKc09ZUUZseEllcndOUzYyS2paZ205SmtSUUg1UVRKVDJLY1pXcHZkdlNr KzlvM00KM3JvRjlBZHh2UzVxbW9rbUdIcUNOWkhVbEFETEN2VTdDc0lMV0EzR1kv
QQotPiBzc2gtZWQyNTUxOSBuanZYNUEgd1Nnbk9GVWFNZDRsd1VpVm9WOHpUaFp0 VQotPiBzc2gtZWQyNTUxOSBuanZYNUEgK0lkMWNuUFR4ZGZmaGJpOURVS3lBbGti
ckdJR3N2UEFUbGMySGNTem5nYwp1OTVtVWg0dlZlL3h3Ty9ZQnA5NTJ4Y1ZVZHU3 aFA4anhUNEhYLzkzT3hZZTJnUQpmSEN5MzdVcWYxbTFpeGRlODAvUFVySGRoUVpE
R0d4V0R5OHFZcDQ2TnZvCi0+IHNzaC1lZDI1NTE5IENxSU9VQSB6OEt2SWl2cXFN NEd6aitiVm1vR1VNcnlNCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBiMjNoUG9jVTQ0
ek5iMWNrcllVZ0o2K0Z0clI2QXlUdE1tWDE2NW8xdDNzClltWjhKaHNOWFpjSmFG akdPcXMrbVo4OU1mODhkMHlKbzEvTEJObGViVXFaUVJZClRWaXhjNzB4b3hvbkVW
WFRZVktvR2E4UUFEMVFkTzVuR3lMVDdRVGs4Y00KLT4gc3NoLWVkMjU1MTkgejFP RUFWWnc0QkFzOEpXWVdZOG1TbDNLQ3lkdkxVRHMKLS0tIHNRNlIxVjhsMEVyK21o
Y1p3IE55VWFKVlFKK3RCalg3RDFwQTBIaWpvay9iTW9RRXV3SVgrUXhtZHV5MDAK a214bW1BKzVHbkZrdGhndkhnMlgrWStYbXoyVGMK8hdGLDk9xC1OnfTNtHZLbZCF
RFEzMGtUZmRIQTlyRHcvSDBnbGlsRDBXVHh3amY4bzM0QmE0aU8vbnpnTQotLS0g KKw9JFl6b8++iwM2H8cQgWk8qZWQUvyO58ahkO/xtOCXCA==
Q2NxNlBWT0ZmMm1MNnJvaUl5dGlUQUt2aStrdkRXRWZ6TDVOdzU0VHFDVQqTaee+
qfaK5T6tjcv7LawzcztJbdKCqFecw/BEAicpyrkGmOfr1J5PmOxOFM/Rkk2HpLuP
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----

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