Merge branch 'master' into autorandr-module
commit7844c87ab731080314bd6f8424e795b46347f964
authorAlexander Nortung <alex_nortung@live.dk>
dateSat 26 Mar 2022, 14:18 (5 years ago)
parent41dd1d41d5c905
7537 files changed+185649−105926
4537 more files changed are not listed.
.editorconfig−11
@@ -67,10 +67,6 @@ indent_style = unset
6767insert_final_newline = unset
6868trim_trailing_whitespace = unset
6969
70−[pkgs/build-support/upstream-updater/**]
71−indent_style = unset
72−trim_trailing_whitespace = unset
73−
7470[pkgs/development/compilers/elm/registry.dat]
7571end_of_line = unset
7672insert_final_newline = unset
@@ -84,10 +80,3 @@ trim_trailing_whitespace = unset
8480
8581[pkgs/tools/misc/timidity/timidity.cfg]
8682trim_trailing_whitespace = unset
87−
88−[pkgs/tools/security/enpass/data.json]
89−insert_final_newline = unset
90−trim_trailing_whitespace = unset
91−
92−[pkgs/top-level/emscripten-packages.nix]
93−trim_trailing_whitespace = unset
.git-blame-ignore-revsnew file+32
@@ -0,0 +1,32 @@
1+# This file contains a list of commits that are not likely what you
2+# are looking for in a blame, such as mass reformatting or renaming.
3+# You can set this file as a default ignore file for blame by running
4+# the following command.
5+#
6+# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
7+#
8+# To temporarily not use this file add
9+# --ignore-revs-file=""
10+# to your blame command.
11+#
12+# The ignoreRevsFile can't be set globally due to blame failing if the file isn't present.
13+# To not have to set the option in every repository it is needed in,
14+# save the following script in your path with the name "git-bblame"
15+# now you can run
16+# $ git bblame $FILE
17+# to use the .git-blame-ignore-revs file if it is present.
18+#
19+# #!/usr/bin/env bash
20+# repo_root=$(git rev-parse --show-toplevel)
21+# if [[ -e $repo_root/.git-blame-ignore-revs ]]; then
22+# git blame --ignore-revs-file="$repo_root/.git-blame-ignore-revs" $@
23+# else
24+# git blame $@
25+# fi
26+
27+
28+# nixos/modules/rename: Sort alphabetically
29+1f71224fe86605ef4cd23ed327b3da7882dad382
30+
31+# nixos: fix module paths in rename.nix
32+d08ede042b74b8199dc748323768227b88efcf7c
.github/CODEOWNERS+15−8
@@ -77,6 +77,12 @@
7777# NixOS integration test driver
7878/nixos/lib/test-driver @tfc
7979
80+# Systemd
81+/nixos/modules/system/boot/systemd.nix @NixOS/systemd
82+/nixos/modules/system/boot/systemd @NixOS/systemd
83+/nixos/lib/systemd-*.nix @NixOS/systemd
84+/pkgs/os-specific/linux/systemd @NixOS/systemd
85+
8086# Updaters
8187## update.nix
8288/maintainers/scripts/update.nix @jtojnar
@@ -104,9 +110,9 @@
104110/pkgs/top-level/haskell-packages.nix @cdepillabout @sternenseemann @maralorn @expipiplus1
105111
106112# Perl
107−/pkgs/development/interpreters/perl @volth @stigtsp @zakame
108−/pkgs/top-level/perl-packages.nix @volth @stigtsp @zakame
109−/pkgs/development/perl-modules @volth @stigtsp @zakame
113+/pkgs/development/interpreters/perl @stigtsp @zakame
114+/pkgs/top-level/perl-packages.nix @stigtsp @zakame
115+/pkgs/development/perl-modules @stigtsp @zakame
110116
111117# R
112118/pkgs/applications/science/math/R @jbedo @bcdarwin
@@ -119,6 +125,7 @@
119125# Rust
120126/pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq
121127/pkgs/build-support/rust @zowoq
128+/doc/languages-frameworks/rust.section.md @zowoq
122129
123130# Darwin-related
124131/pkgs/stdenv/darwin @NixOS/darwin-maintainers
@@ -217,18 +224,18 @@
217224/nixos/modules/services/mail/rspamd.nix @peti
218225
219226# Emacs
220−/pkgs/applications/editors/emacs-modes @adisbladis
221−/pkgs/applications/editors/emacs @adisbladis
222−/pkgs/top-level/emacs-packages.nix @adisbladis
227+/pkgs/applications/editors/emacs/elisp-packages @adisbladis
228+/pkgs/applications/editors/emacs @adisbladis
229+/pkgs/top-level/emacs-packages.nix @adisbladis
223230
224231# Neovim
225232/pkgs/applications/editors/neovim @jonringer @teto
226233
227234# VimPlugins
228−/pkgs/misc/vim-plugins @jonringer @softinio
235+/pkgs/applications/editors/vim/plugins @jonringer
229236
230237# VsCode Extensions
231−/pkgs/misc/vscode-extensions @jonringer
238+/pkgs/applications/editors/vscode/extensions @jonringer
232239
233240# Prometheus exporter modules and tests
234241/nixos/modules/services/monitoring/prometheus/exporters.nix @WilliButz
.github/ISSUE_TEMPLATE/out_of_date_package_report.md+3−3
@@ -13,10 +13,10 @@ assignees: ''
1313<!-- Note that these are hard requirements -->
1414
1515<!--
16−You can use the "Go to file" functionality on github to find the package
16+You can use the "Go to file" functionality on GitHub to find the package
1717Then you can go to the history for this package
1818Find the latest "package_name: old_version -> new_version" commit
19−The "new_version" is the the current version of the package
19+The "new_version" is the current version of the package
2020-->
2121- [ ] Checked the [nixpkgs master branch](https://github.com/NixOS/nixpkgs)
2222<!--
@@ -29,7 +29,7 @@ There's a high chance that you'll have the new version right away while helping
2929###### Project name
3030`nix search` name:
3131<!--
32−The current version can be found easily with the same process than above for checking the master branch
32+The current version can be found easily with the same process as above for checking the master branch
3333If an open PR is present for the package, take this version as the current one and link to the PR
3434-->
3535current version:
.github/PULL_REQUEST_TEMPLATE.md+15−10
@@ -1,16 +1,10 @@
1+###### Description of changes
2+
13<!--
2−To help with the large amounts of pull requests, we would appreciate your
3−reviews of other pull requests, especially simple package updates. Just leave a
4−comment describing what you have tested in the relevant package/service.
5−Reviewing helps to reduce the average time-to-merge for everyone.
6−Thanks a lot if you do!
7−List of open PRs: https://github.com/NixOS/nixpkgs/pulls
8−Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-contributions
4+For package updates please link to a changelog or describe changes, this helps your fellow maintainers discover breaking updates.
5+For new packages please briefly describe the package or provide a link to its homepage.
96-->
107
11−###### Motivation for this change
12−
13−
148###### Things done
159
1610<!-- Please check what applies. Note that these are not hard requirements but merely serve as information for reviewers. -->
@@ -34,3 +28,14 @@ Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-
3428 - [ ] (Module addition) Added a release notes entry if adding a new NixOS module
3529 - [ ] (Release notes changes) Ran `nixos/doc/manual/md-to-db.sh` to update generated release notes
3630- [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md).
31+
32+<!--
33+To help with the large amounts of pull requests, we would appreciate your
34+reviews of other pull requests, especially simple package updates. Just leave a
35+comment describing what you have tested in the relevant package/service.
36+Reviewing helps to reduce the average time-to-merge for everyone.
37+Thanks a lot if you do!
38+
39+List of open PRs: https://github.com/NixOS/nixpkgs/pulls
40+Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-contributions
41+-->
.github/labeler.yml+2−6
@@ -5,10 +5,6 @@
55 - pkgs/development/libraries/agda/**/*
66 - pkgs/top-level/agda-packages.nix
77
8−"6.topic: bsd":
9− - pkgs/os-specific/bsd/**/*
10− - pkgs/stdenv/freebsd/**/*
11−
128"6.topic: cinnamon":
139 - pkgs/desktops/cinnamon/**/*
1410
@@ -16,7 +12,7 @@
1612 - nixos/modules/services/editors/emacs.nix
1713 - nixos/modules/services/editors/emacs.xml
1814 - nixos/tests/emacs-daemon.nix
19− - pkgs/applications/editors/emacs-modes/**/*
15+ - pkgs/applications/editors/emacs/elisp-packages/**/*
2016 - pkgs/applications/editors/emacs/**/*
2117 - pkgs/build-support/emacs/**/*
2218 - pkgs/top-level/emacs-packages.nix
@@ -142,7 +138,7 @@
142138"6.topic: vim":
143139 - doc/languages-frameworks/vim.section.md
144140 - pkgs/applications/editors/vim/**/*
145− - pkgs/misc/vim-plugins/**/*
141+ - pkgs/applications/editors/vim/plugins/**/*
146142 - nixos/modules/programs/neovim.nix
147143 - pkgs/applications/editors/neovim/**/*
148144
.github/workflows/backport.yml+7−1
@@ -2,13 +2,19 @@ name: Backport
22on:
33 pull_request_target:
44 types: [closed, labeled]
5+
6+# WARNING:
7+# When extending this action, be aware that $GITHUB_TOKEN allows write access to
8+# the GitHub repository. This means that it should not evaluate user input in a
9+# way that allows code injection.
10+
511jobs:
612 backport:
713 name: Backport Pull Request
814 if: github.repository_owner == 'NixOS' && github.event.pull_request.merged == true && (github.event_name != 'labeled' || startsWith('backport', github.event.label.name))
915 runs-on: ubuntu-latest
1016 steps:
11− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1218 with:
1319 # required to find all branches
1420 fetch-depth: 0
.github/workflows/basic-eval.yml+6−1
@@ -14,7 +14,12 @@ jobs:
1414 runs-on: ubuntu-latest
1515 # we don't limit this action to only NixOS repo since the checks are cheap and useful developer feedback
1616 steps:
17− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1818 - uses: cachix/install-nix-action@v16
19+ - uses: cachix/cachix-action@v10
20+ with:
21+ # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
22+ name: nixpkgs-ci
23+ signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
1924 # explicit list of supportedSystems is needed until aarch64-darwin becomes part of the trunk jobset
2025 - run: nix-build pkgs/top-level/release.nix -A tarball.nixpkgs-basic-release-checks --arg supportedSystems '[ "aarch64-darwin" "aarch64-linux" "x86_64-linux" "x86_64-darwin" ]'
.github/workflows/direct-push.yml+1−1
@@ -22,7 +22,7 @@ jobs:
2222 if: steps.ismerge.outputs.ismerge != 'true'
2323 - name: Warn if the commit was a direct push
2424 if: steps.ismerge.outputs.ismerge != 'true'
25− uses: peter-evans/commit-comment@v1
25+ uses: peter-evans/commit-comment@v2
2626 with:
2727 body: |
2828 @${{ github.actor }}, you pushed a commit directly to master/release branch
.github/workflows/editorconfig.yml+1−1
@@ -24,7 +24,7 @@ jobs:
2424 - name: print list of changed files
2525 run: |
2626 cat "$HOME/changed_files"
27− - uses: actions/checkout@v2
27+ - uses: actions/checkout@v3
2828 with:
2929 # pull_request_target checks out the base branch by default
3030 ref: refs/pull/${{ github.event.pull_request.number }}/merge
.github/workflows/labels.yml+6−1
@@ -4,6 +4,11 @@ on:
44 pull_request_target:
55 types: [edited, opened, synchronize, reopened]
66
7+# WARNING:
8+# When extending this action, be aware that $GITHUB_TOKEN allows some write
9+# access to the GitHub API. This means that it should not evaluate user input in
10+# a way that allows code injection.
11+
712permissions:
813 contents: read
914 pull-requests: write
@@ -13,7 +18,7 @@ jobs:
1318 runs-on: ubuntu-latest
1419 if: github.repository_owner == 'NixOS'
1520 steps:
16− - uses: actions/labeler@v3
21+ - uses: actions/labeler@v4
1722 with:
1823 repo-token: ${{ secrets.GITHUB_TOKEN }}
1924 sync-labels: true
.github/workflows/manual-nixos.yml+2−2
@@ -14,7 +14,7 @@ jobs:
1414 runs-on: ubuntu-latest
1515 if: github.repository_owner == 'NixOS'
1616 steps:
17− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1818 with:
1919 # pull_request_target checks out the base branch by default
2020 ref: refs/pull/${{ github.event.pull_request.number }}/merge
@@ -24,7 +24,7 @@ jobs:
2424 extra_nix_config: sandbox = true
2525 - uses: cachix/cachix-action@v10
2626 with:
27− # This cache is for the nixos/nixpkgs manual builds and should not be trusted or used elsewhere.
27+ # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
2828 name: nixpkgs-ci
2929 signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
3030 - name: Building NixOS manual
.github/workflows/manual-nixpkgs.yml+2−2
@@ -14,7 +14,7 @@ jobs:
1414 runs-on: ubuntu-latest
1515 if: github.repository_owner == 'NixOS'
1616 steps:
17− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1818 with:
1919 # pull_request_target checks out the base branch by default
2020 ref: refs/pull/${{ github.event.pull_request.number }}/merge
@@ -24,7 +24,7 @@ jobs:
2424 extra_nix_config: sandbox = true
2525 - uses: cachix/cachix-action@v10
2626 with:
27− # This cache is for the nixos/nixpkgs manual builds and should not be trusted or used elsewhere.
27+ # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
2828 name: nixpkgs-ci
2929 signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
3030 - name: Building Nixpkgs manual
.github/workflows/nixos-manual.yml+1−1
@@ -15,7 +15,7 @@ jobs:
1515 runs-on: ubuntu-latest
1616 if: github.repository_owner == 'NixOS'
1717 steps:
18− - uses: actions/checkout@v2
18+ - uses: actions/checkout@v3
1919 with:
2020 # pull_request_target checks out the base branch by default
2121 ref: refs/pull/${{ github.event.pull_request.number }}/merge
.github/workflows/pending-set.yml+5
@@ -3,6 +3,11 @@ name: "set pending status"
33on:
44 pull_request_target:
55
6+# WARNING:
7+# When extending this action, be aware that $GITHUB_TOKEN allows write access to
8+# the GitHub repository. This means that it should not evaluate user input in a
9+# way that allows code injection.
10+
611jobs:
712 action:
813 runs-on: ubuntu-latest
.github/workflows/periodic-merge-24h.yml+1−1
@@ -38,7 +38,7 @@ jobs:
3838 into: staging-21.11
3939 name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
4040 steps:
41− - uses: actions/checkout@v2
41+ - uses: actions/checkout@v3
4242
4343 - name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
4444 uses: devmasx/merge-branch@1.4.0
.github/workflows/periodic-merge-6h.yml+1−1
@@ -32,7 +32,7 @@ jobs:
3232 into: staging
3333 name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
3434 steps:
35− - uses: actions/checkout@v2
35+ - uses: actions/checkout@v3
3636
3737 - name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
3838 uses: devmasx/merge-branch@1.4.0
.github/workflows/update-terraform-providers.yml+2−2
@@ -10,7 +10,7 @@ jobs:
1010 if: github.repository_owner == 'NixOS' && github.ref == 'refs/heads/master' # ensure workflow_dispatch only runs on master
1111 runs-on: ubuntu-latest
1212 steps:
13− - uses: actions/checkout@v2
13+ - uses: actions/checkout@v3
1414 - uses: cachix/install-nix-action@v16
1515 - name: setup
1616 id: setup
@@ -21,7 +21,7 @@ jobs:
2121 git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
2222 git config user.name "github-actions[bot]"
2323 pushd pkgs/applications/networking/cluster/terraform-providers
24− ./update-all-providers
24+ ./update-all-providers --no-build
2525 git commit -m "${{ steps.setup.outputs.title }}" providers.json
2626 popd
2727 - name: create PR
README.md+8−3
@@ -1,10 +1,15 @@
11<p align="center">
2− <a href="https://nixos.org/nixos"><img src="https://nixos.org/logo/nixos-hires.png" width="500px" alt="NixOS logo" /></a>
2+ <a href="https://nixos.org#gh-light-mode-only">
3+ <img src="https://raw.githubusercontent.com/NixOS/nixos-homepage/master/logo/nixos-hires.png" width="500px" alt="NixOS logo"/>
4+ </a>
5+ <a href="https://nixos.org#gh-dark-mode-only">
6+ <img src="https://raw.githubusercontent.com/NixOS/nixos-artwork/master/logo/nixos-white.png" width="500px" alt="NixOS logo"/>
7+ </a>
38</p>
49
510<p align="center">
6− <a href="https://www.codetriage.com/nixos/nixpkgs"><img src="https://www.codetriage.com/nixos/nixpkgs/badges/users.svg" alt="Code Triagers badge" /></a>
7− <a href="https://opencollective.com/nixos"><img src="https://opencollective.com/nixos/tiers/supporter/badge.svg?label=Supporter&color=brightgreen" alt="Open Collective supporters" /></a>
11+ <a href="https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md"><img src="https://img.shields.io/github/contributors-anon/NixOS/nixpkgs" alt="Contributors badge" /></a>
12+ <a href="https://opencollective.com/nixos"><img src="https://opencollective.com/nixos/tiers/supporter/badge.svg?label=supporters&color=brightgreen" alt="Open Collective supporters" /></a>
813</p>
914
1015[Nixpkgs](https://github.com/nixos/nixpkgs) is a collection of over
doc/builders/fetchers.chapter.md+22
@@ -40,6 +40,24 @@ Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this c
4040
4141Additionally the following optional arguments can be given: `fetchSubmodules = true` makes `fetchgit` also fetch the submodules of a repository. If `deepClone` is set to true, the entire repository is cloned as opposing to just creating a shallow clone. `deepClone = true` also implies `leaveDotGit = true` which means that the `.git` directory of the clone won't be removed after checkout.
4242
43+If only parts of the repository are needed, `sparseCheckout` can be used. This will prevent git from fetching unnecessary blobs from server, see [git sparse-checkout](https://git-scm.com/docs/git-sparse-checkout) and [git clone --filter](https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---filterltfilter-specgt) for more infomation:
44+
45+```nix
46+{ stdenv, fetchgit }:
47+
48+stdenv.mkDerivation {
49+ name = "hello";
50+ src = fetchgit {
51+ url = "https://...";
52+ sparseCheckout = ''
53+ path/to/be/included
54+ another/path
55+ '';
56+ sha256 = "0000000000000000000000000000000000000000000000000000";
57+ };
58+}
59+```
60+
4361## `fetchfossil` {#fetchfossil}
4462
4563Used with Fossil. Expects `url` to a Fossil archive, `rev`, and `sha256`.
@@ -54,6 +72,10 @@ Used with Mercurial. Expects `url`, `rev`, and `sha256`.
5472
5573A number of fetcher functions wrap part of `fetchurl` and `fetchzip`. They are mainly convenience functions intended for commonly used destinations of source code in Nixpkgs. These wrapper fetchers are listed below.
5674
75+## `fetchFromGitea` {#fetchfromgitea}
76+
77+`fetchFromGitea` expects five arguments. `domain` is the gitea server name. `owner` is a string corresponding to the Gitea user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every Gitea HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
78+
5779## `fetchFromGitHub` {#fetchfromgithub}
5880
5981`fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
doc/builders/packages/steam.section.md+1−1
@@ -56,7 +56,7 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
5656
5757## steam-run {#sec-steam-run}
5858
59−The FHS-compatible chroot used for Steam can also be used to run other Linux games that expect a FHS environment. To use it, install the `steam-run-native` package and run the game with
59+The FHS-compatible chroot used for Steam can also be used to run other Linux games that expect a FHS environment. To use it, install the `steam-run` package and run the game with
6060
6161```
6262steam-run ./foo
doc/builders/special/fhs-environments.section.md+2
@@ -45,3 +45,5 @@ One can create a simple environment using a `shell.nix` like that:
4545```
4646
4747Running `nix-shell` would then drop you into a shell with these libraries and binaries available. You can use this to run closed-source applications which expect FHS structure without hassles: simply change `runScript` to the application path, e.g. `./bin/start.sh` -- relative paths are supported.
48+
49+Additionally, the FHS builder links all relocated gsettings-schemas (the glib setup-hook moves them to `share/gsettings-schemas/${name}/glib-2.0/schemas`) to their standard FHS location. This means you don't need to wrap binaries with `wrapGAppsHook`.
doc/contributing/coding-conventions.chapter.md+4−3
@@ -224,7 +224,7 @@ There are a few naming guidelines:
224224
225225- Dashes in the package name _should_ be preserved in new variable names, rather than converted to underscores or camel cased — e.g., `http-parser` instead of `http_parser` or `httpParser`. The hyphenated style is preferred in all three package names.
226226
227−- If there are multiple versions of a package, this _should_ be reflected in the variable names in `all-packages.nix`, e.g. `json-c-0-9` and `json-c-0-11`. If there is an obvious “default” version, make an attribute like `json-c = json-c-0-9;`. See also [](#sec-versioning)
227+- If there are multiple versions of a package, this _should_ be reflected in the variable names in `all-packages.nix`, e.g. `json-c_0_9` and `json-c_0_11`. If there is an obvious “default” version, make an attribute like `json-c = json-c_0_9;`. See also [](#sec-versioning)
228228
229229## File naming and organisation {#sec-organisation}
230230
@@ -540,10 +540,11 @@ If you do need to do create this sort of patch file, one way to do so is with gi
540540
541541If a patch is available online but does not cleanly apply, it can be modified in some fixed ways by using additional optional arguments for `fetchpatch`:
542542
543+- `relative`: Similar to using `git-diff`'s `--relative` flag, only keep changes inside the specified directory, making paths relative to it.
543544- `stripLen`: Remove the first `stripLen` components of pathnames in the patch.
544545- `extraPrefix`: Prefix pathnames by this string.
545−- `excludes`: Exclude files matching this pattern.
546−- `includes`: Include only files matching this pattern.
546+- `excludes`: Exclude files matching these patterns (applies after the above arguments).
547+- `includes`: Include only files matching these patterns (applies after the above arguments).
547548- `revert`: Revert the patch.
548549
549550Note that because the checksum is computed after applying these effects, using or modifying these arguments will have no effect unless the `sha256` argument is changed as well.
doc/contributing/reviewing-contributions.chapter.md+5−4
@@ -103,7 +103,8 @@ Sample template for a new package review is provided below.
103103- [ ] `meta.maintainers` is set
104104- [ ] build time only dependencies are declared in `nativeBuildInputs`
105105- [ ] source is fetched using the appropriate function
106−- [ ] phases are respected
106+- [ ] the list of `phases` is not overridden
107+- [ ] when a phase (like `installPhase`) is overridden it starts with `runHook preInstall` and ends with `runHook postInstall`.
107108- [ ] patches that are remotely available are fetched with `fetchpatch`
108109
109110##### Possible improvements
@@ -121,10 +122,10 @@ Reviewing process:
121122 - [CODEOWNERS](https://help.github.com/articles/about-codeowners/) will make GitHub notify users based on the submitted changes, but it can happen that it misses some of the package maintainers.
122123- Ensure that the module tests, if any, are succeeding.
123124- Ensure that the introduced options are correct.
124− - Type should be appropriate (string related types differs in their merging capabilities, `optionSet` and `string` types are deprecated).
125+ - Type should be appropriate (string related types differs in their merging capabilities, `loaOf` and `string` types are deprecated).
125126 - Description, default and example should be provided.
126127- Ensure that option changes are backward compatible.
127− - `mkRenamedOptionModule` and `mkAliasOptionModule` functions provide way to make option changes backward compatible.
128+ - `mkRenamedOptionModuleWith` provides a way to make option changes backward compatible.
128129- Ensure that removed options are declared with `mkRemovedOptionModule`
129130- Ensure that changes that are not backward compatible are mentioned in release notes.
130131- Ensure that documentations affected by the change is updated.
@@ -156,7 +157,7 @@ Reviewing process:
156157
157158- Ensure that the module tests, if any, are succeeding.
158159- Ensure that the introduced options are correct.
159− - Type should be appropriate (string related types differs in their merging capabilities, `optionSet` and `string` types are deprecated).
160+ - Type should be appropriate (string related types differs in their merging capabilities, `loaOf` and `string` types are deprecated).
160161 - Description, default and example should be provided.
161162- Ensure that module `meta` field is present
162163 - Maintainers should be declared in `meta.maintainers`.
doc/contributing/submitting-changes.chapter.md+1−1
@@ -98,7 +98,7 @@ We use jbidwatcher as an example for a discontinued project here.
98981. Create a new branch for your change, e.g. `git checkout -b jbidwatcher`
99991. Remove the actual package including its directory, e.g. `rm -rf pkgs/applications/misc/jbidwatcher`
1001001. Remove the package from the list of all packages (`pkgs/top-level/all-packages.nix`).
101−1. Add an alias for the package name in `pkgs/top-level/aliases.nix` (There is also `pkgs/misc/vim-plugins/aliases.nix`. Package sets typically do not have aliases, so we can't add them there.)
101+1. Add an alias for the package name in `pkgs/top-level/aliases.nix` (There is also `pkgs/applications/editors/vim/plugins/aliases.nix`. Package sets typically do not have aliases, so we can't add them there.)
102102
103103 For example in this case:
104104
doc/functions/library/attrsets.xml+1−1
@@ -1474,7 +1474,7 @@ lib.attrsets.zipAttrsWith
14741474 <section xml:id="function-library-lib.attrsets.zipAttrs">
14751475 <title><function>lib.attrsets.zipAttrs</function></title>
14761476
1477− <subtitle><literal>zipAttrsWith :: [ AttrSet ] -> AttrSet</literal>
1477+ <subtitle><literal>zipAttrs :: [ AttrSet ] -> AttrSet</literal>
14781478 </subtitle>
14791479
14801480 <xi:include href="./locations.xml" xpointer="lib.attrsets.zipAttrs" />
doc/languages-frameworks/coq.section.md+2−1
@@ -29,7 +29,8 @@ The recommended way of defining a derivation for a Coq library, is to use the `c
2929* `releaseRev` (optional, defaults to `(v: v)`), provides a default mapping from release names to revision hashes/branch names/tags,
3030* `displayVersion` (optional), provides a way to alter the computation of `name` from `pname`, by explaining how to display version numbers,
3131* `namePrefix` (optional, defaults to `[ "coq" ]`), provides a way to alter the computation of `name` from `pname`, by explaining which dependencies must occur in `name`,
32−* `extraBuildInputs` (optional), by default `buildInputs` just contains `coq`, this allows to add more build inputs,
32+* `extraNativeBuildInputs` (optional), by default `nativeBuildInputs` just contains `coq`, this allows to add more native build inputs, `nativeBuildInputs` are executables and `buildInputs` are libraries and dependencies,
33+* `extraBuildInputs` (optional), this allows to add more build inputs,
3334* `mlPlugin` (optional, defaults to `false`). Some extensions (plugins) might require OCaml and sometimes other OCaml packages. Standard dependencies can be added by setting the current option to `true`. For a finer grain control, the `coq.ocamlPackages` attribute can be used in `extraBuildInputs` to depend on the same package set Coq was built against.
3435* `useDune2ifVersion` (optional, default to `(x: false)` uses Dune2 to build the package if the provided predicate evaluates to true on the version, e.g. `useDune2if = versions.isGe "1.1"` will use dune if the version of the package is greater or equal to `"1.1"`,
3536* `useDune2` (optional, defaults to `false`) uses Dune2 to build the package if set to true, the presence of this attribute overrides the behavior of the previous one.
doc/languages-frameworks/javascript.section.md+24−2
@@ -85,7 +85,7 @@ you will still need to commit the modified version of the lock files, but at lea
8585
8686each tool has an abstraction to just build the node_modules (dependencies) directory. you can always use the stdenv.mkDerivation with the node_modules to build the package (symlink the node_modules directory and then use the package build command). the node_modules abstraction can be also used to build some web framework frontends. For an example of this see how [plausible](https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/web-apps/plausible/default.nix) is built. mkYarnModules to make the derivation containing node_modules. Then when building the frontend you can just symlink the node_modules directory
8787
88−## javascript packages inside nixpkgs {#javascript-packages-nixpkgs}
88+## Javascript packages inside nixpkgs {#javascript-packages-nixpkgs}
8989
9090The `pkgs/development/node-packages` folder contains a generated collection of
9191[NPM packages](https://npmjs.com/) that can be installed with the Nix package
@@ -121,12 +121,14 @@ requires `node-gyp-build`, so [we override](https://github.com/NixOS/nixpkgs/blo
121121 };
122122```
123123
124+### Adding and Updating Javascript packages in nixpkgs
125+
124126To add a package from NPM to nixpkgs:
125127
1261281. Modify `pkgs/development/node-packages/node-packages.json` to add, update
127129 or remove package entries to have it included in `nodePackages` and
128130 `nodePackages_latest`.
129−2. Run the script: `cd pkgs/development/node-packages && ./generate.sh`.
131+2. Run the script: `./pkgs/development/node-packages/generate.sh`.
1301323. Build your new package to test your changes:
131133 `cd /path/to/nixpkgs && nix-build -A nodePackages.<new-or-updated-package>`.
132134 To build against the latest stable Current Node.js version (e.g. 14.x):
@@ -137,6 +139,26 @@ For more information about the generation process, consult the
137139[README.md](https://github.com/svanderburg/node2nix) file of the `node2nix`
138140tool.
139141
142+To update NPM packages in nixpkgs, run the same `generate.sh` script:
143+
144+```sh
145+./pkgs/development/node-packages/generate.sh
146+```
147+
148+#### Git protocol error
149+
150+Some packages may have Git dependencies from GitHub specified with `git://`.
151+GitHub has
152+[disabled unecrypted Git connections](https://github.blog/2021-09-01-improving-git-protocol-security-github/#no-more-unauthenticated-git),
153+so you may see the following error when running the generate script:
154+`The unauthenticated git protocol on port 9418 is no longer supported`.
155+
156+Use the following Git configuration to resolve the issue:
157+
158+```sh
159+git config --global url."https://github.com/".insteadOf git://github.com/
160+```
161+
140162## Tool specific instructions {#javascript-tool-specific}
141163
142164### node2nix {#javascript-node2nix}
doc/languages-frameworks/ocaml.section.md+13−5
@@ -32,14 +32,14 @@ Given that most of the OCaml ecosystem is now built with dune, nixpkgs includes
3232
3333Here is a simple package example.
3434
35−- It defines an (optional) attribute `minimalOCamlVersion` that will be used to
36− throw a descriptive evaluation error if building with an older OCaml is
37− attempted.
35+- It defines an (optional) attribute `minimalOCamlVersion` (see note below)
36+ that will be used to throw a descriptive evaluation error if building with
37+ an older OCaml is attempted.
3838
3939- It uses the `fetchFromGitHub` fetcher to get its source.
4040
41−- `useDune2 = true` ensures that the latest version of Dune is used for the
42− build (this may become the default value in a future release).
41+- `useDune2 = true` ensures that Dune version 2 is used for the
42+ build (this is the default; set to `false` to use Dune version 1).
4343
4444- It sets the optional `doCheck` attribute such that tests will be run with
4545 `dune runtest -p angstrom` after the build (`dune build -p angstrom`) is
@@ -117,3 +117,11 @@ buildDunePackage rec {
117117 };
118118}
119119```
120+
121+Note about `minimalOCamlVersion`. A deprecated version of this argument was
122+spelled `minimumOCamlVersion`; setting the old attribute wrongly modifies the
123+derivation hash and is therefore inappropriate. As a technical dept, currently
124+packaged libraries may still use the old spelling: maintainers are invited to
125+fix this when updating packages. Massive renaming is strongly discouraged as it
126+would be challenging to review, difficult to test, and will cause unnecessary
127+rebuild.
doc/languages-frameworks/python.section.md+25
@@ -979,6 +979,31 @@ with import <nixpkgs> {};
979979in python.withPackages(ps: [ps.blaze])).env
980980```
981981
982+#### Optional extra dependencies
983+
984+Some packages define optional dependencies for additional features. With
985+`setuptools` this is called `extras_require` and `flit` calls it `extras-require`. A
986+method for supporting this is by declaring the extras of a package in its
987+`passthru`, e.g. in case of the package `dask`
988+
989+```nix
990+passthru.extras-require = {
991+ complete = [ distributed ];
992+};
993+```
994+
995+and letting the package requiring the extra add the list to its dependencies
996+
997+```nix
998+propagatedBuildInputs = [
999+ ...
1000+] ++ dask.extras-require.complete;
1001+```
1002+
1003+Note this method is preferred over adding parameters to builders, as that can
1004+result in packages depending on different variants and thereby causing
1005+collisions.
1006+
9821007#### `buildPythonApplication` function {#buildpythonapplication-function}
9831008
9841009The `buildPythonApplication` function is practically the same as
doc/languages-frameworks/rust.section.md+2
@@ -464,6 +464,8 @@ you of the correct hash.
464464 be disabled by setting `dontUseCargoParallelTests`.
465465* `cargoInstallHook`: install binaries and static/shared libraries
466466 that were built using `cargoBuildHook`.
467+* `bindgenHook`: for crates which use `bindgen` as a build dependency, lets
468+ `bindgen` find `libclang` and `libclang` find the libraries in `buildInputs`.
467469
468470### Examples {#examples}
469471
doc/languages-frameworks/texlive.section.md+1−1
@@ -6,7 +6,7 @@ Since release 15.09 there is a new TeX Live packaging that lives entirely under
66
77- For basic usage just pull `texlive.combined.scheme-basic` for an environment with basic LaTeX support.
88
9−- It typically won't work to use separately installed packages together. Instead, you can build a custom set of packages like this:
9+- It typically won't work to use separately installed packages together. Instead, you can build a custom set of packages like this. Most CTAN packages should be available:
1010
1111 ```nix
1212 texlive.combine {
doc/languages-frameworks/vim.section.md+4−4
@@ -309,9 +309,9 @@ Sample output2:
309309
310310## Adding new plugins to nixpkgs {#adding-new-plugins-to-nixpkgs}
311311
312−Nix expressions for Vim plugins are stored in [pkgs/misc/vim-plugins](https://github.com/NixOS/nixpkgs/tree/master/pkgs/misc/vim-plugins). For the vast majority of plugins, Nix expressions are automatically generated by running [`./update.py`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/misc/vim-plugins/update.py). This creates a [generated.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/misc/vim-plugins/generated.nix) file based on the plugins listed in [vim-plugin-names](https://github.com/NixOS/nixpkgs/blob/master/pkgs/misc/vim-plugins/vim-plugin-names). Plugins are listed in alphabetical order in `vim-plugin-names` using the format `[github username]/[repository]@[gitref]`. For example https://github.com/scrooloose/nerdtree becomes `scrooloose/nerdtree`.
312+Nix expressions for Vim plugins are stored in [pkgs/applications/editors/vim/plugins](https://github.com/NixOS/nixpkgs/tree/master/pkgs/applications/editors/vim/plugins). For the vast majority of plugins, Nix expressions are automatically generated by running [`./update.py`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/update.py). This creates a [generated.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/generated.nix) file based on the plugins listed in [vim-plugin-names](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-plugin-names). Plugins are listed in alphabetical order in `vim-plugin-names` using the format `[github username]/[repository]@[gitref]`. For example https://github.com/scrooloose/nerdtree becomes `scrooloose/nerdtree`.
313313
314−Some plugins require overrides in order to function properly. Overrides are placed in [overrides.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/misc/vim-plugins/overrides.nix). Overrides are most often required when a plugin requires some dependencies, or extra steps are required during the build process. For example `deoplete-fish` requires both `deoplete-nvim` and `vim-fish`, and so the following override was added:
314+Some plugins require overrides in order to function properly. Overrides are placed in [overrides.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/overrides.nix). Overrides are most often required when a plugin requires some dependencies, or extra steps are required during the build process. For example `deoplete-fish` requires both `deoplete-nvim` and `vim-fish`, and so the following override was added:
315315
316316```nix
317317deoplete-fish = super.deoplete-fish.overrideAttrs(old: {
@@ -330,13 +330,13 @@ Finally, there are some plugins that are also packaged in nodePackages because t
330330Run the update script with a GitHub API token that has at least `public_repo` access. Running the script without the token is likely to result in rate-limiting (429 errors). For steps on creating an API token, please refer to [GitHub's token documentation](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token).
331331
332332```sh
333−GITHUB_API_TOKEN=my_token ./pkgs/misc/vim-plugins/update.py
333+GITHUB_API_TOKEN=my_token ./pkgs/applications/editors/vim/plugins/update.py
334334```
335335
336336Alternatively, set the number of processes to a lower count to avoid rate-limiting.
337337
338338```sh
339−./pkgs/misc/vim-plugins/update.py --proc 1
339+./pkgs/applications/editors/vim/plugins/update.py --proc 1
340340```
341341
342342## Important repositories {#important-repositories}
doc/stdenv/meta.chapter.md−4
@@ -192,10 +192,6 @@ meta.hydraPlatforms = [];
192192
193193If set to `true`, the package is marked as "broken", meaning that it won’t show up in `nix-env -qa`, and cannot be built or installed. Such packages should be removed from Nixpkgs eventually unless they are fixed.
194194
195−### `updateWalker` {#var-meta-updateWalker}
196−
197−If set to `true`, the package is tested to be updated correctly by the `update-walker.sh` script without additional settings. Such packages have `meta.version` set and their homepage (or the page specified by `meta.downloadPage`) contains a direct link to the package tarball.
198−
199195## Licenses {#sec-meta-license}
200196
201197The `meta.license` attribute should preferably contain a value from `lib.licenses` defined in [`nixpkgs/lib/licenses.nix`](https://github.com/NixOS/nixpkgs/blob/master/lib/licenses.nix), or in-place license description of the same format if the license is unlikely to be useful in another expression.
doc/stdenv/stdenv.chapter.md+23−3
@@ -319,10 +319,16 @@ For information about how to run the updates, execute `nix-shell maintainers/scr
319319
320320## Phases {#sec-stdenv-phases}
321321
322−The generic builder has a number of *phases*. Package builds are split into phases to make it easier to override specific parts of the build (e.g., unpacking the sources or installing the binaries). Furthermore, it allows a nicer presentation of build logs in the Nix build farm.
322+`stdenv.mkDerivation` sets the Nix [derivation](https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations)'s builder to a script that loads the stdenv `setup.sh` bash library and calls `genericBuild`. Most packaging functions rely on this default builder.
323+
324+This generic command invokes a number of *phases*. Package builds are split into phases to make it easier to override specific parts of the build (e.g., unpacking the sources or installing the binaries).
323325
324326Each phase can be overridden in its entirety either by setting the environment variable `namePhase` to a string containing some shell commands to be executed, or by redefining the shell function `namePhase`. The former is convenient to override a phase from the derivation, while the latter is convenient from a build script. However, typically one only wants to *add* some commands to a phase, e.g. by defining `postInstall` or `preFixup`, as skipping some of the default actions may have unexpected consequences. The default script for each phase is defined in the file `pkgs/stdenv/generic/setup.sh`.
325327
328+When overriding a phase, for example `installPhase`, it is important to start with `runHook preInstall` and end it with `runHook postInstall`, otherwise `preInstall` and `postInstall` will not be run. Even if you don't use them directly, it is good practice to do so anyways for downstream users who would want to add a `postInstall` by overriding your derivation.
329+
330+While inside an interactive `nix-shell`, if you wanted to run all phases in the order they would be run in an actual build, you can invoke `genericBuild` yourself.
331+
326332### Controlling phases {#ssec-controlling-phases}
327333
328334There are a number of variables that control what phases are executed and in what order:
@@ -333,7 +339,8 @@ There are a number of variables that control what phases are executed and in wha
333339
334340Specifies the phases. You can change the order in which phases are executed, or add new phases, by setting this variable. If it’s not set, the default value is used, which is `$prePhases unpackPhase patchPhase $preConfigurePhases configurePhase $preBuildPhases buildPhase checkPhase $preInstallPhases installPhase fixupPhase installCheckPhase $preDistPhases distPhase $postPhases`.
335341
336−Usually, if you just want to add a few phases, it’s more convenient to set one of the variables below (such as `preInstallPhases`), as you then don’t specify all the normal phases.
342+It is discouraged to set this variable, as it is easy to miss some important functionality hidden in some of the less obviously needed phases (like `fixupPhase` which patches the shebang of scripts).
343+Usually, if you just want to add a few phases, it’s more convenient to set one of the variables below (such as `preInstallPhases`).
337344
338345##### `prePhases` {#var-stdenv-prePhases}
339346
@@ -790,7 +797,7 @@ Hook executed at the start of the distribution phase.
790797
791798Hook executed at the end of the distribution phase.
792799
793−## Shell functions {#ssec-stdenv-functions}
800+## Shell functions and utilities {#ssec-stdenv-functions}
794801
795802The standard environment provides a number of useful functions.
796803
@@ -814,6 +821,19 @@ There’s many more kinds of arguments, they are documented in `nixpkgs/pkgs/bui
814821
815822Using the `makeBinaryWrapper` implementation is usually preferred, as it creates a tiny _compiled_ wrapper executable, that can be used as a shebang interpreter. This is needed mostly on Darwin, where shebangs cannot point to scripts, [due to a limitation with the `execve`-syscall](https://stackoverflow.com/questions/67100831/macos-shebang-with-absolute-path-not-working). Compiled wrappers generated by `makeBinaryWrapper` can be inspected with `less <path-to-wrapper>` - by scrolling past the binary data you should be able to see the shell command that generated the executable and there see the environment variables that were injected into the wrapper.
816823
824+### `remove-references-to -t` \<storepath\> [ `-t` \<storepath\> ... ] \<file\> ... {#fun-remove-references-to}
825+
826+Removes the references of the specified files to the specified store files. This is done without changing the size of the file by replacing the hash by `eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`, and should work on compiled executables. This is meant to be used to remove the dependency of the output on inputs that are known to be unnecessary at runtime. Of course, reckless usage will break the patched programs.
827+To use this, add `removeReferencesTo` to `nativeBuildInputs`.
828+
829+As `remove-references-to` is an actual executable and not a shell function, it can be used with `find`.
830+Example removing all references to the compiler in the output:
831+```nix
832+postInstall = ''
833+ find "$out" -type f -exec remove-references-to -t ${stdenv.cc} '{}' +
834+'';
835+```
836+
817837### `substitute` \<infile\> \<outfile\> \<subs\> {#fun-substitute}
818838
819839Performs string substitution on the contents of \<infile\>, writing the result to \<outfile\>. The substitutions in \<subs\> are of the following form:
doc/using/overlays.chapter.md+18−2
@@ -77,7 +77,7 @@ In Nixpkgs, we have multiple implementations of the BLAS/LAPACK numerical linear
7777
7878 The Nixpkgs attribute is `openblas` for ILP64 (integer width = 64 bits) and `openblasCompat` for LP64 (integer width = 32 bits). `openblasCompat` is the default.
7979
80−- [LAPACK reference](http://www.netlib.org/lapack/) (also provides BLAS)
80+- [LAPACK reference](http://www.netlib.org/lapack/) (also provides BLAS and CBLAS)
8181
8282 The Nixpkgs attribute is `lapack-reference`.
8383
@@ -117,7 +117,23 @@ $ LD_LIBRARY_PATH=$(nix-build -A mkl)/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH n
117117
118118Intel MKL requires an `openmp` implementation when running with multiple processors. By default, `mkl` will use Intel's `iomp` implementation if no other is specified, but this is a runtime-only dependency and binary compatible with the LLVM implementation. To use that one instead, Intel recommends users set it with `LD_PRELOAD`. Note that `mkl` is only available on `x86_64-linux` and `x86_64-darwin`. Moreover, Hydra is not building and distributing pre-compiled binaries using it.
119119
120−For BLAS/LAPACK switching to work correctly, all packages must depend on `blas` or `lapack`. This ensures that only one BLAS/LAPACK library is used at one time. There are two versions of BLAS/LAPACK currently in the wild, `LP64` (integer size = 32 bits) and `ILP64` (integer size = 64 bits). Some software needs special flags or patches to work with `ILP64`. You can check if `ILP64` is used in Nixpkgs with `blas.isILP64` and `lapack.isILP64`. Some software does NOT work with `ILP64`, and derivations need to specify an assertion to prevent this. You can prevent `ILP64` from being used with the following:
120+To override `blas` and `lapack` with its reference implementations (i.e. for development purposes), one can use the following overlay:
121+
122+```nix
123+self: super:
124+
125+{
126+ blas = super.blas.override {
127+ blasProvider = self.lapack-reference;
128+ };
129+
130+ lapack = super.lapack.override {
131+ lapackProvider = self.lapack-reference;
132+ };
133+}
134+```
135+
136+For BLAS/LAPACK switching to work correctly, all packages must depend on `blas` or `lapack`. This ensures that only one BLAS/LAPACK library is used at one time. There are two versions of BLAS/LAPACK currently in the wild, `LP64` (integer size = 32 bits) and `ILP64` (integer size = 64 bits). The attributes `blas` and `lapack` are `LP64` by default. Their `ILP64` version are provided through the attributes `blas-ilp64` and `lapack-ilp64`. Some software needs special flags or patches to work with `ILP64`. You can check if `ILP64` is used in Nixpkgs with `blas.isILP64` and `lapack.isILP64`. Some software does NOT work with `ILP64`, and derivations need to specify an assertion to prevent this. You can prevent `ILP64` from being used with the following:
121137
122138```nix
123139{ stdenv, blas, lapack, ... }:
flake.nix+7−33
@@ -21,39 +21,13 @@
2121
2222 nixos = import ./nixos/lib { lib = final; };
2323
24− nixosSystem = { modules, ... } @ args:
24+ nixosSystem = args:
2525 import ./nixos/lib/eval-config.nix (args // {
26− modules =
27− let
28− moduleDeclarationFile =
29− let
30− # Even though `modules` is a mandatory argument for `nixosSystem`, it doesn't
31− # mean that the evaluator always keeps track of its position. If there
32− # are too many levels of indirection, the position gets lost at some point.
33− intermediatePos = builtins.unsafeGetAttrPos "modules" args;
34− in
35− if intermediatePos == null then null else intermediatePos.file;
36−
37− # Add the invoking file as error message location for modules
38− # that don't have their own locations; presumably inline modules.
39− addModuleDeclarationFile =
40− m: if moduleDeclarationFile == null then m else {
41− _file = moduleDeclarationFile;
42− imports = [ m ];
43− };
44−
45− in
46− map addModuleDeclarationFile modules ++ [
47− {
48− system.nixos.versionSuffix =
49− ".${final.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}";
50− system.nixos.revision = final.mkIf (self ? rev) self.rev;
51−
52− # NOTE: This assumes that `nixpkgs.config` is _not_ used when
53− # nixpkgs.pkgs is set OR _module.args.pkgs is set.
54− nixpkgs.config.path = self.outPath;
55− }
56− ];
26+ modules = args.modules ++ [ {
27+ system.nixos.versionSuffix =
28+ ".${final.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}";
29+ system.nixos.revision = final.mkIf (self ? rev) self.rev;
30+ } ];
5731 });
5832 });
5933
@@ -66,7 +40,7 @@
6640 }).nixos.manual.x86_64-linux;
6741 };
6842
69− legacyPackages = forAllSystems (system: import ./. { inherit system; config.path = self.outPath; });
43+ legacyPackages = forAllSystems (system: import ./. { inherit system; });
7044
7145 nixosModules = {
7246 notDetected = import ./nixos/modules/installer/scan/not-detected.nix;
lib/attrsets.nix+115−4
@@ -4,8 +4,8 @@
44let
55 inherit (builtins) head tail length;
66 inherit (lib.trivial) id;
7− inherit (lib.strings) concatStringsSep sanitizeDerivationName;
8− inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all;
7+ inherit (lib.strings) concatStringsSep concatMapStringsSep escapeNixIdentifier sanitizeDerivationName;
8+ inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all partition groupBy take foldl;
99in
1010
1111rec {
@@ -78,6 +78,103 @@ rec {
7878 in attrByPath attrPath (abort errorMsg);
7979
8080
81+ /* Update or set specific paths of an attribute set.
82+
83+ Takes a list of updates to apply and an attribute set to apply them to,
84+ and returns the attribute set with the updates applied. Updates are
85+ represented as { path = ...; update = ...; } values, where `path` is a
86+ list of strings representing the attribute path that should be updated,
87+ and `update` is a function that takes the old value at that attribute path
88+ as an argument and returns the new
89+ value it should be.
90+
91+ Properties:
92+ - Updates to deeper attribute paths are applied before updates to more
93+ shallow attribute paths
94+ - Multiple updates to the same attribute path are applied in the order
95+ they appear in the update list
96+ - If any but the last `path` element leads into a value that is not an
97+ attribute set, an error is thrown
98+ - If there is an update for an attribute path that doesn't exist,
99+ accessing the argument in the update function causes an error, but
100+ intermediate attribute sets are implicitly created as needed
101+
102+ Example:
103+ updateManyAttrsByPath [
104+ {
105+ path = [ "a" "b" ];
106+ update = old: { d = old.c; };
107+ }
108+ {
109+ path = [ "a" "b" "c" ];
110+ update = old: old + 1;
111+ }
112+ {
113+ path = [ "x" "y" ];
114+ update = old: "xy";
115+ }
116+ ] { a.b.c = 0; }
117+ => { a = { b = { d = 1; }; }; x = { y = "xy"; }; }
118+ */
119+ updateManyAttrsByPath = let
120+ # When recursing into attributes, instead of updating the `path` of each
121+ # update using `tail`, which needs to allocate an entirely new list,
122+ # we just pass a prefix length to use and make sure to only look at the
123+ # path without the prefix length, so that we can reuse the original list
124+ # entries.
125+ go = prefixLength: hasValue: value: updates:
126+ let
127+ # Splits updates into ones on this level (split.right)
128+ # And ones on levels further down (split.wrong)
129+ split = partition (el: length el.path == prefixLength) updates;
130+
131+ # Groups updates on further down levels into the attributes they modify
132+ nested = groupBy (el: elemAt el.path prefixLength) split.wrong;
133+
134+ # Applies only nested modification to the input value
135+ withNestedMods =
136+ # Return the value directly if we don't have any nested modifications
137+ if split.wrong == [] then
138+ if hasValue then value
139+ else
140+ # Throw an error if there is no value. This `head` call here is
141+ # safe, but only in this branch since `go` could only be called
142+ # with `hasValue == false` for nested updates, in which case
143+ # it's also always called with at least one update
144+ let updatePath = (head split.right).path; in
145+ throw
146+ ( "updateManyAttrsByPath: Path '${showAttrPath updatePath}' does "
147+ + "not exist in the given value, but the first update to this "
148+ + "path tries to access the existing value.")
149+ else
150+ # If there are nested modifications, try to apply them to the value
151+ if ! hasValue then
152+ # But if we don't have a value, just use an empty attribute set
153+ # as the value, but simplify the code a bit
154+ mapAttrs (name: go (prefixLength + 1) false null) nested
155+ else if isAttrs value then
156+ # If we do have a value and it's an attribute set, override it
157+ # with the nested modifications
158+ value //
159+ mapAttrs (name: go (prefixLength + 1) (value ? ${name}) value.${name}) nested
160+ else
161+ # However if it's not an attribute set, we can't apply the nested
162+ # modifications, throw an error
163+ let updatePath = (head split.wrong).path; in
164+ throw
165+ ( "updateManyAttrsByPath: Path '${showAttrPath updatePath}' needs to "
166+ + "be updated, but path '${showAttrPath (take prefixLength updatePath)}' "
167+ + "of the given value is not an attribute set, so we can't "
168+ + "update an attribute inside of it.");
169+
170+ # We get the final result by applying all the updates on this level
171+ # after having applied all the nested updates
172+ # We use foldl instead of foldl' so that in case of multiple updates,
173+ # intermediate values aren't evaluated if not needed
174+ in foldl (acc: el: el.update acc) withNestedMods split.right;
175+
176+ in updates: value: go 0 true value updates;
177+
81178 /* Return the specified attributes from a set.
82179
83180 Example:
@@ -276,7 +373,7 @@ rec {
276373
277374
278375 /* Like `mapAttrsRecursive', but it takes an additional predicate
279− function that tells it whether to recursive into an attribute
376+ function that tells it whether to recurse into an attribute
280377 set. If it returns false, `mapAttrsRecursiveCond' does not
281378 recurse, but does apply the map function. If it returns true, it
282379 does recurse, and does not apply the map function.
@@ -327,7 +424,7 @@ rec {
327424 isDerivation "foobar"
328425 => false
329426 */
330− isDerivation = x: isAttrs x && x ? type && x.type == "derivation";
427+ isDerivation = x: x.type or null == "derivation";
331428
332429 /* Converts a store path to a fake derivation. */
333430 toDerivation = path:
@@ -477,6 +574,20 @@ rec {
477574 overrideExisting = old: new:
478575 mapAttrs (name: value: new.${name} or value) old;
479576
577+ /* Turns a list of strings into a human-readable description of those
578+ strings represented as an attribute path. The result of this function is
579+ not intended to be machine-readable.
580+
581+ Example:
582+ showAttrPath [ "foo" "10" "bar" ]
583+ => "foo.\"10\".bar"
584+ showAttrPath []
585+ => "<root attribute path>"
586+ */
587+ showAttrPath = path:
588+ if path == [] then "<root attribute path>"
589+ else concatMapStringsSep "." escapeNixIdentifier path;
590+
480591 /* Get a package output.
481592 If no output is found, fallback to `.out` and then to the default.
482593
lib/default.nix+14−10
@@ -67,8 +67,9 @@ let
6767 inherit (self.trivial) id const pipe concat or and bitAnd bitOr bitXor
6868 bitNot boolToString mergeAttrs flip mapNullable inNixShell isFloat min max
6969 importJSON importTOML warn warnIf throwIfNot checkListOfEnum
70− info showWarnings nixpkgsVersion version
71− mod compare splitByAndCompare functionArgs setFunctionArgs isFunction
70+ info showWarnings nixpkgsVersion version isInOldestRelease
71+ mod compare splitByAndCompare
72+ functionArgs setFunctionArgs isFunction toFunction
7273 toHexString toBaseDigits;
7374 inherit (self.fixedPoints) fix fix' converge extends composeExtensions
7475 composeManyExtensions makeExtensible makeExtensibleWithCustomName;
@@ -78,9 +79,10 @@ let
7879 mapAttrs' mapAttrsToList mapAttrsRecursive mapAttrsRecursiveCond
7980 genAttrs isDerivation toDerivation optionalAttrs
8081 zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil
81− recursiveUpdate matchAttrs overrideExisting getOutput getBin
82+ recursiveUpdate matchAttrs overrideExisting showAttrPath getOutput getBin
8283 getLib getDev getMan chooseDevOutputs zipWithNames zip
83− recurseIntoAttrs dontRecurseIntoAttrs cartesianProductOfSets;
84+ recurseIntoAttrs dontRecurseIntoAttrs cartesianProductOfSets
85+ updateManyAttrsByPath;
8486 inherit (self.lists) singleton forEach foldr fold foldl foldl' imap0 imap1
8587 concatMap flatten remove findSingle findFirst any all count
8688 optional optionals toList range partition zipListsWith zipLists
@@ -111,21 +113,23 @@ let
111113 cleanSource sourceByRegex sourceFilesBySuffices
112114 commitIdFromGitRepo cleanSourceWith pathHasContext
113115 canCleanSource pathIsRegularFile pathIsGitRepo;
114− inherit (self.modules) evalModules unifyModuleSyntax
115− applyIfFunction mergeModules
116+ inherit (self.modules) evalModules setDefaultModuleLocation
117+ unifyModuleSyntax applyModuleArgsIfFunction mergeModules
116118 mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions
117119 pushDownProperties dischargeProperties filterOverrides
118120 sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride
119121 mkOptionDefault mkDefault mkImageMediaOverride mkForce mkVMOverride
120122 mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
121123 mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
122− mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
124+ mkRenamedOptionModule mkRenamedOptionModuleWith
125+ mkMergedOptionModule mkChangedOptionModule
123126 mkAliasOptionModule mkDerivedConfig doRename;
124127 inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
125− mergeDefaultOption mergeOneOption mergeEqualOption getValues
126− getFiles optionAttrSetToDocList optionAttrSetToDocList'
128+ mergeDefaultOption mergeOneOption mergeEqualOption mergeUniqueOption
129+ getValues getFiles
130+ optionAttrSetToDocList optionAttrSetToDocList'
127131 scrubOptionValue literalExpression literalExample literalDocBook
128− showOption showFiles unknownModule mkOption;
132+ showOption showFiles unknownModule mkOption mkPackageOption;
129133 inherit (self.types) isType setType defaultTypeMerge defaultFunctor
130134 isOptionType mkOptionType;
131135 inherit (self.asserts)
lib/licenses.nix+15
@@ -465,6 +465,11 @@ in mkLicense lset) ({
465465 spdxId = "imagemagick";
466466 };
467467
468+ imlib2 = {
469+ spdxId = "Imlib2";
470+ fullName = "Imlib2 License";
471+ };
472+
468473 inria-compcert = {
469474 fullName = "INRIA Non-Commercial License Agreement for the CompCert verified compiler";
470475 url = "https://compcert.org/doc/LICENSE.txt";
@@ -591,6 +596,16 @@ in mkLicense lset) ({
591596 spdxId = "MIT";
592597 fullName = "MIT License";
593598 };
599+ # https://spdx.org/licenses/MIT-feh.html
600+ mit-feh = {
601+ spdxId = "MIT-feh";
602+ fullName = "feh License";
603+ };
604+
605+ mitAdvertising = {
606+ spdxId = "MIT-advertising";
607+ fullName = "Enlightenment License (e16)";
608+ };
594609
595610 mpl10 = {
596611 spdxId = "MPL-1.0";
lib/lists.nix+9−8
@@ -4,6 +4,7 @@
44let
55 inherit (lib.strings) toInt;
66 inherit (lib.trivial) compare min;
7+ inherit (lib.attrsets) mapAttrs;
78in
89rec {
910
@@ -340,15 +341,15 @@ rec {
340341 groupBy' builtins.add 0 (x: boolToString (x > 2)) [ 5 1 2 3 4 ]
341342 => { true = 12; false = 3; }
342343 */
343− groupBy' = op: nul: pred: lst:
344− foldl' (r: e:
345− let
346− key = pred e;
347− in
348− r // { ${key} = op (r.${key} or nul) e; }
349− ) {} lst;
344+ groupBy' = op: nul: pred: lst: mapAttrs (name: foldl op nul) (groupBy pred lst);
350345
351− groupBy = groupBy' (sum: e: sum ++ [e]) [];
346+ groupBy = builtins.groupBy or (
347+ pred: foldl' (r: e:
348+ let
349+ key = pred e;
350+ in
351+ r // { ${key} = (r.${key} or []) ++ [e]; }
352+ ) {});
352353
353354 /* Merges two lists of the same size together. If the sizes aren't the same
354355 the merging stops at the shortest. How both lists are merged is defined
lib/modules.nix+96−47
@@ -9,7 +9,7 @@ let
99 catAttrs
1010 concatLists
1111 concatMap
12− count
12+ concatStringsSep
1313 elem
1414 filter
1515 findFirst
@@ -47,6 +47,20 @@ let
4747 showOption
4848 unknownModule
4949 ;
50+
51+ showDeclPrefix = loc: decl: prefix:
52+ " - option(s) with prefix `${showOption (loc ++ [prefix])}' in module `${decl._file}'";
53+ showRawDecls = loc: decls:
54+ concatStringsSep "\n"
55+ (sort (a: b: a < b)
56+ (concatMap
57+ (decl: map
58+ (showDeclPrefix loc decl)
59+ (attrNames decl.options)
60+ )
61+ decls
62+ ));
63+
5064in
5165
5266rec {
@@ -138,7 +152,7 @@ rec {
138152 # support for that, in turn it's lazy in its values. This means e.g.
139153 # a `_module.args.pkgs = import (fetchTarball { ... }) {}` won't
140154 # start a download when `pkgs` wasn't evaluated.
141− type = types.lazyAttrsOf types.unspecified;
155+ type = types.lazyAttrsOf types.raw;
142156 internal = true;
143157 description = "Arguments passed to each module.";
144158 };
@@ -151,8 +165,7 @@ rec {
151165 };
152166
153167 _module.freeformType = mkOption {
154− # Disallow merging for now, but could be implemented nicely with a `types.optionType`
155− type = types.nullOr (types.uniq types.attrs);
168+ type = types.nullOr types.optionType;
156169 internal = true;
157170 default = null;
158171 description = ''
@@ -269,11 +282,11 @@ rec {
269282 # Like unifyModuleSyntax, but also imports paths and calls functions if necessary
270283 loadModule = args: fallbackFile: fallbackKey: m:
271284 if isFunction m || isAttrs m then
272− unifyModuleSyntax fallbackFile fallbackKey (applyIfFunction fallbackKey m args)
285+ unifyModuleSyntax fallbackFile fallbackKey (applyModuleArgsIfFunction fallbackKey m args)
273286 else if isList m then
274287 let defs = [{ file = fallbackFile; value = m; }]; in
275288 throw "Module imports can't be nested lists. Perhaps you meant to remove one level of lists? Definitions: ${showDefs defs}"
276− else unifyModuleSyntax (toString m) (toString m) (applyIfFunction (toString m) (import m) args);
289+ else unifyModuleSyntax (toString m) (toString m) (applyModuleArgsIfFunction (toString m) (import m) args);
277290
278291 /*
279292 Collects all modules recursively into the form
@@ -334,6 +347,10 @@ rec {
334347 in modulesPath: initialModules: args:
335348 filterModules modulesPath (collectStructuredModules unknownModule "" initialModules args);
336349
350+ /* Wrap a module with a default location for reporting errors. */
351+ setDefaultModuleLocation = file: m:
352+ { _file = file; imports = [ m ]; };
353+
337354 /* Massage a module into canonical form, that is, a set consisting
338355 of ‘options’, ‘config’ and ‘imports’ attributes. */
339356 unifyModuleSyntax = file: key: m:
@@ -366,7 +383,7 @@ rec {
366383 config = addFreeformType (addMeta (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]));
367384 };
368385
369− applyIfFunction = key: f: args@{ config, options, lib, ... }: if isFunction f then
386+ applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }: if isFunction f then
370387 let
371388 # Module arguments are resolved in a strict manner when attribute set
372389 # deconstruction is used. As the arguments are now defined with the
@@ -471,26 +488,61 @@ rec {
471488 [{ inherit (module) file; inherit value; }]
472489 ) configs;
473490
491+ # Convert an option tree decl to a submodule option decl
492+ optionTreeToOption = decl:
493+ if isOption decl.options
494+ then decl
495+ else decl // {
496+ options = mkOption {
497+ type = types.submoduleWith {
498+ modules = [ { options = decl.options; } ];
499+ # `null` is not intended for use by modules. It is an internal
500+ # value that means "whatever the user has declared elsewhere".
501+ # This might become obsolete with https://github.com/NixOS/nixpkgs/issues/162398
502+ shorthandOnlyDefinesConfig = null;
503+ };
504+ };
505+ };
506+
474507 resultsByName = mapAttrs (name: decls:
475508 # We're descending into attribute ‘name’.
476509 let
477510 loc = prefix ++ [name];
478511 defns = defnsByName.${name} or [];
479512 defns' = defnsByName'.${name} or [];
480− nrOptions = count (m: isOption m.options) decls;
513+ optionDecls = filter (m: isOption m.options) decls;
481514 in
482− if nrOptions == length decls then
515+ if length optionDecls == length decls then
483516 let opt = fixupOptionType loc (mergeOptionDecls loc decls);
484517 in {
485518 matchedOptions = evalOptionValue loc opt defns';
486519 unmatchedDefns = [];
487520 }
488− else if nrOptions != 0 then
489− let
490− firstOption = findFirst (m: isOption m.options) "" decls;
491− firstNonOption = findFirst (m: !isOption m.options) "" decls;
492− in
493− throw "The option `${showOption loc}' in `${firstOption._file}' is a prefix of options in `${firstNonOption._file}'."
521+ else if optionDecls != [] then
522+ if all (x: x.options.type.name == "submodule") optionDecls
523+ # Raw options can only be merged into submodules. Merging into
524+ # attrsets might be nice, but ambiguous. Suppose we have
525+ # attrset as a `attrsOf submodule`. User declares option
526+ # attrset.foo.bar, this could mean:
527+ # a. option `bar` is only available in `attrset.foo`
528+ # b. option `foo.bar` is available in all `attrset.*`
529+ # c. reject and require "<name>" as a reminder that it behaves like (b).
530+ # d. magically combine (a) and (c).
531+ # All of the above are merely syntax sugar though.
532+ then
533+ let opt = fixupOptionType loc (mergeOptionDecls loc (map optionTreeToOption decls));
534+ in {
535+ matchedOptions = evalOptionValue loc opt defns';
536+ unmatchedDefns = [];
537+ }
538+ else
539+ let
540+ firstNonOption = findFirst (m: !isOption m.options) "" decls;
541+ nonOptions = filter (m: !isOption m.options) decls;
542+ in
543+ throw "The option `${showOption loc}' in module `${(lib.head optionDecls)._file}' would be a parent of the following options, but its type `${(lib.head optionDecls).options.type.description or "<no description>"}' does not support nested options.\n${
544+ showRawDecls loc nonOptions
545+ }"
494546 else
495547 mergeModules' loc decls defns) declsByName;
496548
@@ -534,11 +586,9 @@ rec {
534586 correspond to the definition of 'loc' in 'opt.file'. */
535587 mergeOptionDecls =
536588 let
537− packSubmodule = file: m:
538− { _file = file; imports = [ m ]; };
539589 coerceOption = file: opt:
540− if isFunction opt then packSubmodule file opt
541− else packSubmodule file { options = opt; };
590+ if isFunction opt then setDefaultModuleLocation file opt
591+ else setDefaultModuleLocation file { options = opt; };
542592 in loc: opts:
543593 foldl' (res: opt:
544594 let t = res.type;
@@ -559,17 +609,9 @@ rec {
559609 throw "The option `${showOption loc}' in `${opt._file}' is already declared in ${showFiles res.declarations}."
560610 else
561611 let
562− /* Add the modules of the current option to the list of modules
563− already collected. The options attribute except either a list of
564− submodules or a submodule. For each submodule, we add the file of the
565− current option declaration as the file use for the submodule. If the
566− submodule defines any filename, then we ignore the enclosing option file. */
567− options' = toList opt.options.options;
568−
569612 getSubModules = opt.options.type.getSubModules or null;
570613 submodules =
571− if getSubModules != null then map (packSubmodule opt._file) getSubModules ++ res.options
572− else if opt.options ? options then map (coerceOption opt._file) options' ++ res.options
614+ if getSubModules != null then map (setDefaultModuleLocation opt._file) getSubModules ++ res.options
573615 else res.options;
574616 in opt.options // res //
575617 { declarations = res.declarations ++ [opt._file];
@@ -752,26 +794,13 @@ rec {
752794 compare = a: b: (a.priority or 1000) < (b.priority or 1000);
753795 in sort compare defs';
754796
755− /* Hack for backward compatibility: convert options of type
756− optionSet to options of type submodule. FIXME: remove
757− eventually. */
797+ # This calls substSubModules, whose entire purpose is only to ensure that
798+ # option declarations in submodules have accurate position information.
799+ # TODO: Merge this into mergeOptionDecls
758800 fixupOptionType = loc: opt:
759− let
760− options = opt.options or
761− (throw "Option `${showOption loc}' has type optionSet but has no option attribute, in ${showFiles opt.declarations}.");
762− f = tp:
763− let optionSetIn = type: (tp.name == type) && (tp.functor.wrapped.name == "optionSet");
764− in
765− if tp.name == "option set" || tp.name == "submodule" then
766− throw "The option ${showOption loc} uses submodules without a wrapping type, in ${showFiles opt.declarations}."
767− else if optionSetIn "attrsOf" then types.attrsOf (types.submodule options)
768− else if optionSetIn "listOf" then types.listOf (types.submodule options)
769− else if optionSetIn "nullOr" then types.nullOr (types.submodule options)
770− else tp;
771− in
772− if opt.type.getSubModules or null == null
773− then opt // { type = f (opt.type or types.unspecified); }
774− else opt // { type = opt.type.substSubModules opt.options; options = []; };
801+ if opt.type.getSubModules or null == null
802+ then opt // { type = opt.type or types.unspecified; }
803+ else opt // { type = opt.type.substSubModules opt.options; options = []; };
775804
776805
777806 /* Properties. */
@@ -903,6 +932,26 @@ rec {
903932 use = builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'.";
904933 };
905934
935+ mkRenamedOptionModuleWith = {
936+ /* Old option path as list of strings. */
937+ from,
938+ /* New option path as list of strings. */
939+ to,
940+
941+ /*
942+ Release number of the first release that contains the rename, ignoring backports.
943+ Set it to the upcoming release, matching the nixpkgs/.version file.
944+ */
945+ sinceRelease,
946+
947+ }: doRename {
948+ inherit from to;
949+ visible = false;
950+ warn = lib.isInOldestRelease sinceRelease;
951+ use = lib.warnIf (lib.isInOldestRelease sinceRelease)
952+ "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'.";
953+ };
954+
906955 /* Return a module that causes a warning to be shown if any of the "from"
907956 option is defined; the defined values can be used in the "mergeFn" to set
908957 the "to" value.
lib/options.nix+8−8
@@ -79,8 +79,6 @@ rec {
7979 visible ? null,
8080 # Whether the option can be set only once
8181 readOnly ? null,
82− # Deprecated, used by types.optionSet.
83− options ? null
8482 } @ attrs:
8583 attrs // { _type = "option"; };
8684
@@ -172,11 +170,13 @@ rec {
172170 else if all isInt list && all (x: x == head list) list then head list
173171 else throw "Cannot merge definitions of `${showOption loc}'. Definition values:${showDefs defs}";
174172
175− mergeOneOption = loc: defs:
176− if defs == [] then abort "This case should never happen."
177− else if length defs != 1 then
178− throw "The unique option `${showOption loc}' is defined multiple times. Definition values:${showDefs defs}"
179− else (head defs).value;
173+ mergeOneOption = mergeUniqueOption { message = ""; };
174+
175+ mergeUniqueOption = { message }: loc: defs:
176+ if length defs == 1
177+ then (head defs).value
178+ else assert length defs > 1;
179+ throw "The option `${showOption loc}' is defined multiple times.\n${message}\nDefinition values:${showDefs defs}";
180180
181181 /* "Merge" option definitions by checking that they all have the same value. */
182182 mergeEqualOption = loc: defs:
@@ -229,7 +229,7 @@ rec {
229229 then true
230230 else opt.visible or true;
231231 readOnly = opt.readOnly or false;
232− type = opt.type.description or null;
232+ type = opt.type.description or "unspecified";
233233 }
234234 // optionalAttrs (opt ? example) { example = scrubOptionValue opt.example; }
235235 // optionalAttrs (opt ? default) { default = scrubOptionValue opt.default; }
lib/sources.nix+67−48
@@ -20,17 +20,26 @@ let
2020 readFile
2121 ;
2222
23− # Returns the type of a path: regular (for file), symlink, or directory
24− pathType = p: getAttr (baseNameOf p) (readDir (dirOf p));
23+ /*
24+ Returns the type of a path: regular (for file), symlink, or directory.
25+ */
26+ pathType = path: getAttr (baseNameOf path) (readDir (dirOf path));
2527
26− # Returns true if the path exists and is a directory, false otherwise
27− pathIsDirectory = p: if pathExists p then (pathType p) == "directory" else false;
28+ /*
29+ Returns true if the path exists and is a directory, false otherwise.
30+ */
31+ pathIsDirectory = path: if pathExists path then (pathType path) == "directory" else false;
2832
29− # Returns true if the path exists and is a regular file, false otherwise
30− pathIsRegularFile = p: if pathExists p then (pathType p) == "regular" else false;
33+ /*
34+ Returns true if the path exists and is a regular file, false otherwise.
35+ */
36+ pathIsRegularFile = path: if pathExists path then (pathType path) == "regular" else false;
3137
32− # Bring in a path as a source, filtering out all Subversion and CVS
33− # directories, as well as backup files (*~).
38+ /*
39+ A basic filter for `cleanSourceWith` that removes
40+ directories of version control system, backup files (*~)
41+ and some generated files.
42+ */
3443 cleanSourceFilter = name: type: let baseName = baseNameOf (toString name); in ! (
3544 # Filter out version control software files/directories
3645 (baseName == ".git" || type == "directory" && (baseName == ".svn" || baseName == "CVS" || baseName == ".hg")) ||
@@ -48,43 +57,48 @@ let
4857 (type == "unknown")
4958 );
5059
51− # Filters a source tree removing version control files and directories using cleanSourceWith
52− #
53− # Example:
54− # cleanSource ./.
60+ /*
61+ Filters a source tree removing version control files and directories using cleanSourceFilter.
62+
63+ Example:
64+ cleanSource ./.
65+ */
5566 cleanSource = src: cleanSourceWith { filter = cleanSourceFilter; inherit src; };
5667
57− # Like `builtins.filterSource`, except it will compose with itself,
58− # allowing you to chain multiple calls together without any
59− # intermediate copies being put in the nix store.
60− #
61− # lib.cleanSourceWith {
62− # filter = f;
63− # src = lib.cleanSourceWith {
64− # filter = g;
65− # src = ./.;
66− # };
67− # }
68− # # Succeeds!
69− #
70− # builtins.filterSource f (builtins.filterSource g ./.)
71− # # Fails!
72− #
73− # Parameters:
74− #
75− # src: A path or cleanSourceWith result to filter and/or rename.
76− #
77− # filter: A function (path -> type -> bool)
78− # Optional with default value: constant true (include everything)
79− # The function will be combined with the && operator such
80− # that src.filter is called lazily.
81− # For implementing a filter, see
82− # https://nixos.org/nix/manual/#builtin-filterSource
83− #
84− # name: Optional name to use as part of the store path.
85− # This defaults to `src.name` or otherwise `"source"`.
86− #
87− cleanSourceWith = { filter ? _path: _type: true, src, name ? null }:
68+ /*
69+ Like `builtins.filterSource`, except it will compose with itself,
70+ allowing you to chain multiple calls together without any
71+ intermediate copies being put in the nix store.
72+
73+ Example:
74+ lib.cleanSourceWith {
75+ filter = f;
76+ src = lib.cleanSourceWith {
77+ filter = g;
78+ src = ./.;
79+ };
80+ }
81+ # Succeeds!
82+
83+ builtins.filterSource f (builtins.filterSource g ./.)
84+ # Fails!
85+
86+ */
87+ cleanSourceWith =
88+ {
89+ # A path or cleanSourceWith result to filter and/or rename.
90+ src,
91+ # Optional with default value: constant true (include everything)
92+ # The function will be combined with the && operator such
93+ # that src.filter is called lazily.
94+ # For implementing a filter, see
95+ # https://nixos.org/nix/manual/#builtin-filterSource
96+ # Type: A function (path -> type -> bool)
97+ filter ? _path: _type: true,
98+ # Optional name to use as part of the store path.
99+ # This defaults to `src.name` or otherwise `"source"`.
100+ name ? null
101+ }:
88102 let
89103 orig = toSourceAttributes src;
90104 in fromSourceAttributes {
@@ -116,9 +130,11 @@ let
116130 satisfiesSubpathInvariant = src ? satisfiesSubpathInvariant && src.satisfiesSubpathInvariant;
117131 };
118132
119− # Filter sources by a list of regular expressions.
120− #
121− # E.g. `src = sourceByRegex ./my-subproject [".*\.py$" "^database.sql$"]`
133+ /*
134+ Filter sources by a list of regular expressions.
135+
136+ Example: src = sourceByRegex ./my-subproject [".*\.py$" "^database.sql$"]
137+ */
122138 sourceByRegex = src: regexes:
123139 let
124140 isFiltered = src ? _isLibCleanSourceWith;
@@ -153,8 +169,11 @@ let
153169
154170 pathIsGitRepo = path: (tryEval (commitIdFromGitRepo path)).success;
155171
156− # Get the commit id of a git repo
157− # Example: commitIdFromGitRepo <nixpkgs/.git>
172+ /*
173+ Get the commit id of a git repo.
174+
175+ Example: commitIdFromGitRepo <nixpkgs/.git>
176+ */
158177 commitIdFromGitRepo =
159178 let readCommitFromFile = file: path:
160179 let fileName = toString path + "/" + file;
lib/systems/default.nix+2−1
@@ -105,7 +105,8 @@ rec {
105105 else if final.isAarch64 then "arm64"
106106 else if final.isx86_32 then "i386"
107107 else if final.isx86_64 then "x86_64"
108− else if final.isMips then "mips"
108+ else if final.isMips32 then "mips"
109+ else if final.isMips64 then "mips" # linux kernel does not distinguish mips32/mips64
109110 else if final.isPower then "powerpc"
110111 else if final.isRiscV then "riscv"
111112 else if final.isS390 then "s390"
lib/systems/doubles.nix+6−2
@@ -26,7 +26,7 @@ let
2626
2727 # Linux
2828 "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux"
29− "armv7l-linux" "i686-linux" "m68k-linux" "mipsel-linux"
29+ "armv7l-linux" "i686-linux" "m68k-linux" "mipsel-linux" "mips64el-linux"
3030 "powerpc64-linux" "powerpc64le-linux" "riscv32-linux"
3131 "riscv64-linux" "s390-linux" "s390x-linux" "x86_64-linux"
3232
@@ -87,7 +87,11 @@ in {
8787 darwin = filterDoubles predicates.isDarwin;
8888 freebsd = filterDoubles predicates.isFreeBSD;
8989 # Should be better, but MinGW is unclear.
90− gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; });
90+ gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; })
91+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; })
92+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; })
93+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabin32; })
94+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabi64; });
9195 illumos = filterDoubles predicates.isSunOS;
9296 linux = filterDoubles predicates.isLinux;
9397 netbsd = filterDoubles predicates.isNetBSD;
lib/systems/examples.nix+20
@@ -93,6 +93,26 @@ rec {
9393 config = "mipsel-unknown-linux-gnu";
9494 } // platforms.fuloong2f_n32;
9595
96+ # MIPS ABI table transcribed from here: https://wiki.debian.org/Multiarch/Tuples
97+
98+ # can execute on 32bit chip
99+ mips-linux-gnu = { config = "mips-linux-gnu"; } // platforms.gcc_mips32r2_o32;
100+ mipsel-linux-gnu = { config = "mipsel-linux-gnu"; } // platforms.gcc_mips32r2_o32;
101+ mipsisa32r6-linux-gnu = { config = "mipsisa32r6-linux-gnu"; } // platforms.gcc_mips32r6_o32;
102+ mipsisa32r6el-linux-gnu = { config = "mipsisa32r6el-linux-gnu"; } // platforms.gcc_mips32r6_o32;
103+
104+ # require 64bit chip (for more registers, 64-bit floating point, 64-bit "long long") but use 32bit pointers
105+ mips64-linux-gnuabin32 = { config = "mips64-linux-gnuabin32"; } // platforms.gcc_mips64r2_n32;
106+ mips64el-linux-gnuabin32 = { config = "mips64el-linux-gnuabin32"; } // platforms.gcc_mips64r2_n32;
107+ mipsisa64r6-linux-gnuabin32 = { config = "mipsisa64r6-linux-gnuabin32"; } // platforms.gcc_mips64r6_n32;
108+ mipsisa64r6el-linux-gnuabin32 = { config = "mipsisa64r6el-linux-gnuabin32"; } // platforms.gcc_mips64r6_n32;
109+
110+ # 64bit pointers
111+ mips64-linux-gnuabi64 = { config = "mips64-linux-gnuabi64"; } // platforms.gcc_mips64r2_64;
112+ mips64el-linux-gnuabi64 = { config = "mips64el-linux-gnuabi64"; } // platforms.gcc_mips64r2_64;
113+ mipsisa64r6-linux-gnuabi64 = { config = "mipsisa64r6-linux-gnuabi64"; } // platforms.gcc_mips64r6_64;
114+ mipsisa64r6el-linux-gnuabi64 = { config = "mipsisa64r6el-linux-gnuabi64"; } // platforms.gcc_mips64r6_64;
115+
96116 muslpi = raspberryPi // {
97117 config = "armv6l-unknown-linux-musleabihf";
98118 };
lib/systems/inspect.nix+5−1
@@ -17,6 +17,10 @@ rec {
1717 isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
1818 isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
1919 isMips = { cpu = { family = "mips"; }; };
20+ isMips32 = { cpu = { family = "mips"; bits = 32; }; };
21+ isMips64 = { cpu = { family = "mips"; bits = 64; }; };
22+ isMips64n32 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "n32"; }; };
23+ isMips64n64 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "64"; }; };
2024 isMmix = { cpu = { family = "mmix"; }; };
2125 isRiscV = { cpu = { family = "riscv"; }; };
2226 isSparc = { cpu = { family = "sparc"; }; };
@@ -57,7 +61,7 @@ rec {
5761
5862 isAndroid = [ { abi = abis.android; } { abi = abis.androideabi; } ];
5963 isGnu = with abis; map (a: { abi = a; }) [ gnuabi64 gnu gnueabi gnueabihf ];
60− isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf ];
64+ isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf muslabin32 muslabi64 ];
6165 isUClibc = with abis; map (a: { abi = a; }) [ uclibc uclibceabi uclibceabihf ];
6266
6367 isEfi = map (family: { cpu.family = family; })
lib/systems/parse.nix+9−2
@@ -359,13 +359,20 @@ rec {
359359 ];
360360 };
361361 gnuabi64 = { abi = "64"; };
362+ muslabi64 = { abi = "64"; };
363+
364+ # NOTE: abi=n32 requires a 64-bit MIPS chip! That is not a typo.
365+ # It is basically the 64-bit abi with 32-bit pointers. Details:
366+ # https://www.linux-mips.org/pub/linux/mips/doc/ABI/MIPS-N32-ABI-Handbook.pdf
367+ gnuabin32 = { abi = "n32"; };
368+ muslabin32 = { abi = "n32"; };
362369
363370 musleabi = { float = "soft"; };
364371 musleabihf = { float = "hard"; };
365372 musl = {};
366373
367− uclibceabihf = { float = "soft"; };
368− uclibceabi = { float = "hard"; };
374+ uclibceabi = { float = "soft"; };
375+ uclibceabihf = { float = "hard"; };
369376 uclibc = {};
370377
371378 unknown = {};
lib/systems/platforms.nix+47
@@ -1,3 +1,10 @@
1+# Note: lib/systems/default.nix takes care of producing valid,
2+# fully-formed "platform" values (e.g. hostPlatform, buildPlatform,
3+# targetPlatform, etc) containing at least the minimal set of attrs
4+# required (see types.parsedPlatform in lib/systems/parse.nix). This
5+# file takes an already-valid platform and further elaborates it with
6+# optional fields such as linux-kernel, gcc, etc.
7+
18{ lib }:
29rec {
310 pc = {
@@ -482,6 +489,43 @@ rec {
482489 };
483490 };
484491
492+ # can execute on 32bit chip
493+ gcc_mips32r2_o32 = { gcc = { arch = "mips32r2"; abi = "o32"; }; };
494+ gcc_mips32r6_o32 = { gcc = { arch = "mips32r6"; abi = "o32"; }; };
495+ gcc_mips64r2_n32 = { gcc = { arch = "mips64r2"; abi = "n32"; }; };
496+ gcc_mips64r6_n32 = { gcc = { arch = "mips64r6"; abi = "n32"; }; };
497+ gcc_mips64r2_64 = { gcc = { arch = "mips64r2"; abi = "64"; }; };
498+ gcc_mips64r6_64 = { gcc = { arch = "mips64r6"; abi = "64"; }; };
499+
500+ # based on:
501+ # https://www.mail-archive.com/qemu-discuss@nongnu.org/msg05179.html
502+ # https://gmplib.org/~tege/qemu.html#mips64-debian
503+ mips64el-qemu-linux-gnuabi64 = (import ./examples).mips64el-linux-gnuabi64 // {
504+ linux-kernel = {
505+ name = "mips64el";
506+ baseConfig = "64r2el_defconfig";
507+ target = "vmlinuz";
508+ autoModules = false;
509+ DTB = true;
510+ # for qemu 9p passthrough filesystem
511+ extraConfig = ''
512+ MIPS_MALTA y
513+ PAGE_SIZE_4KB y
514+ CPU_LITTLE_ENDIAN y
515+ CPU_MIPS64_R2 y
516+ 64BIT y
517+ CPU_MIPS64_R2 y
518+
519+ NET_9P y
520+ NET_9P_VIRTIO y
521+ 9P_FS y
522+ 9P_FS_POSIX_ACL y
523+ PCI y
524+ VIRTIO_PCI y
525+ '';
526+ };
527+ };
528+
485529 ##
486530 ## Other
487531 ##
@@ -499,6 +543,9 @@ rec {
499543 };
500544 };
501545
546+ # This function takes a minimally-valid "platform" and returns an
547+ # attrset containing zero or more additional attrs which should be
548+ # included in the platform in order to further elaborate it.
502549 select = platform:
503550 # x86
504551 /**/ if platform.isx86 then pc
lib/tests/misc.nix+152
@@ -761,4 +761,156 @@ runTests {
761761 { a = 3; b = 30; c = 300; }
762762 ];
763763 };
764+
765+ # The example from the showAttrPath documentation
766+ testShowAttrPathExample = {
767+ expr = showAttrPath [ "foo" "10" "bar" ];
768+ expected = "foo.\"10\".bar";
769+ };
770+
771+ testShowAttrPathEmpty = {
772+ expr = showAttrPath [];
773+ expected = "<root attribute path>";
774+ };
775+
776+ testShowAttrPathVarious = {
777+ expr = showAttrPath [
778+ "."
779+ "foo"
780+ "2"
781+ "a2-b"
782+ "_bc'de"
783+ ];
784+ expected = ''".".foo."2".a2-b._bc'de'';
785+ };
786+
787+ testGroupBy = {
788+ expr = groupBy (n: toString (mod n 5)) (range 0 16);
789+ expected = {
790+ "0" = [ 0 5 10 15 ];
791+ "1" = [ 1 6 11 16 ];
792+ "2" = [ 2 7 12 ];
793+ "3" = [ 3 8 13 ];
794+ "4" = [ 4 9 14 ];
795+ };
796+ };
797+
798+ testGroupBy' = {
799+ expr = groupBy' builtins.add 0 (x: boolToString (x > 2)) [ 5 1 2 3 4 ];
800+ expected = { false = 3; true = 12; };
801+ };
802+
803+ # The example from the updateManyAttrsByPath documentation
804+ testUpdateManyAttrsByPathExample = {
805+ expr = updateManyAttrsByPath [
806+ {
807+ path = [ "a" "b" ];
808+ update = old: { d = old.c; };
809+ }
810+ {
811+ path = [ "a" "b" "c" ];
812+ update = old: old + 1;
813+ }
814+ {
815+ path = [ "x" "y" ];
816+ update = old: "xy";
817+ }
818+ ] { a.b.c = 0; };
819+ expected = { a = { b = { d = 1; }; }; x = { y = "xy"; }; };
820+ };
821+
822+ # If there are no updates, the value is passed through
823+ testUpdateManyAttrsByPathNone = {
824+ expr = updateManyAttrsByPath [] "something";
825+ expected = "something";
826+ };
827+
828+ # A single update to the root path is just like applying the function directly
829+ testUpdateManyAttrsByPathSingleIncrement = {
830+ expr = updateManyAttrsByPath [
831+ {
832+ path = [ ];
833+ update = old: old + 1;
834+ }
835+ ] 0;
836+ expected = 1;
837+ };
838+
839+ # Multiple updates can be applied are done in order
840+ testUpdateManyAttrsByPathMultipleIncrements = {
841+ expr = updateManyAttrsByPath [
842+ {
843+ path = [ ];
844+ update = old: old + "a";
845+ }
846+ {
847+ path = [ ];
848+ update = old: old + "b";
849+ }
850+ {
851+ path = [ ];
852+ update = old: old + "c";
853+ }
854+ ] "";
855+ expected = "abc";
856+ };
857+
858+ # If an update doesn't use the value, all previous updates are not evaluated
859+ testUpdateManyAttrsByPathLazy = {
860+ expr = updateManyAttrsByPath [
861+ {
862+ path = [ ];
863+ update = old: old + throw "nope";
864+ }
865+ {
866+ path = [ ];
867+ update = old: "untainted";
868+ }
869+ ] (throw "start");
870+ expected = "untainted";
871+ };
872+
873+ # Deeply nested attributes can be updated without affecting others
874+ testUpdateManyAttrsByPathDeep = {
875+ expr = updateManyAttrsByPath [
876+ {
877+ path = [ "a" "b" "c" ];
878+ update = old: old + 1;
879+ }
880+ ] {
881+ a.b.c = 0;
882+
883+ a.b.z = 0;
884+ a.y.z = 0;
885+ x.y.z = 0;
886+ };
887+ expected = {
888+ a.b.c = 1;
889+
890+ a.b.z = 0;
891+ a.y.z = 0;
892+ x.y.z = 0;
893+ };
894+ };
895+
896+ # Nested attributes are updated first
897+ testUpdateManyAttrsByPathNestedBeforehand = {
898+ expr = updateManyAttrsByPath [
899+ {
900+ path = [ "a" ];
901+ update = old: old // { x = old.b; };
902+ }
903+ {
904+ path = [ "a" "b" ];
905+ update = old: old + 1;
906+ }
907+ ] {
908+ a.b = 0;
909+ };
910+ expected = {
911+ a.b = 1;
912+ a.x = 1;
913+ };
914+ };
915+
764916}
lib/tests/modules.sh+43
@@ -62,6 +62,13 @@ checkConfigError() {
6262checkConfigOutput '^false$' config.enable ./declare-enable.nix
6363checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*: true' config.enable ./define-enable.nix
6464
65+checkConfigOutput '^1$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix
66+checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix
67+checkConfigOutput '^42$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
68+checkConfigOutput '^420$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
69+checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix ./define-shorthandOnlyDefinesConfig-true.nix
70+checkConfigError 'The option .bare-submodule.deep. in .*/declare-bare-submodule-deep-option.nix. is already declared in .*/declare-bare-submodule-deep-option-duplicate.nix' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix ./declare-bare-submodule-deep-option-duplicate.nix
71+
6572# Check integer types.
6673# unsigned
6774checkConfigOutput '^42$' config.value ./declare-int-unsigned-value.nix ./define-value-int-positive.nix
@@ -240,6 +247,11 @@ checkConfigOutput '^"24"$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-
240247checkConfigError 'infinite recursion encountered' config.foo ./freeform-attrsOf.nix ./freeform-unstr-dep-str.nix
241248checkConfigError 'The option .* is used but not defined' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix
242249checkConfigOutput '^"24"$' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix ./define-value-string.nix
250+# submodules in freeformTypes should have their locations annotated
251+checkConfigOutput '/freeform-submodules.nix"$' config.fooDeclarations.0 ./freeform-submodules.nix
252+# freeformTypes can get merged using `types.type`, including submodules
253+checkConfigOutput '^10$' config.free.xxx.foo ./freeform-submodules.nix
254+checkConfigOutput '^10$' config.free.yyy.bar ./freeform-submodules.nix
243255
244256## types.anything
245257# Check that attribute sets are merged recursively
@@ -284,6 +296,37 @@ checkConfigOutput '^"a b"$' config.resultFoo ./declare-variants.nix ./define-var
284296checkConfigOutput '^"a y z"$' config.resultFooBar ./declare-variants.nix ./define-variant.nix
285297checkConfigOutput '^"a b c"$' config.resultFooFoo ./declare-variants.nix ./define-variant.nix
286298
299+## emptyValue's
300+checkConfigOutput "[ ]" config.list.a ./emptyValues.nix
301+checkConfigOutput "{ }" config.attrs.a ./emptyValues.nix
302+checkConfigOutput "null" config.null.a ./emptyValues.nix
303+checkConfigOutput "{ }" config.submodule.a ./emptyValues.nix
304+# These types don't have empty values
305+checkConfigError 'The option .int.a. is used but not defined' config.int.a ./emptyValues.nix
306+checkConfigError 'The option .nonEmptyList.a. is used but not defined' config.nonEmptyList.a ./emptyValues.nix
307+
308+## types.raw
309+checkConfigOutput "{ foo = <CODE>; }" config.unprocessedNesting ./raw.nix
310+checkConfigOutput "10" config.processedToplevel ./raw.nix
311+checkConfigError "The option .multiple. is defined multiple times" config.multiple ./raw.nix
312+checkConfigOutput "bar" config.priorities ./raw.nix
313+
314+## Option collision
315+checkConfigError \
316+ 'The option .set. in module .*/declare-set.nix. would be a parent of the following options, but its type .attribute set of signed integers. does not support nested options.\n\s*- option[(]s[)] with prefix .set.enable. in module .*/declare-enable-nested.nix.' \
317+ config.set \
318+ ./declare-set.nix ./declare-enable-nested.nix
319+
320+# Test that types.optionType merges types correctly
321+checkConfigOutput '^10$' config.theOption.int ./optionTypeMerging.nix
322+checkConfigOutput '^"hello"$' config.theOption.str ./optionTypeMerging.nix
323+
324+# Test that types.optionType correctly annotates option locations
325+checkConfigError 'The option .theOption.nested. in .other.nix. is already declared in .optionTypeFile.nix.' config.theOption.nested ./optionTypeFile.nix
326+
327+# Test that types.optionType leaves types untouched as long as they don't need to be merged
328+checkConfigOutput 'ok' config.freeformItems.foo.bar ./adhoc-freeformType-survives-type-merge.nix
329+
287330cat <<EOF
288331====== module tests ======
289332$pass Pass
lib/tests/modules/adhoc-freeformType-survives-type-merge.nixnew file+14
@@ -0,0 +1,14 @@
1+{ lib, ... }: {
2+ options.dummy = lib.mkOption { type = lib.types.anything; default = {}; };
3+ freeformType =
4+ let
5+ a = lib.types.attrsOf (lib.types.submodule { options.bar = lib.mkOption { }; });
6+ in
7+ # modifying types like this breaks type merging.
8+ # This test makes sure that type merging is not performed when only a single declaration exists.
9+ # Don't modify types in practice!
10+ a // {
11+ merge = loc: defs: { freeformItems = a.merge loc defs; };
12+ };
13+ config.foo.bar = "ok";
14+}
lib/tests/modules/declare-bare-submodule-deep-option-duplicate.nixnew file+10
@@ -0,0 +1,10 @@
1+{ lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule.deep = mkOption {
7+ type = types.int;
8+ default = 2;
9+ };
10+}
lib/tests/modules/declare-bare-submodule-deep-option.nixnew file+10
@@ -0,0 +1,10 @@
1+{ lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule.deep = mkOption {
7+ type = types.int;
8+ default = 2;
9+ };
10+}
lib/tests/modules/declare-bare-submodule-nested-option.nixnew file+19
@@ -0,0 +1,19 @@
1+{ config, lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule = mkOption {
7+ type = types.submoduleWith {
8+ shorthandOnlyDefinesConfig = config.shorthandOnlyDefinesConfig;
9+ modules = [
10+ {
11+ options.nested = mkOption {
12+ type = types.int;
13+ default = 1;
14+ };
15+ }
16+ ];
17+ };
18+ };
19+}
lib/tests/modules/declare-bare-submodule.nixnew file+18
@@ -0,0 +1,18 @@
1+{ config, lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule = mkOption {
7+ type = types.submoduleWith {
8+ modules = [ ];
9+ shorthandOnlyDefinesConfig = config.shorthandOnlyDefinesConfig;
10+ };
11+ default = {};
12+ };
13+
14+ # config-dependent options: won't recommend, but useful for making this test parameterized
15+ options.shorthandOnlyDefinesConfig = mkOption {
16+ default = false;
17+ };
18+}
lib/tests/modules/declare-set.nixnew file+12
@@ -0,0 +1,12 @@
1+{ lib, ... }:
2+
3+{
4+ options.set = lib.mkOption {
5+ default = { };
6+ example = { a = 1; };
7+ type = lib.types.attrsOf lib.types.int;
8+ description = ''
9+ Some descriptive text
10+ '';
11+ };
12+}
lib/tests/modules/define-bare-submodule-values.nixnew file+4
@@ -0,0 +1,4 @@
1+{
2+ bare-submodule.nested = 42;
3+ bare-submodule.deep = 420;
4+}
lib/tests/modules/define-shorthandOnlyDefinesConfig-true.nixnew file+1
@@ -0,0 +1 @@
1+{ shorthandOnlyDefinesConfig = true; }
lib/tests/modules/emptyValues.nixnew file+36
@@ -0,0 +1,36 @@
1+{ lib, ... }:
2+let
3+ inherit (lib) types;
4+in {
5+
6+ options = {
7+ int = lib.mkOption {
8+ type = types.lazyAttrsOf types.int;
9+ };
10+ list = lib.mkOption {
11+ type = types.lazyAttrsOf (types.listOf types.int);
12+ };
13+ nonEmptyList = lib.mkOption {
14+ type = types.lazyAttrsOf (types.nonEmptyListOf types.int);
15+ };
16+ attrs = lib.mkOption {
17+ type = types.lazyAttrsOf (types.attrsOf types.int);
18+ };
19+ null = lib.mkOption {
20+ type = types.lazyAttrsOf (types.nullOr types.int);
21+ };
22+ submodule = lib.mkOption {
23+ type = types.lazyAttrsOf (types.submodule {});
24+ };
25+ };
26+
27+ config = {
28+ int.a = lib.mkIf false null;
29+ list.a = lib.mkIf false null;
30+ nonEmptyList.a = lib.mkIf false null;
31+ attrs.a = lib.mkIf false null;
32+ null.a = lib.mkIf false null;
33+ submodule.a = lib.mkIf false null;
34+ };
35+
36+}
lib/tests/modules/freeform-submodules.nixnew file+22
@@ -0,0 +1,22 @@
1+{ lib, options, ... }: with lib.types; {
2+
3+ options.fooDeclarations = lib.mkOption {
4+ default = (options.free.type.getSubOptions [])._freeformOptions.foo.declarations;
5+ };
6+
7+ options.free = lib.mkOption {
8+ type = submodule {
9+ config._module.freeformType = lib.mkMerge [
10+ (attrsOf (submodule {
11+ options.foo = lib.mkOption {};
12+ }))
13+ (attrsOf (submodule {
14+ options.bar = lib.mkOption {};
15+ }))
16+ ];
17+ };
18+ };
19+
20+ config.free.xxx.foo = 10;
21+ config.free.yyy.bar = 10;
22+}
lib/tests/modules/optionTypeFile.nixnew file+28
@@ -0,0 +1,28 @@
1+{ config, lib, ... }: {
2+
3+ _file = "optionTypeFile.nix";
4+
5+ options.theType = lib.mkOption {
6+ type = lib.types.optionType;
7+ };
8+
9+ options.theOption = lib.mkOption {
10+ type = config.theType;
11+ default = {};
12+ };
13+
14+ config.theType = lib.mkMerge [
15+ (lib.types.submodule {
16+ options.nested = lib.mkOption {
17+ type = lib.types.int;
18+ };
19+ })
20+ (lib.types.submodule {
21+ _file = "other.nix";
22+ options.nested = lib.mkOption {
23+ type = lib.types.str;
24+ };
25+ })
26+ ];
27+
28+}
lib/tests/modules/optionTypeMerging.nixnew file+27
@@ -0,0 +1,27 @@
1+{ config, lib, ... }: {
2+
3+ options.theType = lib.mkOption {
4+ type = lib.types.optionType;
5+ };
6+
7+ options.theOption = lib.mkOption {
8+ type = config.theType;
9+ };
10+
11+ config.theType = lib.mkMerge [
12+ (lib.types.submodule {
13+ options.int = lib.mkOption {
14+ type = lib.types.int;
15+ default = 10;
16+ };
17+ })
18+ (lib.types.submodule {
19+ options.str = lib.mkOption {
20+ type = lib.types.str;
21+ };
22+ })
23+ ];
24+
25+ config.theOption.str = "hello";
26+
27+}
lib/tests/modules/raw.nixnew file+30
@@ -0,0 +1,30 @@
1+{ lib, ... }: {
2+
3+ options = {
4+ processedToplevel = lib.mkOption {
5+ type = lib.types.raw;
6+ };
7+ unprocessedNesting = lib.mkOption {
8+ type = lib.types.raw;
9+ };
10+ multiple = lib.mkOption {
11+ type = lib.types.raw;
12+ };
13+ priorities = lib.mkOption {
14+ type = lib.types.raw;
15+ };
16+ };
17+
18+ config = {
19+ processedToplevel = lib.mkIf true 10;
20+ unprocessedNesting.foo = throw "foo";
21+ multiple = lib.mkMerge [
22+ "foo"
23+ "foo"
24+ ];
25+ priorities = lib.mkMerge [
26+ "foo"
27+ (lib.mkForce "bar")
28+ ];
29+ };
30+}
lib/tests/systems.nix+2−2
@@ -17,7 +17,7 @@ with lib.systems.doubles; lib.runTests {
1717
1818 testarm = mseteq arm [ "armv5tel-linux" "armv6l-linux" "armv6l-netbsd" "armv6l-none" "armv7a-linux" "armv7a-netbsd" "armv7l-linux" "armv7l-netbsd" "arm-none" "armv7a-darwin" ];
1919 testi686 = mseteq i686 [ "i686-linux" "i686-freebsd" "i686-genode" "i686-netbsd" "i686-openbsd" "i686-cygwin" "i686-windows" "i686-none" "i686-darwin" ];
20− testmips = mseteq mips [ "mipsel-linux" "mipsel-netbsd" ];
20+ testmips = mseteq mips [ "mips64el-linux" "mipsel-linux" "mipsel-netbsd" ];
2121 testmmix = mseteq mmix [ "mmix-mmixware" ];
2222 testx86_64 = mseteq x86_64 [ "x86_64-linux" "x86_64-darwin" "x86_64-freebsd" "x86_64-genode" "x86_64-redox" "x86_64-openbsd" "x86_64-netbsd" "x86_64-cygwin" "x86_64-solaris" "x86_64-windows" "x86_64-none" ];
2323
@@ -28,7 +28,7 @@ with lib.systems.doubles; lib.runTests {
2828 testredox = mseteq redox [ "x86_64-redox" ];
2929 testgnu = mseteq gnu (linux /* ++ kfreebsd ++ ... */);
3030 testillumos = mseteq illumos [ "x86_64-solaris" ];
31− testlinux = mseteq linux [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "mipsel-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux" "powerpc64-linux" "powerpc64le-linux" "m68k-linux" "s390-linux" "s390x-linux" ];
31+ testlinux = mseteq linux [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "mips64el-linux" "mipsel-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux" "powerpc64-linux" "powerpc64le-linux" "m68k-linux" "s390-linux" "s390x-linux" ];
3232 testnetbsd = mseteq netbsd [ "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd" "i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd" ];
3333 testopenbsd = mseteq openbsd [ "i686-openbsd" "x86_64-openbsd" ];
3434 testwindows = mseteq windows [ "i686-cygwin" "x86_64-cygwin" "i686-windows" "x86_64-windows" ];
lib/trivial.nix+63−6
@@ -61,11 +61,11 @@ rec {
6161 pipe = val: functions:
6262 let reverseApply = x: f: f x;
6363 in builtins.foldl' reverseApply val functions;
64− /* note please don’t add a function like `compose = flip pipe`.
65− This would confuse users, because the order of the functions
66− in the list is not clear. With pipe, it’s obvious that it
67− goes first-to-last. With `compose`, not so much.
68− */
64+
65+ # note please don’t add a function like `compose = flip pipe`.
66+ # This would confuse users, because the order of the functions
67+ # in the list is not clear. With pipe, it’s obvious that it
68+ # goes first-to-last. With `compose`, not so much.
6969
7070 ## Named versions corresponding to some builtin operators.
7171
@@ -166,6 +166,30 @@ rec {
166166 /* Returns the current nixpkgs release number as string. */
167167 release = lib.strings.fileContents ../.version;
168168
169+ /* The latest release that is supported, at the time of release branch-off,
170+ if applicable.
171+
172+ Ideally, out-of-tree modules should be able to evaluate cleanly with all
173+ supported Nixpkgs versions (master, release and old release until EOL).
174+ So if possible, deprecation warnings should take effect only when all
175+ out-of-tree expressions/libs/modules can upgrade to the new way without
176+ losing support for supported Nixpkgs versions.
177+
178+ This release number allows deprecation warnings to be implemented such that
179+ they take effect as soon as the oldest release reaches end of life. */
180+ oldestSupportedRelease =
181+ # Update on master only. Do not backport.
182+ 2111;
183+
184+ /* Whether a feature is supported in all supported releases (at the time of
185+ release branch-off, if applicable). See `oldestSupportedRelease`. */
186+ isInOldestRelease =
187+ /* Release number of feature introduction as an integer, e.g. 2111 for 21.11.
188+ Set it to the upcoming release, matching the nixpkgs/.version file.
189+ */
190+ release:
191+ release <= lib.trivial.oldestSupportedRelease;
192+
169193 /* Returns the current nixpkgs release code name.
170194
171195 On each release the first letter is bumped and a new animal is chosen
@@ -323,7 +347,14 @@ rec {
323347
324348 Type: bool -> string -> a -> a
325349 */
326− warnIf = cond: msg: if cond then warn msg else id;
350+ warnIf = cond: msg: if cond then warn msg else x: x;
351+
352+ /*
353+ Like warnIf, but negated (warn if the first argument is `false`).
354+
355+ Type: bool -> string -> a -> a
356+ */
357+ warnIfNot = cond: msg: if cond then x: x else warn msg;
327358
328359 /*
329360 Like the `assert b; e` expression, but with a custom error message and
@@ -347,6 +378,13 @@ rec {
347378 */
348379 throwIfNot = cond: msg: if cond then x: x else throw msg;
349380
381+ /*
382+ Like throwIfNot, but negated (throw if the first argument is `true`).
383+
384+ Type: bool -> string -> a -> a
385+ */
386+ throwIf = cond: msg: if cond then throw msg else x: x;
387+
350388 /* Check if the elements in a list are valid values from a enum, returning the identity function, or throwing an error message otherwise.
351389
352390 Example:
@@ -403,6 +441,25 @@ rec {
403441 isFunction = f: builtins.isFunction f ||
404442 (f ? __functor && isFunction (f.__functor f));
405443
444+ /*
445+ Turns any non-callable values into constant functions.
446+ Returns callable values as is.
447+
448+ Example:
449+
450+ nix-repl> lib.toFunction 1 2
451+ 1
452+
453+ nix-repl> lib.toFunction (x: x + 1) 2
454+ 3
455+ */
456+ toFunction =
457+ # Any value
458+ v:
459+ if isFunction v
460+ then v
461+ else k: v;
462+
406463 /* Convert the given positive integer to a string of its hexadecimal
407464 representation. For example:
408465
lib/types.nix+81−22
@@ -32,7 +32,6 @@ let
3232 last
3333 length
3434 tail
35− unique
3635 ;
3736 inherit (lib.attrsets)
3837 attrNames
@@ -48,6 +47,7 @@ let
4847 mergeDefaultOption
4948 mergeEqualOption
5049 mergeOneOption
50+ mergeUniqueOption
5151 showFiles
5252 showOption
5353 ;
@@ -61,7 +61,11 @@ let
6161 boolToString
6262 ;
6363
64− inherit (lib.modules) mergeDefinitions;
64+ inherit (lib.modules)
65+ mergeDefinitions
66+ fixupOptionType
67+ mergeOptionDecls
68+ ;
6569 outer_types =
6670rec {
6771 isType = type: x: (x._type or "") == type;
@@ -162,6 +166,13 @@ rec {
162166 # nixos/doc/manual/development/option-types.xml!
163167 types = rec {
164168
169+ raw = mkOptionType rec {
170+ name = "raw";
171+ description = "raw value";
172+ check = value: true;
173+ merge = mergeOneOption;
174+ };
175+
165176 anything = mkOptionType {
166177 name = "anything";
167178 description = "anything";
@@ -357,13 +368,21 @@ rec {
357368 emptyValue = { value = {}; };
358369 };
359370
360− # derivation is a reserved keyword.
371+ # A package is a top-level store path (/nix/store/hash-name). This includes:
372+ # - derivations
373+ # - more generally, attribute sets with an `outPath` or `__toString` attribute
374+ # pointing to a store path, e.g. flake inputs
375+ # - strings with context, e.g. "${pkgs.foo}" or (toString pkgs.foo)
376+ # - hardcoded store path literals (/nix/store/hash-foo) or strings without context
377+ # ("/nix/store/hash-foo"). These get a context added to them using builtins.storePath.
361378 package = mkOptionType {
362379 name = "package";
363380 check = x: isDerivation x || isStorePath x;
364381 merge = loc: defs:
365382 let res = mergeOneOption loc defs;
366− in if isDerivation res then res else toDerivation res;
383+ in if builtins.isPath res || (builtins.isString res && ! builtins.hasContext res)
384+ then toDerivation res
385+ else res;
367386 };
368387
369388 shellPackage = package // {
@@ -390,7 +409,7 @@ rec {
390409 ).optionalValue
391410 ) def.value
392411 ) defs)));
393− emptyValue = { value = {}; };
412+ emptyValue = { value = []; };
394413 getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*"]);
395414 getSubModules = elemType.getSubModules;
396415 substSubModules = m: listOf (elemType.substSubModules m);
@@ -402,7 +421,7 @@ rec {
402421 let list = addCheck (types.listOf elemType) (l: l != []);
403422 in list // {
404423 description = "non-empty " + list.description;
405− # Note: emptyValue is left as is, because another module may define an element.
424+ emptyValue = { }; # no .value attr, meaning unset
406425 };
407426
408427 attrsOf = elemType: mkOptionType rec {
@@ -470,6 +489,18 @@ rec {
470489 nestedTypes.elemType = elemType;
471490 };
472491
492+ unique = { message }: type: mkOptionType rec {
493+ name = "unique";
494+ inherit (type) description check;
495+ merge = mergeUniqueOption { inherit message; };
496+ emptyValue = type.emptyValue;
497+ getSubOptions = type.getSubOptions;
498+ getSubModules = type.getSubModules;
499+ substSubModules = m: uniq (type.substSubModules m);
500+ functor = (defaultFunctor name) // { wrapped = type; };
501+ nestedTypes.elemType = type;
502+ };
503+
473504 # Null or value of ...
474505 nullOr = elemType: mkOptionType rec {
475506 name = "nullOr";
@@ -491,7 +522,7 @@ rec {
491522
492523 functionTo = elemType: mkOptionType {
493524 name = "functionTo";
494− description = "function that evaluates to a(n) ${elemType.name}";
525+ description = "function that evaluates to a(n) ${elemType.description}";
495526 check = isFunction;
496527 merge = loc: defs:
497528 fnArgs: (mergeDefinitions (loc ++ [ "[function body]" ]) elemType (map (fn: { inherit (fn) file; value = fn.value fnArgs; }) defs)).mergedValue;
@@ -506,6 +537,33 @@ rec {
506537 modules = toList modules;
507538 };
508539
540+ # The type of a type!
541+ optionType = mkOptionType {
542+ name = "optionType";
543+ description = "optionType";
544+ check = value: value._type or null == "option-type";
545+ merge = loc: defs:
546+ if length defs == 1
547+ then (head defs).value
548+ else let
549+ # Prepares the type definitions for mergeOptionDecls, which
550+ # annotates submodules types with file locations
551+ optionModules = map ({ value, file }:
552+ {
553+ _file = file;
554+ # There's no way to merge types directly from the module system,
555+ # but we can cheat a bit by just declaring an option with the type
556+ options = lib.mkOption {
557+ type = value;
558+ };
559+ }
560+ ) defs;
561+ # Merges all the types into a single one, including submodule merging.
562+ # This also propagates file information to all submodules
563+ mergedOption = fixupOptionType loc (mergeOptionDecls loc optionModules);
564+ in mergedOption.type;
565+ };
566+
509567 submoduleWith =
510568 { modules
511569 , specialArgs ? {}
@@ -514,14 +572,18 @@ rec {
514572 let
515573 inherit (lib.modules) evalModules;
516574
517− coerce = unify: value: if isFunction value
518− then setFunctionArgs (args: unify (value args)) (functionArgs value)
519− else unify (if shorthandOnlyDefinesConfig then { config = value; } else value);
575+ shorthandToModule = if shorthandOnlyDefinesConfig == false
576+ then value: value
577+ else value: { config = value; };
520578
521579 allModules = defs: imap1 (n: { value, file }:
522− if isAttrs value || isFunction value then
523− # Annotate the value with the location of its definition for better error messages
524− coerce (lib.modules.unifyModuleSyntax file "${toString file}-${toString n}") value
580+ if isFunction value
581+ then setFunctionArgs
582+ (args: lib.modules.unifyModuleSyntax file "${toString file}-${toString n}" (value args))
583+ (functionArgs value)
584+ else if isAttrs value
585+ then
586+ lib.modules.unifyModuleSyntax file "${toString file}-${toString n}" (shorthandToModule value)
525587 else value
526588 ) defs;
527589
@@ -589,7 +651,11 @@ rec {
589651 then lhs.specialArgs // rhs.specialArgs
590652 else throw "A submoduleWith option is declared multiple times with the same specialArgs \"${toString (attrNames intersecting)}\"";
591653 shorthandOnlyDefinesConfig =
592− if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
654+ if lhs.shorthandOnlyDefinesConfig == null
655+ then rhs.shorthandOnlyDefinesConfig
656+ else if rhs.shorthandOnlyDefinesConfig == null
657+ then lhs.shorthandOnlyDefinesConfig
658+ else if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
593659 then lhs.shorthandOnlyDefinesConfig
594660 else throw "A submoduleWith option is declared multiple times with conflicting shorthandOnlyDefinesConfig values";
595661 };
@@ -599,6 +665,7 @@ rec {
599665 # A value from a set of allowed ones.
600666 enum = values:
601667 let
668+ inherit (lib.lists) unique;
602669 show = v:
603670 if builtins.isString v then ''"${v}"''
604671 else if builtins.isInt v then builtins.toString v
@@ -682,14 +749,6 @@ rec {
682749 nestedTypes.finalType = finalType;
683750 };
684751
685− # Obsolete alternative to configOf. It takes its option
686− # declarations from the ‘options’ attribute of containing option
687− # declaration.
688− optionSet = mkOptionType {
689− name = "optionSet";
690− description = "option set";
691− deprecationMessage = "Use `types.submodule' instead";
692− };
693752 # Augment the given type with an additional type check function.
694753 addCheck = elemType: check: elemType // { check = x: elemType.check x && check x; };
695754
maintainers/maintainer-list.nix+494−60
@@ -145,6 +145,12 @@
145145 githubId = 16829510;
146146 name = "Aaron Janse";
147147 };
148+ aaronjheng = {
149+ email = "wentworth@outlook.com";
150+ github = "aaronjheng";
151+ githubId = 806876;
152+ name = "Aaron Jheng";
153+ };
148154 aaronschif = {
149155 email = "aaronschif@gmail.com";
150156 github = "aaronschif";
@@ -513,10 +519,6 @@
513519 githubId = 38869148;
514520 name = "Alex Eyre";
515521 };
516− algorith = {
517− email = "dries_van_daele@telenet.be";
518− name = "Dries Van Daele";
519− };
520522 alibabzo = {
521523 email = "alistair.bill@gmail.com";
522524 github = "alibabzo";
@@ -599,6 +601,12 @@
599601 githubId = 15623522;
600602 name = "Amar Paul";
601603 };
604+ amarshall = {
605+ email = "andrew@johnandrewmarshall.com";
606+ github = "amarshall";
607+ githubId = 153175;
608+ name = "Andrew Marshall";
609+ };
602610 ambroisie = {
603611 email = "bruno.nixpkgs@belanyi.fr";
604612 github = "ambroisie";
@@ -763,13 +771,6 @@
763771 githubId = 11699655;
764772 name = "Stanislas Lange";
765773 };
766− angustrau = {
767− name = "Angus Trau";
768− email = "nix@angus.ws";
769− matrix = "@angustrau:matrix.org";
770− github = "angustrau";
771− githubId = 13267947;
772− };
773774 anhdle14 = {
774775 name = "Le Anh Duc";
775776 email = "anhdle14@icloud.com";
@@ -1081,6 +1082,12 @@
10811082 githubId = 55833;
10821083 name = "Troels Henriksen";
10831084 };
1085+ atila = {
1086+ name = "Átila Saraiva";
1087+ email = "atilasaraiva@gmail.com";
1088+ github = "AtilaSaraiva";
1089+ githubId = 29521461;
1090+ };
10841091 atkinschang = {
10851092 email = "atkinschang+nixpkgs@gmail.com";
10861093 github = "AtkinsChang";
@@ -1183,14 +1190,14 @@
11831190 name = "Artturi N";
11841191 };
11851192 azahi = {
1186− email = "azahi@teknik.io";
1187− matrix = "@azahi:matrix.org";
1193+ name = "Azat Bahawi";
1194+ email = "azat@bahawi.net";
1195+ matrix = "@azahi:azahi.cc";
11881196 github = "azahi";
11891197 githubId = 22211000;
1190− name = "Azat Bahawi";
11911198 keys = [{
1192− longkeyid = "rsa2048/0xB40FCB6608BBE3B6";
1193− fingerprint = "E9F3 483F 31C7 29B4 4CA2 7C38 B40F CB66 08BB E3B6";
1199+ longkeyid = "rsa4096/0xC8C6BDDB3847F72B";
1200+ fingerprint = "2688 0377 C31D 9E81 9BDF 83A8 C8C6 BDDB 3847 F72B";
11941201 }];
11951202 };
11961203 ayazhafiz = {
@@ -1199,6 +1206,12 @@
11991206 githubId = 262763;
12001207 name = "Ayaz Hafiz";
12011208 };
1209+ azuwis = {
1210+ email = "azuwis@gmail.com";
1211+ github = "azuwis";
1212+ githubId = 9315;
1213+ name = "Zhong Jianxin";
1214+ };
12021215 b4dm4n = {
12031216 email = "fabianm88@gmail.com";
12041217 github = "B4dM4n";
@@ -1282,12 +1295,24 @@
12821295 githubId = 127523;
12831296 name = "Herman Fries";
12841297 };
1298+ BarinovMaxim = {
1299+ name = "Barinov Maxim";
1300+ email = "barinov274@gmail.com";
1301+ github = "barinov274";
1302+ githubId = 54442153;
1303+ };
12851304 barrucadu = {
12861305 email = "mike@barrucadu.co.uk";
12871306 github = "barrucadu";
12881307 githubId = 75235;
12891308 name = "Michael Walker";
12901309 };
1310+ bartsch = {
1311+ email = "consume.noise@gmail.com";
1312+ github = "bartsch";
1313+ githubId = 3390885;
1314+ name = "Daniel Martin";
1315+ };
12911316 bartuka = {
12921317 email = "wand@hey.com";
12931318 github = "wandersoncferreira";
@@ -1669,6 +1694,12 @@
16691694 githubId = 355401;
16701695 name = "Brian Hicks";
16711696 };
1697+ brianmcgee = {
1698+ name = "Brian McGee";
1699+ email = "brian@41north.dev";
1700+ github = "brianmcgee";
1701+ githubId = 1173648;
1702+ };
16721703 Br1ght0ne = {
16731704 email = "brightone@protonmail.com";
16741705 github = "Br1ght0ne";
@@ -1876,6 +1907,12 @@
18761907 githubId = 82591;
18771908 name = "Carl Sverre";
18781909 };
1910+ carpinchomug = {
1911+ email = "aki.suda@protonmail.com";
1912+ github = "carpinchomug";
1913+ githubId = 101536256;
1914+ name = "Akiyoshi Suda";
1915+ };
18791916 cartr = {
18801917 email = "carter.sande@duodecima.technology";
18811918 github = "cartr";
@@ -2162,6 +2199,12 @@
21622199 githubId = 42220376;
21632200 name = "Charlotte Van Petegem";
21642201 };
2202+ cigrainger = {
2203+ name = "Christopher Grainger";
2204+ email = "chris@amplified.ai";
2205+ github = "cigrainger";
2206+ githubId = 3984794;
2207+ };
21652208 ciil = {
21662209 email = "simon@lackerbauer.com";
21672210 github = "ciil";
@@ -2205,7 +2248,7 @@
22052248 ckie = {
22062249 email = "nixpkgs-0efe364@ckie.dev";
22072250 github = "ckiee";
2208− githubId = 2526321;
2251+ githubId = 25263210;
22092252 keys = [{
22102253 longkeyid = "rsa4096/0x13E79449C0525215";
22112254 fingerprint = "539F 0655 4D35 38A5 429A E253 13E7 9449 C052 5215";
@@ -2307,6 +2350,13 @@
23072350 githubId = 5561189;
23082351 name = "Cody Opel";
23092352 };
2353+ Cogitri = {
2354+ email = "oss@cogitri.dev";
2355+ github = "Cogitri";
2356+ githubId = 8766773;
2357+ matrix = "@cogitri:cogitri.dev";
2358+ name = "Rasmus Thomsen";
2359+ };
23102360 cohei = {
23112361 email = "a.d.xvii.kal.mai@gmail.com";
23122362 github = "cohei";
@@ -2379,6 +2429,13 @@
23792429 githubId = 11145016;
23802430 name = "J.C.";
23812431 };
2432+ congee = {
2433+ email = "changshengwu@pm.me";
2434+ matrix = "@congeec:matrix.org";
2435+ github = "congee";
2436+ name = "Changsheng Wu";
2437+ githubId = 2083950;
2438+ };
23822439 contrun = {
23832440 email = "uuuuuu@protonmail.com";
23842441 github = "contrun";
@@ -2391,6 +2448,23 @@
23912448 githubId = 5510514;
23922449 name = "Conrad Mearns";
23932450 };
2451+ corbanr = {
2452+ email = "corban@raunco.co";
2453+ github = "CorbanR";
2454+ githubId = 1918683;
2455+ matrix = "@corbansolo:matrix.org";
2456+ name = "Corban Raun";
2457+ keys = [
2458+ {
2459+ longkeyid = "rsa4096/0xA697A56F1F151189";
2460+ fingerprint = "6607 0B24 8CE5 64ED 22CE 0950 A697 A56F 1F15 1189";
2461+ }
2462+ {
2463+ longkeyid = "ed25519/0x230F4AC153F90F29";
2464+ fingerprint = "D8CB 816A B678 A4E6 1EC7 5325 230F 4AC1 53F9 0F29";
2465+ }
2466+ ];
2467+ };
23942468 couchemar = {
23952469 email = "couchemar@yandex.ru";
23962470 github = "couchemar";
@@ -2750,6 +2824,12 @@
27502824 githubId = 49904992;
27512825 name = "Dawid Sowa";
27522826 };
2827+ dbeckwith = {
2828+ email = "djbsnx@gmail.com";
2829+ github = "dbeckwith";
2830+ githubId = 1279939;
2831+ name = "Daniel Beckwith";
2832+ };
27532833 dbirks = {
27542834 email = "david@birks.dev";
27552835 github = "dbirks";
@@ -2876,6 +2956,12 @@
28762956 githubId = 19733;
28772957 name = "Moritz Heidkamp";
28782958 };
2959+ DerickEddington = {
2960+ email = "derick.eddington@pm.me";
2961+ github = "DerickEddington";
2962+ githubId = 4731128;
2963+ name = "Derick Eddington";
2964+ };
28792965 dermetfan = {
28802966 email = "serverkorken@gmail.com";
28812967 github = "dermetfan";
@@ -2960,6 +3046,12 @@
29603046 githubId = 8404455;
29613047 name = "Diego Lelis";
29623048 };
3049+ DieracDelta = {
3050+ email = "justin@restivo.me";
3051+ github = "DieracDelta";
3052+ githubId = 13730968;
3053+ name = "Justin Restivo";
3054+ };
29633055 diffumist = {
29643056 email = "git@diffumist.me";
29653057 github = "diffumist";
@@ -3378,6 +3470,12 @@
33783470 githubId = 18535642;
33793471 name = "Emily";
33803472 };
3473+ emilytrau = {
3474+ name = "Emily Trau";
3475+ email = "nix@angus.ws";
3476+ github = "emilytrau";
3477+ githubId = 13267947;
3478+ };
33813479 enderger = {
33823480 email = "endergeryt@gmail.com";
33833481 github = "enderger";
@@ -3543,7 +3641,7 @@
35433641 name = "Leo Maroni";
35443642 };
35453643 emmanuelrosa = {
3546− email = "emmanuel_rosa@aol.com";
3644+ email = "emmanuelrosa@protonmail.com";
35473645 matrix = "@emmanuelrosa:matrix.org";
35483646 github = "emmanuelrosa";
35493647 githubId = 13485450;
@@ -3733,6 +3831,12 @@
37333831 githubId = 222467;
37343832 name = "Dmitry Ivanov";
37353833 };
3834+ Etjean = {
3835+ email = "et.jean@outlook.fr";
3836+ github = "Etjean";
3837+ githubId = 32169529;
3838+ name = "Etienne Jean";
3839+ };
37363840 etu = {
37373841 email = "elis@hirwing.se";
37383842 matrix = "@etu:semi.social";
@@ -3915,6 +4019,12 @@
39154019 githubId = 1276854;
39164020 name = "Florian Peter";
39174021 };
4022+ fbeffa = {
4023+ email = "beffa@fbengineering.ch";
4024+ github = "fedeinthemix";
4025+ githubId = 7670450;
4026+ name = "Federico Beffa";
4027+ };
39184028 fbrs = {
39194029 email = "yuuki@protonmail.com";
39204030 github = "cideM";
@@ -4007,6 +4117,12 @@
40074117 github = "fitzgibbon";
40084118 githubId = 617048;
40094119 };
4120+ fkautz = {
4121+ name = "Frederick F. Kautz IV";
4122+ email = "fkautz@alumni.cmu.edu";
4123+ github = "fkautz";
4124+ githubId = 135706;
4125+ };
40104126 Flakebi = {
40114127 email = "flakebi@t-online.de";
40124128 github = "Flakebi";
@@ -4131,7 +4247,12 @@
41314247 githubId = 119691;
41324248 name = "Michael Gough";
41334249 };
4134−
4250+ freax13 = {
4251+ email = "erbse.13@gmx.de";
4252+ github = "freax13";
4253+ githubId = 14952658;
4254+ name = "Tom Dohrmann";
4255+ };
41354256 fredeb = {
41364257 email = "im@fredeb.dev";
41374258 github = "fredeeb";
@@ -4393,6 +4514,12 @@
43934514 githubId = 27668;
43944515 name = "Tobias Pflug";
43954516 };
4517+ gin66 = {
4518+ email = "jochen@kiemes.de";
4519+ github = "gin66";
4520+ githubId = 5549373;
4521+ name = "Jochen Kiemes";
4522+ };
43964523 giogadi = {
43974524 email = "lgtorres42@gmail.com";
43984525 github = "giogadi";
@@ -4472,7 +4599,7 @@
44724599 gordias = {
44734600 name = "Gordias";
44744601 email = "gordias@disroot.org";
4475− github = "NotGordias";
4602+ github = "gordiasdot";
44764603 githubId = 94724133;
44774604 keys = [{
44784605 longkeyid = "ed25519/0x5D47284830FAA4FA";
@@ -5453,6 +5580,12 @@
54535580 githubId = 221929;
54545581 name = "Jean-Baptiste Giraudeau";
54555582 };
5583+ jc = {
5584+ name = "Josh Cooper";
5585+ email = "josh@cooper.is";
5586+ github = "joshua-cooper";
5587+ githubId = 35612334;
5588+ };
54565589 jceb = {
54575590 name = "jceb";
54585591 email = "jceb@e-jc.de";
@@ -5527,6 +5660,12 @@
55275660 github = "jduan";
55285661 githubId = 452450;
55295662 };
5663+ jdupak = {
5664+ name = "Jakub Dupak";
5665+ email = "dev@jakubdupak.com";
5666+ github = "jdupak";
5667+ githubId = 22683640;
5668+ };
55305669 jecaro = {
55315670 email = "jeancharles.quillet@gmail.com";
55325671 github = "jecaro";
@@ -5581,6 +5720,16 @@
55815720 githubId = 143075;
55825721 name = "James Felix Black";
55835722 };
5723+ jfchevrette = {
5724+ email = "jfchevrette@gmail.com";
5725+ github = "jfchevrette";
5726+ githubId = 3001;
5727+ name = "Jean-Francois Chevrette";
5728+ keys = [{
5729+ longkeyid = "rsa4096/0x67A0585801290DC6";
5730+ fingerprint = "B612 96A9 498E EECD D5E9 C0F0 67A0 5858 0129 0DC6";
5731+ }];
5732+ };
55845733 jflanglois = {
55855734 email = "yourstruly@julienlanglois.me";
55865735 github = "jflanglois";
@@ -5737,6 +5886,12 @@
57375886 githubId = 587870;
57385887 name = "Jonathan Mettes";
57395888 };
5889+ jmgilman = {
5890+ email = "joshuagilman@gmail.com";
5891+ github = "jmgilman";
5892+ githubId = 2308444;
5893+ name = "Joshua Gilman";
5894+ };
57405895 jo1gi = {
57415896 email = "joakimholm@protonmail.com";
57425897 github = "jo1gi";
@@ -5963,6 +6118,12 @@
59636118 githubId = 4611077;
59646119 name = "Raymond Gauthier";
59656120 };
6121+ jrpotter = {
6122+ email = "jrpotter2112@gmail.com";
6123+ github = "jrpotter";
6124+ githubId = 3267697;
6125+ name = "Joshua Potter";
6126+ };
59666127 jschievink = {
59676128 email = "jonasschievink@gmail.com";
59686129 matrix = "@jschievink:matrix.org";
@@ -5982,6 +6143,13 @@
59826143 githubId = 107689;
59836144 name = "Josh Holland";
59846145 };
6146+ jsierles = {
6147+ email = "joshua@hey.com";
6148+ matrix = "@jsierles:matrix.org";
6149+ name = "Joshua Sierles";
6150+ github = "jsierles";
6151+ githubId = 82;
6152+ };
59856153 jtcoolen = {
59866154 email = "jtcoolen@pm.me";
59876155 name = "Julien Coolen";
@@ -6011,6 +6179,12 @@
60116179 githubId = 810075;
60126180 name = "Juan Rodal";
60136181 };
6182+ juboba = {
6183+ email = "juboba@gmail.com";
6184+ github = "juboba";
6185+ githubId = 1189739;
6186+ name = "Julio Borja Barra";
6187+ };
60146188 juliendehos = {
60156189 email = "dehos@lisic.univ-littoral.fr";
60166190 github = "juliendehos";
@@ -6059,6 +6233,16 @@
60596233 githubId = 2396926;
60606234 name = "Justin Woo";
60616235 };
6236+ jvanbruegge = {
6237+ email = "supermanitu@gmail.com";
6238+ github = "jvanbruegge";
6239+ githubId = 1529052;
6240+ name = "Jan van Brügge";
6241+ keys = [{
6242+ longkeyid = "rsa4096/0x366572BE7D6C78A2";
6243+ fingerprint = "3513 5CE5 77AD 711F 3825 9A99 3665 72BE 7D6C 78A2";
6244+ }];
6245+ };
60626246 jwatt = {
60636247 email = "jwatt@broken.watch";
60646248 github = "jjwatt";
@@ -6219,6 +6403,12 @@
62196403 githubId = 37185887;
62206404 name = "Calvin Kim";
62216405 };
6406+ keldu = {
6407+ email = "mail@keldu.de";
6408+ github = "keldu";
6409+ githubId = 15373888;
6410+ name = "Claudius Holeksa";
6411+ };
62226412 kennyballou = {
62236413 email = "kb@devnulllabs.io";
62246414 github = "kennyballou";
@@ -6254,6 +6444,12 @@
62546444 githubId = 209729;
62556445 name = "Kevin Griffin";
62566446 };
6447+ kevink = {
6448+ email = "kevin@kevink.dev";
6449+ github = "Unkn0wnCat";
6450+ githubId = 8211181;
6451+ name = "Kevin Kandlbinder";
6452+ };
62576453 kfollesdal = {
62586454 email = "kfollesdal@gmail.com";
62596455 github = "kfollesdal";
@@ -6410,7 +6606,7 @@
64106606 githubId = 18447310;
64116607 };
64126608 kloenk = {
6413− email = "me@kloenk.de";
6609+ email = "me@kloenk.dev";
64146610 matrix = "@kloenk:petabyte.dev";
64156611 name = "Finn Behrens";
64166612 github = "kloenk";
@@ -6517,6 +6713,12 @@
65176713 githubId = 787421;
65186714 name = "Kevin Quick";
65196715 };
6716+ kradalby = {
6717+ name = "Kristoffer Dalby";
6718+ email = "kristoffer@dalby.cc";
6719+ github = "kradalby";
6720+ githubId = 98431;
6721+ };
65206722 kraem = {
65216723 email = "me@kraem.xyz";
65226724 github = "kraem";
@@ -6958,12 +7160,6 @@
69587160 githubId = 36448130;
69597161 name = "Michael Brantley";
69607162 };
6961− linarcx = {
6962− email = "linarcx@gmail.com";
6963− github = "linarcx";
6964− githubId = 10884422;
6965− name = "Kaveh Ahangar";
6966− };
69677163 linc01n = {
69687164 email = "git@lincoln.hk";
69697165 github = "linc01n";
@@ -7026,6 +7222,12 @@
70267222 githubId = 30698906;
70277223 name = "Luna D Dragon";
70287224 };
7225+ LunNova = {
7226+ email = "nixpkgs-maintainer@lunnova.dev";
7227+ github = "LunNova";
7228+ githubId = 782440;
7229+ name = "Luna Nova";
7230+ };
70297231 lionello = {
70307232 email = "lio@lunesu.com";
70317233 github = "lionello";
@@ -7062,6 +7264,29 @@
70627264 githubId = 1267527;
70637265 name = "Daniel Firth";
70647266 };
7267+ lockejan = {
7268+ email = "git@smittie.de";
7269+ matrix = "@jan:smittie.de";
7270+ github = "lockejan";
7271+ githubId = 25434434;
7272+ name = "Jan Schmitt";
7273+ keys = [{
7274+ longkeyid = "dsa2048/0xA2BC3C6F14351991";
7275+ fingerprint = "1763 9903 2D7C 5B82 5D5A 0EAD A2BC 3C6F 1435 1991";
7276+ }];
7277+ };
7278+ lodi = {
7279+ email = "anthony.lodi@gmail.com";
7280+ github = "lodi";
7281+ githubId = 918448;
7282+ name = "Anthony Lodi";
7283+ };
7284+ loicreynier = {
7285+ email = "loic@loireynier.fr";
7286+ github = "loicreynier";
7287+ githubId = 88983487;
7288+ name = "Loïc Reynier";
7289+ };
70657290 lopsided98 = {
70667291 email = "benwolsieffer@gmail.com";
70677292 github = "lopsided98";
@@ -7497,16 +7722,6 @@
74977722 githubId = 29855073;
74987723 name = "Michael Colicchia";
74997724 };
7500− matdsoupe = {
7501− github = "matdsoupe";
7502− githubId = 44469426;
7503− name = "Matheus de Souza Pessanha";
7504− email = "matheus_pessanha2001@outlook.com";
7505− keys = [{
7506− longkeyid = "rsa4096/0x2671964AB1E06A08";
7507− fingerprint = "2F32 CFEF E11A D73B A740 FA47 2671 964A B1E0 6A08";
7508− }];
7509− };
75107725 matejc = {
75117726 email = "cotman.matej@gmail.com";
75127727 github = "matejc";
@@ -7562,6 +7777,16 @@
75627777 githubId = 279868;
75637778 name = "Matti Kariluoma";
75647779 };
7780+ matthewpi = {
7781+ email = "me+nix@matthewp.io";
7782+ github = "matthewpi";
7783+ githubId = 26559841;
7784+ name = "Matthew Penner";
7785+ keys = [{
7786+ longkeyid = "ed25519/0x31311906AD4CF6D6";
7787+ fingerprint = "5118 F1CC B7B0 6C17 4DD1 5267 3131 1906 AD4C F6D6";
7788+ }];
7789+ };
75657790 maurer = {
75667791 email = "matthew.r.maurer+nix@gmail.com";
75677792 github = "maurer";
@@ -7608,6 +7833,12 @@
76087833 githubId = 1187050;
76097834 name = "Maximilian Huber";
76107835 };
7836+ maximsmol = {
7837+ email = "maximsmol@gmail.com";
7838+ github = "maximsmol";
7839+ githubId = 1472826;
7840+ name = "Max Smolin";
7841+ };
76117842 maxxk = {
76127843 email = "maxim.krivchikov@gmail.com";
76137844 github = "maxxk";
@@ -7788,12 +8019,6 @@
77888019 github = "kira-bruneau";
77898020 githubId = 382041;
77908021 };
7791− meutraa = {
7792− email = "paul+nixpkgs@lost.host";
7793− name = "Paul Meredith";
7794− github = "meutraa";
7795− githubId = 68550871;
7796− };
77978022 mephistophiles = {
77988023 email = "mussitantesmortem@gmail.com";
77998024 name = "Maxim Zhukov";
@@ -7836,6 +8061,12 @@
78368061 githubId = 668926;
78378062 name = "Maximilian Güntner";
78388063 };
8064+ mh = {
8065+ email = "68288772+markus-heinrich@users.noreply.github.com";
8066+ github = "markus-heinrich";
8067+ githubId = 68288772;
8068+ name = "Markus Heinrich";
8069+ };
78398070 mhaselsteiner = {
78408071 email = "magdalena.haselsteiner@gmx.at";
78418072 github = "mhaselsteiner";
@@ -7907,6 +8138,12 @@
79078138 fingerprint = "FEF0 AE2D 5449 3482 5F06 40AA 186A 1EDA C5C6 3F83";
79088139 }];
79098140 };
8141+ mihnea-s = {
8142+ email = "mihn.stn@gmail.com";
8143+ github = "mihnea-s";
8144+ githubId = 43088426;
8145+ name = "Mihnea Stoian";
8146+ };
79108147 mikefaille = {
79118148 email = "michael@faille.io";
79128149 github = "mikefaille";
@@ -8021,13 +8258,6 @@
80218258 githubId = 1001112;
80228259 name = "Marcin Janczyk";
80238260 };
8024− mjlbach = {
8025− email = "m.j.lbach@gmail.com";
8026− matrix = "@atrius:matrix.org";
8027− github = "mjlbach";
8028− githubId = 13316262;
8029− name = "Michael Lingelbach";
8030− };
80318261 mjp = {
80328262 email = "mike@mythik.co.uk";
80338263 github = "MikePlayle";
@@ -8262,6 +8492,17 @@
82628492 githubId = 3073833;
82638493 name = "Massimo Redaelli";
82648494 };
8495+ mrhedgehog = {
8496+ name = "Mr Hedgehog";
8497+ email = "hedgehog@mrhedgehog.xyz";
8498+ matrix = "@mrhedgehog:jupiterbroadcasting.com";
8499+ github = "ModdedGamers";
8500+ githubId = 35778371;
8501+ keys = [{
8502+ longkeyid = "rsa4096/0x7D5107866B1C6752";
8503+ fingerprint = "38A0 29B0 4A7E 4C13 A4BB 86C8 7D51 0786 6B1C 6752";
8504+ }];
8505+ };
82658506 mrkkrp = {
82668507 email = "markkarpov92@gmail.com";
82678508 github = "mrkkrp";
@@ -8406,6 +8647,17 @@
84068647 githubId = 25388474;
84078648 name = "Matej Urbas";
84088649 };
8650+ mvisonneau = {
8651+ name = "Maxime VISONNEAU";
8652+ email = "maxime@visonneau.fr";
8653+ matrix = "@maxime:visonneau.fr";
8654+ github = "mvisonneau";
8655+ githubId = 1761583;
8656+ keys = [{
8657+ longkeyid = "rsa4096/0x150D6F0AE9198D24";
8658+ fingerprint = "EC63 0CEA E8BC 5EE5 5C58 F2E3 150D 6F0A E919 8D24";
8659+ }];
8660+ };
84098661 mvnetbiz = {
84108662 email = "mvnetbiz@gmail.com";
84118663 matrix = "@mvtva:matrix.org";
@@ -8431,6 +8683,12 @@
84318683 githubId = 9636071;
84328684 name = "Myrl Hex";
84338685 };
8686+ n0emis = {
8687+ email = "nixpkgs@n0emis.network";
8688+ github = "n0emis";
8689+ githubId = 22817873;
8690+ name = "Ember Keske";
8691+ };
84348692 nadrieril = {
84358693 email = "nadrieril@gmail.com";
84368694 github = "nadrieril";
@@ -8498,6 +8756,12 @@
84988756 fingerprint = "4BFF 0614 03A2 47F0 AA0B 4BC4 916D 8B67 2418 92AE";
84998757 }];
85008758 };
8759+ nbr = {
8760+ email = "nbr@users.noreply.github.com";
8761+ github = "nbr";
8762+ githubId = 3819225;
8763+ name = "Nick Braga";
8764+ };
85018765 nbren12 = {
85028766 email = "nbren12@gmail.com";
85038767 github = "nbren12";
@@ -8533,6 +8797,12 @@
85338797 githubId = 3747396;
85348798 name = "Nathan Isom";
85358799 };
8800+ nelsonjeppesen = {
8801+ email = "nix@jeppesen.io";
8802+ github = "NelsonJeppesen";
8803+ githubId = 50854675;
8804+ name = "Nelson Jeppesen";
8805+ };
85368806 neonfuz = {
85378807 email = "neonfuz@gmail.com";
85388808 github = "neonfuz";
@@ -8586,6 +8856,12 @@
85868856 githubId = 7845120;
85878857 name = "Alex Martens";
85888858 };
8859+ nialov = {
8860+ email = "nikolasovaskainen@gmail.com";
8861+ github = "nialov";
8862+ githubId = 47318483;
8863+ name = "Nikolas Ovaskainen";
8864+ };
85898865 nikitavoloboev = {
85908866 email = "nikita.voloboev@gmail.com";
85918867 github = "nikitavoloboev";
@@ -8649,6 +8925,12 @@
86498925 githubId = 8214542;
86508926 name = "Nicolò Balzarotti";
86518927 };
8928+ nidabdella = {
8929+ name = "Mohamed Nidabdella";
8930+ email = "nidabdella.mohamed@gmail.com";
8931+ github = "nidabdella";
8932+ githubId = 8083813;
8933+ };
86528934 NieDzejkob = {
86538935 email = "kuba@kadziolka.net";
86548936 github = "NieDzejkob";
@@ -8824,9 +9106,9 @@
88249106 githubId = 2946283;
88259107 name = "Brian Cohen";
88269108 };
8827− novoxudonoser = {
9109+ novoxd = {
88289110 email = "radnovox@gmail.com";
8829− github = "novoxudonoser";
9111+ github = "novoxd";
88309112 githubId = 6052922;
88319113 name = "Kirill Struokov";
88329114 };
@@ -8954,6 +9236,12 @@
89549236 githubId = 158758;
89559237 name = "Oliver Dunkl";
89569238 };
9239+ ofek = {
9240+ email = "oss@ofek.dev";
9241+ github = "ofek";
9242+ githubId = 9677399;
9243+ name = "Ofek Lev";
9244+ };
89579245 offline = {
89589246 email = "jaka@x-truder.net";
89599247 github = "offlinehacker";
@@ -9048,6 +9336,12 @@
90489336 githubId = 23431373;
90499337 name = "Christoph Neidahl";
90509338 };
9339+ opeik = {
9340+ email = "sandro@stikic.com";
9341+ github = "opeik";
9342+ githubId = 11566773;
9343+ name = "Sandro Stikić";
9344+ };
90519345 orbekk = {
90529346 email = "kjetil.orbekk@gmail.com";
90539347 github = "orbekk";
@@ -9132,6 +9426,12 @@
91329426 githubId = 15930073;
91339427 name = "Moritz Scheuren";
91349428 };
9429+ ozkutuk = {
9430+ email = "ozkutuk@protonmail.com";
9431+ github = "ozkutuk";
9432+ githubId = 5948762;
9433+ name = "Berk Özkütük";
9434+ };
91359435 pablovsky = {
91369436 email = "dealberapablo07@gmail.com";
91379437 github = "pablo1107";
@@ -9200,6 +9500,13 @@
92009500 githubId = 71795;
92019501 name = "Mica Semrick";
92029502 };
9503+ papojari = {
9504+ email = "papojari-git.ovoid@aleeas.com";
9505+ matrix = "@papojari:artemislena.eu";
9506+ github = "papojari";
9507+ githubId = 81317317;
9508+ name = "papojari";
9509+ };
92039510 paraseba = {
92049511 email = "paraseba@gmail.com";
92059512 github = "paraseba";
@@ -9771,6 +10078,12 @@
977110078 githubId = 20524473;
977210079 name = "Psyanticy";
977310080 };
10081+ psydvl = {
10082+ email = "psydvl@fea.st";
10083+ github = "psydvl";
10084+ githubId = 43755002;
10085+ name = "Dmitriy P";
10086+ };
977410087 ptival = {
977510088 email = "valentin.robert.42@gmail.com";
977610089 github = "Ptival";
@@ -10005,6 +10318,20 @@
1000510318 githubId = 16624;
1000610319 name = "Maxim Ivanov";
1000710320 };
10321+ reckenrode = {
10322+ name = "Randy Eckenrode";
10323+ email = "randy@largeandhighquality.com";
10324+ matrix = "@reckenrode:matrix.org";
10325+ github = "reckenrode";
10326+ githubId = 7413633;
10327+ keys = [
10328+ # compare with https://keybase.io/reckenrode
10329+ {
10330+ longkeyid = "ed25519/0xFBF19A982CCE0048";
10331+ fingerprint = "01D7 5486 3A6D 64EA AC77 0D26 FBF1 9A98 2CCE 0048";
10332+ }
10333+ ];
10334+ };
1000810335 redfish64 = {
1000910336 email = "engler@gmail.com";
1001010337 github = "redfish64";
@@ -10099,6 +10426,12 @@
1009910426 githubId = 22803888;
1010010427 name = "Lu Hongxu";
1010110428 };
10429+ rgnns = {
10430+ email = "jglievano@gmail.com";
10431+ github = "rgnns";
10432+ githubId = 811827;
10433+ name = "Gabriel Lievano";
10434+ };
1010210435 rgrunbla = {
1010310436 email = "remy@grunblatt.org";
1010410437 github = "rgrunbla";
@@ -10123,6 +10456,13 @@
1012310456 githubId = 6047658;
1012410457 name = "Ryan Horiguchi";
1012510458 };
10459+ rhysmdnz = {
10460+ email = "rhys@memes.nz";
10461+ matrix = "@rhys:memes.nz";
10462+ github = "rhysmdnz";
10463+ githubId = 2162021;
10464+ name = "Rhys Davies";
10465+ };
1012610466 ribose-jeffreylau = {
1012710467 name = "Jeffrey Lau";
1012810468 email = "jeffrey.lau@ribose.com";
@@ -10799,6 +11139,12 @@
1079911139 githubId = 19472270;
1080011140 name = "Sebastian";
1080111141 };
11142+ sebastianblunt = {
11143+ name = "Sebastian Blunt";
11144+ email = "nix@sebastianblunt.com";
11145+ github = "sebastianblunt";
11146+ githubId = 47431204;
11147+ };
1080211148 sebbadk = {
1080311149 email = "sebastian@sebba.dk";
1080411150 github = "SEbbaDK";
@@ -10937,6 +11283,12 @@
1093711283 githubId = 293035;
1093811284 name = "Shawn Dellysse";
1093911285 };
11286+ shawn8901 = {
11287+ email = "shawn8901@googlemail.com";
11288+ github = "shawn8901";
11289+ githubId = 12239057;
11290+ name = "Shawn8901";
11291+ };
1094011292 shazow = {
1094111293 email = "andrey.petrov@shazow.net";
1094211294 github = "shazow";
@@ -10973,6 +11325,16 @@
1097311325 github = "shikanime";
1097411326 githubId = 22115108;
1097511327 };
11328+ shiryel = {
11329+ email = "contact@shiryel.com";
11330+ name = "Shiryel";
11331+ github = "shiryel";
11332+ githubId = 35617139;
11333+ keys = [{
11334+ longkeyid = "ed25519/0xC4041EA6B32633DE";
11335+ fingerprint = "AB63 4CD9 3322 BD42 6231 F764 C404 1EA6 B326 33DE";
11336+ }];
11337+ };
1097611338 shlevy = {
1097711339 email = "shea@shealevy.com";
1097811340 github = "shlevy";
@@ -11396,6 +11758,23 @@
1139611758 githubId = 1699155;
1139711759 name = "Steve Elliott";
1139811760 };
11761+ stehessel = {
11762+ email = "stephan@stehessel.de";
11763+ github = "stehessel";
11764+ githubId = 55607356;
11765+ name = "Stephan Heßelmann";
11766+ };
11767+ steinybot = {
11768+ name = "Jason Pickens";
11769+ email = "jasonpickensnz@gmail.com";
11770+ matrix = "@steinybot:matrix.org";
11771+ github = "steinybot";
11772+ githubId = 4659562;
11773+ keys = [{
11774+ longkeyid = "ed25519/0x21DE1CAE59762A0F";
11775+ fingerprint = "2709 1DEC CC42 4635 4299 569C 21DE 1CAE 5976 2A0F";
11776+ }];
11777+ };
1139911778 stelcodes = {
1140011779 email = "stel@stel.codes";
1140111780 github = "stelcodes";
@@ -11539,6 +11918,13 @@
1153911918 githubId = 2666479;
1154011919 name = "Y Nguyen";
1154111920 };
11921+ superherointj = {
11922+ name = "Sérgio G.";
11923+ email = "5861043+superherointj@users.noreply.github.com";
11924+ matrix = "@superherointj:matrix.org";
11925+ github = "superherointj";
11926+ githubId = 5861043;
11927+ };
1154211928 SuperSandro2000 = {
1154311929 email = "sandro.jaeckel@gmail.com";
1154411930 matrix = "@sandro:supersandro.de";
@@ -11779,6 +12165,13 @@
1177912165 githubId = 863327;
1178012166 name = "Tyler Benster";
1178112167 };
12168+ tboerger = {
12169+ email = "thomas@webhippie.de";
12170+ matrix = "@tboerger:matrix.org";
12171+ github = "tboerger";
12172+ githubId = 156964;
12173+ name = "Thomas Boerger";
12174+ };
1178212175 tcbravo = {
1178312176 email = "tomas.bravo@protonmail.ch";
1178412177 github = "tcbravo";
@@ -12041,7 +12434,7 @@
1204112434 name = "Tiago Castro";
1204212435 };
1204312436 tilcreator = {
12044− name = "Tilman Jackel";
12437+ name = "TilCreator";
1204512438 email = "contact.nixos@tc-j.de";
1204612439 matrix = "@tilcreator:matrix.org";
1204712440 github = "TilCreator";
@@ -12138,6 +12531,7 @@
1213812531 };
1213912532 toastal = {
1214012533 email = "toastal+nix@posteo.net";
12534+ matrix = "@toastal:matrix.org";
1214112535 github = "toastal";
1214212536 githubId = 561087;
1214312537 name = "toastal";
@@ -12626,9 +13020,9 @@
1262613020 githubId = 5837359;
1262713021 name = "Adrian Pistol";
1262813022 };
12629− vika_nezrimaya = {
13023+ vikanezrimaya = {
1263013024 email = "vika@fireburn.ru";
12631− github = "kisik21";
13025+ github = "vikanezrimaya";
1263213026 githubId = 7953163;
1263313027 name = "Vika Shleina";
1263413028 keys = [{
@@ -12652,6 +13046,12 @@
1265213046 githubId = 118959;
1265313047 name = "VinyMeuh";
1265413048 };
13049+ viraptor = {
13050+ email = "nix@viraptor.info";
13051+ github = "viraptor";
13052+ githubId = 188063;
13053+ name = "Stanisław Pitucha";
13054+ };
1265513055 viric = {
1265613056 email = "viric@viric.name";
1265713057 github = "viric";
@@ -12998,7 +13398,7 @@
1299813398 name = "Wayne Scott";
1299913399 };
1300013400 wucke13 = {
13001− email = "info@wucke13.de";
13401+ email = "wucke13@gmail.com";
1300213402 github = "wucke13";
1300313403 githubId = 20400405;
1300413404 name = "Wucke";
@@ -13077,6 +13477,12 @@
1307713477 githubId = 1297598;
1307813478 name = "Konrad Borowski";
1307913479 };
13480+ xgroleau = {
13481+ email = "xgroleau@gmail.com";
13482+ github = "xgroleau";
13483+ githubId = 31734358;
13484+ name = "Xavier Groleau";
13485+ };
1308013486 xiorcale = {
1308113487 email = "quentin.vaucher@pm.me";
1308213488 github = "xiorcale";
@@ -13133,7 +13539,7 @@
1313313539 };
1313413540 yana = {
1313513541 email = "yana@riseup.net";
13136− github = "alpakido";
13542+ github = "sowelisuwi";
1313713543 githubId = 1643293;
1313813544 name = "Yana Timoshenko";
1313913545 };
@@ -13587,10 +13993,10 @@
1358713993 github = "nagisa";
1358813994 githubId = 679122;
1358913995 };
13590− yevhenshymotiuk = {
13996+ yshym = {
1359113997 name = "Yevhen Shymotiuk";
13592− email = "yevhenshymotiuk@gmail.com";
13593− github = "yevhenshymotiuk";
13998+ email = "yshym@pm.me";
13999+ github = "yshym";
1359414000 githubId = 44244245;
1359514001 };
1359614002 hmenke = {
@@ -13714,6 +14120,16 @@
1371414120 github = "zeri42";
1371514121 githubId = 68825133;
1371614122 };
14123+ zoedsoupe = {
14124+ github = "zoedsoupe";
14125+ githubId = 44469426;
14126+ name = "Zoey de Souza Pessanha";
14127+ email = "zoey.spessanha@outlook.com";
14128+ keys = [{
14129+ longkeyid = "rsa4096/0x1E1E889CDBD6A315";
14130+ fingerprint = "EAA1 51DB 472B 0122 109A CB17 1E1E 889C DBD6 A315";
14131+ }];
14132+ };
1371714133 zombiezen = {
1371814134 name = "Ross Light";
1371914135 email = "ross@zombiezen.com";
@@ -13754,6 +14170,12 @@
1375414170 github = "jpagex";
1375514171 githubId = 635768;
1375614172 };
14173+ vbrandl = {
14174+ name = "Valentin Brandl";
14175+ email = "mail+nixpkgs@vbrandl.net";
14176+ github = "vbrandl";
14177+ githubId = 20639051;
14178+ };
1375714179 portothree = {
1375814180 name = "Gustavo Porto";
1375914181 email = "gustavoporto@ya.ru";
@@ -13777,4 +14199,16 @@
1377714199 fingerprint = "3586 3350 BFEA C101 DB1A 4AF0 1F81 112D 62A9 ADCE";
1377814200 }];
1377914201 };
14202+ ameer = {
14203+ name = "Ameer Taweel";
14204+ email = "ameertaweel2002@gmail.com";
14205+ github = "AmeerTaweel";
14206+ githubId = 20538273;
14207+ };
14208+ nigelgbanks = {
14209+ name = "Nigel Banks";
14210+ email = "nigel.g.banks@gmail.com";
14211+ github = "nigelgbanks";
14212+ githubId = 487373;
14213+ };
1378014214}
maintainers/scripts/haskell/regenerate-hackage-packages.sh+1−1
@@ -20,7 +20,7 @@ HACKAGE2NIX="${HACKAGE2NIX:-hackage2nix}"
2020# See: https://github.com/NixOS/nixpkgs/pull/122023
2121export LC_ALL=C.UTF-8
2222
23−extraction_derivation='with import ./. {}; runCommand "unpacked-cabal-hashes" { } "tar xf ${all-cabal-hashes} --strip-components=1 --one-top-level=$out"'
23+extraction_derivation='with import ./. {}; runCommandLocal "unpacked-cabal-hashes" { } "tar xf ${all-cabal-hashes} --strip-components=1 --one-top-level=$out"'
2424unpacked_hackage="$(nix-build -E "$extraction_derivation" --no-out-link)"
2525config_dir=pkgs/development/haskell-modules/configuration-hackage2nix
2626
maintainers/scripts/luarocks-packages.csv+1−1
@@ -68,7 +68,7 @@ luautf8,,,,,,pstn
6868luazip,,,,,,
6969lua-yajl,,,,,,pstn
7070luuid,,,,,,
71−luv,,,,1.42.0-0,,
71+luv,,,,1.43.0-0,,
7272lyaml,,,,,,lblasc
7373markdown,,,,,,
7474mediator_lua,,,,,,
maintainers/scripts/pluginupdate.py+64−52
@@ -1,4 +1,4 @@
1−# Used by pkgs/misc/vim-plugins/update.py and pkgs/applications/editors/kakoune/plugins/update.py
1+# Used by pkgs/applications/editors/vim/plugins/update.py and pkgs/applications/editors/kakoune/plugins/update.py
22
33# format:
44# $ nix run nixpkgs.python3Packages.black -c black update.py
@@ -73,9 +73,13 @@ def retry(ExceptionToCheck: Any, tries: int = 4, delay: float = 3, backoff: floa
7373
7474 return deco_retry
7575
76+@dataclass
77+class FetchConfig:
78+ proc: int
79+ github_token: str
80+
7681
77−def make_request(url: str) -> urllib.request.Request:
78− token = os.getenv("GITHUB_API_TOKEN")
82+def make_request(url: str, token=None) -> urllib.request.Request:
7983 headers = {}
8084 if token is not None:
8185 headers["Authorization"] = f"token {token}"
@@ -90,6 +94,7 @@ class Repo:
9094 self.branch = branch
9195 self.alias = alias
9296 self.redirect: Dict[str, str] = {}
97+ self.token = "dummy_token"
9398
9499 @property
95100 def name(self):
@@ -132,10 +137,11 @@ class Repo:
132137
133138class RepoGitHub(Repo):
134139 def __init__(
135− self, owner: str, repo: str, branch: str, alias: Optional[str]
140+ self, owner: str, repo: str, branch: str, alias: Optional[str]
136141 ) -> None:
137142 self.owner = owner
138143 self.repo = repo
144+ self.token = None
139145 '''Url to the repo'''
140146 super().__init__(self.url(""), branch, alias)
141147 log.debug("Instantiating github repo %s/%s", self.owner, self.repo)
@@ -150,7 +156,7 @@ class RepoGitHub(Repo):
150156 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
151157 def has_submodules(self) -> bool:
152158 try:
153− req = make_request(self.url(f"blob/{self.branch}/.gitmodules"))
159+ req = make_request(self.url(f"blob/{self.branch}/.gitmodules"), self.token)
154160 urllib.request.urlopen(req, timeout=10).close()
155161 except urllib.error.HTTPError as e:
156162 if e.code == 404:
@@ -162,7 +168,7 @@ class RepoGitHub(Repo):
162168 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
163169 def latest_commit(self) -> Tuple[str, datetime]:
164170 commit_url = self.url(f"commits/{self.branch}.atom")
165− commit_req = make_request(commit_url)
171+ commit_req = make_request(commit_url, self.token)
166172 with urllib.request.urlopen(commit_req, timeout=10) as req:
167173 self._check_for_redirect(commit_url, req)
168174 xml = req.read()
@@ -291,15 +297,41 @@ class Editor:
291297 """To fill the cache"""
292298 return get_current_plugins(self)
293299
294− def load_plugin_spec(self, plugin_file) -> List[PluginDesc]:
295− return load_plugin_spec(plugin_file)
300+ def load_plugin_spec(self, config: FetchConfig, plugin_file) -> List[PluginDesc]:
301+ plugins = []
302+ with open(plugin_file) as f:
303+ for line in f:
304+ if line.startswith("#"):
305+ continue
306+ plugin = parse_plugin_line(config, line)
307+ plugins.append(plugin)
308+ return plugins
296309
297310 def generate_nix(self, plugins, outfile: str):
298311 '''Returns nothing for now, writes directly to outfile'''
299312 raise NotImplementedError()
300313
301− def get_update(self, input_file: str, outfile: str, proc: int):
302− return get_update(input_file, outfile, proc, editor=self)
314+ def get_update(self, input_file: str, outfile: str, config: FetchConfig):
315+ cache: Cache = Cache(self.get_current_plugins(), self.cache_file)
316+ _prefetch = functools.partial(prefetch, cache=cache)
317+
318+ def update() -> dict:
319+ plugin_names = self.load_plugin_spec(config, input_file)
320+
321+ try:
322+ pool = Pool(processes=config.proc)
323+ results = pool.map(_prefetch, plugin_names)
324+ finally:
325+ cache.store()
326+
327+ plugins, redirects = check_results(results)
328+
329+ self.generate_nix(plugins, outfile)
330+
331+ return redirects
332+
333+ return update
334+
303335
304336 @property
305337 def attr_path(self):
@@ -345,7 +377,15 @@ class Editor:
345377 dest="proc",
346378 type=int,
347379 default=30,
348− help="Number of concurrent processes to spawn. Export GITHUB_API_TOKEN allows higher values.",
380+ help="Number of concurrent processes to spawn. Setting --github-token allows higher values.",
381+ )
382+ parser.add_argument(
383+ "--github-token",
384+ "-t",
385+ type=str,
386+ default=os.getenv("GITHUB_API_TOKEN"),
387+ help="""Allows to set --proc to higher values.
388+ Uses GITHUB_API_TOKEN environment variables as the default value.""",
349389 )
350390 parser.add_argument(
351391 "--no-commit", "-n", action="store_true", default=False,
@@ -414,8 +454,8 @@ def prefetch_plugin(
414454 )
415455
416456
417−def fetch_plugin_from_pluginline(plugin_line: str) -> Plugin:
418− plugin, _ = prefetch_plugin(parse_plugin_line(plugin_line))
457+def fetch_plugin_from_pluginline(config: FetchConfig, plugin_line: str) -> Plugin:
458+ plugin, _ = prefetch_plugin(parse_plugin_line(config, plugin_line))
419459 return plugin
420460
421461
@@ -465,7 +505,7 @@ def make_repo(uri, branch, alias) -> Repo:
465505 repo = Repo(uri.strip(), branch, alias)
466506 return repo
467507
468−def parse_plugin_line(line: str) -> PluginDesc:
508+def parse_plugin_line(config: FetchConfig, line: str) -> PluginDesc:
469509 branch = "HEAD"
470510 alias = None
471511 uri = line
@@ -476,21 +516,11 @@ def parse_plugin_line(line: str) -> PluginDesc:
476516 uri, branch = uri.split("@")
477517
478518 repo = make_repo(uri.strip(), branch.strip(), alias)
519+ repo.token = config.github_token
479520
480521 return PluginDesc(repo, branch.strip(), alias)
481522
482523
483−def load_plugin_spec(plugin_file: str) -> List[PluginDesc]:
484− plugins = []
485− with open(plugin_file) as f:
486− for line in f:
487− if line.startswith("#"):
488− continue
489− plugin = parse_plugin_line(line)
490− plugins.append(plugin)
491− return plugins
492−
493−
494524def get_cache_path(cache_file_name: str) -> Optional[Path]:
495525 xdg_cache = os.environ.get("XDG_CACHE_HOME", None)
496526 if xdg_cache is None:
@@ -556,6 +586,7 @@ def prefetch(
556586
557587
558588def rewrite_input(
589+ config: FetchConfig,
559590 input_file: Path,
560591 deprecated: Path,
561592 redirects: Dict[str, str] = None,
@@ -573,8 +604,8 @@ def rewrite_input(
573604 with open(deprecated, "r") as f:
574605 deprecations = json.load(f)
575606 for old, new in redirects.items():
576− old_plugin = fetch_plugin_from_pluginline(old)
577− new_plugin = fetch_plugin_from_pluginline(new)
607+ old_plugin = fetch_plugin_from_pluginline(config, old)
608+ new_plugin = fetch_plugin_from_pluginline(config, new)
578609 if old_plugin.normalized_name != new_plugin.normalized_name:
579610 deprecations[old_plugin.normalized_name] = {
580611 "new": new_plugin.normalized_name,
@@ -600,40 +631,21 @@ def commit(repo: git.Repo, message: str, files: List[Path]) -> None:
600631 print("no changes in working tree to commit")
601632
602633
603−def get_update(input_file: str, outfile: str, proc: int, editor: Editor):
604− cache: Cache = Cache(editor.get_current_plugins(), editor.cache_file)
605− _prefetch = functools.partial(prefetch, cache=cache)
606−
607− def update() -> dict:
608− plugin_names = editor.load_plugin_spec(input_file)
609−
610− try:
611− pool = Pool(processes=proc)
612− results = pool.map(_prefetch, plugin_names)
613− finally:
614− cache.store()
615−
616− plugins, redirects = check_results(results)
617−
618− editor.generate_nix(plugins, outfile)
619−
620− return redirects
621−
622− return update
623−
624634
625635def update_plugins(editor: Editor, args):
626636 """The main entry function of this module. All input arguments are grouped in the `Editor`."""
627637
628638 log.setLevel(LOG_LEVELS[args.debug])
629639 log.info("Start updating plugins")
630− update = editor.get_update(args.input_file, args.outfile, args.proc)
640+ fetch_config = FetchConfig(args.proc, args.github_token)
641+ update = editor.get_update(args.input_file, args.outfile, fetch_config)
631642
632643 redirects = update()
633− editor.rewrite_input(args.input_file, editor.deprecated, redirects)
644+ editor.rewrite_input(fetch_config, args.input_file, editor.deprecated, redirects)
634645
635646 autocommit = not args.no_commit
636647
648+ nixpkgs_repo = None
637649 if autocommit:
638650 nixpkgs_repo = git.Repo(editor.root, search_parent_directories=True)
639651 commit(nixpkgs_repo, f"{editor.attr_path}: update", [args.outfile])
@@ -648,9 +660,9 @@ def update_plugins(editor: Editor, args):
648660 )
649661
650662 for plugin_line in args.add_plugins:
651− editor.rewrite_input(args.input_file, editor.deprecated, append=(plugin_line + "\n",))
663+ editor.rewrite_input(fetch_config, args.input_file, editor.deprecated, append=(plugin_line + "\n",))
652664 update()
653− plugin = fetch_plugin_from_pluginline(plugin_line)
665+ plugin = fetch_plugin_from_pluginline(fetch_config, plugin_line)
654666 if autocommit:
655667 commit(
656668 nixpkgs_repo,
maintainers/scripts/remove-old-aliases.pynew file+202
@@ -0,0 +1,202 @@
1+#!/usr/bin/env nix-shell
2+#!nix-shell -i python3 -p "python3.withPackages(ps: with ps; [ ])" nix
3+"""
4+A program to remove old aliases or convert old aliases to throws
5+Example usage:
6+./maintainers/scripts/remove-old-aliases.py --year 2018 --file ./pkgs/top-level/aliases.nix
7+
8+Check this file with mypy after every change!
9+$ mypy --strict maintainers/scripts/remove-old-aliases.py
10+"""
11+import argparse
12+import shutil
13+import subprocess
14+from datetime import date as datetimedate
15+from datetime import datetime
16+from pathlib import Path
17+
18+
19+def process_args() -> argparse.Namespace:
20+ """process args"""
21+ arg_parser = argparse.ArgumentParser()
22+ arg_parser.add_argument(
23+ "--year", required=True, type=int, help="operate on aliases older than $year"
24+ )
25+ arg_parser.add_argument(
26+ "--month",
27+ type=int,
28+ default=1,
29+ help="operate on aliases older than $year-$month",
30+ )
31+ arg_parser.add_argument("--file", required=True, type=Path, help="alias file")
32+ arg_parser.add_argument(
33+ "--dry-run", action="store_true", help="don't modify files, only print results"
34+ )
35+ return arg_parser.parse_args()
36+
37+
38+def get_date_lists(
39+ txt: list[str], cutoffdate: datetimedate
40+) -> tuple[list[str], list[str], list[str]]:
41+ """get a list of lines in which the date is older than $cutoffdate"""
42+ date_older_list: list[str] = []
43+ date_older_throw_list: list[str] = []
44+ date_sep_line_list: list[str] = []
45+
46+ for lineno, line in enumerate(txt, start=1):
47+ line = line.rstrip()
48+ my_date = None
49+ for string in line.split():
50+ string = string.strip(":")
51+ try:
52+ # strip ':' incase there is a string like 2019-11-01:
53+ my_date = datetime.strptime(string, "%Y-%m-%d").date()
54+ except ValueError:
55+ try:
56+ my_date = datetime.strptime(string, "%Y-%m").date()
57+ except ValueError:
58+ continue
59+
60+ if my_date is None or my_date > cutoffdate or "preserve, reason:" in line.lower():
61+ continue
62+
63+ if "=" not in line:
64+ date_sep_line_list.append(f"{lineno} {line}")
65+ # 'if' lines could be complicated
66+ elif "if " in line and "if =" not in line:
67+ print(f"RESOLVE MANUALLY {line}")
68+ elif "throw" in line:
69+ date_older_throw_list.append(line)
70+ else:
71+ date_older_list.append(line)
72+
73+ return (
74+ date_older_list,
75+ date_sep_line_list,
76+ date_older_throw_list,
77+ )
78+
79+
80+def convert_to_throw(date_older_list: list[str]) -> list[tuple[str, str]]:
81+ """convert a list of lines to throws"""
82+ converted_list = []
83+ for line in date_older_list.copy():
84+ indent: str = " " * (len(line) - len(line.lstrip()))
85+ before_equal = ""
86+ after_equal = ""
87+ try:
88+ before_equal, after_equal = (x.strip() for x in line.split("=", maxsplit=2))
89+ except ValueError as err:
90+ print(err, line, "\n")
91+ date_older_list.remove(line)
92+ continue
93+
94+ alias = before_equal.strip()
95+ after_equal_list = [x.strip(";:") for x in after_equal.split()]
96+
97+ converted = (
98+ f"{indent}{alias} = throw \"'{alias}' has been renamed to/replaced by"
99+ f" '{after_equal_list.pop(0)}'\";"
100+ f' # Converted to throw {datetime.today().strftime("%Y-%m-%d")}'
101+ )
102+ converted_list.append((line, converted))
103+
104+ return converted_list
105+
106+
107+def generate_text_to_write(
108+ txt: list[str],
109+ date_older_list: list[str],
110+ converted_to_throw: list[tuple[str, str]],
111+ date_older_throw_list: list[str],
112+) -> list[str]:
113+ """generate a list of text to be written to the aliasfile"""
114+ text_to_write: list[str] = []
115+ for line in txt:
116+ text_to_append: str = ""
117+ if converted_to_throw:
118+ for tupl in converted_to_throw:
119+ if line == tupl[0]:
120+ text_to_append = f"{tupl[1]}\n"
121+ if line not in date_older_list and line not in date_older_throw_list:
122+ text_to_append = f"{line}\n"
123+ if text_to_append:
124+ text_to_write.append(text_to_append)
125+
126+ return text_to_write
127+
128+
129+def write_file(
130+ aliasfile: Path,
131+ text_to_write: list[str],
132+) -> None:
133+ """write file"""
134+ temp_aliasfile = Path(f"{aliasfile}.raliases")
135+ with open(temp_aliasfile, "w", encoding="utf-8") as far:
136+ for line in text_to_write:
137+ far.write(line)
138+ print("\nChecking the syntax of the new aliasfile")
139+ try:
140+ subprocess.run(
141+ ["nix-instantiate", "--eval", temp_aliasfile],
142+ check=True,
143+ stdout=subprocess.DEVNULL,
144+ )
145+ except subprocess.CalledProcessError:
146+ print(
147+ "\nSyntax check failed,",
148+ "there may have been a line which only has\n"
149+ 'aliasname = "reason why";\n'
150+ "when it should have been\n"
151+ 'aliasname = throw "reason why";',
152+ )
153+ temp_aliasfile.unlink()
154+ return
155+ shutil.move(f"{aliasfile}.raliases", aliasfile)
156+ print(f"{aliasfile} modified! please verify with 'git diff'.")
157+
158+
159+def main() -> None:
160+ """main"""
161+ args = process_args()
162+
163+ aliasfile = Path(args.file).absolute()
164+ cutoffdate = (datetime.strptime(f"{args.year}-{args.month}-01", "%Y-%m-%d")).date()
165+
166+ txt: list[str] = (aliasfile.read_text(encoding="utf-8")).splitlines()
167+
168+ date_older_list: list[str] = []
169+ date_sep_line_list: list[str] = []
170+ date_older_throw_list: list[str] = []
171+
172+ date_older_list, date_sep_line_list, date_older_throw_list = get_date_lists(
173+ txt, cutoffdate
174+ )
175+
176+ converted_to_throw: list[tuple[str, str]] = []
177+ converted_to_throw = convert_to_throw(date_older_list)
178+
179+ if date_older_list:
180+ print(" Will be converted to throws. ".center(100, "-"))
181+ for l_n in date_older_list:
182+ print(l_n)
183+
184+ if date_older_throw_list:
185+ print(" Will be removed. ".center(100, "-"))
186+ for l_n in date_older_throw_list:
187+ print(l_n)
188+
189+ if date_sep_line_list:
190+ print(" On separate line, resolve manually. ".center(100, "-"))
191+ for l_n in date_sep_line_list:
192+ print(l_n)
193+
194+ if not args.dry_run:
195+ text_to_write = generate_text_to_write(
196+ txt, date_older_list, converted_to_throw, date_older_throw_list
197+ )
198+ write_file(aliasfile, text_to_write)
199+
200+
201+if __name__ == "__main__":
202+ main()
maintainers/scripts/update-luarocks-packages+5−8
@@ -25,8 +25,8 @@ from pathlib import Path
2525log = logging.getLogger()
2626log.addHandler(logging.StreamHandler())
2727
28−ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))).parent.parent
29−from pluginupdate import Editor, update_plugins, PluginDesc, CleanEnvironment, LOG_LEVELS, Cache
28+ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))).parent.parent # type: ignore
29+from pluginupdate import Editor, update_plugins, FetchConfig, CleanEnvironment
3030
3131PKG_LIST="maintainers/scripts/luarocks-packages.csv"
3232TMP_FILE="$(mktemp)"
@@ -118,7 +118,7 @@ class LuaEditor(Editor):
118118 def attr_path(self):
119119 return "luaPackages"
120120
121− def get_update(self, input_file: str, outfile: str, proc: int):
121+ def get_update(self, input_file: str, outfile: str, config: FetchConfig):
122122 _prefetch = generate_pkg_nix
123123
124124 def update() -> dict:
@@ -126,14 +126,14 @@ class LuaEditor(Editor):
126126 sorted_plugin_specs = sorted(plugin_specs, key=lambda v: v.name.lower())
127127
128128 try:
129− pool = Pool(processes=proc)
129+ pool = Pool(processes=config.proc)
130130 results = pool.map(_prefetch, sorted_plugin_specs)
131131 finally:
132132 pass
133133
134134 self.generate_nix(results, outfile)
135135
136− redirects = []
136+ redirects = {}
137137 return redirects
138138
139139 return update
@@ -181,11 +181,9 @@ def generate_pkg_nix(plug: LuaPlugin):
181181
182182 cmd.append(plug.version)
183183
184− #
185184 if plug.server != "src" and plug.server:
186185 cmd.append(f"--only-server={plug.server}")
187186
188−
189187 if plug.luaversion:
190188 with CleanEnvironment():
191189 local_pkgs = str(ROOT.resolve())
@@ -209,7 +207,6 @@ def main():
209207
210208 parser = editor.create_parser()
211209 args = parser.parse_args()
212− log.setLevel(LOG_LEVELS[args.debug])
213210
214211 update_plugins(editor, args)
215212
maintainers/scripts/update.nix+1−1
@@ -147,7 +147,7 @@ let
147147
148148 to run update script for specific package, or
149149
150− % nix-shell maintainers/scripts/update.nix --arg predicate '(path: pkg: builtins.isList pkg.updateScript && builtins.length pkg.updateScript >= 1 && (let script = builtins.head pkg.updateScript; in builtins.isAttrs script && script.name == "gnome-update-script"))'
150+ % nix-shell maintainers/scripts/update.nix --arg predicate '(path: pkg: pkg.updateScript.name or null == "gnome-update-script")'
151151
152152 to run update script for all packages matching given predicate, or
153153
maintainers/scripts/update.py+4
@@ -88,6 +88,10 @@ async def commit_changes(name: str, merge_lock: asyncio.Lock, worktree: str, bra
8888 async with merge_lock:
8989 await check_subprocess('git', 'add', *change['files'], cwd=worktree)
9090 commit_message = '{attrPath}: {oldVersion} → {newVersion}'.format(**change)
91+ if 'commitMessage' in change:
92+ commit_message = change['commitMessage']
93+ elif 'commitBody' in change:
94+ commit_message = commit_message + '\n\n' + change['commitBody']
9195 await check_subprocess('git', 'commit', '--quiet', '-m', commit_message, cwd=worktree)
9296 await check_subprocess('git', 'cherry-pick', branch)
9397
maintainers/team-list.nix+9−3
@@ -50,6 +50,7 @@ with lib.maintainers; {
5050 DianaOlympos
5151 gleber
5252 happysalada
53+ minijackson
5354 yurrriq
5455 ];
5556 scope = "Maintain BEAM-related packages and modules.";
@@ -64,7 +65,6 @@ with lib.maintainers; {
6465
6566 chia = {
6667 members = [
67− atemu
6868 lourkeur
6969 ];
7070 scope = "Maintain the Chia blockchain and its dependencies";
@@ -214,7 +214,6 @@ with lib.maintainers; {
214214 mguentner
215215 ekleog
216216 ralith
217− mjlbach
218217 dandellion
219218 sumnerevans
220219 ];
@@ -223,7 +222,7 @@ with lib.maintainers; {
223222
224223 openstack = {
225224 members = [
226− angustrau
225+ emilytrau
227226 SuperSandro2000
228227 ];
229228 scope = "Maintain the ecosystem around OpenStack";
@@ -278,6 +277,13 @@ with lib.maintainers; {
278277 scope = "Maintain SageMath and the dependencies that are likely to break it.";
279278 };
280279
280+ sphinx = {
281+ members = [
282+ SuperSandro2000
283+ ];
284+ scope = "Maintain Sphinx related packages.";
285+ };
286+
281287 serokell = {
282288 # Verify additions by approval of an already existing member of the team.
283289 members = [
nixos/doc/manual/development/activation-script.section.mdnew file+72
@@ -0,0 +1,72 @@
1+# Activation script {#sec-activation-script}
2+
3+The activation script is a bash script called to activate the new
4+configuration which resides in a NixOS system in `$out/activate`. Since its
5+contents depend on your system configuration, the contents may differ.
6+This chapter explains how the script works in general and some common NixOS
7+snippets. Please be aware that the script is executed on every boot and system
8+switch, so tasks that can be performed in other places should be performed
9+there (for example letting a directory of a service be created by systemd using
10+mechanisms like `StateDirectory`, `CacheDirectory`, ... or if that's not
11+possible using `preStart` of the service).
12+
13+Activation scripts are defined as snippets using
14+[](#opt-system.activationScripts). They can either be a simple multiline string
15+or an attribute set that can depend on other snippets. The builder for the
16+activation script will take these dependencies into account and order the
17+snippets accordingly. As a simple example:
18+
19+```nix
20+system.activationScripts.my-activation-script = {
21+ deps = [ "etc" ];
22+ # supportsDryActivation = true;
23+ text = ''
24+ echo "Hallo i bims"
25+ '';
26+};
27+```
28+
29+This example creates an activation script snippet that is run after the `etc`
30+snippet. The special variable `supportsDryActivation` can be set so the snippet
31+is also run when `nixos-rebuild dry-activate` is run. To differentiate between
32+real and dry activation, the `$NIXOS_ACTION` environment variable can be
33+read which is set to `dry-activate` when a dry activation is done.
34+
35+An activation script can write to special files instructing
36+`switch-to-configuration` to restart/reload units. The script will take these
37+requests into account and will incorperate the unit configuration as described
38+above. This means that the activation script will "fake" a modified unit file
39+and `switch-to-configuration` will act accordingly. By doing so, configuration
40+like [systemd.services.\<name\>.restartIfChanged](#opt-systemd.services) is
41+respected. Since the activation script is run **after** services are already
42+stopped, [systemd.services.\<name\>.stopIfChanged](#opt-systemd.services)
43+cannot be taken into account anymore and the unit is always restarted instead
44+of being stopped and started afterwards.
45+
46+The files that can be written to are `/run/nixos/activation-restart-list` and
47+`/run/nixos/activation-reload-list` with their respective counterparts for
48+dry activation being `/run/nixos/dry-activation-restart-list` and
49+`/run/nixos/dry-activation-reload-list`. Those files can contain
50+newline-separated lists of unit names where duplicates are being ignored. These
51+files are not create automatically and activation scripts must take the
52+possiblility into account that they have to create them first.
53+
54+## NixOS snippets {#sec-activation-script-nixos-snippets}
55+
56+There are some snippets NixOS enables by default because disabling them would
57+most likely break you system. This section lists a few of them and what they
58+do:
59+
60+- `binsh` creates `/bin/sh` which points to the runtime shell
61+- `etc` sets up the contents of `/etc`, this includes systemd units and
62+ excludes `/etc/passwd`, `/etc/group`, and `/etc/shadow` (which are managed by
63+ the `users` snippet)
64+- `hostname` sets the system's hostname in the kernel (not in `/etc`)
65+- `modprobe` sets the path to the `modprobe` binary for module auto-loading
66+- `nix` prepares the nix store and adds a default initial channel
67+- `specialfs` is responsible for mounting filesystems like `/proc` and `sys`
68+- `users` creates and removes users and groups by managing `/etc/passwd`,
69+ `/etc/group` and `/etc/shadow`. This also creates home directories
70+- `usrbinenv` creates `/usr/bin/env`
71+- `var` creates some directories in `/var` that are not service-specific
72+- `wrappers` creates setuid wrappers like `ping` and `sudo`
nixos/doc/manual/development/development.xml+1
@@ -12,6 +12,7 @@
1212 <xi:include href="../from_md/development/sources.chapter.xml" />
1313 <xi:include href="../from_md/development/writing-modules.chapter.xml" />
1414 <xi:include href="../from_md/development/building-parts.chapter.xml" />
15+ <xi:include href="../from_md/development/what-happens-during-a-system-switch.chapter.xml" />
1516 <xi:include href="../from_md/development/writing-documentation.chapter.xml" />
1617 <xi:include href="../from_md/development/building-nixos.chapter.xml" />
1718 <xi:include href="../from_md/development/nixos-tests.chapter.xml" />
nixos/doc/manual/development/option-declarations.section.md+17−16
@@ -27,9 +27,10 @@ The function `mkOption` accepts the following arguments.
2727
2828`type`
2929
30−: The type of the option (see [](#sec-option-types)). It may be
31− omitted, but that's not advisable since it may lead to errors that
32− are hard to diagnose.
30+: The type of the option (see [](#sec-option-types)). This
31+ argument is mandatory for nixpkgs modules. Setting this is highly
32+ recommended for the sake of documentation and type checking. In case it is
33+ not set, a fallback type with unspecified behavior is used.
3334
3435`default`
3536
@@ -145,26 +146,26 @@ As an example, we will take the case of display managers. There is a
145146central display manager module for generic display manager options and a
146147module file per display manager backend (sddm, gdm \...).
147148
148−There are two approach to this module structure:
149+There are two approaches we could take with this module structure:
149150
150−- Managing the display managers independently by adding an enable
151+- Configuring the display managers independently by adding an enable
151152 option to every display manager module backend. (NixOS)
152153
153−- Managing the display managers in the central module by adding an
154− option to select which display manager backend to use.
154+- Configuring the display managers in the central module by adding
155+ an option to select which display manager backend to use.
155156
156157Both approaches have problems.
157158
158159Making backends independent can quickly become hard to manage. For
159−display managers, there can be only one enabled at a time, but the type
160−system can not enforce this restriction as there is no relation between
161−each backend `enable` option. As a result, this restriction has to be
162−done explicitely by adding assertions in each display manager backend
163−module.
160+display managers, there can only be one enabled at a time, but the
161+type system cannot enforce this restriction as there is no relation
162+between each backend's `enable` option. As a result, this restriction
163+has to be done explicitly by adding assertions in each display manager
164+backend module.
164165
165−On the other hand, managing the display managers backends in the central
166−module will require to change the central module option every time a new
167−backend is added or removed.
166+On the other hand, managing the display manager backends in the
167+central module will require changing the central module option every
168+time a new backend is added or removed.
168169
169170By using extensible option types, it is possible to create a placeholder
170171option in the central module
@@ -175,7 +176,7 @@ and to extend it in each backend module
175176
176177As a result, `displayManager.enable` option values can be added without
177178changing the main service module file and the type system automatically
178−enforce that there can only be a single display manager enabled.
179+enforces that there can only be a single display manager enabled.
179180
180181::: {#ex-option-declaration-eot-service .example}
181182::: {.title}
nixos/doc/manual/development/option-types.section.md+29−4
@@ -16,13 +16,14 @@ merging is handled.
1616
1717`types.path`
1818
19−: A filesystem path, defined as anything that when coerced to a string
20− starts with a slash. Even if derivations can be considered as path,
21− the more specific `types.package` should be preferred.
19+: A filesystem path is anything that starts with a slash when
20+ coerced to a string. Even if derivations can be considered as
21+ paths, the more specific `types.package` should be preferred.
2222
2323`types.package`
2424
25−: A derivation or a store path.
25+: A top-level store path. This can be an attribute set pointing
26+ to a store path, like a derivation or a flake input.
2627
2728`types.anything`
2829
@@ -63,6 +64,24 @@ merging is handled.
6364 ```
6465 :::
6566
67+`types.raw`
68+
69+: A type which doesn't do any checking, merging or nested evaluation. It
70+ accepts a single arbitrary value that is not recursed into, making it
71+ useful for values coming from outside the module system, such as package
72+ sets or arbitrary data. Options of this type are still evaluated according
73+ to priorities and conditionals, so `mkForce`, `mkIf` and co. still work on
74+ the option value itself, but not for any value nested within it. This type
75+ should only be used when checking, merging and nested evaluation are not
76+ desirable.
77+
78+`types.optionType`
79+
80+: The type of an option's type. Its merging operation ensures that nested
81+ options have the correct file location annotated, and that if possible,
82+ multiple option definitions are correctly merged together. The main use
83+ case is as the type of the `_module.freeformType` option.
84+
6685`types.attrs`
6786
6887: A free-form attribute set.
@@ -250,6 +269,12 @@ Composed types are types that take a type as parameter. `listOf
250269: Ensures that type *`t`* cannot be merged. It is used to ensure option
251270 definitions are declared only once.
252271
272+`types.unique` `{ message = m }` *`t`*
273+
274+: Ensures that type *`t`* cannot be merged. Prints the message *`m`*, after
275+ the line `The option <option path> is defined multiple times.` and before
276+ a list of definition locations.
277+
253278`types.either` *`t1 t2`*
254279
255280: Type *`t1`* or type *`t2`*, e.g. `with types; either int str`.
nixos/doc/manual/development/running-nixos-tests-interactively.section.md+2−2
@@ -5,7 +5,7 @@ when developing or debugging a test:
55
66```ShellSession
77$ nix-build . -A nixosTests.login.driverInteractive
8−$ ./result/bin/nixos-test-driver --interactive
8+$ ./result/bin/nixos-test-driver
99[...]
1010>>>
1111```
@@ -28,7 +28,7 @@ You can re-use the VM states coming from a previous run by setting the
2828`--keep-vm-state` flag.
2929
3030```ShellSession
31−$ ./result/bin/nixos-test-driver --interactive --keep-vm-state
31+$ ./result/bin/nixos-test-driver --keep-vm-state
3232```
3333
3434The machine state is stored in the `$TMPDIR/vm-state-machinename`
nixos/doc/manual/development/running-nixos-tests.section.md+2−2
@@ -24,8 +24,8 @@ After building/downloading all required dependencies, this will perform
2424a build that starts a QEMU/KVM virtual machine containing a NixOS
2525system. The virtual machine mounts the Nix store of the host; this makes
2626VM creation very fast, as no disk image needs to be created. Afterwards,
27−you can view a pretty-printed log of the test:
27+you can view a log of the test:
2828
2929```ShellSession
30−$ firefox result/log.html
30+$ nix-store --read-log result
3131```
nixos/doc/manual/development/settings-options.section.md+45
@@ -66,6 +66,45 @@ have a predefined type and string generator already declared under
6666 and returning a set with TOML-specific attributes `type` and
6767 `generate` as specified [below](#pkgs-formats-result).
6868
69+`pkgs.formats.elixirConf { elixir ? pkgs.elixir }`
70+
71+: A function taking an attribute set with values
72+
73+ `elixir`
74+
75+ : The Elixir package which will be used to format the generated output
76+
77+ It returns a set with Elixir-Config-specific attributes `type`, `lib`, and
78+ `generate` as specified [below](#pkgs-formats-result).
79+
80+ The `lib` attribute contains functions to be used in settings, for
81+ generating special Elixir values:
82+
83+ `mkRaw elixirCode`
84+
85+ : Outputs the given string as raw Elixir code
86+
87+ `mkGetEnv { envVariable, fallback ? null }`
88+
89+ : Makes the configuration fetch an environment variable at runtime
90+
91+ `mkAtom atom`
92+
93+ : Outputs the given string as an Elixir atom, instead of the default
94+ Elixir binary string. Note: lowercase atoms still needs to be prefixed
95+ with `:`
96+
97+ `mkTuple array`
98+
99+ : Outputs the given array as an Elixir tuple, instead of the default
100+ Elixir list
101+
102+ `mkMap attrset`
103+
104+ : Outputs the given attribute set as an Elixir map, instead of the
105+ default Elixir keyword list
106+
107+
69108::: {#pkgs-formats-result}
70109These functions all return an attribute set with these values:
71110:::
@@ -74,6 +113,12 @@ These functions all return an attribute set with these values:
74113
75114: A module system type representing a value of the format
76115
116+`lib`
117+
118+: Utility functions for convenience, or special interactions with the format.
119+ This attribute is optional. It may contain inside a `types` attribute
120+ containing types specific to this format.
121+
77122`generate` *`filename jsonValue`*
78123
79124: A function that can render a value of the format to a file. Returns
nixos/doc/manual/development/unit-handling.section.mdnew file+62
@@ -0,0 +1,62 @@
1+# Unit handling {#sec-unit-handling}
2+
3+To figure out what units need to be started/stopped/restarted/reloaded, the
4+script first checks the current state of the system, similar to what `systemctl
5+list-units` shows. For each of the units, the script goes through the following
6+checks:
7+
8+- Is the unit file still in the new system? If not, **stop** the service unless
9+ it sets `X-StopOnRemoval` in the `[Unit]` section to `false`.
10+
11+- Is it a `.target` unit? If so, **start** it unless it sets
12+ `RefuseManualStart` in the `[Unit]` section to `true` or `X-OnlyManualStart`
13+ in the `[Unit]` section to `true`. Also **stop** the unit again unless it
14+ sets `X-StopOnReconfiguration` to `false`.
15+
16+- Are the contents of the unit files different? They are compared by parsing
17+ them and comparing their contents. If they are different but only
18+ `X-Reload-Triggers` in the `[Unit]` section is changed, **reload** the unit.
19+ The NixOS module system allows setting these triggers with the option
20+ [systemd.services.\<name\>.reloadTriggers](#opt-systemd.services). There are
21+ some additional keys in the `[Unit]` section that are ignored as well. If the
22+ unit files differ in any way, the following actions are performed:
23+
24+ - `.path` and `.slice` units are ignored. There is no need to restart them
25+ since changes in their values are applied by systemd when systemd is
26+ reloaded.
27+
28+ - `.mount` units are **reload**ed. These mostly come from the `/etc/fstab`
29+ parser.
30+
31+ - `.socket` units are currently ignored. This is to be fixed at a later
32+ point.
33+
34+ - The rest of the units (mostly `.service` units) are then **reload**ed if
35+ `X-ReloadIfChanged` in the `[Service]` section is set to `true` (exposed
36+ via [systemd.services.\<name\>.reloadIfChanged](#opt-systemd.services)).
37+ A little exception is done for units that were deactivated in the meantime,
38+ for example because they require a unit that got stopped before. These
39+ are **start**ed instead of reloaded.
40+
41+ - If the reload flag is not set, some more flags decide if the unit is
42+ skipped. These flags are `X-RestartIfChanged` in the `[Service]` section
43+ (exposed via
44+ [systemd.services.\<name\>.restartIfChanged](#opt-systemd.services)),
45+ `RefuseManualStop` in the `[Unit]` section, and `X-OnlyManualStart` in the
46+ `[Unit]` section.
47+
48+ - Further behavior depends on the unit having `X-StopIfChanged` in the
49+ `[Service]` section set to `true` (exposed via
50+ [systemd.services.\<name\>.stopIfChanged](#opt-systemd.services)). This is
51+ set to `true` by default and must be explicitly turned off if not wanted.
52+ If the flag is enabled, the unit is **stop**ped and then **start**ed. If
53+ not, the unit is **restart**ed. The goal of the flag is to make sure that
54+ the new unit never runs in the old environment which is still in place
55+ before the activation script is run. This behavior is different when the
56+ service is socket-activated, as outlined in the following steps.
57+
58+ - The last thing that is taken into account is whether the unit is a service
59+ and socket-activated. If `X-StopIfChanged` is **not** set, the service
60+ is **restart**ed with the others. If it is set, both the service and the
61+ socket are **stop**ped and the socket is **start**ed, leaving socket
62+ activation to start the service when it's needed.
nixos/doc/manual/development/what-happens-during-a-system-switch.chapter.mdnew file+53
@@ -0,0 +1,53 @@
1+# What happens during a system switch? {#sec-switching-systems}
2+
3+Running `nixos-rebuild switch` is one of the more common tasks under NixOS.
4+This chapter explains some of the internals of this command to make it simpler
5+for new module developers to configure their units correctly and to make it
6+easier to understand what is happening and why for curious administrators.
7+
8+`nixos-rebuild`, like many deployment solutions, calls `switch-to-configuration`
9+which resides in a NixOS system at `$out/bin/switch-to-configuration`. The
10+script is called with the action that is to be performed like `switch`, `test`,
11+`boot`. There is also the `dry-activate` action which does not really perform
12+the actions but rather prints what it would do if you called it with `test`.
13+This feature can be used to check what service states would be changed if the
14+configuration was switched to.
15+
16+If the action is `switch` or `boot`, the bootloader is updated first so the
17+configuration will be the next one to boot. Unless `NIXOS_NO_SYNC` is set to
18+`1`, `/nix/store` is synced to disk.
19+
20+If the action is `switch` or `test`, the currently running system is inspected
21+and the actions to switch to the new system are calculated. This process takes
22+two data sources into account: `/etc/fstab` and the current systemd status.
23+Mounts and swaps are read from `/etc/fstab` and the corresponding actions are
24+generated. If a new mount is added, for example, the proper `.mount` unit is
25+marked to be started. The current systemd state is inspected, the difference
26+between the current system and the desired configuration is calculated and
27+actions are generated to get to this state. There are a lot of nuances that can
28+be controlled by the units which are explained here.
29+
30+After calculating what should be done, the actions are carried out. The order
31+of actions is always the same:
32+- Stop units (`systemctl stop`)
33+- Run activation script (`$out/activate`)
34+- See if the activation script requested more units to restart
35+- Restart systemd if needed (`systemd daemon-reexec`)
36+- Forget about the failed state of units (`systemctl reset-failed`)
37+- Reload systemd (`systemctl daemon-reload`)
38+- Reload systemd user instances (`systemctl --user daemon-reload`)
39+- Set up tmpfiles (`systemd-tmpfiles --create`)
40+- Reload units (`systemctl reload`)
41+- Restart units (`systemctl restart`)
42+- Start units (`systemctl start`)
43+- Inspect what changed during these actions and print units that failed and
44+ that were newly started
45+
46+Most of these actions are either self-explaining but some of them have to do
47+with our units or the activation script. For this reason, these topics are
48+explained in the next sections.
49+
50+```{=docbook}
51+<xi:include href="unit-handling.section.xml" />
52+<xi:include href="activation-script.section.xml" />
53+```
nixos/doc/manual/development/writing-modules.chapter.md+42
@@ -90,6 +90,17 @@ modules: `systemd.services` (the set of all systemd services) and
9090`systemd.timers` (the list of commands to be executed periodically by
9191`systemd`).
9292
93+Care must be taken when writing systemd services using `Exec*` directives. By
94+default systemd performs substitution on `%<char>` specifiers in these
95+directives, expands environment variables from `$FOO` and `${FOO}`, splits
96+arguments on whitespace, and splits commands on `;`. All of these must be escaped
97+to avoid unexpected substitution or splitting when interpolating into an `Exec*`
98+directive, e.g. when using an `extraArgs` option to pass additional arguments to
99+the service. The functions `utils.escapeSystemdExecArg` and
100+`utils.escapeSystemdExecArgs` are provided for this, see [Example: Escaping in
101+Exec directives](#exec-escaping-example) for an example. When using these
102+functions system environment substitution should *not* be disabled explicitly.
103+
93104::: {#locate-example .example}
94105::: {.title}
95106**Example: NixOS Module for the "locate" Service**
@@ -153,6 +164,37 @@ in {
153164```
154165:::
155166
167+::: {#exec-escaping-example .example}
168+::: {.title}
169+**Example: Escaping in Exec directives**
170+:::
171+```nix
172+{ config, lib, pkgs, utils, ... }:
173+
174+with lib;
175+
176+let
177+ cfg = config.services.echo;
178+ echoAll = pkgs.writeScript "echo-all" ''
179+ #! ${pkgs.runtimeShell}
180+ for s in "$@"; do
181+ printf '%s\n' "$s"
182+ done
183+ '';
184+ args = [ "a%Nything" "lang=\${LANG}" ";" "/bin/sh -c date" ];
185+in {
186+ systemd.services.echo =
187+ { description = "Echo to the journal";
188+ wantedBy = [ "multi-user.target" ];
189+ serviceConfig.Type = "oneshot";
190+ serviceConfig.ExecStart = ''
191+ ${echoAll} ${utils.escapeSystemdExecArgs args}
192+ '';
193+ };
194+}
195+```
196+:::
197+
156198```{=docbook}
157199<xi:include href="option-declarations.section.xml" />
158200<xi:include href="option-types.section.xml" />
nixos/doc/manual/development/writing-nixos-tests.section.md+13
@@ -158,6 +158,12 @@ The following methods are available on machine objects:
158158 e.g., `send_chars("foobar\n")` will type the string `foobar`
159159 followed by the Enter key.
160160
161+`send_console`
162+
163+: Send keys to the kernel console. This allows interaction with the systemd
164+ emergency mode, for example. Takes a string that is sent, e.g.,
165+ `send_console("\n\nsystemctl default\n")`.
166+
161167`execute`
162168
163169: Execute a shell command, returning a list `(status, stdout)`.
@@ -272,6 +278,13 @@ The following methods are available on machine objects:
272278 Killing the interactive session with `Ctrl-d` or `Ctrl-c` also ends
273279 the guest session.
274280
281+`console_interact`
282+
283+: Allows you to directly interact with QEMU's stdin. This should
284+ only be used during test development, not in production tests.
285+ Output from QEMU is only read line-wise. `Ctrl-c` kills QEMU and
286+ `Ctrl-d` closes console and returns to the test runner.
287+
275288To test user units declared by `systemd.user.services` the optional
276289`user` argument can be used:
277290
nixos/doc/manual/from_md/development/activation-script.section.xmlnew file+150
@@ -0,0 +1,150 @@
1+<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-activation-script">
2+ <title>Activation script</title>
3+ <para>
4+ The activation script is a bash script called to activate the new
5+ configuration which resides in a NixOS system in
6+ <literal>$out/activate</literal>. Since its contents depend on your
7+ system configuration, the contents may differ. This chapter explains
8+ how the script works in general and some common NixOS snippets.
9+ Please be aware that the script is executed on every boot and system
10+ switch, so tasks that can be performed in other places should be
11+ performed there (for example letting a directory of a service be
12+ created by systemd using mechanisms like
13+ <literal>StateDirectory</literal>,
14+ <literal>CacheDirectory</literal>, … or if that’s not possible using
15+ <literal>preStart</literal> of the service).
16+ </para>
17+ <para>
18+ Activation scripts are defined as snippets using
19+ <xref linkend="opt-system.activationScripts" />. They can either be
20+ a simple multiline string or an attribute set that can depend on
21+ other snippets. The builder for the activation script will take
22+ these dependencies into account and order the snippets accordingly.
23+ As a simple example:
24+ </para>
25+ <programlisting language="bash">
26+system.activationScripts.my-activation-script = {
27+ deps = [ "etc" ];
28+ # supportsDryActivation = true;
29+ text = ''
30+ echo "Hallo i bims"
31+ '';
32+};
33+</programlisting>
34+ <para>
35+ This example creates an activation script snippet that is run after
36+ the <literal>etc</literal> snippet. The special variable
37+ <literal>supportsDryActivation</literal> can be set so the snippet
38+ is also run when <literal>nixos-rebuild dry-activate</literal> is
39+ run. To differentiate between real and dry activation, the
40+ <literal>$NIXOS_ACTION</literal> environment variable can be read
41+ which is set to <literal>dry-activate</literal> when a dry
42+ activation is done.
43+ </para>
44+ <para>
45+ An activation script can write to special files instructing
46+ <literal>switch-to-configuration</literal> to restart/reload units.
47+ The script will take these requests into account and will
48+ incorperate the unit configuration as described above. This means
49+ that the activation script will <quote>fake</quote> a modified unit
50+ file and <literal>switch-to-configuration</literal> will act
51+ accordingly. By doing so, configuration like
52+ <link linkend="opt-systemd.services">systemd.services.<name>.restartIfChanged</link>
53+ is respected. Since the activation script is run
54+ <emphasis role="strong">after</emphasis> services are already
55+ stopped,
56+ <link linkend="opt-systemd.services">systemd.services.<name>.stopIfChanged</link>
57+ cannot be taken into account anymore and the unit is always
58+ restarted instead of being stopped and started afterwards.
59+ </para>
60+ <para>
61+ The files that can be written to are
62+ <literal>/run/nixos/activation-restart-list</literal> and
63+ <literal>/run/nixos/activation-reload-list</literal> with their
64+ respective counterparts for dry activation being
65+ <literal>/run/nixos/dry-activation-restart-list</literal> and
66+ <literal>/run/nixos/dry-activation-reload-list</literal>. Those
67+ files can contain newline-separated lists of unit names where
68+ duplicates are being ignored. These files are not create
69+ automatically and activation scripts must take the possiblility into
70+ account that they have to create them first.
71+ </para>
72+ <section xml:id="sec-activation-script-nixos-snippets">
73+ <title>NixOS snippets</title>
74+ <para>
75+ There are some snippets NixOS enables by default because disabling
76+ them would most likely break you system. This section lists a few
77+ of them and what they do:
78+ </para>
79+ <itemizedlist spacing="compact">
80+ <listitem>
81+ <para>
82+ <literal>binsh</literal> creates <literal>/bin/sh</literal>
83+ which points to the runtime shell
84+ </para>
85+ </listitem>
86+ <listitem>
87+ <para>
88+ <literal>etc</literal> sets up the contents of
89+ <literal>/etc</literal>, this includes systemd units and
90+ excludes <literal>/etc/passwd</literal>,
91+ <literal>/etc/group</literal>, and
92+ <literal>/etc/shadow</literal> (which are managed by the
93+ <literal>users</literal> snippet)
94+ </para>
95+ </listitem>
96+ <listitem>
97+ <para>
98+ <literal>hostname</literal> sets the system’s hostname in the
99+ kernel (not in <literal>/etc</literal>)
100+ </para>
101+ </listitem>
102+ <listitem>
103+ <para>
104+ <literal>modprobe</literal> sets the path to the
105+ <literal>modprobe</literal> binary for module auto-loading
106+ </para>
107+ </listitem>
108+ <listitem>
109+ <para>
110+ <literal>nix</literal> prepares the nix store and adds a
111+ default initial channel
112+ </para>
113+ </listitem>
114+ <listitem>
115+ <para>
116+ <literal>specialfs</literal> is responsible for mounting
117+ filesystems like <literal>/proc</literal> and
118+ <literal>sys</literal>
119+ </para>
120+ </listitem>
121+ <listitem>
122+ <para>
123+ <literal>users</literal> creates and removes users and groups
124+ by managing <literal>/etc/passwd</literal>,
125+ <literal>/etc/group</literal> and
126+ <literal>/etc/shadow</literal>. This also creates home
127+ directories
128+ </para>
129+ </listitem>
130+ <listitem>
131+ <para>
132+ <literal>usrbinenv</literal> creates
133+ <literal>/usr/bin/env</literal>
134+ </para>
135+ </listitem>
136+ <listitem>
137+ <para>
138+ <literal>var</literal> creates some directories in
139+ <literal>/var</literal> that are not service-specific
140+ </para>
141+ </listitem>
142+ <listitem>
143+ <para>
144+ <literal>wrappers</literal> creates setuid wrappers like
145+ <literal>ping</literal> and <literal>sudo</literal>
146+ </para>
147+ </listitem>
148+ </itemizedlist>
149+ </section>
150+</section>
nixos/doc/manual/from_md/development/option-declarations.section.xml+20−17
@@ -38,9 +38,11 @@ options = {
3838 <listitem>
3939 <para>
4040 The type of the option (see
41− <xref linkend="sec-option-types" />). It may be omitted, but
42− that’s not advisable since it may lead to errors that are hard
43− to diagnose.
41+ <xref linkend="sec-option-types" />). This argument is
42+ mandatory for nixpkgs modules. Setting this is highly
43+ recommended for the sake of documentation and type checking.
44+ In case it is not set, a fallback type with unspecified
45+ behavior is used.
4446 </para>
4547 </listitem>
4648 </varlistentry>
@@ -215,21 +217,22 @@ lib.mkOption {
215217 manager backend (sddm, gdm ...).
216218 </para>
217219 <para>
218− There are two approach to this module structure:
220+ There are two approaches we could take with this module
221+ structure:
219222 </para>
220223 <itemizedlist>
221224 <listitem>
222225 <para>
223− Managing the display managers independently by adding an
224− enable option to every display manager module backend.
225− (NixOS)
226+ Configuring the display managers independently by adding
227+ an enable option to every display manager module
228+ backend. (NixOS)
226229 </para>
227230 </listitem>
228231 <listitem>
229232 <para>
230− Managing the display managers in the central module by
231− adding an option to select which display manager backend
232− to use.
233+ Configuring the display managers in the central module
234+ by adding an option to select which display manager
235+ backend to use.
233236 </para>
234237 </listitem>
235238 </itemizedlist>
@@ -238,16 +241,16 @@ lib.mkOption {
238241 </para>
239242 <para>
240243 Making backends independent can quickly become hard to
241− manage. For display managers, there can be only one enabled
242− at a time, but the type system can not enforce this
243− restriction as there is no relation between each backend
244+ manage. For display managers, there can only be one enabled
245+ at a time, but the type system cannot enforce this
246+ restriction as there is no relation between each backend’s
244247 <literal>enable</literal> option. As a result, this
245− restriction has to be done explicitely by adding assertions
248+ restriction has to be done explicitly by adding assertions
246249 in each display manager backend module.
247250 </para>
248251 <para>
249− On the other hand, managing the display managers backends in
250− the central module will require to change the central module
252+ On the other hand, managing the display manager backends in
253+ the central module will require changing the central module
251254 option every time a new backend is added or removed.
252255 </para>
253256 <para>
@@ -268,7 +271,7 @@ lib.mkOption {
268271 <para>
269272 As a result, <literal>displayManager.enable</literal> option
270273 values can be added without changing the main service module
271− file and the type system automatically enforce that there
274+ file and the type system automatically enforces that there
272275 can only be a single display manager enabled.
273276 </para>
274277 <anchor xml:id="ex-option-declaration-eot-service" />
nixos/doc/manual/from_md/development/option-types.section.xml+56−5
@@ -30,10 +30,10 @@
3030 </term>
3131 <listitem>
3232 <para>
33− A filesystem path, defined as anything that when coerced to
34− a string starts with a slash. Even if derivations can be
35− considered as path, the more specific
36− <literal>types.package</literal> should be preferred.
33+ A filesystem path is anything that starts with a slash when
34+ coerced to a string. Even if derivations can be considered
35+ as paths, the more specific <literal>types.package</literal>
36+ should be preferred.
3737 </para>
3838 </listitem>
3939 </varlistentry>
@@ -43,7 +43,9 @@
4343 </term>
4444 <listitem>
4545 <para>
46− A derivation or a store path.
46+ A top-level store path. This can be an attribute set
47+ pointing to a store path, like a derivation or a flake
48+ input.
4749 </para>
4850 </listitem>
4951 </varlistentry>
@@ -92,6 +94,39 @@
9294</programlisting>
9395 </listitem>
9496 </varlistentry>
97+ <varlistentry>
98+ <term>
99+ <literal>types.raw</literal>
100+ </term>
101+ <listitem>
102+ <para>
103+ A type which doesn’t do any checking, merging or nested
104+ evaluation. It accepts a single arbitrary value that is not
105+ recursed into, making it useful for values coming from
106+ outside the module system, such as package sets or arbitrary
107+ data. Options of this type are still evaluated according to
108+ priorities and conditionals, so <literal>mkForce</literal>,
109+ <literal>mkIf</literal> and co. still work on the option
110+ value itself, but not for any value nested within it. This
111+ type should only be used when checking, merging and nested
112+ evaluation are not desirable.
113+ </para>
114+ </listitem>
115+ </varlistentry>
116+ <varlistentry>
117+ <term>
118+ <literal>types.optionType</literal>
119+ </term>
120+ <listitem>
121+ <para>
122+ The type of an option’s type. Its merging operation ensures
123+ that nested options have the correct file location
124+ annotated, and that if possible, multiple option definitions
125+ are correctly merged together. The main use case is as the
126+ type of the <literal>_module.freeformType</literal> option.
127+ </para>
128+ </listitem>
129+ </varlistentry>
95130 <varlistentry>
96131 <term>
97132 <literal>types.attrs</literal>
@@ -496,6 +531,22 @@
496531 </para>
497532 </listitem>
498533 </varlistentry>
534+ <varlistentry>
535+ <term>
536+ <literal>types.unique</literal>
537+ <literal>{ message = m }</literal>
538+ <emphasis><literal>t</literal></emphasis>
539+ </term>
540+ <listitem>
541+ <para>
542+ Ensures that type <emphasis><literal>t</literal></emphasis>
543+ cannot be merged. Prints the message
544+ <emphasis><literal>m</literal></emphasis>, after the line
545+ <literal>The option <option path> is defined multiple times.</literal>
546+ and before a list of definition locations.
547+ </para>
548+ </listitem>
549+ </varlistentry>
499550 <varlistentry>
500551 <term>
501552 <literal>types.either</literal>
nixos/doc/manual/from_md/development/running-nixos-tests-interactively.section.xml+2−2
@@ -6,7 +6,7 @@
66 </para>
77 <programlisting>
88$ nix-build . -A nixosTests.login.driverInteractive
9−$ ./result/bin/nixos-test-driver --interactive
9+$ ./result/bin/nixos-test-driver
1010[...]
1111>>>
1212</programlisting>
@@ -30,7 +30,7 @@ $ ./result/bin/nixos-test-driver --interactive
3030 the <literal>--keep-vm-state</literal> flag.
3131 </para>
3232 <programlisting>
33−$ ./result/bin/nixos-test-driver --interactive --keep-vm-state
33+$ ./result/bin/nixos-test-driver --keep-vm-state
3434</programlisting>
3535 <para>
3636 The machine state is stored in the
nixos/doc/manual/from_md/development/running-nixos-tests.section.xml+2−2
@@ -26,9 +26,9 @@ machine: QEMU running (pid 8841)
2626 perform a build that starts a QEMU/KVM virtual machine containing a
2727 NixOS system. The virtual machine mounts the Nix store of the host;
2828 this makes VM creation very fast, as no disk image needs to be
29− created. Afterwards, you can view a pretty-printed log of the test:
29+ created. Afterwards, you can view a log of the test:
3030 </para>
3131 <programlisting>
32−$ firefox result/log.html
32+$ nix-store --read-log result
3333</programlisting>
3434</section>
nixos/doc/manual/from_md/development/settings-options.section.xml+104
@@ -137,6 +137,97 @@
137137 </para>
138138 </listitem>
139139 </varlistentry>
140+ <varlistentry>
141+ <term>
142+ <literal>pkgs.formats.elixirConf { elixir ? pkgs.elixir }</literal>
143+ </term>
144+ <listitem>
145+ <para>
146+ A function taking an attribute set with values
147+ </para>
148+ <variablelist>
149+ <varlistentry>
150+ <term>
151+ <literal>elixir</literal>
152+ </term>
153+ <listitem>
154+ <para>
155+ The Elixir package which will be used to format the
156+ generated output
157+ </para>
158+ </listitem>
159+ </varlistentry>
160+ </variablelist>
161+ <para>
162+ It returns a set with Elixir-Config-specific attributes
163+ <literal>type</literal>, <literal>lib</literal>, and
164+ <literal>generate</literal> as specified
165+ <link linkend="pkgs-formats-result">below</link>.
166+ </para>
167+ <para>
168+ The <literal>lib</literal> attribute contains functions to
169+ be used in settings, for generating special Elixir values:
170+ </para>
171+ <variablelist>
172+ <varlistentry>
173+ <term>
174+ <literal>mkRaw elixirCode</literal>
175+ </term>
176+ <listitem>
177+ <para>
178+ Outputs the given string as raw Elixir code
179+ </para>
180+ </listitem>
181+ </varlistentry>
182+ <varlistentry>
183+ <term>
184+ <literal>mkGetEnv { envVariable, fallback ? null }</literal>
185+ </term>
186+ <listitem>
187+ <para>
188+ Makes the configuration fetch an environment variable
189+ at runtime
190+ </para>
191+ </listitem>
192+ </varlistentry>
193+ <varlistentry>
194+ <term>
195+ <literal>mkAtom atom</literal>
196+ </term>
197+ <listitem>
198+ <para>
199+ Outputs the given string as an Elixir atom, instead of
200+ the default Elixir binary string. Note: lowercase
201+ atoms still needs to be prefixed with
202+ <literal>:</literal>
203+ </para>
204+ </listitem>
205+ </varlistentry>
206+ <varlistentry>
207+ <term>
208+ <literal>mkTuple array</literal>
209+ </term>
210+ <listitem>
211+ <para>
212+ Outputs the given array as an Elixir tuple, instead of
213+ the default Elixir list
214+ </para>
215+ </listitem>
216+ </varlistentry>
217+ <varlistentry>
218+ <term>
219+ <literal>mkMap attrset</literal>
220+ </term>
221+ <listitem>
222+ <para>
223+ Outputs the given attribute set as an Elixir map,
224+ instead of the default Elixir keyword list
225+ </para>
226+ </listitem>
227+ </varlistentry>
228+ </variablelist>
229+ </listitem>
230+ </varlistentry>
140231 </variablelist>
141232 <para xml:id="pkgs-formats-result">
142233 These functions all return an attribute set with these values:
@@ -152,6 +243,19 @@
152243 </para>
153244 </listitem>
154245 </varlistentry>
246+ <varlistentry>
247+ <term>
248+ <literal>lib</literal>
249+ </term>
250+ <listitem>
251+ <para>
252+ Utility functions for convenience, or special interactions
253+ with the format. This attribute is optional. It may contain
254+ inside a <literal>types</literal> attribute containing types
255+ specific to this format.
256+ </para>
257+ </listitem>
258+ </varlistentry>
155259 <varlistentry>
156260 <term>
157261 <literal>generate</literal>
nixos/doc/manual/from_md/development/unit-handling.section.xmlnew file+131
@@ -0,0 +1,131 @@
1+<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-unit-handling">
2+ <title>Unit handling</title>
3+ <para>
4+ To figure out what units need to be
5+ started/stopped/restarted/reloaded, the script first checks the
6+ current state of the system, similar to what
7+ <literal>systemctl list-units</literal> shows. For each of the
8+ units, the script goes through the following checks:
9+ </para>
10+ <itemizedlist>
11+ <listitem>
12+ <para>
13+ Is the unit file still in the new system? If not,
14+ <emphasis role="strong">stop</emphasis> the service unless it
15+ sets <literal>X-StopOnRemoval</literal> in the
16+ <literal>[Unit]</literal> section to <literal>false</literal>.
17+ </para>
18+ </listitem>
19+ <listitem>
20+ <para>
21+ Is it a <literal>.target</literal> unit? If so,
22+ <emphasis role="strong">start</emphasis> it unless it sets
23+ <literal>RefuseManualStart</literal> in the
24+ <literal>[Unit]</literal> section to <literal>true</literal> or
25+ <literal>X-OnlyManualStart</literal> in the
26+ <literal>[Unit]</literal> section to <literal>true</literal>.
27+ Also <emphasis role="strong">stop</emphasis> the unit again
28+ unless it sets <literal>X-StopOnReconfiguration</literal> to
29+ <literal>false</literal>.
30+ </para>
31+ </listitem>
32+ <listitem>
33+ <para>
34+ Are the contents of the unit files different? They are compared
35+ by parsing them and comparing their contents. If they are
36+ different but only <literal>X-Reload-Triggers</literal> in the
37+ <literal>[Unit]</literal> section is changed,
38+ <emphasis role="strong">reload</emphasis> the unit. The NixOS
39+ module system allows setting these triggers with the option
40+ <link linkend="opt-systemd.services">systemd.services.<name>.reloadTriggers</link>.
41+ There are some additional keys in the <literal>[Unit]</literal>
42+ section that are ignored as well. If the unit files differ in
43+ any way, the following actions are performed:
44+ </para>
45+ <itemizedlist>
46+ <listitem>
47+ <para>
48+ <literal>.path</literal> and <literal>.slice</literal> units
49+ are ignored. There is no need to restart them since changes
50+ in their values are applied by systemd when systemd is
51+ reloaded.
52+ </para>
53+ </listitem>
54+ <listitem>
55+ <para>
56+ <literal>.mount</literal> units are
57+ <emphasis role="strong">reload</emphasis>ed. These mostly
58+ come from the <literal>/etc/fstab</literal> parser.
59+ </para>
60+ </listitem>
61+ <listitem>
62+ <para>
63+ <literal>.socket</literal> units are currently ignored. This
64+ is to be fixed at a later point.
65+ </para>
66+ </listitem>
67+ <listitem>
68+ <para>
69+ The rest of the units (mostly <literal>.service</literal>
70+ units) are then <emphasis role="strong">reload</emphasis>ed
71+ if <literal>X-ReloadIfChanged</literal> in the
72+ <literal>[Service]</literal> section is set to
73+ <literal>true</literal> (exposed via
74+ <link linkend="opt-systemd.services">systemd.services.<name>.reloadIfChanged</link>).
75+ A little exception is done for units that were deactivated
76+ in the meantime, for example because they require a unit
77+ that got stopped before. These are
78+ <emphasis role="strong">start</emphasis>ed instead of
79+ reloaded.
80+ </para>
81+ </listitem>
82+ <listitem>
83+ <para>
84+ If the reload flag is not set, some more flags decide if the
85+ unit is skipped. These flags are
86+ <literal>X-RestartIfChanged</literal> in the
87+ <literal>[Service]</literal> section (exposed via
88+ <link linkend="opt-systemd.services">systemd.services.<name>.restartIfChanged</link>),
89+ <literal>RefuseManualStop</literal> in the
90+ <literal>[Unit]</literal> section, and
91+ <literal>X-OnlyManualStart</literal> in the
92+ <literal>[Unit]</literal> section.
93+ </para>
94+ </listitem>
95+ <listitem>
96+ <para>
97+ Further behavior depends on the unit having
98+ <literal>X-StopIfChanged</literal> in the
99+ <literal>[Service]</literal> section set to
100+ <literal>true</literal> (exposed via
101+ <link linkend="opt-systemd.services">systemd.services.<name>.stopIfChanged</link>).
102+ This is set to <literal>true</literal> by default and must
103+ be explicitly turned off if not wanted. If the flag is
104+ enabled, the unit is
105+ <emphasis role="strong">stop</emphasis>ped and then
106+ <emphasis role="strong">start</emphasis>ed. If not, the unit
107+ is <emphasis role="strong">restart</emphasis>ed. The goal of
108+ the flag is to make sure that the new unit never runs in the
109+ old environment which is still in place before the
110+ activation script is run. This behavior is different when
111+ the service is socket-activated, as outlined in the
112+ following steps.
113+ </para>
114+ </listitem>
115+ <listitem>
116+ <para>
117+ The last thing that is taken into account is whether the
118+ unit is a service and socket-activated. If
119+ <literal>X-StopIfChanged</literal> is
120+ <emphasis role="strong">not</emphasis> set, the service is
121+ <emphasis role="strong">restart</emphasis>ed with the
122+ others. If it is set, both the service and the socket are
123+ <emphasis role="strong">stop</emphasis>ped and the socket is
124+ <emphasis role="strong">start</emphasis>ed, leaving socket
125+ activation to start the service when it’s needed.
126+ </para>
127+ </listitem>
128+ </itemizedlist>
129+ </listitem>
130+ </itemizedlist>
131+</section>
nixos/doc/manual/from_md/development/what-happens-during-a-system-switch.chapter.xmlnew file+122
@@ -0,0 +1,122 @@
1+<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="sec-switching-systems">
2+ <title>What happens during a system switch?</title>
3+ <para>
4+ Running <literal>nixos-rebuild switch</literal> is one of the more
5+ common tasks under NixOS. This chapter explains some of the
6+ internals of this command to make it simpler for new module
7+ developers to configure their units correctly and to make it easier
8+ to understand what is happening and why for curious administrators.
9+ </para>
10+ <para>
11+ <literal>nixos-rebuild</literal>, like many deployment solutions,
12+ calls <literal>switch-to-configuration</literal> which resides in a
13+ NixOS system at <literal>$out/bin/switch-to-configuration</literal>.
14+ The script is called with the action that is to be performed like
15+ <literal>switch</literal>, <literal>test</literal>,
16+ <literal>boot</literal>. There is also the
17+ <literal>dry-activate</literal> action which does not really perform
18+ the actions but rather prints what it would do if you called it with
19+ <literal>test</literal>. This feature can be used to check what
20+ service states would be changed if the configuration was switched
21+ to.
22+ </para>
23+ <para>
24+ If the action is <literal>switch</literal> or
25+ <literal>boot</literal>, the bootloader is updated first so the
26+ configuration will be the next one to boot. Unless
27+ <literal>NIXOS_NO_SYNC</literal> is set to <literal>1</literal>,
28+ <literal>/nix/store</literal> is synced to disk.
29+ </para>
30+ <para>
31+ If the action is <literal>switch</literal> or
32+ <literal>test</literal>, the currently running system is inspected
33+ and the actions to switch to the new system are calculated. This
34+ process takes two data sources into account:
35+ <literal>/etc/fstab</literal> and the current systemd status. Mounts
36+ and swaps are read from <literal>/etc/fstab</literal> and the
37+ corresponding actions are generated. If a new mount is added, for
38+ example, the proper <literal>.mount</literal> unit is marked to be
39+ started. The current systemd state is inspected, the difference
40+ between the current system and the desired configuration is
41+ calculated and actions are generated to get to this state. There are
42+ a lot of nuances that can be controlled by the units which are
43+ explained here.
44+ </para>
45+ <para>
46+ After calculating what should be done, the actions are carried out.
47+ The order of actions is always the same:
48+ </para>
49+ <itemizedlist spacing="compact">
50+ <listitem>
51+ <para>
52+ Stop units (<literal>systemctl stop</literal>)
53+ </para>
54+ </listitem>
55+ <listitem>
56+ <para>
57+ Run activation script (<literal>$out/activate</literal>)
58+ </para>
59+ </listitem>
60+ <listitem>
61+ <para>
62+ See if the activation script requested more units to restart
63+ </para>
64+ </listitem>
65+ <listitem>
66+ <para>
67+ Restart systemd if needed
68+ (<literal>systemd daemon-reexec</literal>)
69+ </para>
70+ </listitem>
71+ <listitem>
72+ <para>
73+ Forget about the failed state of units
74+ (<literal>systemctl reset-failed</literal>)
75+ </para>
76+ </listitem>
77+ <listitem>
78+ <para>
79+ Reload systemd (<literal>systemctl daemon-reload</literal>)
80+ </para>
81+ </listitem>
82+ <listitem>
83+ <para>
84+ Reload systemd user instances
85+ (<literal>systemctl --user daemon-reload</literal>)
86+ </para>
87+ </listitem>
88+ <listitem>
89+ <para>
90+ Set up tmpfiles (<literal>systemd-tmpfiles --create</literal>)
91+ </para>
92+ </listitem>
93+ <listitem>
94+ <para>
95+ Reload units (<literal>systemctl reload</literal>)
96+ </para>
97+ </listitem>
98+ <listitem>
99+ <para>
100+ Restart units (<literal>systemctl restart</literal>)
101+ </para>
102+ </listitem>
103+ <listitem>
104+ <para>
105+ Start units (<literal>systemctl start</literal>)
106+ </para>
107+ </listitem>
108+ <listitem>
109+ <para>
110+ Inspect what changed during these actions and print units that
111+ failed and that were newly started
112+ </para>
113+ </listitem>
114+ </itemizedlist>
115+ <para>
116+ Most of these actions are either self-explaining but some of them
117+ have to do with our units or the activation script. For this reason,
118+ these topics are explained in the next sections.
119+ </para>
120+ <xi:include href="unit-handling.section.xml" />
121+ <xi:include href="activation-script.section.xml" />
122+</chapter>
nixos/doc/manual/from_md/development/writing-modules.chapter.xml+49
@@ -122,6 +122,25 @@
122122 services) and <literal>systemd.timers</literal> (the list of
123123 commands to be executed periodically by <literal>systemd</literal>).
124124 </para>
125+ <para>
126+ Care must be taken when writing systemd services using
127+ <literal>Exec*</literal> directives. By default systemd performs
128+ substitution on <literal>%<char></literal> specifiers in these
129+ directives, expands environment variables from
130+ <literal>$FOO</literal> and <literal>${FOO}</literal>, splits
131+ arguments on whitespace, and splits commands on
132+ <literal>;</literal>. All of these must be escaped to avoid
133+ unexpected substitution or splitting when interpolating into an
134+ <literal>Exec*</literal> directive, e.g. when using an
135+ <literal>extraArgs</literal> option to pass additional arguments to
136+ the service. The functions
137+ <literal>utils.escapeSystemdExecArg</literal> and
138+ <literal>utils.escapeSystemdExecArgs</literal> are provided for
139+ this, see <link linkend="exec-escaping-example">Example: Escaping in
140+ Exec directives</link> for an example. When using these functions
141+ system environment substitution should <emphasis>not</emphasis> be
142+ disabled explicitly.
143+ </para>
125144 <anchor xml:id="locate-example" />
126145 <para>
127146 <emphasis role="strong">Example: NixOS Module for the
@@ -183,6 +202,36 @@ in {
183202 };
184203 };
185204}
205+</programlisting>
206+ <anchor xml:id="exec-escaping-example" />
207+ <para>
208+ <emphasis role="strong">Example: Escaping in Exec
209+ directives</emphasis>
210+ </para>
211+ <programlisting language="bash">
212+{ config, lib, pkgs, utils, ... }:
213+
214+with lib;
215+
216+let
217+ cfg = config.services.echo;
218+ echoAll = pkgs.writeScript "echo-all" ''
219+ #! ${pkgs.runtimeShell}
220+ for s in "$@"; do
221+ printf '%s\n' "$s"
222+ done
223+ '';
224+ args = [ "a%Nything" "lang=\${LANG}" ";" "/bin/sh -c date" ];
225+in {
226+ systemd.services.echo =
227+ { description = "Echo to the journal";
228+ wantedBy = [ "multi-user.target" ];
229+ serviceConfig.Type = "oneshot";
230+ serviceConfig.ExecStart = ''
231+ ${echoAll} ${utils.escapeSystemdExecArgs args}
232+ '';
233+ };
234+}
186235</programlisting>
187236 <xi:include href="option-declarations.section.xml" />
188237 <xi:include href="option-types.section.xml" />
nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml+28
@@ -261,6 +261,19 @@ start_all()
261261 </para>
262262 </listitem>
263263 </varlistentry>
264+ <varlistentry>
265+ <term>
266+ <literal>send_console</literal>
267+ </term>
268+ <listitem>
269+ <para>
270+ Send keys to the kernel console. This allows interaction
271+ with the systemd emergency mode, for example. Takes a string
272+ that is sent, e.g.,
273+ <literal>send_console("\n\nsystemctl default\n")</literal>.
274+ </para>
275+ </listitem>
276+ </varlistentry>
264277 <varlistentry>
265278 <term>
266279 <literal>execute</literal>
@@ -502,6 +515,21 @@ machine.systemctl("list-jobs --no-pager", "any-user") # spaw
502515 </para>
503516 </listitem>
504517 </varlistentry>
518+ <varlistentry>
519+ <term>
520+ <literal>console_interact</literal>
521+ </term>
522+ <listitem>
523+ <para>
524+ Allows you to directly interact with QEMU’s stdin. This
525+ should only be used during test development, not in
526+ production tests. Output from QEMU is only read line-wise.
527+ <literal>Ctrl-c</literal> kills QEMU and
528+ <literal>Ctrl-d</literal> closes console and returns to the
529+ test runner.
530+ </para>
531+ </listitem>
532+ </varlistentry>
505533 </variablelist>
506534 <para>
507535 To test user units declared by
nixos/doc/manual/from_md/installation/installing-pxe.section.xml+2−2
@@ -7,11 +7,11 @@
77 <para>
88 These instructions assume that you have an existing PXE or iPXE
99 infrastructure and simply want to add the NixOS installer as another
10− option. To build the necessary files from a recent version of
10+ option. To build the necessary files from your current version of
1111 nixpkgs, you can run:
1212 </para>
1313 <programlisting>
14−nix-build -A netboot.x86_64-linux nixos/release.nix
14+nix-build -A netboot.x86_64-linux '<nixpkgs/nixos/release.nix>'
1515</programlisting>
1616 <para>
1717 This will create a <literal>result</literal> directory containing: *
nixos/doc/manual/from_md/release-notes/rl-2111.section.xml+41−2
@@ -26,8 +26,36 @@
2626 </listitem>
2727 <listitem>
2828 <para>
29− <literal>iptables</literal> now uses
30− <literal>nf_tables</literal> backend.
29+ <literal>iptables</literal> is now using
30+ <literal>nf_tables</literal> under the hood, by using
31+ <literal>iptables-nft</literal>, similar to
32+ <link xlink:href="https://wiki.debian.org/nftables#Current_status">Debian</link>
33+ and
34+ <link xlink:href="https://fedoraproject.org/wiki/Changes/iptables-nft-default">Fedora</link>.
35+ This means, <literal>ip[6]tables</literal>,
36+ <literal>arptables</literal> and <literal>ebtables</literal>
37+ commands will actually show rules from some specific tables in
38+ the <literal>nf_tables</literal> kernel subsystem. In case
39+ you’re migrating from an older release without rebooting,
40+ there might be cases where you end up with iptable rules
41+ configured both in the legacy <literal>iptables</literal>
42+ kernel backend, as well as in the <literal>nf_tables</literal>
43+ backend. This can lead to confusing firewall behaviour. An
44+ <literal>iptables-save</literal> after switching will complain
45+ about <quote>iptables-legacy tables present</quote>. It’s
46+ probably best to reboot after the upgrade, or manually
47+ removing all legacy iptables rules (via the
48+ <literal>iptables-legacy</literal> package).
49+ </para>
50+ </listitem>
51+ <listitem>
52+ <para>
53+ systemd got an <literal>nftables</literal> backend, and
54+ configures (networkd) rules in their own
55+ <literal>io.systemd.*</literal> tables. Check
56+ <literal>nft list ruleset</literal> to see these rules, not
57+ <literal>iptables-save</literal> (which only shows
58+ <literal>iptables</literal>-created rules.
3159 </para>
3260 </listitem>
3361 <listitem>
@@ -1429,6 +1457,17 @@ Superuser created successfully.
14291457 knob.
14301458 </para>
14311459 </listitem>
1460+ <listitem>
1461+ <para>
1462+ <literal>/usr</literal> will always be included in the initial
1463+ ramdisk. See the
1464+ <literal>fileSystems.<name>.neededForBoot</literal>
1465+ option. If any files exist under <literal>/usr</literal>
1466+ (which is not typical for NixOS), they will be included in the
1467+ initial ramdisk, increasing its size to a possibly problematic
1468+ extent.
1469+ </para>
1470+ </listitem>
14321471 </itemizedlist>
14331472 </section>
14341473 <section xml:id="sec-release-21.11-notable-changes">
nixos/doc/manual/from_md/release-notes/rl-2205.section.xml+998−11
@@ -25,6 +25,16 @@
2525 <literal>services.nginx.virtualHosts.*.enableACME</literal>).
2626 </para>
2727 </listitem>
28+ <listitem>
29+ <para>
30+ GNOME has been upgraded to 42. Please take a look at their
31+ <link xlink:href="https://release.gnome.org/42/">Release
32+ Notes</link> for details. Notably, it replaces gedit with
33+ GNOME Text Editor, GNOME Terminal with GNOME Console (formerly
34+ King’s Cross), and GNOME Screenshot with a tool built into the
35+ Shell.
36+ </para>
37+ </listitem>
2838 <listitem>
2939 <para>
3040 PHP 8.1 is now available
@@ -42,6 +52,34 @@
4252 upgrade notes</link>.
4353 </para>
4454 </listitem>
55+ <listitem>
56+ <para>
57+ systemd services can now set
58+ <link linkend="opt-systemd.services">systemd.services.<name>.reloadTriggers</link>
59+ instead of <literal>reloadIfChanged</literal> for a more
60+ granular distinction between reloads and restarts.
61+ </para>
62+ </listitem>
63+ <listitem>
64+ <para>
65+ <link xlink:href="https://kops.sigs.k8s.io"><literal>kops</literal></link>
66+ defaults to 1.22.4, which will enable
67+ <link xlink:href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html">Instance
68+ Metadata Service Version 2</link> and require tokens on new
69+ clusters with Kubernetes 1.22. This will increase security by
70+ default, but may break some types of workloads. See the
71+ <link xlink:href="https://kops.sigs.k8s.io/releases/1.22-notes/">release
72+ notes</link> for details.
73+ </para>
74+ </listitem>
75+ <listitem>
76+ <para>
77+ Module authors can use
78+ <literal>mkRenamedOptionModuleWith</literal> to automate the
79+ deprecation cycle without annoying out-of-tree module authors
80+ and their users.
81+ </para>
82+ </listitem>
4583 </itemizedlist>
4684 </section>
4785 <section xml:id="sec-release-22.05-new-services">
@@ -79,12 +117,18 @@
79117 <link linkend="opt-services.filebeat.enable">services.filebeat</link>.
80118 </para>
81119 </listitem>
120+ <listitem>
121+ <para>
122+ <link xlink:href="https://github.com/linux-apfs/linux-apfs-rw">apfs</link>,
123+ a kernel module for mounting the Apple File System (APFS).
124+ </para>
125+ </listitem>
82126 <listitem>
83127 <para>
84128 <link xlink:href="https://frrouting.org/">FRRouting</link>, a
85129 popular suite of Internet routing protocol daemons (BGP, BFD,
86130 OSPF, IS-IS, VVRP and others). Available as
87− <link linkend="opt-services.ffr.babel.enable">services.frr</link>
131+ <link linkend="opt-services.frr.babel.enable">services.frr</link>
88132 </para>
89133 </listitem>
90134 <listitem>
@@ -94,6 +138,13 @@
94138 <link xlink:href="options.html#opt-services.heisenbridge.enable">services.heisenbridge</link>.
95139 </para>
96140 </listitem>
141+ <listitem>
142+ <para>
143+ <link xlink:href="https://snowflake.torproject.org/">snowflake-proxy</link>,
144+ a system to defeat internet censorship. Available as
145+ <link xlink:href="options.html#opt-services.snowflake-proxy.enable">services.snowflake-proxy</link>.
146+ </para>
147+ </listitem>
97148 <listitem>
98149 <para>
99150 <link xlink:href="https://ergo.chat">ergochat</link>, a modern
@@ -108,6 +159,21 @@
108159 <link xlink:href="options.html#opt-services.powerdns-admin.enable">services.powerdns-admin</link>.
109160 </para>
110161 </listitem>
162+ <listitem>
163+ <para>
164+ <link xlink:href="https://github.com/postgres/pgadmin4">pgadmin4</link>,
165+ an admin interface for the PostgreSQL database. Available at
166+ <link xlink:href="options.html#opt-services.pgadmin.enable">services.pgadmin</link>.
167+ </para>
168+ </listitem>
169+ <listitem>
170+ <para>
171+ <link xlink:href="https://github.com/sezanzeb/input-remapper">input-remapper</link>,
172+ an easy to use tool to change the mapping of your input device
173+ buttons. Available at
174+ <link xlink:href="options.html#opt-services.input-remapper.enable">services.input-remapper</link>.
175+ </para>
176+ </listitem>
111177 <listitem>
112178 <para>
113179 <link xlink:href="https://invoiceplane.com">InvoicePlane</link>,
@@ -123,6 +189,15 @@
123189 <link xlink:href="options.html#opt-services.maddy.enable">services.maddy</link>.
124190 </para>
125191 </listitem>
192+ <listitem>
193+ <para>
194+ <link xlink:href="https://www.scorchworks.com/K40whisperer/k40whisperer.html">K40-Whisperer</link>,
195+ a program to control cheap Chinese laser cutters. Available as
196+ <link xlink:href="options.html#opt-programs.k4-whisperer.enable">programs.k40-whisperer.enable</link>.
197+ Users must add themselves to the <literal>k40</literal> group
198+ to be able to access the device.
199+ </para>
200+ </listitem>
126201 <listitem>
127202 <para>
128203 <link xlink:href="https://github.com/mgumz/mtr-exporter">mtr-exporter</link>,
@@ -130,6 +205,14 @@
130205 <link xlink:href="options.html#opt-services.mtr-exporter.enable">services.mtr-exporter</link>.
131206 </para>
132207 </listitem>
208+ <listitem>
209+ <para>
210+ <link xlink:href="https://github.com/prometheus-pve/prometheus-pve-exporter">prometheus-pve-exporter</link>,
211+ a tool that exposes information from the Proxmox VE API for
212+ use by Prometheus. Available as
213+ <link xlink:href="options.html#opt-services.prometheus.exporters.pve">services.prometheus.exporters.pve</link>.
214+ </para>
215+ </listitem>
133216 <listitem>
134217 <para>
135218 <link xlink:href="https://tetrd.app">tetrd</link>, share your
@@ -138,6 +221,14 @@
138221 <link linkend="opt-services.tetrd.enable">services.tetrd</link>.
139222 </para>
140223 </listitem>
224+ <listitem>
225+ <para>
226+ <link xlink:href="https://github.com/mbrubeck/agate">agate</link>,
227+ a very simple server for the Gemini hypertext protocol.
228+ Available as
229+ <link xlink:href="options.html#opt-services.agate.enable">services.agate</link>.
230+ </para>
231+ </listitem>
141232 <listitem>
142233 <para>
143234 <link xlink:href="https://github.com/JustArchiNET/ArchiSteamFarm">ArchiSteamFarm</link>,
@@ -162,6 +253,13 @@
162253 <link linkend="opt-services.baget.enable">services.baget</link>.
163254 </para>
164255 </listitem>
256+ <listitem>
257+ <para>
258+ <link xlink:href="https://moosefs.com">moosefs</link>, fault
259+ tolerant petabyte distributed file system. Available as
260+ <link linkend="opt-services.moosefs.client.enable">moosefs</link>.
261+ </para>
262+ </listitem>
165263 <listitem>
166264 <para>
167265 <link xlink:href="https://github.com/ThomasLeister/prosody-filer">prosody-filer</link>,
@@ -169,6 +267,38 @@
169267 <link linkend="opt-services.prosody-filer.enable">services.prosody-filer</link>.
170268 </para>
171269 </listitem>
270+ <listitem>
271+ <para>
272+ <link xlink:href="https://github.com/rfjakob/systembus-notify">systembus-notify</link>,
273+ allow system level notifications to reach the users. Available
274+ as
275+ <link xlink:href="opt-services.systembus-notify.enable">services.systembus-notify</link>.
276+ Please keep in mind that this service should only be enabled
277+ on machines with fully trusted users, as any local user is
278+ able to DoS user sessions by spamming notifications.
279+ </para>
280+ </listitem>
281+ <listitem>
282+ <para>
283+ <link xlink:href="https://github.com/audreyt/ethercalc">ethercalc</link>,
284+ an online collaborative spreadsheet. Available as
285+ <link xlink:href="options.html#opt-services.ethercalc.enable">services.ethercalc</link>.
286+ </para>
287+ </listitem>
288+ <listitem>
289+ <para>
290+ <link xlink:href="https://nbd.sourceforge.io/">nbd</link>, a
291+ Network Block Device server. Available as
292+ <link xlink:href="options.html#opt-services.nbd.server.enable">services.nbd</link>.
293+ </para>
294+ </listitem>
295+ <listitem>
296+ <para>
297+ <link xlink:href="https://github.com/Mic92/nix-ld">nix-ld</link>,
298+ Run unpatched dynamic binaries on NixOS. Available as
299+ <link xlink:href="options.html#opt-programs.nix-ld.enable">programs.nix-ld</link>.
300+ </para>
301+ </listitem>
172302 <listitem>
173303 <para>
174304 <link xlink:href="https://timetagger.app">timetagger</link>,
@@ -185,6 +315,28 @@
185315 <link xlink:href="options.html#opt-services.rstudio-server.enable">services.rstudio-server</link>.
186316 </para>
187317 </listitem>
318+ <listitem>
319+ <para>
320+ <link xlink:href="https://github.com/juanfont/headscale">headscale</link>,
321+ an Open Source implementation of the
322+ <link xlink:href="https://tailscale.io">Tailscale</link>
323+ Control Server. Available as
324+ <link xlink:href="options.html#opt-services.headscale.enable">services.headscale</link>
325+ </para>
326+ </listitem>
327+ <listitem>
328+ <para>
329+ <link xlink:href="https://0xerr0r.github.io/blocky/">blocky</link>,
330+ fast and lightweight DNS proxy as ad-blocker for local network
331+ with many features.
332+ </para>
333+ </listitem>
334+ <listitem>
335+ <para>
336+ <link xlink:href="https://clusterlabs.org/pacemaker/">pacemaker</link>
337+ cluster resource manager
338+ </para>
339+ </listitem>
188340 </itemizedlist>
189341 </section>
190342 <section xml:id="sec-release-22.05-incompatibilities">
@@ -211,6 +363,36 @@
211363 <literal>haskellPackages.callPackage</literal>).
212364 </para>
213365 </listitem>
366+ <listitem>
367+ <para>
368+ <literal>pkgs.ghc.withPackages</literal> as well as
369+ <literal>haskellPackages.ghcWithPackages</literal> etc. now
370+ needs be overridden directly, as opposed to overriding the
371+ result of calling it. Additionally, the
372+ <literal>withLLVM</literal> parameter has been renamed to
373+ <literal>useLLVM</literal>. So instead of
374+ <literal>(ghc.withPackages (p: [])).override { withLLVM = true; }</literal>,
375+ one needs to use
376+ <literal>(ghc.withPackages.override { useLLVM = true; }) (p: [])</literal>.
377+ </para>
378+ </listitem>
379+ <listitem>
380+ <para>
381+ The <literal>home-assistant</literal> module now requires
382+ users that don’t want their configuration to be managed
383+ declaratively to set
384+ <literal>services.home-assistant.config = null;</literal>.
385+ This is required due to the way default settings are handled
386+ with the new settings style.
387+ </para>
388+ <para>
389+ Additionally the default list of
390+ <literal>extraComponents</literal> now includes the minimal
391+ dependencies to successfully complete the
392+ <link xlink:href="https://www.home-assistant.io/getting-started/onboarding/">onboarding</link>
393+ procedure.
394+ </para>
395+ </listitem>
214396 <listitem>
215397 <para>
216398 <literal>pkgs.emacsPackages.orgPackages</literal> is removed
@@ -228,6 +410,66 @@
228410 removed due to it being an outdated version.
229411 </para>
230412 </listitem>
413+ <listitem>
414+ <para>
415+ <literal>services.kubernetes.scheduler.{port,address}</literal>
416+ now set <literal>--secure-port</literal> and
417+ <literal>--bind-address</literal> instead of
418+ <literal>--port</literal> and <literal>--address</literal>,
419+ since the former have been deprecated and are no longer
420+ functional in kubernetes>=1.23. Ensure that you are not
421+ relying on the insecure behaviour before upgrading.
422+ </para>
423+ </listitem>
424+ <listitem>
425+ <para>
426+ <literal>services.k3s.enable</literal> no longer implies
427+ <literal>systemd.enableUnifiedCgroupHierarchy = false</literal>,
428+ and will default to the <quote>systemd</quote> cgroup driver
429+ when using <literal>services.k3s.docker = true</literal>. This
430+ change may require a reboot to take effect, and k3s may not be
431+ able to run if the boot cgroup hierarchy does not match its
432+ configuration. The previous behavior may be retained by
433+ explicitly setting
434+ <literal>systemd.enableUnifiedCgroupHierarchy = false</literal>
435+ in your configuration.
436+ </para>
437+ </listitem>
438+ <listitem>
439+ <para>
440+ <literal>fonts.fonts</literal> no longer includes ancient
441+ bitmap fonts when both
442+ <literal>config.services.xserver.enable</literal> and
443+ <literal>config.nixpkgs.config.allowUnfree</literal> are
444+ enabled. If you still want these fonts, use:
445+ </para>
446+ <programlisting language="bash">
447+{
448+ fonts.fonts = [
449+ pkgs.xorg.fontbhlucidatypewriter100dpi
450+ pkgs.xorg.fontbhlucidatypewriter75dpi
451+ pkgs.xorg.fontbh100dpi
452+ ];
453+}
454+</programlisting>
455+ </listitem>
456+ <listitem>
457+ <para>
458+ The DHCP server (<literal>services.dhcpd4</literal>,
459+ <literal>services.dhcpd6</literal>) has been hardened. The
460+ service is now using the systemd’s
461+ <literal>DynamicUser</literal> mechanism to run as an
462+ unprivileged dynamically-allocated user with limited
463+ capabilities. The dhcpd state files are now always stored in
464+ <literal>/var/lib/dhcpd{4,6}</literal> and the
465+ <literal>services.dhcpd4.stateDir</literal> and
466+ <literal>service.dhcpd6.stateDir</literal> options have been
467+ removed. If you were depending on root privileges or
468+ set{uid,gid,cap} binaries in dhcpd shell hooks, you may give
469+ dhcpd more capabilities with e.g.
470+ <literal>systemd.services.dhcpd6.serviceConfig.AmbientCapabilities</literal>.
471+ </para>
472+ </listitem>
231473 <listitem>
232474 <para>
233475 The <literal>mailpile</literal> email webclient
@@ -235,6 +477,138 @@
235477 its reliance on python2.
236478 </para>
237479 </listitem>
480+ <listitem>
481+ <para>
482+ <literal>services.ipfs.extraFlags</literal> is now escaped
483+ with <literal>utils.escapeSystemdExecArgs</literal>. If you
484+ rely on systemd interpolating <literal>extraFlags</literal> in
485+ the service <literal>ExecStart</literal>, this will no longer
486+ work.
487+ </para>
488+ </listitem>
489+ <listitem>
490+ <para>
491+ The <literal>matrix-synapse</literal> service
492+ (<literal>services.matrix-synapse</literal>) has been
493+ converted to use the <literal>settings</literal> option
494+ defined in RFC42. This means that options that are part of
495+ your <literal>homeserver.yaml</literal> configuration, and
496+ that were specified at the top-level of the module
497+ (<literal>services.matrix-synapse</literal>) now need to be
498+ moved into
499+ <literal>services.matrix-synapse.settings</literal>. And while
500+ not all options you may use are defined in there, they are
501+ still supported, because you can set arbitrary values in this
502+ freeform type.
503+ </para>
504+ <para>
505+ The <literal>listeners.*.bind_address</literal> option was
506+ renamed to <literal>bind_addresses</literal> in order to match
507+ the upstream <literal>homeserver.yaml</literal> option name.
508+ It is now also a list of strings instead of a string.
509+ </para>
510+ <para>
511+ An example to make the required migration clearer:
512+ </para>
513+ <para>
514+ Before:
515+ </para>
516+ <programlisting language="bash">
517+{
518+ services.matrix-synapse = {
519+ enable = true;
520+
521+ server_name = "example.com";
522+ public_baseurl = "https://example.com:8448";
523+
524+ enable_registration = false;
525+ registration_shared_secret = "xohshaeyui8jic7uutuDogahkee3aehuaf6ei3Xouz4iicie5thie6nohNahceut";
526+ macaroon_secret_key = "xoo8eder9seivukaiPh1cheikohquuw8Yooreid0The4aifahth3Ou0aiShaiz4l";
527+
528+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
529+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
530+
531+ listeners = [ {
532+ port = 8448;
533+ bind_address = "";
534+ type = "http";
535+ tls = true;
536+ resources = [ {
537+ names = [ "client" ];
538+ compress = true;
539+ } {
540+ names = [ "federation" ];
541+ compress = false;
542+ } ];
543+ } ];
544+
545+ };
546+}
547+</programlisting>
548+ <para>
549+ After:
550+ </para>
551+ <programlisting language="bash">
552+{
553+ services.matrix-synapse = {
554+ enable = true;
555+
556+ # this attribute set holds all values that go into your homeserver.yaml configuration
557+ # See https://github.com/matrix-org/synapse/blob/develop/docs/sample_config.yaml for
558+ # possible values.
559+ settings = {
560+ server_name = "example.com";
561+ public_baseurl = "https://example.com:8448";
562+
563+ enable_registration = false;
564+ # pass `registration_shared_secret` and `macaroon_secret_key` via `extraConfigFiles` instead
565+
566+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
567+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
568+
569+ listeners = [ {
570+ port = 8448;
571+ bind_addresses = [
572+ "::"
573+ "0.0.0.0"
574+ ];
575+ type = "http";
576+ tls = true;
577+ resources = [ {
578+ names = [ "client" ];
579+ compress = true;
580+ } {
581+ names = [ "federation" ];
582+ compress = false;
583+ } ];
584+ } ];
585+ };
586+
587+ extraConfigFiles = [
588+ /run/keys/matrix-synapse/secrets.yaml
589+ ];
590+ };
591+}
592+</programlisting>
593+ <para>
594+ The secrets in your original config should be migrated into a
595+ YAML file that is included via
596+ <literal>extraConfigFiles</literal>.
597+ </para>
598+ <para>
599+ Additionally a few option defaults have been synced up with
600+ upstream default values, for example the
601+ <literal>max_upload_size</literal> grew from
602+ <literal>10M</literal> to <literal>50M</literal>. For the same
603+ reason, the default <literal>media_store_path</literal> was
604+ changed from <literal>${dataDir}/media</literal> to
605+ <literal>${dataDir}/media_store</literal> if
606+ <literal>system.stateVersion</literal> is at least
607+ <literal>22.05</literal>. Files will need to be manually moved
608+ to the new location if the <literal>stateVersion</literal> is
609+ updated.
610+ </para>
611+ </listitem>
238612 <listitem>
239613 <para>
240614 The MoinMoin wiki engine
@@ -242,6 +616,25 @@
242616 because Python 2 is being retired from nixpkgs.
243617 </para>
244618 </listitem>
619+ <listitem>
620+ <para>
621+ Services in the <literal>hadoop</literal> module previously
622+ set <literal>openFirewall</literal> to true by default. This
623+ has now been changed to false. Node definitions for multi-node
624+ clusters would need <literal>openFirewall = true;</literal> to
625+ be added to to hadoop services when upgrading from NixOS
626+ 21.11.
627+ </para>
628+ </listitem>
629+ <listitem>
630+ <para>
631+ <literal>services.hadoop.yarn.nodemanager</literal> now uses
632+ cgroup-based CPU limit enforcement by default. Additionally,
633+ the option <literal>useCGroups</literal> was added to
634+ nodemanagers as an easy way to switch back to the old
635+ behavior.
636+ </para>
637+ </listitem>
245638 <listitem>
246639 <para>
247640 The <literal>wafHook</literal> hook now honors
@@ -271,6 +664,32 @@
271664 <literal>writers.writePyPy2</literal> needs to be used.
272665 </para>
273666 </listitem>
667+ <listitem>
668+ <para>
669+ <literal>buildGoModule</literal> was updated to use
670+ <literal>go_1_17</literal>, third party derivations that
671+ specify >= go 1.17 in the main <literal>go.mod</literal>
672+ will need to regenerate their <literal>vendorSha256</literal>
673+ hash.
674+ </para>
675+ </listitem>
676+ <listitem>
677+ <para>
678+ The <literal>gnome-passwordsafe</literal> package updated to
679+ <link xlink:href="https://gitlab.gnome.org/World/secrets/-/tags/6.0">version
680+ 6.x</link> and renamed to <literal>gnome-secrets</literal>.
681+ </para>
682+ </listitem>
683+ <listitem>
684+ <para>
685+ <literal>services.gnome.experimental-features.realtime-scheduling</literal>
686+ option has been removed, as GNOME Shell now
687+ <link xlink:href="https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2060">uses
688+ rtkit</link>. Use
689+ <literal>security.rtkit.enable = true;</literal> instead. As
690+ before, you will need to have it enabled using GSettings.
691+ </para>
692+ </listitem>
274693 <listitem>
275694 <para>
276695 If you previously used
@@ -279,6 +698,15 @@
279698 <literal>virtualisation.docker.daemon.settings</literal>.
280699 </para>
281700 </listitem>
701+ <listitem>
702+ <para>
703+ Ntopng (<literal>services.ntopng</literal>) is updated to
704+ 5.2.1 and uses a separate Redis instance if
705+ <literal>system.stateVersion</literal> is at least
706+ <literal>22.05</literal>. Existing setups shouldn’t be
707+ affected.
708+ </para>
709+ </listitem>
282710 <listitem>
283711 <para>
284712 The backward compatibility in
@@ -301,6 +729,13 @@
301729 support due to python2 deprecation in nixpkgs
302730 </para>
303731 </listitem>
732+ <listitem>
733+ <para>
734+ <literal>services.miniflux.adminCredentialFiles</literal> is
735+ now required, instead of defaulting to
736+ <literal>admin</literal> and <literal>password</literal>.
737+ </para>
738+ </listitem>
304739 <listitem>
305740 <para>
306741 The <literal>autorestic</literal> package has been upgraded
@@ -356,6 +791,19 @@
356791 loaded.
357792 </para>
358793 </listitem>
794+ <listitem>
795+ <para>
796+ The iputils package, which is installed by default, no longer
797+ provides the legacy tools <literal>tftpd</literal> and
798+ <literal>traceroute6</literal>. More tools
799+ (<literal>ninfod</literal>, <literal>rarpd</literal>, and
800+ <literal>rdisc</literal>) are going to be removed in the next
801+ release. See
802+ <link xlink:href="https://github.com/iputils/iputils/releases/tag/20211215">upstream’s
803+ release notes</link> for more details and available
804+ replacements.
805+ </para>
806+ </listitem>
359807 <listitem>
360808 <para>
361809 <literal>services.thelounge.private</literal> was removed in
@@ -369,6 +817,32 @@
369817 unmaintained
370818 </para>
371819 </listitem>
820+ <listitem>
821+ <para>
822+ <literal>pkgs._7zz</literal> is now correctly licensed as
823+ LGPL3+ and BSD3 with optional unfree unRAR licensed code
824+ </para>
825+ </listitem>
826+ <listitem>
827+ <para>
828+ <literal>tilp2</literal> was removed together with its module
829+ </para>
830+ </listitem>
831+ <listitem>
832+ <para>
833+ The F-PROT antivirus (<literal>fprot</literal> package) and
834+ its service module were removed because it reached
835+ <link xlink:href="https://kb.cyren.com/av-support/index.php?/Knowledgebase/Article/View/434/0/end-of-sale--end-of-life-for-f-prot-and-csam">end-of-life</link>.
836+ </para>
837+ </listitem>
838+ <listitem>
839+ <para>
840+ <literal>bird1</literal> and its modules
841+ <literal>services.bird</literal> as well as
842+ <literal>services.bird6</literal> have been removed. Upgrade
843+ to <literal>services.bird2</literal>.
844+ </para>
845+ </listitem>
372846 <listitem>
373847 <para>
374848 The options
@@ -381,6 +855,16 @@
381855 <literal>true</literal>.
382856 </para>
383857 </listitem>
858+ <listitem>
859+ <para>
860+ The <literal>miller</literal> package has been upgraded from
861+ 5.10.3 to
862+ <link xlink:href="https://github.com/johnkerl/miller/releases/tag/v6.2.0">6.2.0</link>.
863+ See
864+ <link xlink:href="https://miller.readthedocs.io/en/latest/new-in-miller-6">What’s
865+ new in Miller 6</link>.
866+ </para>
867+ </listitem>
384868 <listitem>
385869 <para>
386870 MultiMC has been replaced with the fork PolyMC due to upstream
@@ -397,6 +881,25 @@
397881 <literal>~/.local/share/polymc/polymc.cfg</literal>.
398882 </para>
399883 </listitem>
884+ <listitem>
885+ <para>
886+ <literal>systemd-nspawn@.service</literal> settings have been
887+ reverted to the default systemd behaviour. User namespaces are
888+ now activated by default. If you want to keep running nspawn
889+ containers without user namespaces you need to set
890+ <literal>systemd.nspawn.<name>.execConfig.PrivateUsers = false</literal>
891+ </para>
892+ </listitem>
893+ <listitem>
894+ <para>
895+ The Tor SOCKS proxy is now actually disabled if
896+ <literal>services.tor.client.enable</literal> is set to
897+ <literal>false</literal> (the default). If you are using this
898+ functionality but didn’t change the setting or set it to
899+ <literal>false</literal>, you now need to set it to
900+ <literal>true</literal>.
901+ </para>
902+ </listitem>
400903 <listitem>
401904 <para>
402905 The terraform 0.12 compatibility has been removed and the
@@ -415,6 +918,39 @@
415918 directly.
416919 </para>
417920 </listitem>
921+ <listitem>
922+ <para>
923+ The <literal>dendrite</literal> package has been upgraded from
924+ 0.5.1 to
925+ <link xlink:href="https://github.com/matrix-org/dendrite/releases/tag/v0.6.5">0.6.5</link>.
926+ Instances configured with split sqlite databases, which has
927+ been the default in NixOS, require merging of the federation
928+ sender and signing key databases. See upstream
929+ <link xlink:href="https://github.com/matrix-org/dendrite/releases/tag/v0.6.0">release
930+ notes</link> on version 0.6.0 for details on database changes.
931+ </para>
932+ </listitem>
933+ <listitem>
934+ <para>
935+ The existing <literal>pkgs.opentelemetry-collector</literal>
936+ has been moved to
937+ <literal>pkgs.opentelemetry-collector-contrib</literal> to
938+ match the actual source being the <quote>contrib</quote>
939+ edition. <literal>pkgs.opentelemetry-collector</literal> is
940+ now the actual core release of opentelemetry-collector. If you
941+ use the community contributions you should change the package
942+ you refer to. If you don’t need them update your commands from
943+ <literal>otelcontribcol</literal> to
944+ <literal>otelcorecol</literal> and enjoy a 7x smaller binary.
945+ </para>
946+ </listitem>
947+ <listitem>
948+ <para>
949+ <literal>pkgs.pgadmin</literal> now refers to
950+ <literal>pkgs.pgadmin4</literal>. If you still need pgadmin3,
951+ use <literal>pkgs.pgadmin3</literal>.
952+ </para>
953+ </listitem>
418954 <listitem>
419955 <para>
420956 <literal>pkgs.noto-fonts-cjk</literal> is now deprecated in
@@ -429,14 +965,111 @@
429965 </listitem>
430966 <listitem>
431967 <para>
432− The interface that allows activation scripts to restart units
433− has been reworked. Restarting and reloading is now done by a
434− single file
435− <literal>/run/nixos/activation-restart-list</literal> that
436− honors <literal>restartIfChanged</literal> and
437− <literal>reloadIfChanged</literal> of the units.
968+ <literal>pkgs.epgstation</literal> has been upgraded from v1
969+ to v2, resulting in incompatible changes in the database
970+ scheme and configuration format.
438971 </para>
439972 </listitem>
973+ <listitem>
974+ <para>
975+ Some top-level settings under
976+ <link linkend="opt-services.epgstation.enable">services.epgstation</link>
977+ is now deprecated because it was redudant due to the same
978+ options being present in
979+ <link linkend="opt-services.epgstation.settings">services.epgstation.settings</link>.
980+ </para>
981+ </listitem>
982+ <listitem>
983+ <para>
984+ The option <literal>services.epgstation.basicAuth</literal>
985+ was removed because basic authentication support was dropped
986+ by upstream.
987+ </para>
988+ </listitem>
989+ <listitem>
990+ <para>
991+ The option
992+ <link linkend="opt-services.epgstation.database.passwordFile">services.epgstation.database.passwordFile</link>
993+ no longer has a default value. Make sure to set this option
994+ explicitly before upgrading. Change the database password if
995+ necessary.
996+ </para>
997+ </listitem>
998+ <listitem>
999+ <para>
1000+ The
1001+ <link linkend="opt-services.epgstation.settings">services.epgstation.settings</link>
1002+ option now expects options for <literal>config.yml</literal>
1003+ in EPGStation v2.
1004+ </para>
1005+ </listitem>
1006+ <listitem>
1007+ <para>
1008+ Existing data for the
1009+ <link linkend="opt-services.epgstation.enable">services.epgstation</link>
1010+ module would have to be backed up prior to the upgrade. To
1011+ back up exising data to
1012+ <literal>/tmp/epgstation.bak</literal>, run
1013+ <literal>sudo -u epgstation epgstation run backup /tmp/epgstation.bak</literal>.
1014+ To import that data after to the upgrade, run
1015+ <literal>sudo -u epgstation epgstation run v1migrate /tmp/epgstation.bak</literal>
1016+ </para>
1017+ </listitem>
1018+ <listitem>
1019+ <para>
1020+ <literal>switch-to-configuration</literal> (the script that is
1021+ run when running <literal>nixos-rebuild switch</literal> for
1022+ example) has been reworked
1023+ </para>
1024+ <itemizedlist spacing="compact">
1025+ <listitem>
1026+ <para>
1027+ The interface that allows activation scripts to restart
1028+ units has been streamlined. Restarting and reloading is
1029+ now done by a single file
1030+ <literal>/run/nixos/activation-restart-list</literal> that
1031+ honors <literal>restartIfChanged</literal> and
1032+ <literal>reloadIfChanged</literal> of the units.
1033+ </para>
1034+ <itemizedlist spacing="compact">
1035+ <listitem>
1036+ <para>
1037+ Preferring to reload instead of restarting can still
1038+ be achieved using
1039+ <literal>/run/nixos/activation-reload-list</literal>.
1040+ </para>
1041+ </listitem>
1042+ </itemizedlist>
1043+ </listitem>
1044+ <listitem>
1045+ <para>
1046+ The script now uses a proper ini-file parser to parse
1047+ systemd units. Some values are now only searched in one
1048+ section instead of in the entire unit. This is only
1049+ relevant for units that don’t use the NixOS systemd moule.
1050+ </para>
1051+ <itemizedlist spacing="compact">
1052+ <listitem>
1053+ <para>
1054+ <literal>RefuseManualStop</literal>,
1055+ <literal>X-OnlyManualStart</literal>,
1056+ <literal>X-StopOnRemoval</literal>,
1057+ <literal>X-StopOnReconfiguration</literal> are only
1058+ searched in the <literal>[Unit]</literal> section
1059+ </para>
1060+ </listitem>
1061+ <listitem>
1062+ <para>
1063+ <literal>X-ReloadIfChanged</literal>,
1064+ <literal>X-RestartIfChanged</literal>,
1065+ <literal>X-StopIfChanged</literal> are only searched
1066+ in the <literal>[Service]</literal> section
1067+ </para>
1068+ </listitem>
1069+ </itemizedlist>
1070+ </listitem>
1071+ </itemizedlist>
1072+ </listitem>
4401073 <listitem>
4411074 <para>
4421075 The <literal>services.bookstack.cacheDir</literal> option has
@@ -466,6 +1099,97 @@
4661099 wrapper for <literal>assert</literal> conditions.
4671100 </para>
4681101 </listitem>
1102+ <listitem>
1103+ <para>
1104+ The <literal>vpnc</literal> package has been changed to use
1105+ GnuTLS instead of OpenSSL by default for licensing reasons.
1106+ </para>
1107+ </listitem>
1108+ <listitem>
1109+ <para>
1110+ <literal>pkgs.vimPlugins.onedark-nvim</literal> now refers to
1111+ <link xlink:href="https://github.com/navarasu/onedark.nvim">navarasu/onedark.nvim</link>
1112+ (formerly refers to
1113+ <link xlink:href="https://github.com/olimorris/onedarkpro.nvim">olimorris/onedarkpro.nvim</link>).
1114+ </para>
1115+ </listitem>
1116+ <listitem>
1117+ <para>
1118+ <literal>services.pipewire.enable</literal> will default to
1119+ enabling the WirePlumber session manager instead of
1120+ pipewire-media-session. pipewire-media-session is deprecated
1121+ by upstream and not recommended, but can still be manually
1122+ enabled by setting
1123+ <literal>services.pipewire.media-session.enable</literal> to
1124+ <literal>true</literal> and
1125+ <literal>services.pipewire.wireplumber.enable</literal> to
1126+ <literal>false</literal>.
1127+ </para>
1128+ </listitem>
1129+ <listitem>
1130+ <para>
1131+ <literal>pkgs.makeDesktopItem</literal> has been refactored to
1132+ provide a more idiomatic API. Specifically:
1133+ </para>
1134+ <itemizedlist spacing="compact">
1135+ <listitem>
1136+ <para>
1137+ All valid options as of FDO Desktop Entry specification
1138+ version 1.4 can now be passed in as explicit arguments
1139+ </para>
1140+ </listitem>
1141+ <listitem>
1142+ <para>
1143+ <literal>exec</literal> can now be null, for entries that
1144+ are not of type Application
1145+ </para>
1146+ </listitem>
1147+ <listitem>
1148+ <para>
1149+ <literal>mimeType</literal> argument is renamed to
1150+ <literal>mimeTypes</literal> for consistency
1151+ </para>
1152+ </listitem>
1153+ <listitem>
1154+ <para>
1155+ <literal>mimeTypes</literal>,
1156+ <literal>categories</literal>,
1157+ <literal>implements</literal>,
1158+ <literal>keywords</literal>, <literal>onlyShowIn</literal>
1159+ and <literal>notShowIn</literal> take lists of strings
1160+ instead of one string with semicolon separators
1161+ </para>
1162+ </listitem>
1163+ <listitem>
1164+ <para>
1165+ <literal>extraDesktopEntries</literal> renamed to
1166+ <literal>extraConfig</literal> for consistency
1167+ </para>
1168+ </listitem>
1169+ <listitem>
1170+ <para>
1171+ Actions should now be provided as an attrset
1172+ <literal>actions</literal>, the <literal>Actions</literal>
1173+ line will be autogenerated.
1174+ </para>
1175+ </listitem>
1176+ <listitem>
1177+ <para>
1178+ <literal>extraEntries</literal> is removed.
1179+ </para>
1180+ </listitem>
1181+ <listitem>
1182+ <para>
1183+ Additional validation is added both at eval time and at
1184+ build time.
1185+ </para>
1186+ </listitem>
1187+ </itemizedlist>
1188+ <para>
1189+ See the <literal>vscode</literal> package for a more detailed
1190+ example.
1191+ </para>
1192+ </listitem>
4691193 </itemizedlist>
4701194 </section>
4711195 <section xml:id="sec-release-22.05-notable-changes">
@@ -518,6 +1242,30 @@
5181242 was added.
5191243 </para>
5201244 </listitem>
1245+ <listitem>
1246+ <para>
1247+ The configuration portion of the <literal>nix-daemon</literal>
1248+ module has been reworked and exposed as
1249+ <link xlink:href="options.html#opt-nix-settings">nix.settings</link>:
1250+ </para>
1251+ <itemizedlist spacing="compact">
1252+ <listitem>
1253+ <para>
1254+ Legacy options have been mapped to the corresponding
1255+ options under under
1256+ <link xlink:href="options.html#opt-nix.settings">nix.settings</link>
1257+ and will be deprecated when NixOS 21.11 reaches end of
1258+ life.
1259+ </para>
1260+ </listitem>
1261+ <listitem>
1262+ <para>
1263+ <link xlink:href="options.html#opt-nix.buildMachines.publicHostKey">nix.buildMachines.publicHostKey</link>
1264+ has been added.
1265+ </para>
1266+ </listitem>
1267+ </itemizedlist>
1268+ </listitem>
5211269 <listitem>
5221270 <para>
5231271 The
@@ -528,6 +1276,46 @@
5281276 using the PyPy interpreter were added.
5291277 </para>
5301278 </listitem>
1279+ <listitem>
1280+ <para>
1281+ Some improvements have been made to the
1282+ <literal>hadoop</literal> module:
1283+ </para>
1284+ <itemizedlist spacing="compact">
1285+ <listitem>
1286+ <para>
1287+ A <literal>gatewayRole</literal> option has been added,
1288+ for deploying hadoop cluster configuration files to a node
1289+ that does not have any active services
1290+ </para>
1291+ </listitem>
1292+ <listitem>
1293+ <para>
1294+ Support for older versions of hadoop have been added to
1295+ the module
1296+ </para>
1297+ </listitem>
1298+ <listitem>
1299+ <para>
1300+ Overriding and extending site XML files has been made
1301+ easier
1302+ </para>
1303+ </listitem>
1304+ </itemizedlist>
1305+ </listitem>
1306+ <listitem>
1307+ <para>
1308+ If you are using Wayland you can choose to use the Ozone
1309+ Wayland support in Chrome and several Electron apps by setting
1310+ the environment variable <literal>NIXOS_OZONE_WL=1</literal>
1311+ (for example via
1312+ <literal>environment.sessionVariables.NIXOS_OZONE_WL = "1"</literal>).
1313+ This is not enabled by default because Ozone Wayland is still
1314+ under heavy development and behavior is not always flawless.
1315+ Furthermore, not all Electron apps use the latest Electron
1316+ versions.
1317+ </para>
1318+ </listitem>
5311319 <listitem>
5321320 <para>
5331321 The <literal>influxdb2</literal> package was split into
@@ -538,6 +1326,20 @@
5381326 compatibilty, but will be removed at a later date.
5391327 </para>
5401328 </listitem>
1329+ <listitem>
1330+ <para>
1331+ The <literal>unifi</literal> package was switched from
1332+ <literal>unifi6</literal> to <literal>unifi7</literal>. Direct
1333+ downgrades from Unifi 7 to Unifi 6 are not possible and
1334+ require restoring from a backup made by Unifi 6.
1335+ </para>
1336+ </listitem>
1337+ <listitem>
1338+ <para>
1339+ <literal>programs.zsh.autosuggestions.strategy</literal> now
1340+ takes a list of strings instead of a string.
1341+ </para>
1342+ </listitem>
5411343 <listitem>
5421344 <para>
5431345 The <literal>services.unifi.openPorts</literal> option default
@@ -609,12 +1411,65 @@
6091411 </listitem>
6101412 <listitem>
6111413 <para>
612− A new option
613− <literal>boot.initrd.extraModprobeConfig</literal> has been
614− added which can be used to configure kernel modules that are
615− loaded in the initrd.
1414+ The options <literal>boot.extraModprobeConfig</literal> and
1415+ <literal>boot.blacklistedKernelModules</literal> now also take
1416+ effect in the initrd by copying the file
1417+ <literal>/etc/modprobe.d/nixos.conf</literal> into the initrd.
6161418 </para>
6171419 </listitem>
1420+ <listitem>
1421+ <para>
1422+ <literal>nixos-generate-config</literal> now puts the dhcp
1423+ configuration in <literal>hardware-configuration.nix</literal>
1424+ instead of <literal>configuration.nix</literal>.
1425+ </para>
1426+ </listitem>
1427+ <listitem>
1428+ <para>
1429+ ORY Kratos was updated to version 0.8.3-alpha.1.pre.0, which
1430+ introduces some breaking changes:
1431+ </para>
1432+ <itemizedlist spacing="compact">
1433+ <listitem>
1434+ <para>
1435+ If you are relying on the SQLite images, update your
1436+ Docker Pull commands as follows:
1437+ </para>
1438+ <itemizedlist spacing="compact">
1439+ <listitem>
1440+ <para>
1441+ <literal>docker pull oryd/kratos:{version}</literal>
1442+ </para>
1443+ </listitem>
1444+ </itemizedlist>
1445+ </listitem>
1446+ <listitem>
1447+ <para>
1448+ Additionally, all passwords now have to be at least 8
1449+ characters long.
1450+ </para>
1451+ </listitem>
1452+ <listitem>
1453+ <para>
1454+ For more details, see:
1455+ </para>
1456+ <itemizedlist spacing="compact">
1457+ <listitem>
1458+ <para>
1459+ <link xlink:href="https://github.com/ory/kratos/releases/tag/v0.8.1-alpha.1">Release
1460+ Notes for v0.8.1-alpha-1</link>
1461+ </para>
1462+ </listitem>
1463+ <listitem>
1464+ <para>
1465+ <link xlink:href="https://github.com/ory/kratos/releases/tag/v0.8.2-alpha.1">Release
1466+ Notes for v0.8.2-alpha-1</link>
1467+ </para>
1468+ </listitem>
1469+ </itemizedlist>
1470+ </listitem>
1471+ </itemizedlist>
1472+ </listitem>
6181473 <listitem>
6191474 <para>
6201475 <literal>fetchFromSourcehut</literal> now allows fetching
@@ -624,6 +1479,16 @@
6241479 <literal>true</literal>.
6251480 </para>
6261481 </listitem>
1482+ <listitem>
1483+ <para>
1484+ The <literal>element-desktop</literal> package now has an
1485+ <literal>useKeytar</literal> option (defaults to
1486+ <literal>true</literal>), which allows disabling
1487+ <literal>keytar</literal> and in turn
1488+ <literal>libsecret</literal> usage (which binds to native
1489+ credential managers / keychain libraries).
1490+ </para>
1491+ </listitem>
6271492 <listitem>
6281493 <para>
6291494 The option <literal>services.thelounge.plugins</literal> has
@@ -633,12 +1498,29 @@
6331498 <literal>pkgs.theLoungePlugins.themes</literal>.
6341499 </para>
6351500 </listitem>
1501+ <listitem>
1502+ <para>
1503+ The option
1504+ <literal>services.xserver.videoDriver = [ "nvidia" ];</literal>
1505+ will now also install
1506+ <link xlink:href="https://github.com/elFarto/nvidia-vaapi-driver">nvidia
1507+ VA-API drivers</link> by default.
1508+ </para>
1509+ </listitem>
6361510 <listitem>
6371511 <para>
6381512 The <literal>firmwareLinuxNonfree</literal> package has been
6391513 renamed to <literal>linux-firmware</literal>.
6401514 </para>
6411515 </listitem>
1516+ <listitem>
1517+ <para>
1518+ It is now possible to specify wordlists to include as handy to
1519+ access environment variables using the
1520+ <literal>config.environment.wordlist</literal> configuration
1521+ options.
1522+ </para>
1523+ </listitem>
6421524 <listitem>
6431525 <para>
6441526 The <literal>services.mbpfan</literal> module was converted to
@@ -647,6 +1529,14 @@
6471529 0042</link> configuration.
6481530 </para>
6491531 </listitem>
1532+ <listitem>
1533+ <para>
1534+ The default value for
1535+ <literal>programs.spacefm.settings.graphical_su</literal> got
1536+ unset. It previously pointed to <literal>gksu</literal> which
1537+ has been removed.
1538+ </para>
1539+ </listitem>
6501540 <listitem>
6511541 <para>
6521542 A new module was added for the
@@ -656,6 +1546,12 @@
6561546 <literal>programs.starship.settings</literal>.
6571547 </para>
6581548 </listitem>
1549+ <listitem>
1550+ <para>
1551+ The <link xlink:href="https://dino.im">Dino</link> XMPP client
1552+ was updated to 0.3, adding support for audio and video calls.
1553+ </para>
1554+ </listitem>
6591555 <listitem>
6601556 <para>
6611557 <literal>services.mattermost.plugins</literal> has been added
@@ -663,6 +1559,13 @@
6631559 Plugins are automatically repackaged using autoPatchelf.
6641560 </para>
6651561 </listitem>
1562+ <listitem>
1563+ <para>
1564+ <literal>services.logrotate.enable</literal> now defaults to
1565+ true if any rotate path has been defined, and some paths have
1566+ been added by default.
1567+ </para>
1568+ </listitem>
6661569 <listitem>
6671570 <para>
6681571 The <literal>zrepl</literal> package has been updated from
@@ -705,6 +1608,90 @@
7051608 hooks and profiles declaratively.
7061609 </para>
7071610 </listitem>
1611+ <listitem>
1612+ <para>
1613+ The <literal>pomerium-cli</literal> command has been moved out
1614+ of the <literal>pomerium</literal> package into the
1615+ <literal>pomerium-cli</literal> package, following upstream’s
1616+ repository split. If you are using the
1617+ <literal>pomerium-cli</literal> command, you should now
1618+ install the <literal>pomerium-cli</literal> package.
1619+ </para>
1620+ </listitem>
1621+ <listitem>
1622+ <para>
1623+ The option
1624+ <link linkend="opt-networking.networkmanager.enableFccUnlock">services.networking.networkmanager.enableFccUnlock</link>
1625+ was added to support FCC unlock procedures. Since release
1626+ 1.18.4, the ModemManager daemon no longer automatically
1627+ performs the FCC unlock procedure by default. See
1628+ <link xlink:href="https://modemmanager.org/docs/modemmanager/fcc-unlock/">the
1629+ docs</link> for more details.
1630+ </para>
1631+ </listitem>
1632+ <listitem>
1633+ <para>
1634+ <literal>programs.tmux</literal> has a new option
1635+ <literal>plugins</literal> that accepts a list of packages
1636+ from the <literal>tmuxPlugins</literal> group. The specified
1637+ packages are added to the system and loaded by
1638+ <literal>tmux</literal>.
1639+ </para>
1640+ </listitem>
1641+ <listitem>
1642+ <para>
1643+ The polkit service, available at
1644+ <literal>security.polkit.enable</literal>, is now disabled by
1645+ default. It will automatically be enabled through services and
1646+ desktop environments as needed.
1647+ </para>
1648+ </listitem>
1649+ <listitem>
1650+ <para>
1651+ The <literal>hadoop</literal> package has added support for
1652+ <literal>aarch64-linux</literal> and
1653+ <literal>aarch64-darwin</literal> as of 3.3.1
1654+ (<link xlink:href="https://github.com/NixOS/nixpkgs/pull/158613">#158613</link>).
1655+ </para>
1656+ </listitem>
1657+ <listitem>
1658+ <para>
1659+ The <literal>R</literal> package now builds again on
1660+ <literal>aarch64-darwin</literal>
1661+ (<link xlink:href="https://github.com/NixOS/nixpkgs/pull/158992">#158992</link>).
1662+ </para>
1663+ </listitem>
1664+ <listitem>
1665+ <para>
1666+ The <literal>spark3</literal> package has been updated from
1667+ 3.1.2 to 3.2.1
1668+ (<link xlink:href="https://github.com/NixOS/nixpkgs/pull/160075">#160075</link>):
1669+ </para>
1670+ <itemizedlist spacing="compact">
1671+ <listitem>
1672+ <para>
1673+ Testing has been enabled for
1674+ <literal>aarch64-linux</literal> in addition to
1675+ <literal>x86_64-linux</literal>.
1676+ </para>
1677+ </listitem>
1678+ <listitem>
1679+ <para>
1680+ The <literal>spark3</literal> package is now usable on
1681+ <literal>aarch64-darwin</literal> as a result of
1682+ <link xlink:href="https://github.com/NixOS/nixpkgs/pull/158613">#158613</link>
1683+ and
1684+ <link xlink:href="https://github.com/NixOS/nixpkgs/pull/158992">#158992</link>.
1685+ </para>
1686+ </listitem>
1687+ </itemizedlist>
1688+ </listitem>
1689+ <listitem>
1690+ <para>
1691+ The <literal>programs.nncp</literal> options were added for
1692+ generating host-global NNCP configuration.
1693+ </para>
1694+ </listitem>
7081695 </itemizedlist>
7091696 </section>
7101697</section>
nixos/doc/manual/installation/installing-pxe.section.md+2−2
@@ -5,11 +5,11 @@ setup.
55
66These instructions assume that you have an existing PXE or iPXE
77infrastructure and simply want to add the NixOS installer as another
8−option. To build the necessary files from a recent version of nixpkgs,
8+option. To build the necessary files from your current version of nixpkgs,
99you can run:
1010
1111```ShellSession
12−nix-build -A netboot.x86_64-linux nixos/release.nix
12+nix-build -A netboot.x86_64-linux '<nixpkgs/nixos/release.nix>'
1313```
1414
1515This will create a `result` directory containing: \* `bzImage` -- the
nixos/doc/manual/man-nixos-rebuild.xml+19−1
@@ -91,6 +91,10 @@
9191 <option>--flake</option> <replaceable>flake-uri</replaceable>
9292 </arg>
9393
94+ <arg>
95+ <option>--no-flake</option>
96+ </arg>
97+
9498 <arg>
9599 <option>--override-input</option> <replaceable>input-name</replaceable> <replaceable>flake-uri</replaceable>
96100 </arg>
@@ -453,7 +457,7 @@
453457 Allow ad-hoc remote builders for building the new system. This requires
454458 the user executing <command>nixos-rebuild</command> (usually root) to be
455459 configured as a trusted user in the Nix daemon. This can be achieved by
456− using the <literal>nix.trustedUsers</literal> NixOS option. Examples
460+ using the <literal>nix.settings.trusted-users</literal> NixOS option. Examples
457461 values for that option are described in the <literal>Remote builds
458462 chapter</literal> in the Nix manual, (i.e. <command>--builders
459463 "ssh://bigbrother x86_64-linux"</command>). By specifying an empty string
@@ -594,6 +598,20 @@
594598 </listitem>
595599 </varlistentry>
596600
601+ <varlistentry>
602+ <term>
603+ <option>--no-flake</option>
604+ </term>
605+ <listitem>
606+ <para>
607+ Do not imply <option>--flake</option> if
608+ <filename>/etc/nixos/flake.nix</filename> exists. With this
609+ option, it is possible to build non-flake NixOS configurations
610+ even if the current NixOS systems uses flakes.
611+ </para>
612+ </listitem>
613+ </varlistentry>
614+
597615 </variablelist>
598616
599617 <para>
nixos/doc/manual/release-notes/release-notes.xml+1
@@ -8,6 +8,7 @@
88 This section lists the release notes for each stable version of NixOS and
99 current unstable revision.
1010 </para>
11+ <xi:include href="../from_md/release-notes/rl-2205.section.xml" />
1112 <xi:include href="../from_md/release-notes/rl-2111.section.xml" />
1213 <xi:include href="../from_md/release-notes/rl-2105.section.xml" />
1314 <xi:include href="../from_md/release-notes/rl-2009.section.xml" />
nixos/doc/manual/release-notes/rl-2111.section.md+19−1
@@ -8,7 +8,22 @@ In addition to numerous new and upgraded packages, this release has the followin
88
99- Nix has been updated to version 2.4, reference its [release notes](https://discourse.nixos.org/t/nix-2-4-released/15822) for more information on what has changed. The previous version of Nix, 2.3.16, remains available for the time being in the `nix_2_3` package.
1010
11−- `iptables` now uses `nf_tables` backend.
11+- `iptables` is now using `nf_tables` under the hood, by using `iptables-nft`,
12+ similar to [Debian](https://wiki.debian.org/nftables#Current_status) and
13+ [Fedora](https://fedoraproject.org/wiki/Changes/iptables-nft-default).
14+ This means, `ip[6]tables`, `arptables` and `ebtables` commands will actually
15+ show rules from some specific tables in the `nf_tables` kernel subsystem.
16+ In case you're migrating from an older release without rebooting, there might
17+ be cases where you end up with iptable rules configured both in the legacy
18+ `iptables` kernel backend, as well as in the `nf_tables` backend.
19+ This can lead to confusing firewall behaviour. An `iptables-save` after
20+ switching will complain about "iptables-legacy tables present".
21+ It's probably best to reboot after the upgrade, or manually removing all
22+ legacy iptables rules (via the `iptables-legacy` package).
23+
24+- systemd got an `nftables` backend, and configures (networkd) rules in their
25+ own `io.systemd.*` tables. Check `nft list ruleset` to see these rules, not
26+ `iptables-save` (which only shows `iptables`-created rules.
1227
1328- PHP now defaults to PHP 8.0, updated from 7.4.
1429
@@ -419,6 +434,9 @@ In addition to numerous new and upgraded packages, this release has the followin
419434
420435- The Linux kernel for security reasons now restricts access to BPF syscalls via `BPF_UNPRIV_DEFAULT_OFF=y`. Unprivileged access can be reenabled via the `kernel.unprivileged_bpf_disabled` sysctl knob.
421436
437+- `/usr` will always be included in the initial ramdisk. See the `fileSystems.<name>.neededForBoot` option.
438+ If any files exist under `/usr` (which is not typical for NixOS), they will be included in the initial ramdisk, increasing its size to a possibly problematic extent.
439+
422440## Other Notable Changes {#sec-release-21.11-notable-changes}
423441
424442
nixos/doc/manual/release-notes/rl-2205.section.md+363−7
@@ -11,12 +11,20 @@ In addition to numerous new and upgraded packages, this release has the followin
1111 the option to use DNS-01 validation when using `enableACME` on
1212 web server virtual hosts (e.g. `services.nginx.virtualHosts.*.enableACME`).
1313
14+- GNOME has been upgraded to 42. Please take a look at their [Release Notes](https://release.gnome.org/42/) for details. Notably, it replaces gedit with GNOME Text Editor, GNOME Terminal with GNOME Console (formerly King’s Cross), and GNOME Screenshot with a tool built into the Shell.
15+
1416- PHP 8.1 is now available
1517
1618- Mattermost has been updated to extended support release 6.3, as the previously packaged extended support release 5.37 is [reaching its end of life](https://docs.mattermost.com/upgrade/extended-support-release.html).
1719 Migrations may take a while, see the [changelog](https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-3-extended-support-release)
1820 and [important upgrade notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).
1921
22+- systemd services can now set [systemd.services.\<name\>.reloadTriggers](#opt-systemd.services) instead of `reloadIfChanged` for a more granular distinction between reloads and restarts.
23+
24+- [`kops`](https://kops.sigs.k8s.io) defaults to 1.22.4, which will enable [Instance Metadata Service Version 2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) and require tokens on new clusters with Kubernetes 1.22. This will increase security by default, but may break some types of workloads. See the [release notes](https://kops.sigs.k8s.io/releases/1.22-notes/) for details.
25+
26+- Module authors can use `mkRenamedOptionModuleWith` to automate the deprecation cycle without annoying out-of-tree module authors and their users.
27+
2028## New Services {#sec-release-22.05-new-services}
2129
2230- [aesmd](https://github.com/intel/linux-sgx#install-the-intelr-sgx-psw), the Intel SGX Architectural Enclave Service Manager. Available as [services.aesmd](#opt-services.aesmd.enable).
@@ -27,40 +35,72 @@ In addition to numerous new and upgraded packages, this release has the followin
2735
2836- [filebeat](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html), a lightweight shipper for forwarding and centralizing log data. Available as [services.filebeat](#opt-services.filebeat.enable).
2937
30−- [FRRouting](https://frrouting.org/), a popular suite of Internet routing protocol daemons (BGP, BFD, OSPF, IS-IS, VVRP and others). Available as [services.frr](#opt-services.ffr.babel.enable)
38+- [apfs](https://github.com/linux-apfs/linux-apfs-rw), a kernel module for mounting the Apple File System (APFS).
39+
40+- [FRRouting](https://frrouting.org/), a popular suite of Internet routing protocol daemons (BGP, BFD, OSPF, IS-IS, VVRP and others). Available as [services.frr](#opt-services.frr.babel.enable)
3141
3242- [heisenbridge](https://github.com/hifi/heisenbridge), a bouncer-style Matrix IRC bridge. Available as [services.heisenbridge](options.html#opt-services.heisenbridge.enable).
3343
44+- [snowflake-proxy](https://snowflake.torproject.org/), a system to defeat internet censorship. Available as [services.snowflake-proxy](options.html#opt-services.snowflake-proxy.enable).
45+
3446- [ergochat](https://ergo.chat), a modern IRC with IRCv3 features. Available as [services.ergochat](options.html#opt-services.ergochat.enable).
3547
3648- [PowerDNS-Admin](https://github.com/ngoduykhanh/PowerDNS-Admin), a web interface for the PowerDNS server. Available at [services.powerdns-admin](options.html#opt-services.powerdns-admin.enable).
3749
50+- [pgadmin4](https://github.com/postgres/pgadmin4), an admin interface for the PostgreSQL database. Available at [services.pgadmin](options.html#opt-services.pgadmin.enable).
51+
52+- [input-remapper](https://github.com/sezanzeb/input-remapper), an easy to use tool to change the mapping of your input device buttons. Available at [services.input-remapper](options.html#opt-services.input-remapper.enable).
53+
3854- [InvoicePlane](https://invoiceplane.com), web application for managing and creating invoices. Available at [services.invoiceplane](options.html#opt-services.invoiceplane.enable).
3955
4056- [maddy](https://maddy.email), a composable all-in-one mail server. Available as [services.maddy](options.html#opt-services.maddy.enable).
4157
58+- [K40-Whisperer](https://www.scorchworks.com/K40whisperer/k40whisperer.html), a program to control cheap Chinese laser cutters. Available as [programs.k40-whisperer.enable](options.html#opt-programs.k4-whisperer.enable). Users must add themselves to the `k40` group to be able to access the device.
59+
4260- [mtr-exporter](https://github.com/mgumz/mtr-exporter), a Prometheus exporter for mtr metrics. Available as [services.mtr-exporter](options.html#opt-services.mtr-exporter.enable).
4361
62+- [prometheus-pve-exporter](https://github.com/prometheus-pve/prometheus-pve-exporter), a tool that exposes information from the Proxmox VE API for use by Prometheus. Available as [services.prometheus.exporters.pve](options.html#opt-services.prometheus.exporters.pve).
63+
4464- [tetrd](https://tetrd.app), share your internet connection from your device to your PC and vice versa through a USB cable. Available at [services.tetrd](#opt-services.tetrd.enable).
4565
66+- [agate](https://github.com/mbrubeck/agate), a very simple server for the Gemini hypertext protocol. Available as [services.agate](options.html#opt-services.agate.enable).
67+
4668- [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm), a C# application with primary purpose of idling Steam cards from multiple accounts simultaneously. Available as [services.archisteamfarm](options.html#opt-services.archisteamfarm.enable).
4769
4870- [teleport](https://goteleport.com), allows engineers and security professionals to unify access for SSH servers, Kubernetes clusters, web applications, and databases across all environments. Available at [services.teleport](#opt-services.teleport.enable).
4971
5072- [BaGet](https://loic-sharma.github.io/BaGet/), a lightweight NuGet and symbol server. Available at [services.baget](#opt-services.baget.enable).
5173
74+- [moosefs](https://moosefs.com), fault tolerant petabyte distributed file system.
75+ Available as [moosefs](#opt-services.moosefs.client.enable).
76+
5277- [prosody-filer](https://github.com/ThomasLeister/prosody-filer), a server for handling XMPP HTTP Upload requests. Available at [services.prosody-filer](#opt-services.prosody-filer.enable).
5378
79+- [systembus-notify](https://github.com/rfjakob/systembus-notify), allow system level notifications to reach the users. Available as [services.systembus-notify](opt-services.systembus-notify.enable). Please keep in mind that this service should only be enabled on machines with fully trusted users, as any local user is able to DoS user sessions by spamming notifications.
80+
81+- [ethercalc](https://github.com/audreyt/ethercalc), an online collaborative
82+ spreadsheet. Available as [services.ethercalc](options.html#opt-services.ethercalc.enable).
83+
84+- [nbd](https://nbd.sourceforge.io/), a Network Block Device server. Available as [services.nbd](options.html#opt-services.nbd.server.enable).
85+
86+- [nix-ld](https://github.com/Mic92/nix-ld), Run unpatched dynamic binaries on NixOS. Available as [programs.nix-ld](options.html#opt-programs.nix-ld.enable).
87+
5488- [timetagger](https://timetagger.app), an open source time-tracker with an intuitive user experience and powerful reporting. [services.timetagger](options.html#opt-services.timetagger.enable).
5589
5690- [rstudio-server](https://www.rstudio.com/products/rstudio/#rstudio-server), a browser-based version of the RStudio IDE for the R programming language. Available as [services.rstudio-server](options.html#opt-services.rstudio-server.enable).
5791
92+- [headscale](https://github.com/juanfont/headscale), an Open Source implementation of the [Tailscale](https://tailscale.io) Control Server. Available as [services.headscale](options.html#opt-services.headscale.enable)
93+
94+- [blocky](https://0xerr0r.github.io/blocky/), fast and lightweight DNS proxy as ad-blocker for local network with many features.
95+
96+- [pacemaker](https://clusterlabs.org/pacemaker/) cluster resource manager
97+
5898<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
5999
60100## Backward Incompatibilities {#sec-release-22.05-incompatibilities}
61101
62102- `pkgs.ghc` now refers to `pkgs.targetPackages.haskellPackages.ghc`.
63− This *only* makes a difference if you are cross-compiling and will
103+ This _only_ makes a difference if you are cross-compiling and will
64104 ensure that `pkgs.ghc` always runs on the host platform and compiles
65105 for the target platform (similar to `pkgs.gcc` for example).
66106 `haskellPackages.ghc` still behaves as before, running on the build
@@ -71,6 +111,21 @@ In addition to numerous new and upgraded packages, this release has the followin
71111 instead to ensure cross compilation keeps working (or switch to
72112 `haskellPackages.callPackage`).
73113
114+- `pkgs.ghc.withPackages` as well as `haskellPackages.ghcWithPackages` etc.
115+ now needs be overridden directly, as opposed to overriding the result of
116+ calling it. Additionally, the `withLLVM` parameter has been renamed to
117+ `useLLVM`. So instead of `(ghc.withPackages (p: [])).override { withLLVM = true; }`,
118+ one needs to use `(ghc.withPackages.override { useLLVM = true; }) (p: [])`.
119+
120+- The `home-assistant` module now requires users that don't want their
121+ configuration to be managed declaratively to set
122+ `services.home-assistant.config = null;`. This is required
123+ due to the way default settings are handled with the new settings style.
124+
125+ Additionally the default list of `extraComponents` now includes the minimal
126+ dependencies to successfully complete the [onboarding](https://www.home-assistant.io/getting-started/onboarding/)
127+ procedure.
128+
74129- `pkgs.emacsPackages.orgPackages` is removed because org elpa is deprecated.
75130 The packages in the top level of `pkgs.emacsPackages`, such as org and
76131 org-contrib, refer to the ones in `pkgs.emacsPackages.elpaPackages` and
@@ -78,10 +133,138 @@ In addition to numerous new and upgraded packages, this release has the followin
78133
79134- `services.kubernetes.addons.dashboard` was removed due to it being an outdated version.
80135
136+- `services.kubernetes.scheduler.{port,address}` now set `--secure-port` and `--bind-address` instead of `--port` and `--address`, since the former have been deprecated and are no longer functional in kubernetes>=1.23. Ensure that you are not relying on the insecure behaviour before upgrading.
137+
138+- `services.k3s.enable` no longer implies `systemd.enableUnifiedCgroupHierarchy = false`, and will default to the 'systemd' cgroup driver when using `services.k3s.docker = true`.
139+ This change may require a reboot to take effect, and k3s may not be able to run if the boot cgroup hierarchy does not match its configuration.
140+ The previous behavior may be retained by explicitly setting `systemd.enableUnifiedCgroupHierarchy = false` in your configuration.
141+
142+- `fonts.fonts` no longer includes ancient bitmap fonts when both `config.services.xserver.enable` and `config.nixpkgs.config.allowUnfree` are enabled.
143+ If you still want these fonts, use:
144+
145+ ```nix
146+ {
147+ fonts.fonts = [
148+ pkgs.xorg.fontbhlucidatypewriter100dpi
149+ pkgs.xorg.fontbhlucidatypewriter75dpi
150+ pkgs.xorg.fontbh100dpi
151+ ];
152+ }
153+ ```
154+
155+- The DHCP server (`services.dhcpd4`, `services.dhcpd6`) has been hardened.
156+ The service is now using the systemd's `DynamicUser` mechanism to run as an unprivileged dynamically-allocated user with limited capabilities.
157+ The dhcpd state files are now always stored in `/var/lib/dhcpd{4,6}` and the `services.dhcpd4.stateDir` and `service.dhcpd6.stateDir` options have been removed.
158+ If you were depending on root privileges or set{uid,gid,cap} binaries in dhcpd shell hooks, you may give dhcpd more capabilities with e.g. `systemd.services.dhcpd6.serviceConfig.AmbientCapabilities`.
159+
81160- The `mailpile` email webclient (`services.mailpile`) has been removed due to its reliance on python2.
82161
162+- `services.ipfs.extraFlags` is now escaped with `utils.escapeSystemdExecArgs`. If you rely on systemd interpolating `extraFlags` in the service `ExecStart`, this will no longer work.
163+
164+- The `matrix-synapse` service (`services.matrix-synapse`) has been converted to use the `settings` option defined in RFC42.
165+ This means that options that are part of your `homeserver.yaml` configuration, and that were specified at the top-level of the
166+ module (`services.matrix-synapse`) now need to be moved into `services.matrix-synapse.settings`. And while not all options you
167+ may use are defined in there, they are still supported, because you can set arbitrary values in this freeform type.
168+
169+ The `listeners.*.bind_address` option was renamed to `bind_addresses` in order to match the upstream `homeserver.yaml` option
170+ name. It is now also a list of strings instead of a string.
171+
172+ An example to make the required migration clearer:
173+
174+ Before:
175+ ```nix
176+ {
177+ services.matrix-synapse = {
178+ enable = true;
179+
180+ server_name = "example.com";
181+ public_baseurl = "https://example.com:8448";
182+
183+ enable_registration = false;
184+ registration_shared_secret = "xohshaeyui8jic7uutuDogahkee3aehuaf6ei3Xouz4iicie5thie6nohNahceut";
185+ macaroon_secret_key = "xoo8eder9seivukaiPh1cheikohquuw8Yooreid0The4aifahth3Ou0aiShaiz4l";
186+
187+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
188+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
189+
190+ listeners = [ {
191+ port = 8448;
192+ bind_address = "";
193+ type = "http";
194+ tls = true;
195+ resources = [ {
196+ names = [ "client" ];
197+ compress = true;
198+ } {
199+ names = [ "federation" ];
200+ compress = false;
201+ } ];
202+ } ];
203+
204+ };
205+ }
206+ ```
207+
208+ After:
209+ ```nix
210+ {
211+ services.matrix-synapse = {
212+ enable = true;
213+
214+ # this attribute set holds all values that go into your homeserver.yaml configuration
215+ # See https://github.com/matrix-org/synapse/blob/develop/docs/sample_config.yaml for
216+ # possible values.
217+ settings = {
218+ server_name = "example.com";
219+ public_baseurl = "https://example.com:8448";
220+
221+ enable_registration = false;
222+ # pass `registration_shared_secret` and `macaroon_secret_key` via `extraConfigFiles` instead
223+
224+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
225+ tls_certificate_path = "/var/lib/acme/example.com/fullchain.pem";
226+
227+ listeners = [ {
228+ port = 8448;
229+ bind_addresses = [
230+ "::"
231+ "0.0.0.0"
232+ ];
233+ type = "http";
234+ tls = true;
235+ resources = [ {
236+ names = [ "client" ];
237+ compress = true;
238+ } {
239+ names = [ "federation" ];
240+ compress = false;
241+ } ];
242+ } ];
243+ };
244+
245+ extraConfigFiles = [
246+ /run/keys/matrix-synapse/secrets.yaml
247+ ];
248+ };
249+ }
250+ ```
251+
252+ The secrets in your original config should be migrated into a YAML file that is included via `extraConfigFiles`.
253+
254+ Additionally a few option defaults have been synced up with upstream default values, for example the `max_upload_size` grew from `10M` to `50M`. For the same reason, the default
255+ `media_store_path` was changed from `${dataDir}/media` to `${dataDir}/media_store` if `system.stateVersion` is at least `22.05`. Files will need to be manually moved to the new
256+ location if the `stateVersion` is updated.
257+
83258- The MoinMoin wiki engine (`services.moinmoin`) has been removed, because Python 2 is being retired from nixpkgs.
84259
260+- Services in the `hadoop` module previously set `openFirewall` to true by default.
261+ This has now been changed to false. Node definitions for multi-node clusters would need
262+ `openFirewall = true;` to be added to to hadoop services when upgrading from NixOS 21.11.
263+
264+- `services.hadoop.yarn.nodemanager` now uses cgroup-based CPU limit enforcement by default.
265+ Additionally, the option `useCGroups` was added to nodemanagers as an easy way to switch
266+ back to the old behavior.
267+
85268- The `wafHook` hook now honors `NIX_BUILD_CORES` when `enableParallelBuilding` is not set explicitly. Packages can restore the old behaviour by setting `enableParallelBuilding=false`.
86269
87270- `pkgs.claws-mail-gtk2`, representing Claws Mail's older release version three, was removed in order to get rid of Python 2.
@@ -90,8 +273,16 @@ In addition to numerous new and upgraded packages, this release has the followin
90273- The `writers.writePython2` and corresponding `writers.writePython2Bin` convenience functions to create executable Python 2 scripts in the store were removed in preparation of removal of the Python 2 interpreter.
91274 Scripts have to be converted to Python 3 for use with `writers.writePython3` or `writers.writePyPy2` needs to be used.
92275
276+- `buildGoModule` was updated to use `go_1_17`, third party derivations that specify >= go 1.17 in the main `go.mod` will need to regenerate their `vendorSha256` hash.
277+
278+- The `gnome-passwordsafe` package updated to [version 6.x](https://gitlab.gnome.org/World/secrets/-/tags/6.0) and renamed to `gnome-secrets`.
279+
280+- `services.gnome.experimental-features.realtime-scheduling` option has been removed, as GNOME Shell now [uses rtkit](https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2060). Use `security.rtkit.enable = true;` instead. As before, you will need to have it enabled using GSettings.
281+
93282- If you previously used `/etc/docker/daemon.json`, you need to incorporate the changes into the new option `virtualisation.docker.daemon.settings`.
94283
284+- Ntopng (`services.ntopng`) is updated to 5.2.1 and uses a separate Redis instance if `system.stateVersion` is at least `22.05`. Existing setups shouldn't be affected.
285+
95286- The backward compatibility in `services.wordpress` to configure sites with
96287 the old interface has been removed. Please use `services.wordpress.sites`
97288 instead.
@@ -101,6 +292,8 @@ In addition to numerous new and upgraded packages, this release has the followin
101292
102293- opensmtpd-extras is no longer build with python2 scripting support due to python2 deprecation in nixpkgs
103294
295+- `services.miniflux.adminCredentialFiles` is now required, instead of defaulting to `admin` and `password`.
296+
104297- The `autorestic` package has been upgraded from 1.3.0 to 1.5.0 which introduces breaking changes in config file, check [their migration guide](https://autorestic.vercel.app/migration/1.4_1.5) for more details.
105298
106299- For `pkgs.python3.pkgs.ipython`, its direct dependency `pkgs.python3.pkgs.matplotlib-inline`
@@ -116,26 +309,94 @@ In addition to numerous new and upgraded packages, this release has the followin
116309
117310- `idris2` now requires `--package` when using packages `contrib` and `network`, while previously these idris2 packages were automatically loaded.
118311
312+- The iputils package, which is installed by default, no longer provides the
313+ legacy tools `tftpd` and `traceroute6`. More tools (`ninfod`, `rarpd`, and
314+ `rdisc`) are going to be removed in the next release. See
315+ [upstream's release notes](https://github.com/iputils/iputils/releases/tag/20211215)
316+ for more details and available replacements.
317+
119318- `services.thelounge.private` was removed in favor of `services.thelounge.public`, to follow with upstream changes.
120319
121320- `pkgs.docbookrx` was removed since it's unmaintained
122321
322+- `pkgs._7zz` is now correctly licensed as LGPL3+ and BSD3 with optional unfree unRAR licensed code
323+
324+- `tilp2` was removed together with its module
325+
326+- The F-PROT antivirus (`fprot` package) and its service module were removed because it
327+ reached [end-of-life](https://kb.cyren.com/av-support/index.php?/Knowledgebase/Article/View/434/0/end-of-sale--end-of-life-for-f-prot-and-csam).
328+
329+- `bird1` and its modules `services.bird` as well as `services.bird6` have been removed. Upgrade to `services.bird2`.
330+
123331- The options `networking.interfaces.<name>.ipv4.routes` and `networking.interfaces.<name>.ipv6.routes` are no longer ignored when using networkd instead of the default scripted network backend by setting `networking.useNetworkd` to `true`.
124332
333+- The `miller` package has been upgraded from 5.10.3 to [6.2.0](https://github.com/johnkerl/miller/releases/tag/v6.2.0). See [What's new in Miller 6](https://miller.readthedocs.io/en/latest/new-in-miller-6).
334+
125335- MultiMC has been replaced with the fork PolyMC due to upstream developers being hostile to 3rd party package maintainers. PolyMC removes all MultiMC branding and is aimed at providing proper 3rd party packages like the one contained in Nixpkgs. This change affects the data folder where game instances and other save and configuration files are stored. Users with existing installations should rename `~/.local/share/multimc` to `~/.local/share/polymc`. The main config file's path has also moved from `~/.local/share/multimc/multimc.cfg` to `~/.local/share/polymc/polymc.cfg`.
126336
337+- `systemd-nspawn@.service` settings have been reverted to the default systemd behaviour. User namespaces are now activated by default. If you want to keep running nspawn containers without user namespaces you need to set `systemd.nspawn.<name>.execConfig.PrivateUsers = false`
338+
339+- The Tor SOCKS proxy is now actually disabled if `services.tor.client.enable` is set to `false` (the default). If you are using this functionality but didn't change the setting or set it to `false`, you now need to set it to `true`.
340+
127341- The terraform 0.12 compatibility has been removed and the `terraform.withPlugins` and `terraform-providers.mkProvider` implementations simplified. Providers now need to be stored under
128342`$out/libexec/terraform-providers/<registry>/<owner>/<name>/<version>/<os>_<arch>/terraform-provider-<name>_v<version>` (which mkProvider does).
129343
130344 This breaks back-compat so it's not possible to mix-and-match with previous versions of nixpkgs. In exchange, it now becomes possible to use the providers from [nixpkgs-terraform-providers-bin](https://github.com/numtide/nixpkgs-terraform-providers-bin) directly.
131345
346+- The `dendrite` package has been upgraded from 0.5.1 to
347+ [0.6.5](https://github.com/matrix-org/dendrite/releases/tag/v0.6.5). Instances
348+ configured with split sqlite databases, which has been the default
349+ in NixOS, require merging of the federation sender and signing key
350+ databases. See upstream [release
351+ notes](https://github.com/matrix-org/dendrite/releases/tag/v0.6.0)
352+ on version 0.6.0 for details on database changes.
353+
354+- The existing `pkgs.opentelemetry-collector` has been moved to
355+ `pkgs.opentelemetry-collector-contrib` to match the actual source being the
356+ "contrib" edition. `pkgs.opentelemetry-collector` is now the actual core
357+ release of opentelemetry-collector. If you use the community contributions
358+ you should change the package you refer to. If you don't need them update your
359+ commands from `otelcontribcol` to `otelcorecol` and enjoy a 7x smaller binary.
360+
361+- `pkgs.pgadmin` now refers to `pkgs.pgadmin4`.
362+ If you still need pgadmin3, use `pkgs.pgadmin3`.
363+
132364- `pkgs.noto-fonts-cjk` is now deprecated in favor of `pkgs.noto-fonts-cjk-sans`
133365 and `pkgs.noto-fonts-cjk-serif` because they each have different release
134366 schedules. To maintain compatibility with prior releases of Nixpkgs,
135367 `pkgs.noto-fonts-cjk` is currently an alias of `pkgs.noto-fonts-cjk-sans` and
136368 doesn't include serif fonts.
137369
138−- The interface that allows activation scripts to restart units has been reworked. Restarting and reloading is now done by a single file `/run/nixos/activation-restart-list` that honors `restartIfChanged` and `reloadIfChanged` of the units.
370+- `pkgs.epgstation` has been upgraded from v1 to v2, resulting in incompatible
371+ changes in the database scheme and configuration format.
372+
373+- Some top-level settings under [services.epgstation](#opt-services.epgstation.enable)
374+ is now deprecated because it was redudant due to the same options being
375+ present in [services.epgstation.settings](#opt-services.epgstation.settings).
376+
377+- The option `services.epgstation.basicAuth` was removed because basic
378+ authentication support was dropped by upstream.
379+
380+- The option [services.epgstation.database.passwordFile](#opt-services.epgstation.database.passwordFile)
381+ no longer has a default value. Make sure to set this option explicitly before
382+ upgrading. Change the database password if necessary.
383+
384+- The [services.epgstation.settings](#opt-services.epgstation.settings)
385+ option now expects options for `config.yml` in EPGStation v2.
386+
387+- Existing data for the [services.epgstation](#opt-services.epgstation.enable)
388+ module would have to be backed up prior to the upgrade. To back up exising
389+ data to `/tmp/epgstation.bak`, run
390+ `sudo -u epgstation epgstation run backup /tmp/epgstation.bak`.
391+ To import that data after to the upgrade, run
392+ `sudo -u epgstation epgstation run v1migrate /tmp/epgstation.bak`
393+
394+- `switch-to-configuration` (the script that is run when running `nixos-rebuild switch` for example) has been reworked
395+ * The interface that allows activation scripts to restart units has been streamlined. Restarting and reloading is now done by a single file `/run/nixos/activation-restart-list` that honors `restartIfChanged` and `reloadIfChanged` of the units.
396+ * Preferring to reload instead of restarting can still be achieved using `/run/nixos/activation-reload-list`.
397+ * The script now uses a proper ini-file parser to parse systemd units. Some values are now only searched in one section instead of in the entire unit. This is only relevant for units that don't use the NixOS systemd moule.
398+ * `RefuseManualStop`, `X-OnlyManualStart`, `X-StopOnRemoval`, `X-StopOnReconfiguration` are only searched in the `[Unit]` section
399+ * `X-ReloadIfChanged`, `X-RestartIfChanged`, `X-StopIfChanged` are only searched in the `[Service]` section
139400
140401- The `services.bookstack.cacheDir` option has been removed, since the
141402 cache directory is now handled by systemd.
@@ -147,6 +408,27 @@ In addition to numerous new and upgraded packages, this release has the followin
147408
148409- `lib.assertMsg` and `lib.assertOneOf` no longer return `false` if the passed condition is `false`, `throw`ing the given error message instead (which makes the resulting error message less cluttered). This will not impact the behaviour of code using these functions as intended, namely as top-level wrapper for `assert` conditions.
149410
411+- The `vpnc` package has been changed to use GnuTLS instead of OpenSSL by default for licensing reasons.
412+
413+- `pkgs.vimPlugins.onedark-nvim` now refers to [navarasu/onedark.nvim](https://github.com/navarasu/onedark.nvim)
414+ (formerly refers to [olimorris/onedarkpro.nvim](https://github.com/olimorris/onedarkpro.nvim)).
415+
416+- `services.pipewire.enable` will default to enabling the WirePlumber session manager instead of pipewire-media-session.
417+ pipewire-media-session is deprecated by upstream and not recommended, but can still be manually enabled by setting
418+ `services.pipewire.media-session.enable` to `true` and `services.pipewire.wireplumber.enable` to `false`.
419+
420+- `pkgs.makeDesktopItem` has been refactored to provide a more idiomatic API. Specifically:
421+ - All valid options as of FDO Desktop Entry specification version 1.4 can now be passed in as explicit arguments
422+ - `exec` can now be null, for entries that are not of type Application
423+ - `mimeType` argument is renamed to `mimeTypes` for consistency
424+ - `mimeTypes`, `categories`, `implements`, `keywords`, `onlyShowIn` and `notShowIn` take lists of strings instead of one string with semicolon separators
425+ - `extraDesktopEntries` renamed to `extraConfig` for consistency
426+ - Actions should now be provided as an attrset `actions`, the `Actions` line will be autogenerated.
427+ - `extraEntries` is removed.
428+ - Additional validation is added both at eval time and at build time.
429+
430+ See the `vscode` package for a more detailed example.
431+
150432<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
151433
152434## Other Notable Changes {#sec-release-22.05-notable-changes}
@@ -171,19 +453,41 @@ In addition to numerous new and upgraded packages, this release has the followin
171453 to allow users to make changes to the `nixos-rebuild build-vm` configuration
172454 that do not apply to their normal system.
173455
174− The `config.system.build.vm` attribute now always exists and defaults to the
456+ The `config.system.build.vm` attribute now always exists and defaults to the
175457 value from `vmVariant`. Configurations that import the `virtualisation/qemu-vm.nix`
176458 module themselves will override this value, such that `vmVariant` is not used.
177459
178460 Similarly [virtualisation.vmVariantWithBootloader](#opt-virtualisation.vmVariantWithBootLoader) was added.
179461
462+- The configuration portion of the `nix-daemon` module has been reworked and exposed as [nix.settings](options.html#opt-nix-settings):
463+ * Legacy options have been mapped to the corresponding options under under [nix.settings](options.html#opt-nix.settings) and will be deprecated when NixOS 21.11 reaches end of life.
464+ * [nix.buildMachines.publicHostKey](options.html#opt-nix.buildMachines.publicHostKey) has been added.
465+
180466- The `writers.writePyPy2`/`writers.writePyPy3` and corresponding `writers.writePyPy2Bin`/`writers.writePyPy3Bin` convenience functions to create executable Python 2/3 scripts using the PyPy interpreter were added.
181467
468+- Some improvements have been made to the `hadoop` module:
469+ - A `gatewayRole` option has been added, for deploying hadoop cluster configuration files to a node that does not have any active services
470+ - Support for older versions of hadoop have been added to the module
471+ - Overriding and extending site XML files has been made easier
472+
473+- If you are using Wayland you can choose to use the Ozone Wayland support
474+ in Chrome and several Electron apps by setting the environment variable
475+ `NIXOS_OZONE_WL=1` (for example via
476+ `environment.sessionVariables.NIXOS_OZONE_WL = "1"`).
477+ This is not enabled by default because Ozone Wayland is
478+ still under heavy development and behavior is not always flawless.
479+ Furthermore, not all Electron apps use the latest Electron versions.
480+
182481- The `influxdb2` package was split into `influxdb2-server` and
183482 `influxdb2-cli`, matching the split that took place upstream. A
184483 combined `influxdb2` package is still provided in this release for
185484 backwards compatibilty, but will be removed at a later date.
186485
486+- The `unifi` package was switched from `unifi6` to `unifi7`.
487+ Direct downgrades from Unifi 7 to Unifi 6 are not possible and require restoring from a backup made by Unifi 6.
488+
489+- `programs.zsh.autosuggestions.strategy` now takes a list of strings instead of a string.
490+
187491- The `services.unifi.openPorts` option default value of `true` is now deprecated and will be changed to `false` in 22.11.
188492 Configurations using this default will print a warning when rebuilt.
189493
@@ -211,27 +515,53 @@ In addition to numerous new and upgraded packages, this release has the followin
211515
212516- The option `services.duplicati.dataDir` has been added to allow changing the location of duplicati's files.
213517
214−- A new option `boot.initrd.extraModprobeConfig` has been added which can be used to configure kernel modules that are loaded in the initrd.
518+- The options `boot.extraModprobeConfig` and `boot.blacklistedKernelModules` now also take effect in the initrd by copying the file `/etc/modprobe.d/nixos.conf` into the initrd.
519+
520+- `nixos-generate-config` now puts the dhcp configuration in `hardware-configuration.nix` instead of `configuration.nix`.
521+
522+- ORY Kratos was updated to version 0.8.3-alpha.1.pre.0, which introduces some breaking changes:
523+ - If you are relying on the SQLite images, update your Docker Pull commands as follows:
524+ - `docker pull oryd/kratos:{version}`
525+ - Additionally, all passwords now have to be at least 8 characters long.
526+ - For more details, see:
527+ - [Release Notes for v0.8.1-alpha-1](https://github.com/ory/kratos/releases/tag/v0.8.1-alpha.1)
528+ - [Release Notes for v0.8.2-alpha-1](https://github.com/ory/kratos/releases/tag/v0.8.2-alpha.1)
215529
216530- `fetchFromSourcehut` now allows fetching repositories recursively
217531 using `fetchgit` or `fetchhg` if the argument `fetchSubmodules`
218532 is set to `true`.
219533
534+- The `element-desktop` package now has an `useKeytar` option (defaults to `true`),
535+ which allows disabling `keytar` and in turn `libsecret` usage
536+ (which binds to native credential managers / keychain libraries).
537+
220538- The option `services.thelounge.plugins` has been added to allow installing plugins for The Lounge. Plugins can be found in `pkgs.theLoungePlugins.plugins` and `pkgs.theLoungePlugins.themes`.
221539
540+- The option `services.xserver.videoDriver = [ "nvidia" ];` will now also install [nvidia VA-API drivers](https://github.com/elFarto/nvidia-vaapi-driver) by default.
541+
222542- The `firmwareLinuxNonfree` package has been renamed to `linux-firmware`.
223543
544+- It is now possible to specify wordlists to include as handy to access environment variables using the `config.environment.wordlist` configuration options.
545+
224546- The `services.mbpfan` module was converted to a [RFC 0042](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md) configuration.
225547
548+- The default value for `programs.spacefm.settings.graphical_su` got unset. It previously pointed to `gksu` which has been removed.
549+
226550- A new module was added for the [Starship](https://starship.rs/) shell prompt,
227551 providing the options `programs.starship.enable` and `programs.starship.settings`.
228552
553+- The [Dino](https://dino.im) XMPP client was updated to 0.3, adding support for audio and video calls.
554+
229555- `services.mattermost.plugins` has been added to allow the declarative installation of Mattermost plugins.
230556 Plugins are automatically repackaged using autoPatchelf.
231557
558+- `services.logrotate.enable` now defaults to true if any rotate path has
559+ been defined, and some paths have been added by default.
560+
232561- The `zrepl` package has been updated from 0.4.0 to 0.5:
233− * The RPC protocol version was bumped; all zrepl daemons in a setup must be updated and restarted before replication can resume.
234− * A bug involving encrypt-on-receive has been fixed. Read the [zrepl documentation](https://zrepl.github.io/configuration/sendrecvoptions.html#job-recv-options-placeholder) and check the output of `zfs get -r encryption,zrepl:placeholder PATH_TO_ROOTFS` on the receiver.
562+
563+ - The RPC protocol version was bumped; all zrepl daemons in a setup must be updated and restarted before replication can resume.
564+ - A bug involving encrypt-on-receive has been fixed. Read the [zrepl documentation](https://zrepl.github.io/configuration/sendrecvoptions.html#job-recv-options-placeholder) and check the output of `zfs get -r encryption,zrepl:placeholder PATH_TO_ROOTFS` on the receiver.
235565
236566- Renamed option `services.openssh.challengeResponseAuthentication` to `services.openssh.kbdInteractiveAuthentication`.
237567 Reason is that the old name has been deprecated upstream.
@@ -239,4 +569,30 @@ In addition to numerous new and upgraded packages, this release has the followin
239569
240570- `services.autorandr` now allows for adding hooks and profiles declaratively.
241571
572+- The `pomerium-cli` command has been moved out of the `pomerium` package into
573+ the `pomerium-cli` package, following upstream's repository split. If you are
574+ using the `pomerium-cli` command, you should now install the `pomerium-cli`
575+ package.
576+
577+- The option
578+ [services.networking.networkmanager.enableFccUnlock](#opt-networking.networkmanager.enableFccUnlock)
579+ was added to support FCC unlock procedures. Since release 1.18.4, the ModemManager
580+ daemon no longer automatically performs the FCC unlock procedure by default. See
581+ [the docs](https://modemmanager.org/docs/modemmanager/fcc-unlock/) for more details.
582+
583+- `programs.tmux` has a new option `plugins` that accepts a list of packages from the `tmuxPlugins` group. The specified packages are added to the system and loaded by `tmux`.
584+
585+- The polkit service, available at `security.polkit.enable`, is now disabled by default. It will automatically be enabled through services and desktop environments as needed.
586+
587+- The `hadoop` package has added support for `aarch64-linux` and `aarch64-darwin` as of 3.3.1 ([#158613](https://github.com/NixOS/nixpkgs/pull/158613)).
588+
589+- The `R` package now builds again on `aarch64-darwin` ([#158992](https://github.com/NixOS/nixpkgs/pull/158992)).
590+
591+- The `spark3` package has been updated from 3.1.2 to 3.2.1 ([#160075](https://github.com/NixOS/nixpkgs/pull/160075)):
592+
593+ - Testing has been enabled for `aarch64-linux` in addition to `x86_64-linux`.
594+ - The `spark3` package is now usable on `aarch64-darwin` as a result of [#158613](https://github.com/NixOS/nixpkgs/pull/158613) and [#158992](https://github.com/NixOS/nixpkgs/pull/158992).
595+
596+- The `programs.nncp` options were added for generating host-global NNCP configuration.
597+
242598<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
nixos/lib/eval-config.nix+13−1
@@ -21,6 +21,7 @@ evalConfigArgs@
2121, # !!! See comment about args in lib/modules.nix
2222 specialArgs ? {}
2323, modules
24+, modulesLocation ? (builtins.unsafeGetAttrPos "modules" evalConfigArgs).file or null
2425, # !!! See comment about check in lib/modules.nix
2526 check ? true
2627, prefix ? []
@@ -74,7 +75,18 @@ let
7475 _module.check = lib.mkDefault check;
7576 };
7677 };
77− allUserModules = modules ++ legacyModules;
78+
79+ allUserModules =
80+ let
81+ # Add the invoking file (or specified modulesLocation) as error message location
82+ # for modules that don't have their own locations; presumably inline modules.
83+ locatedModules =
84+ if modulesLocation == null then
85+ modules
86+ else
87+ map (lib.setDefaultModuleLocation modulesLocation) modules;
88+ in
89+ locatedModules ++ legacyModules;
7890
7991 noUserModules = evalModulesMinimal ({
8092 inherit prefix specialArgs;
nixos/lib/make-options-doc/mergeJSON.py+8−1
@@ -66,14 +66,21 @@ for (k, v) in overrides.items():
6666 elif ov is not None or cur.get(ok, None) is None:
6767 cur[ok] = ov
6868
69+severity = "error" if warningsAreErrors else "warning"
70+
6971# check that every option has a description
7072hasWarnings = False
7173for (k, v) in options.items():
7274 if v.value.get('description', None) is None:
73− severity = "error" if warningsAreErrors else "warning"
7475 hasWarnings = True
7576 print(f"\x1b[1;31m{severity}: option {v.name} has no description\x1b[0m", file=sys.stderr)
7677 v.value['description'] = "This option has no description."
78+ if v.value.get('type', "unspecified") == "unspecified":
79+ hasWarnings = True
80+ print(
81+ f"\x1b[1;31m{severity}: option {v.name} has no type. Please specify a valid type, see " +
82+ "https://nixos.org/manual/nixos/stable/index.html#sec-option-types\x1b[0m", file=sys.stderr)
83+
7784if hasWarnings and warningsAreErrors:
7885 print(
7986 "\x1b[1;31m" +
nixos/lib/qemu-common.nix+1−1
@@ -22,7 +22,7 @@ rec {
2222 else throw "Unknown QEMU serial device for system '${pkgs.stdenv.hostPlatform.system}'";
2323
2424 qemuBinary = qemuPkg: {
25− x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu qemu64";
25+ x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu max";
2626 armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -enable-kvm -machine virt -cpu host";
2727 aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -enable-kvm -machine virt,gic-version=host -cpu host";
2828 powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
nixos/lib/systemd-lib.nix+211−4
@@ -5,12 +5,16 @@ with lib;
55let
66 cfg = config.systemd;
77 lndir = "${pkgs.buildPackages.xorg.lndir}/bin/lndir";
8+ systemd = cfg.package;
89in rec {
910
1011 shellEscape = s: (replaceChars [ "\\" ] [ "\\\\" ] s);
1112
1213 mkPathSafeName = lib.replaceChars ["@" ":" "\\" "[" "]"] ["-" "-" "-" "" ""];
1314
15+ # a type for options that take a unit name
16+ unitNameType = types.strMatching "[a-zA-Z0-9@%:_.\\-]+[.](service|socket|device|mount|automount|swap|target|path|timer|scope|slice)";
17+
1418 makeUnit = name: unit:
1519 if unit.enable then
1620 pkgs.runCommand "unit-${mkPathSafeName name}"
@@ -19,8 +23,9 @@ in rec {
1923 inherit (unit) text;
2024 }
2125 ''
22− mkdir -p $out
23− echo -n "$text" > $out/${shellEscape name}
26+ name=${shellEscape name}
27+ mkdir -p "$out/$(dirname "$name")"
28+ echo -n "$text" > "$out/$name"
2429 ''
2530 else
2631 pkgs.runCommand "unit-${mkPathSafeName name}-disabled"
@@ -28,8 +33,9 @@ in rec {
2833 allowSubstitutes = false;
2934 }
3035 ''
31− mkdir -p $out
32− ln -s /dev/null $out/${shellEscape name}
36+ name=${shellEscape name}
37+ mkdir -p "$out/$(dirname "$name")"
38+ ln -s /dev/null "$out/$name"
3339 '';
3440
3541 boolValues = [true false "yes" "no"];
@@ -232,4 +238,205 @@ in rec {
232238 ''}
233239 ''; # */
234240
241+ makeJobScript = name: text:
242+ let
243+ scriptName = replaceChars [ "\\" "@" ] [ "-" "_" ] (shellEscape name);
244+ out = (pkgs.writeShellScriptBin scriptName ''
245+ set -e
246+ ${text}
247+ '').overrideAttrs (_: {
248+ # The derivation name is different from the script file name
249+ # to keep the script file name short to avoid cluttering logs.
250+ name = "unit-script-${scriptName}";
251+ });
252+ in "${out}/bin/${scriptName}";
253+
254+ unitConfig = { config, options, ... }: {
255+ config = {
256+ unitConfig =
257+ optionalAttrs (config.requires != [])
258+ { Requires = toString config.requires; }
259+ // optionalAttrs (config.wants != [])
260+ { Wants = toString config.wants; }
261+ // optionalAttrs (config.after != [])
262+ { After = toString config.after; }
263+ // optionalAttrs (config.before != [])
264+ { Before = toString config.before; }
265+ // optionalAttrs (config.bindsTo != [])
266+ { BindsTo = toString config.bindsTo; }
267+ // optionalAttrs (config.partOf != [])
268+ { PartOf = toString config.partOf; }
269+ // optionalAttrs (config.conflicts != [])
270+ { Conflicts = toString config.conflicts; }
271+ // optionalAttrs (config.requisite != [])
272+ { Requisite = toString config.requisite; }
273+ // optionalAttrs (config.restartTriggers != [])
274+ { X-Restart-Triggers = toString config.restartTriggers; }
275+ // optionalAttrs (config.reloadTriggers != [])
276+ { X-Reload-Triggers = toString config.reloadTriggers; }
277+ // optionalAttrs (config.description != "") {
278+ Description = config.description; }
279+ // optionalAttrs (config.documentation != []) {
280+ Documentation = toString config.documentation; }
281+ // optionalAttrs (config.onFailure != []) {
282+ OnFailure = toString config.onFailure; }
283+ // optionalAttrs (options.startLimitIntervalSec.isDefined) {
284+ StartLimitIntervalSec = toString config.startLimitIntervalSec;
285+ } // optionalAttrs (options.startLimitBurst.isDefined) {
286+ StartLimitBurst = toString config.startLimitBurst;
287+ };
288+ };
289+ };
290+
291+ serviceConfig = { name, config, ... }: {
292+ config = mkMerge
293+ [ { # Default path for systemd services. Should be quite minimal.
294+ path = mkAfter
295+ [ pkgs.coreutils
296+ pkgs.findutils
297+ pkgs.gnugrep
298+ pkgs.gnused
299+ systemd
300+ ];
301+ environment.PATH = "${makeBinPath config.path}:${makeSearchPathOutput "bin" "sbin" config.path}";
302+ }
303+ (mkIf (config.preStart != "")
304+ { serviceConfig.ExecStartPre =
305+ [ (makeJobScript "${name}-pre-start" config.preStart) ];
306+ })
307+ (mkIf (config.script != "")
308+ { serviceConfig.ExecStart =
309+ makeJobScript "${name}-start" config.script + " " + config.scriptArgs;
310+ })
311+ (mkIf (config.postStart != "")
312+ { serviceConfig.ExecStartPost =
313+ [ (makeJobScript "${name}-post-start" config.postStart) ];
314+ })
315+ (mkIf (config.reload != "")
316+ { serviceConfig.ExecReload =
317+ makeJobScript "${name}-reload" config.reload;
318+ })
319+ (mkIf (config.preStop != "")
320+ { serviceConfig.ExecStop =
321+ makeJobScript "${name}-pre-stop" config.preStop;
322+ })
323+ (mkIf (config.postStop != "")
324+ { serviceConfig.ExecStopPost =
325+ makeJobScript "${name}-post-stop" config.postStop;
326+ })
327+ ];
328+ };
329+
330+ mountConfig = { config, ... }: {
331+ config = {
332+ mountConfig =
333+ { What = config.what;
334+ Where = config.where;
335+ } // optionalAttrs (config.type != "") {
336+ Type = config.type;
337+ } // optionalAttrs (config.options != "") {
338+ Options = config.options;
339+ };
340+ };
341+ };
342+
343+ automountConfig = { config, ... }: {
344+ config = {
345+ automountConfig =
346+ { Where = config.where;
347+ };
348+ };
349+ };
350+
351+ commonUnitText = def: ''
352+ [Unit]
353+ ${attrsToSection def.unitConfig}
354+ '';
355+
356+ targetToUnit = name: def:
357+ { inherit (def) aliases wantedBy requiredBy enable;
358+ text =
359+ ''
360+ [Unit]
361+ ${attrsToSection def.unitConfig}
362+ '';
363+ };
364+
365+ serviceToUnit = name: def:
366+ { inherit (def) aliases wantedBy requiredBy enable;
367+ text = commonUnitText def +
368+ ''
369+ [Service]
370+ ${let env = cfg.globalEnvironment // def.environment;
371+ in concatMapStrings (n:
372+ let s = optionalString (env.${n} != null)
373+ "Environment=${builtins.toJSON "${n}=${env.${n}}"}\n";
374+ # systemd max line length is now 1MiB
375+ # https://github.com/systemd/systemd/commit/e6dde451a51dc5aaa7f4d98d39b8fe735f73d2af
376+ in if stringLength s >= 1048576 then throw "The value of the environment variable ‘${n}’ in systemd service ‘${name}.service’ is too long." else s) (attrNames env)}
377+ ${if def.reloadIfChanged then ''
378+ X-ReloadIfChanged=true
379+ '' else if !def.restartIfChanged then ''
380+ X-RestartIfChanged=false
381+ '' else ""}
382+ ${optionalString (!def.stopIfChanged) "X-StopIfChanged=false"}
383+ ${attrsToSection def.serviceConfig}
384+ '';
385+ };
386+
387+ socketToUnit = name: def:
388+ { inherit (def) aliases wantedBy requiredBy enable;
389+ text = commonUnitText def +
390+ ''
391+ [Socket]
392+ ${attrsToSection def.socketConfig}
393+ ${concatStringsSep "\n" (map (s: "ListenStream=${s}") def.listenStreams)}
394+ ${concatStringsSep "\n" (map (s: "ListenDatagram=${s}") def.listenDatagrams)}
395+ '';
396+ };
397+
398+ timerToUnit = name: def:
399+ { inherit (def) aliases wantedBy requiredBy enable;
400+ text = commonUnitText def +
401+ ''
402+ [Timer]
403+ ${attrsToSection def.timerConfig}
404+ '';
405+ };
406+
407+ pathToUnit = name: def:
408+ { inherit (def) aliases wantedBy requiredBy enable;
409+ text = commonUnitText def +
410+ ''
411+ [Path]
412+ ${attrsToSection def.pathConfig}
413+ '';
414+ };
415+
416+ mountToUnit = name: def:
417+ { inherit (def) aliases wantedBy requiredBy enable;
418+ text = commonUnitText def +
419+ ''
420+ [Mount]
421+ ${attrsToSection def.mountConfig}
422+ '';
423+ };
424+
425+ automountToUnit = name: def:
426+ { inherit (def) aliases wantedBy requiredBy enable;
427+ text = commonUnitText def +
428+ ''
429+ [Automount]
430+ ${attrsToSection def.automountConfig}
431+ '';
432+ };
433+
434+ sliceToUnit = name: def:
435+ { inherit (def) aliases wantedBy requiredBy enable;
436+ text = commonUnitText def +
437+ ''
438+ [Slice]
439+ ${attrsToSection def.sliceConfig}
440+ '';
441+ };
235442}
nixos/lib/systemd-unit-options.nix+29−13
@@ -45,7 +45,7 @@ in rec {
4545
4646 requiredBy = mkOption {
4747 default = [];
48− type = types.listOf types.str;
48+ type = types.listOf unitNameType;
4949 description = ''
5050 Units that require (i.e. depend on and need to go down with)
5151 this unit. The discussion under <literal>wantedBy</literal>
@@ -56,7 +56,7 @@ in rec {
5656
5757 wantedBy = mkOption {
5858 default = [];
59− type = types.listOf types.str;
59+ type = types.listOf unitNameType;
6060 description = ''
6161 Units that want (i.e. depend on) this unit. The standard way
6262 to make a unit start by default at boot is to set this option
@@ -73,7 +73,7 @@ in rec {
7373
7474 aliases = mkOption {
7575 default = [];
76− type = types.listOf types.str;
76+ type = types.listOf unitNameType;
7777 description = "Aliases of that unit.";
7878 };
7979
@@ -98,7 +98,7 @@ in rec {
9898
9999 description = mkOption {
100100 default = "";
101− type = types.str;
101+ type = types.singleLineStr;
102102 description = "Description of this unit used in systemd messages and progress indicators.";
103103 };
104104
@@ -110,7 +110,7 @@ in rec {
110110
111111 requires = mkOption {
112112 default = [];
113− type = types.listOf types.str;
113+ type = types.listOf unitNameType;
114114 description = ''
115115 Start the specified units when this unit is started, and stop
116116 this unit when the specified units are stopped or fail.
@@ -119,7 +119,7 @@ in rec {
119119
120120 wants = mkOption {
121121 default = [];
122− type = types.listOf types.str;
122+ type = types.listOf unitNameType;
123123 description = ''
124124 Start the specified units when this unit is started.
125125 '';
@@ -127,7 +127,7 @@ in rec {
127127
128128 after = mkOption {
129129 default = [];
130− type = types.listOf types.str;
130+ type = types.listOf unitNameType;
131131 description = ''
132132 If the specified units are started at the same time as
133133 this unit, delay this unit until they have started.
@@ -136,7 +136,7 @@ in rec {
136136
137137 before = mkOption {
138138 default = [];
139− type = types.listOf types.str;
139+ type = types.listOf unitNameType;
140140 description = ''
141141 If the specified units are started at the same time as
142142 this unit, delay them until this unit has started.
@@ -145,7 +145,7 @@ in rec {
145145
146146 bindsTo = mkOption {
147147 default = [];
148− type = types.listOf types.str;
148+ type = types.listOf unitNameType;
149149 description = ''
150150 Like ‘requires’, but in addition, if the specified units
151151 unexpectedly disappear, this unit will be stopped as well.
@@ -154,7 +154,7 @@ in rec {
154154
155155 partOf = mkOption {
156156 default = [];
157− type = types.listOf types.str;
157+ type = types.listOf unitNameType;
158158 description = ''
159159 If the specified units are stopped or restarted, then this
160160 unit is stopped or restarted as well.
@@ -163,7 +163,7 @@ in rec {
163163
164164 conflicts = mkOption {
165165 default = [];
166− type = types.listOf types.str;
166+ type = types.listOf unitNameType;
167167 description = ''
168168 If the specified units are started, then this unit is stopped
169169 and vice versa.
@@ -172,7 +172,7 @@ in rec {
172172
173173 requisite = mkOption {
174174 default = [];
175− type = types.listOf types.str;
175+ type = types.listOf unitNameType;
176176 description = ''
177177 Similar to requires. However if the units listed are not started,
178178 they will not be started and the transaction will fail.
@@ -201,9 +201,20 @@ in rec {
201201 '';
202202 };
203203
204+ reloadTriggers = mkOption {
205+ default = [];
206+ type = types.listOf unitOption;
207+ description = ''
208+ An arbitrary list of items such as derivations. If any item
209+ in the list changes between reconfigurations, the service will
210+ be reloaded. If anything but a reload trigger changes in the
211+ unit file, the unit will be restarted instead.
212+ '';
213+ };
214+
204215 onFailure = mkOption {
205216 default = [];
206− type = types.listOf types.str;
217+ type = types.listOf unitNameType;
207218 description = ''
208219 A list of one or more units that are activated when
209220 this unit enters the "failed" state.
@@ -338,6 +349,11 @@ in rec {
338349 configuration switch if its definition has changed. If
339350 enabled, the value of <option>restartIfChanged</option> is
340351 ignored.
352+
353+ This option should not be used anymore in favor of
354+ <option>reloadTriggers</option> which allows more granular
355+ control of when a service is reloaded and when a service
356+ is restarted.
341357 '';
342358 };
343359
nixos/lib/test-driver/test_driver/__init__.py+31−3
@@ -33,6 +33,22 @@ class EnvDefault(argparse.Action):
3333 setattr(namespace, self.dest, values)
3434
3535
36+def writeable_dir(arg: str) -> Path:
37+ """Raises an ArgumentTypeError if the given argument isn't a writeable directory
38+ Note: We want to fail as early as possible if a directory isn't writeable,
39+ since an executed nixos-test could fail (very late) because of the test-driver
40+ writing in a directory without proper permissions.
41+ """
42+ path = Path(arg)
43+ if not path.is_dir():
44+ raise argparse.ArgumentTypeError("{0} is not a directory".format(path))
45+ if not os.access(path, os.W_OK):
46+ raise argparse.ArgumentTypeError(
47+ "{0} is not a writeable directory".format(path)
48+ )
49+ return path
50+
51+
3652def main() -> None:
3753 arg_parser = argparse.ArgumentParser(prog="nixos-test-driver")
3854 arg_parser.add_argument(
@@ -45,7 +61,7 @@ def main() -> None:
4561 "-I",
4662 "--interactive",
4763 help="drop into a python repl and run the tests interactively",
48− action="store_true",
64+ action=argparse.BooleanOptionalAction,
4965 )
5066 arg_parser.add_argument(
5167 "--start-scripts",
@@ -63,6 +79,14 @@ def main() -> None:
6379 nargs="*",
6480 help="vlans to span by the driver",
6581 )
82+ arg_parser.add_argument(
83+ "-o",
84+ "--output_directory",
85+ help="""The path to the directory where outputs copied from the VM will be placed.
86+ By e.g. Machine.copy_from_vm or Machine.screenshot""",
87+ default=Path.cwd(),
88+ type=writeable_dir,
89+ )
6690 arg_parser.add_argument(
6791 "testscript",
6892 action=EnvDefault,
@@ -77,7 +101,11 @@ def main() -> None:
77101 rootlog.info("Machine state will be reset. To keep it, pass --keep-vm-state")
78102
79103 with Driver(
80− args.start_scripts, args.vlans, args.testscript.read_text(), args.keep_vm_state
104+ args.start_scripts,
105+ args.vlans,
106+ args.testscript.read_text(),
107+ args.output_directory.resolve(),
108+ args.keep_vm_state,
81109 ) as driver:
82110 if args.interactive:
83111 ptpython.repl.embed(driver.test_symbols(), {})
@@ -94,7 +122,7 @@ def generate_driver_symbols() -> None:
94122 in user's test scripts. That list is then used by pyflakes to lint those
95123 scripts.
96124 """
97− d = Driver([], [], "")
125+ d = Driver([], [], "", Path())
98126 test_symbols = d.test_symbols()
99127 with open("driver-symbols", "w") as fp:
100128 fp.write(",".join(test_symbols.keys()))
nixos/lib/test-driver/test_driver/driver.py+30−4
@@ -10,6 +10,28 @@ from test_driver.vlan import VLan
1010from test_driver.polling_condition import PollingCondition
1111
1212
13+def get_tmp_dir() -> Path:
14+ """Returns a temporary directory that is defined by TMPDIR, TEMP, TMP or CWD
15+ Raises an exception in case the retrieved temporary directory is not writeable
16+ See https://docs.python.org/3/library/tempfile.html#tempfile.gettempdir
17+ """
18+ tmp_dir = Path(tempfile.gettempdir())
19+ tmp_dir.mkdir(mode=0o700, exist_ok=True)
20+ if not tmp_dir.is_dir():
21+ raise NotADirectoryError(
22+ "The directory defined by TMPDIR, TEMP, TMP or CWD: {0} is not a directory".format(
23+ tmp_dir
24+ )
25+ )
26+ if not os.access(tmp_dir, os.W_OK):
27+ raise PermissionError(
28+ "The directory defined by TMPDIR, TEMP, TMP, or CWD: {0} is not writeable".format(
29+ tmp_dir
30+ )
31+ )
32+ return tmp_dir
33+
34+
1335class Driver:
1436 """A handle to the driver that sets up the environment
1537 and runs the tests"""
@@ -24,14 +46,16 @@ class Driver:
2446 start_scripts: List[str],
2547 vlans: List[int],
2648 tests: str,
49+ out_dir: Path,
2750 keep_vm_state: bool = False,
2851 ):
2952 self.tests = tests
53+ self.out_dir = out_dir
3054
31− tmp_dir = Path(os.environ.get("TMPDIR", tempfile.gettempdir()))
32− tmp_dir.mkdir(mode=0o700, exist_ok=True)
55+ tmp_dir = get_tmp_dir()
3356
3457 with rootlog.nested("start all VLans"):
58+ vlans = list(set(vlans))
3559 self.vlans = [VLan(nr, tmp_dir) for nr in vlans]
3660
3761 def cmd(scripts: List[str]) -> Iterator[NixStartScript]:
@@ -47,6 +71,7 @@ class Driver:
4771 name=cmd.machine_name,
4872 tmp_dir=tmp_dir,
4973 callbacks=[self.check_polling_conditions],
74+ out_dir=self.out_dir,
5075 )
5176 for cmd in cmd(start_scripts)
5277 ]
@@ -141,8 +166,8 @@ class Driver:
141166 "Using legacy create_machine(), please instantiate the"
142167 "Machine class directly, instead"
143168 )
144− tmp_dir = Path(os.environ.get("TMPDIR", tempfile.gettempdir()))
145− tmp_dir.mkdir(mode=0o700, exist_ok=True)
169+
170+ tmp_dir = get_tmp_dir()
146171
147172 if args.get("startCommand"):
148173 start_command: str = args.get("startCommand", "")
@@ -154,6 +179,7 @@ class Driver:
154179
155180 return Machine(
156181 tmp_dir=tmp_dir,
182+ out_dir=self.out_dir,
157183 start_command=cmd,
158184 name=name,
159185 keep_vm_state=args.get("keep_vm_state", False),
nixos/lib/test-driver/test_driver/machine.py+44−8
@@ -198,7 +198,7 @@ class StartCommand:
198198 ) -> subprocess.Popen:
199199 return subprocess.Popen(
200200 self.cmd(monitor_socket_path, shell_socket_path),
201− stdin=subprocess.DEVNULL,
201+ stdin=subprocess.PIPE,
202202 stdout=subprocess.PIPE,
203203 stderr=subprocess.STDOUT,
204204 shell=True,
@@ -241,9 +241,15 @@ class LegacyStartCommand(StartCommand):
241241 cdrom: Optional[str] = None,
242242 usb: Optional[str] = None,
243243 bios: Optional[str] = None,
244+ qemuBinary: Optional[str] = None,
244245 qemuFlags: Optional[str] = None,
245246 ):
246− self._cmd = "qemu-kvm -m 384"
247+ if qemuBinary is not None:
248+ self._cmd = qemuBinary
249+ else:
250+ self._cmd = "qemu-kvm"
251+
252+ self._cmd += " -m 384"
247253
248254 # networking
249255 net_backend = "-netdev user,id=net0"
@@ -297,6 +303,7 @@ class Machine:
297303 the machine lifecycle with the help of a start script / command."""
298304
299305 name: str
306+ out_dir: Path
300307 tmp_dir: Path
301308 shared_dir: Path
302309 state_dir: Path
@@ -325,6 +332,7 @@ class Machine:
325332
326333 def __init__(
327334 self,
335+ out_dir: Path,
328336 tmp_dir: Path,
329337 start_command: StartCommand,
330338 name: str = "machine",
@@ -332,6 +340,7 @@ class Machine:
332340 allow_reboot: bool = False,
333341 callbacks: Optional[List[Callable]] = None,
334342 ) -> None:
343+ self.out_dir = out_dir
335344 self.tmp_dir = tmp_dir
336345 self.keep_vm_state = keep_vm_state
337346 self.allow_reboot = allow_reboot
@@ -378,6 +387,7 @@ class Machine:
378387 cdrom=args.get("cdrom"),
379388 usb=args.get("usb"),
380389 bios=args.get("bios"),
390+ qemuBinary=args.get("qemuBinary"),
381391 qemuFlags=args.get("qemuFlags"),
382392 )
383393
@@ -540,14 +550,36 @@ class Machine:
540550
541551 Should only be used during test development, not in the production test."""
542552 self.connect()
543− self.log("Terminal is ready (there is no prompt):")
553+ self.log("Terminal is ready (there is no initial prompt):")
544554
545555 assert self.shell
546556 subprocess.run(
547− ["socat", "READLINE", f"FD:{self.shell.fileno()}"],
557+ ["socat", "READLINE,prompt=$ ", f"FD:{self.shell.fileno()}"],
548558 pass_fds=[self.shell.fileno()],
549559 )
550560
561+ def console_interact(self) -> None:
562+ """Allows you to interact with QEMU's stdin
563+
564+ The shell can be exited with Ctrl+D. Note that Ctrl+C is not allowed to be used.
565+ QEMU's stdout is read line-wise.
566+
567+ Should only be used during test development, not in the production test."""
568+ self.log("Terminal is ready (there is no prompt):")
569+
570+ assert self.process
571+ assert self.process.stdin
572+
573+ while True:
574+ try:
575+ char = sys.stdin.buffer.read(1)
576+ except KeyboardInterrupt:
577+ break
578+ if char == b"": # ctrl+d
579+ self.log("Closing connection to the console")
580+ break
581+ self.send_console(char.decode())
582+
551583 def succeed(self, *commands: str, timeout: Optional[int] = None) -> str:
552584 """Execute each command and check that it succeeds."""
553585 output = ""
@@ -702,10 +734,9 @@ class Machine:
702734 self.connected = True
703735
704736 def screenshot(self, filename: str) -> None:
705− out_dir = os.environ.get("out", os.getcwd())
706737 word_pattern = re.compile(r"^\w+$")
707738 if word_pattern.match(filename):
708− filename = os.path.join(out_dir, "{}.png".format(filename))
739+ filename = os.path.join(self.out_dir, "{}.png".format(filename))
709740 tmp = "{}.ppm".format(filename)
710741
711742 with self.nested(
@@ -756,7 +787,6 @@ class Machine:
756787 all the VMs (using a temporary directory).
757788 """
758789 # Compute the source, target, and intermediate shared file names
759− out_dir = Path(os.environ.get("out", os.getcwd()))
760790 vm_src = Path(source)
761791 with tempfile.TemporaryDirectory(dir=self.shared_dir) as shared_td:
762792 shared_temp = Path(shared_td)
@@ -766,7 +796,7 @@ class Machine:
766796 # Copy the file to the shared directory inside VM
767797 self.succeed(make_command(["mkdir", "-p", vm_shared_temp]))
768798 self.succeed(make_command(["cp", "-r", vm_src, vm_intermediate]))
769− abs_target = out_dir / target_dir / vm_src.name
799+ abs_target = self.out_dir / target_dir / vm_src.name
770800 abs_target.parent.mkdir(exist_ok=True, parents=True)
771801 # Copy the file from the shared directory outside VM
772802 if intermediate.is_dir():
@@ -826,6 +856,12 @@ class Machine:
826856 self.send_monitor_command("sendkey {}".format(key))
827857 time.sleep(0.01)
828858
859+ def send_console(self, chars: str) -> None:
860+ assert self.process
861+ assert self.process.stdin
862+ self.process.stdin.write(chars.encode())
863+ self.process.stdin.flush()
864+
829865 def start(self) -> None:
830866 if self.booted:
831867 return
nixos/lib/testing-python.nix+19−18
@@ -30,7 +30,7 @@ rec {
3030 # effectively mute the XMLLogger
3131 export LOGFILE=/dev/null
3232
33− ${driver}/bin/nixos-test-driver
33+ ${driver}/bin/nixos-test-driver -o $out
3434 '';
3535
3636 passthru = driver.passthru // {
@@ -51,6 +51,7 @@ rec {
5151 , enableOCR ? false
5252 , skipLint ? false
5353 , passthru ? {}
54+ , interactive ? false
5455 }:
5556 let
5657 # Reifies and correctly wraps the python test driver for
@@ -139,31 +140,34 @@ rec {
139140 wrapProgram $out/bin/nixos-test-driver \
140141 --set startScripts "''${vmStartScripts[*]}" \
141142 --set testScript "$out/test-script" \
142− --set vlans '${toString vlans}'
143+ --set vlans '${toString vlans}' \
144+ ${lib.optionalString (interactive) "--add-flags --interactive"}
143145 '');
144146
145147 # Make a full-blown test
146148 makeTest =
147− { testScript
149+ { machine ? null
150+ , nodes ? {}
151+ , testScript
148152 , enableOCR ? false
149153 , name ? "unnamed"
150154 # Skip linting (mainly intended for faster dev cycles)
151155 , skipLint ? false
152156 , passthru ? {}
157+ , meta ? {}
153158 , # For meta.position
154159 pos ? # position used in error messages and for meta.position
155− (if t.meta.description or null != null
156− then builtins.unsafeGetAttrPos "description" t.meta
160+ (if meta.description or null != null
161+ then builtins.unsafeGetAttrPos "description" meta
157162 else builtins.unsafeGetAttrPos "testScript" t)
158− , ...
159163 } @ t:
160164 let
161− nodes = qemu_pkg:
165+ mkNodes = qemu_pkg:
162166 let
163167 testScript' =
164168 # Call the test script with the computed nodes.
165169 if lib.isFunction testScript
166− then testScript { nodes = nodes qemu_pkg; }
170+ then testScript { nodes = mkNodes qemu_pkg; }
167171 else testScript;
168172
169173 build-vms = import ./build-vms.nix {
@@ -203,32 +207,29 @@ rec {
203207 };
204208 in
205209 build-vms.buildVirtualNetwork (
206− t.nodes or (if t ? machine then { machine = t.machine; } else { })
210+ nodes // lib.optionalAttrs (machine != null) { inherit machine; }
207211 );
208212
209213 driver = setupDriverForTest {
210214 inherit testScript enableOCR skipLint passthru;
211215 testName = name;
212216 qemu_pkg = pkgs.qemu_test;
213− nodes = nodes pkgs.qemu_test;
217+ nodes = mkNodes pkgs.qemu_test;
214218 };
215219 driverInteractive = setupDriverForTest {
216220 inherit testScript enableOCR skipLint passthru;
217221 testName = name;
218222 qemu_pkg = pkgs.qemu;
219− nodes = nodes pkgs.qemu;
223+ nodes = mkNodes pkgs.qemu;
224+ interactive = true;
220225 };
221226
222− test =
223− let
224− passMeta = drv: drv // lib.optionalAttrs (t ? meta) {
225− meta = (drv.meta or { }) // t.meta;
226− };
227− in passMeta (runTests { inherit driver pos driverInteractive; });
227+ test = lib.addMetaAttrs meta (runTests { inherit driver pos driverInteractive; });
228228
229229 in
230230 test // {
231− inherit test driver driverInteractive nodes;
231+ inherit test driver driverInteractive;
232+ inherit (driver) nodes;
232233 };
233234
234235 abortForFunction = functionName: abort ''The ${functionName} function was
nixos/lib/utils.nix+29−1
@@ -45,6 +45,26 @@ rec {
4545 replaceChars ["/" "-" " "] ["-" "\\x2d" "\\x20"]
4646 (removePrefix "/" s);
4747
48+ # Quotes an argument for use in Exec* service lines.
49+ # systemd accepts "-quoted strings with escape sequences, toJSON produces
50+ # a subset of these.
51+ # Additionally we escape % to disallow expansion of % specifiers. Any lone ;
52+ # in the input will be turned it ";" and thus lose its special meaning.
53+ # Every $ is escaped to $$, this makes it unnecessary to disable environment
54+ # substitution for the directive.
55+ escapeSystemdExecArg = arg:
56+ let
57+ s = if builtins.isPath arg then "${arg}"
58+ else if builtins.isString arg then arg
59+ else if builtins.isInt arg || builtins.isFloat arg then toString arg
60+ else throw "escapeSystemdExecArg only allows strings, paths and numbers";
61+ in
62+ replaceChars [ "%" "$" ] [ "%%" "$$" ] (builtins.toJSON s);
63+
64+ # Quotes a list of arguments into a single string for use in a Exec*
65+ # line.
66+ escapeSystemdExecArgs = concatMapStringsSep " " escapeSystemdExecArg;
67+
4868 # Returns a system path for a given shell package
4969 toShellPath = shell:
5070 if types.shellPackage.check shell then
@@ -149,10 +169,17 @@ rec {
149169 if [[ -h '${output}' ]]; then
150170 rm '${output}'
151171 fi
172+
173+ inherit_errexit_enabled=0
174+ shopt -pq inherit_errexit && inherit_errexit_enabled=1
175+ shopt -s inherit_errexit
152176 ''
153177 + concatStringsSep
154178 "\n"
155− (imap1 (index: name: "export secret${toString index}=$(<'${secrets.${name}}')")
179+ (imap1 (index: name: ''
180+ secret${toString index}=$(<'${secrets.${name}}')
181+ export secret${toString index}
182+ '')
156183 (attrNames secrets))
157184 + "\n"
158185 + "${pkgs.jq}/bin/jq >'${output}' '"
@@ -164,6 +191,7 @@ rec {
164191 ' <<'EOF'
165192 ${builtins.toJSON set}
166193 EOF
194+ (( ! $inherit_errexit_enabled )) && shopt -u inherit_errexit
167195 '';
168196
169197 systemdUtils = {
nixos/maintainers/scripts/azure-new/examples/basic/system.nix+1−1
@@ -17,7 +17,7 @@ in
1717 description = "Azure NixOS Test User";
1818 openssh.authorizedKeys.keys = [ (builtins.readFile ~/.ssh/id_ed25519.pub) ];
1919 };
20− nix.trustedUsers = [ username ];
20+ nix.settings.trusted-users = [ username ];
2121
2222 virtualisation.azureImage.diskSize = 2500;
2323
nixos/modules/config/fonts/fonts.nix−5
@@ -39,11 +39,6 @@ let
3939 defaultXFonts =
4040 [ (if hasHidpi then fontcursormisc_hidpi else pkgs.xorg.fontcursormisc)
4141 pkgs.xorg.fontmiscmisc
42− ] ++ optionals (config.nixpkgs.config.allowUnfree or false)
43− [ # these are unfree, and will make usage with xserver fail
44− pkgs.xorg.fontbhlucidatypewriter100dpi
45− pkgs.xorg.fontbhlucidatypewriter75dpi
46− pkgs.xorg.fontbh100dpi
4742 ];
4843
4944in
nixos/modules/config/users-groups.nix+24−12
@@ -449,16 +449,10 @@ in {
449449 imports = [
450450 (mkAliasOptionModule [ "users" "extraUsers" ] [ "users" "users" ])
451451 (mkAliasOptionModule [ "users" "extraGroups" ] [ "users" "groups" ])
452− (mkChangedOptionModule
453− [ "security" "initialRootPassword" ]
454− [ "users" "users" "root" "initialHashedPassword" ]
455− (cfg: if cfg.security.initialRootPassword == "!"
456− then null
457− else cfg.security.initialRootPassword))
452+ (mkRenamedOptionModule ["security" "initialRootPassword"] ["users" "users" "root" "initialHashedPassword"])
458453 ];
459454
460455 ###### interface
461−
462456 options = {
463457
464458 users.mutableUsers = mkOption {
@@ -526,6 +520,17 @@ in {
526520 '';
527521 };
528522
523+
524+ users.allowNoPasswordLogin = mkOption {
525+ type = types.bool;
526+ default = false;
527+ description = ''
528+ Disable checking that at least the <literal>root</literal> user or a user in the <literal>wheel</literal> group can log in using
529+ a password or an SSH key.
530+
531+ WARNING: enabling this can lock you out of your system. Enable this only if you know what are you doing.
532+ '';
533+ };
529534 };
530535
531536
@@ -540,6 +545,7 @@ in {
540545 home = "/root";
541546 shell = mkDefault cfg.defaultUserShell;
542547 group = "root";
548+ initialHashedPassword = mkDefault "!";
543549 };
544550 nobody = {
545551 uid = ids.uids.nobody;
@@ -616,9 +622,11 @@ in {
616622 # there is at least one "privileged" account that has a
617623 # password or an SSH authorized key. Privileged accounts are
618624 # root and users in the wheel group.
619− assertion = !cfg.mutableUsers ->
620− any id ((mapAttrsToList (_: cfg:
621− (cfg.name == "root"
625+ # The check does not apply when users.disableLoginPossibilityAssertion
626+ # The check does not apply when users.mutableUsers
627+ assertion = !cfg.mutableUsers -> !cfg.allowNoPasswordLogin ->
628+ any id (mapAttrsToList (name: cfg:
629+ (name == "root"
622630 || cfg.group == "wheel"
623631 || elem "wheel" cfg.extraGroups)
624632 &&
@@ -627,12 +635,16 @@ in {
627635 || cfg.passwordFile != null
628636 || cfg.openssh.authorizedKeys.keys != []
629637 || cfg.openssh.authorizedKeys.keyFiles != [])
630− ) cfg.users) ++ [
638+ ) cfg.users ++ [
631639 config.security.googleOsLogin.enable
632640 ]);
633641 message = ''
634642 Neither the root account nor any wheel user has a password or SSH authorized key.
635− You must set one to prevent being locked out of your system.'';
643+ You must set one to prevent being locked out of your system.
644+ If you really want to be locked out of your system, set users.allowNoPasswordLogin = true;
645+ However you are most probably better off by setting users.mutableUsers = true; and
646+ manually running passwd root to set the root password.
647+ '';
636648 }
637649 ] ++ flatten (flip mapAttrsToList cfg.users (name: user:
638650 [
nixos/modules/config/xdg/portal.nix+23−12
@@ -1,4 +1,4 @@
1−{ config, pkgs ,lib ,... }:
1+{ config, pkgs, lib, ... }:
22
33with lib;
44
@@ -13,13 +13,13 @@ with lib;
1313
1414 options.xdg.portal = {
1515 enable =
16− mkEnableOption "<link xlink:href='https://github.com/flatpak/xdg-desktop-portal'>xdg desktop integration</link>"//{
16+ mkEnableOption "<link xlink:href='https://github.com/flatpak/xdg-desktop-portal'>xdg desktop integration</link>" // {
1717 default = false;
1818 };
1919
2020 extraPortals = mkOption {
2121 type = types.listOf types.package;
22− default = [];
22+ default = [ ];
2323 description = ''
2424 List of additional portals to add to path. Portals allow interaction
2525 with system, like choosing files or taking screenshots. At minimum,
@@ -46,25 +46,36 @@ with lib;
4646 let
4747 cfg = config.xdg.portal;
4848 packages = [ pkgs.xdg-desktop-portal ] ++ cfg.extraPortals;
49− joinedPortals = pkgs.symlinkJoin {
49+ joinedPortals = pkgs.buildEnv {
5050 name = "xdg-portals";
51− paths = cfg.extraPortals;
51+ paths = packages;
52+ pathsToLink = [ "/share/xdg-desktop-portal/portals" "/share/applications" ];
5253 };
5354
54− in mkIf cfg.enable {
55+ in
56+ mkIf cfg.enable {
5557
5658 assertions = [
57− { assertion = (cfg.gtkUsePortal -> cfg.extraPortals != []);
58− message = "Setting xdg.portal.gtkUsePortal to true requires a portal implementation in xdg.portal.extraPortals such as xdg-desktop-portal-gtk or xdg-desktop-portal-kde.";
59+ {
60+ assertion = cfg.extraPortals != [ ];
61+ message = "Setting xdg.portal.enable to true requires a portal implementation in xdg.portal.extraPortals such as xdg-desktop-portal-gtk or xdg-desktop-portal-kde.";
5962 }
6063 ];
6164
62− services.dbus.packages = packages;
65+ services.dbus.packages = packages;
6366 systemd.packages = packages;
6467
65− environment.sessionVariables = {
66− GTK_USE_PORTAL = mkIf cfg.gtkUsePortal "1";
67− XDG_DESKTOP_PORTAL_DIR = "${joinedPortals}/share/xdg-desktop-portal/portals";
68+ environment = {
69+ # fixes screen sharing on plasmawayland on non-chromium apps by linking
70+ # share/applications/*.desktop files
71+ # see https://github.com/NixOS/nixpkgs/issues/145174
72+ systemPackages = [ joinedPortals ];
73+ pathsToLink = [ "/share/applications" ];
74+
75+ sessionVariables = {
76+ GTK_USE_PORTAL = mkIf cfg.gtkUsePortal "1";
77+ XDG_DESKTOP_PORTAL_DIR = "${joinedPortals}/share/xdg-desktop-portal/portals";
78+ };
6879 };
6980 };
7081}
nixos/modules/hardware/all-firmware.nix+3−1
@@ -57,7 +57,6 @@ in {
5757 rtl8723bs-firmware
5858 rtl8761b-firmware
5959 rtw88-firmware
60− rtw89-firmware
6160 zd1211fw
6261 alsa-firmware
6362 sof-firmware
@@ -65,6 +64,8 @@ in {
6564 ] ++ optional (pkgs.stdenv.hostPlatform.isAarch32 || pkgs.stdenv.hostPlatform.isAarch64) raspberrypiWirelessFirmware
6665 ++ optionals (versionOlder config.boot.kernelPackages.kernel.version "4.13") [
6766 rtl8723bs-firmware
67+ ] ++ optionals (versionOlder config.boot.kernelPackages.kernel.version "5.16") [
68+ rtw89-firmware
6869 ];
6970 hardware.wirelessRegulatoryDatabase = true;
7071 })
@@ -82,6 +83,7 @@ in {
8283 b43Firmware_5_1_138
8384 b43Firmware_6_30_163_46
8485 b43FirmwareCutter
86+ xow_dongle-firmware
8587 ] ++ optional pkgs.stdenv.hostPlatform.isx86 facetimehd-firmware;
8688 })
8789 (mkIf cfg.wirelessRegulatoryDatabase {
nixos/modules/hardware/network/b43.nix−4
@@ -24,10 +24,6 @@ let kernelVersion = config.boot.kernelPackages.kernel.version; in
2424 ###### implementation
2525
2626 config = mkIf config.networking.enableB43Firmware {
27− assertions = singleton
28− { assertion = lessThan 0 (builtins.compareVersions kernelVersion "3.2");
29− message = "b43 firmware for kernels older than 3.2 not packaged yet!";
30− };
3127 hardware.firmware = [ pkgs.b43Firmware_5_1_138 ];
3228 };
3329
nixos/modules/hardware/video/capture/mwprocapture.nix−5
@@ -16,11 +16,6 @@ in
1616
1717 config = mkIf cfg.enable {
1818
19− assertions = singleton {
20− assertion = versionAtLeast kernelPackages.kernel.version "3.2";
21− message = "Magewell Pro Capture family module is not supported for kernels older than 3.2";
22− };
23−
2419 boot.kernelModules = [ "ProCapture" ];
2520
2621 environment.systemPackages = [ kernelPackages.mwprocapture ];
nixos/modules/hardware/video/nvidia.nix+17−12
@@ -178,11 +178,6 @@ in
178178 igpuBusId = if pCfg.intelBusId != "" then pCfg.intelBusId else pCfg.amdgpuBusId;
179179 in mkIf enabled {
180180 assertions = [
181− {
182− assertion = with config.services.xserver.displayManager; (gdm.enable && gdm.nvidiaWayland) -> cfg.modesetting.enable;
183− message = "You cannot use wayland with GDM without modesetting enabled for NVIDIA drivers, set `hardware.nvidia.modesetting.enable = true`";
184− }
185−
186181 {
187182 assertion = primeEnabled -> pCfg.intelBusId == "" || pCfg.amdgpuBusId == "";
188183 message = ''
@@ -249,7 +244,7 @@ in
249244 modules = optional (igpuDriver == "amdgpu") [ pkgs.xorg.xf86videoamdgpu ];
250245 deviceSection = ''
251246 BusID "${igpuBusId}"
252− ${optionalString syncCfg.enable ''Option "AccelMethod" "none"''}
247+ ${optionalString (syncCfg.enable && igpuDriver != "amdgpu") ''Option "AccelMethod" "none"''}
253248 '';
254249 } ++ singleton {
255250 name = "nvidia";
@@ -274,9 +269,15 @@ in
274269 Option "AllowNVIDIAGPUScreens"
275270 '';
276271
277− services.xserver.displayManager.setupCommands = optionalString syncCfg.enable ''
272+ services.xserver.displayManager.setupCommands = let
273+ sinkGpuProviderName = if igpuDriver == "amdgpu" then
274+ # find the name of the provider if amdgpu
275+ "`${pkgs.xorg.xrandr}/bin/xrandr --listproviders | ${pkgs.gnugrep}/bin/grep -i AMD | ${pkgs.gnused}/bin/sed -n 's/^.*name://p'`"
276+ else
277+ igpuDriver;
278+ in optionalString syncCfg.enable ''
278279 # Added by nvidia configuration module for Optimus/PRIME.
279− ${pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource ${igpuDriver} NVIDIA-0
280+ ${pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource "${sinkGpuProviderName}" NVIDIA-0
280281 ${pkgs.xorg.xrandr}/bin/xrandr --auto
281282 '';
282283
@@ -288,10 +289,14 @@ in
288289 environment.etc."egl/egl_external_platform.d".source =
289290 "/run/opengl-driver/share/egl/egl_external_platform.d/";
290291
291− hardware.opengl.package = mkIf (!offloadCfg.enable) nvidia_x11.out;
292− hardware.opengl.package32 = mkIf (!offloadCfg.enable) nvidia_x11.lib32;
293− hardware.opengl.extraPackages = optional offloadCfg.enable nvidia_x11.out;
294− hardware.opengl.extraPackages32 = optional offloadCfg.enable nvidia_x11.lib32;
292+ hardware.opengl.extraPackages = [
293+ nvidia_x11.out
294+ pkgs.nvidia-vaapi-driver
295+ ];
296+ hardware.opengl.extraPackages32 = [
297+ nvidia_x11.lib32
298+ pkgs.pkgsi686Linux.nvidia-vaapi-driver
299+ ];
295300
296301 environment.systemPackages = [ nvidia_x11.bin ]
297302 ++ optionals cfg.nvidiaSettings [ nvidia_x11.settings ]
nixos/modules/hardware/xone.nixnew file+23
@@ -0,0 +1,23 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+let
5+ cfg = config.hardware.xone;
6+in
7+{
8+ options.hardware.xone = {
9+ enable = mkEnableOption "the xone driver for Xbox One and Xbobx Series X|S accessories";
10+ };
11+
12+ config = mkIf cfg.enable {
13+ boot = {
14+ blacklistedKernelModules = [ "xpad" "mt76x2u" ];
15+ extraModulePackages = with config.boot.kernelPackages; [ xone ];
16+ };
17+ hardware.firmware = [ pkgs.xow_dongle-firmware ];
18+ };
19+
20+ meta = {
21+ maintainers = with maintainers; [ rhysmdnz ];
22+ };
23+}
nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix+2−2
@@ -10,10 +10,10 @@ with lib;
1010 isoImage.edition = "gnome";
1111
1212 services.xserver.desktopManager.gnome = {
13− # Add firefox to favorite-apps
13+ # Add Firefox and other tools useful for installation to the launcher
1414 favoriteAppsOverride = ''
1515 [org.gnome.shell]
16− favorite-apps=[ 'firefox.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Photos.desktop', 'org.gnome.Nautilus.desktop' ]
16+ favorite-apps=[ 'firefox.desktop', 'nixos-manual.desktop', 'org.gnome.Terminal.desktop', 'org.gnome.Nautilus.desktop', 'gparted.desktop' ]
1717 '';
1818 enable = true;
1919 };
nixos/modules/installer/cd-dvd/iso-image.nix+33−22
@@ -91,29 +91,9 @@ let
9191 SERIAL 0 115200
9292 TIMEOUT ${builtins.toString syslinuxTimeout}
9393 UI vesamenu.c32
94− MENU TITLE NixOS
9594 MENU BACKGROUND /isolinux/background.png
96− MENU RESOLUTION 800 600
97− MENU CLEAR
98− MENU ROWS 6
99− MENU CMDLINEROW -4
100− MENU TIMEOUTROW -3
101− MENU TABMSGROW -2
102− MENU HELPMSGROW -1
103− MENU HELPMSGENDROW -1
104− MENU MARGIN 0
105−
106− # FG:AARRGGBB BG:AARRGGBB shadow
107− MENU COLOR BORDER 30;44 #00000000 #00000000 none
108− MENU COLOR SCREEN 37;40 #FF000000 #00E2E8FF none
109− MENU COLOR TABMSG 31;40 #80000000 #00000000 none
110− MENU COLOR TIMEOUT 1;37;40 #FF000000 #00000000 none
111− MENU COLOR TIMEOUT_MSG 37;40 #FF000000 #00000000 none
112− MENU COLOR CMDMARK 1;36;40 #FF000000 #00000000 none
113− MENU COLOR CMDLINE 37;40 #FF000000 #00000000 none
114− MENU COLOR TITLE 1;36;44 #00000000 #00000000 none
115− MENU COLOR UNSEL 37;44 #FF000000 #00000000 none
116− MENU COLOR SEL 7;37;40 #FFFFFFFF #FF5277C3 std
95+
96+ ${config.isoImage.syslinuxTheme}
11797
11898 DEFAULT boot
11999
@@ -601,6 +581,37 @@ in
601581 '';
602582 };
603583
584+ isoImage.syslinuxTheme = mkOption {
585+ default = ''
586+ MENU TITLE NixOS
587+ MENU RESOLUTION 800 600
588+ MENU CLEAR
589+ MENU ROWS 6
590+ MENU CMDLINEROW -4
591+ MENU TIMEOUTROW -3
592+ MENU TABMSGROW -2
593+ MENU HELPMSGROW -1
594+ MENU HELPMSGENDROW -1
595+ MENU MARGIN 0
596+
597+ # FG:AARRGGBB BG:AARRGGBB shadow
598+ MENU COLOR BORDER 30;44 #00000000 #00000000 none
599+ MENU COLOR SCREEN 37;40 #FF000000 #00E2E8FF none
600+ MENU COLOR TABMSG 31;40 #80000000 #00000000 none
601+ MENU COLOR TIMEOUT 1;37;40 #FF000000 #00000000 none
602+ MENU COLOR TIMEOUT_MSG 37;40 #FF000000 #00000000 none
603+ MENU COLOR CMDMARK 1;36;40 #FF000000 #00000000 none
604+ MENU COLOR CMDLINE 37;40 #FF000000 #00000000 none
605+ MENU COLOR TITLE 1;36;44 #00000000 #00000000 none
606+ MENU COLOR UNSEL 37;44 #FF000000 #00000000 none
607+ MENU COLOR SEL 7;37;40 #FFFFFFFF #FF5277C3 std
608+ '';
609+ type = types.str;
610+ description = ''
611+ The syslinux theme used for BIOS boot.
612+ '';
613+ };
614+
604615 isoImage.appendToMenuLabel = mkOption {
605616 default = " Installer";
606617 example = " Live System";
nixos/modules/installer/sd-card/sd-image-aarch64.nix+6
@@ -24,6 +24,9 @@
2424 [pi3]
2525 kernel=u-boot-rpi3.bin
2626
27+ [pi02]
28+ kernel=u-boot-rpi3.bin
29+
2730 [pi4]
2831 kernel=u-boot-rpi4.bin
2932 enable_gic=1
@@ -33,6 +36,9 @@
3336 # what the pi3 firmware does by default.
3437 disable_overscan=1
3538
39+ # Supported in newer board revisions
40+ arm_boost=1
41+
3642 [all]
3743 # Boot in 64-bit mode.
3844 arm_64bit=1
nixos/modules/installer/tools/nix-fallback-paths.nix+5−5
@@ -1,7 +1,7 @@
11{
2− x86_64-linux = "/nix/store/hapw7q1fkjxvprnkcgw9ppczavg4daj2-nix-2.4";
3− i686-linux = "/nix/store/8qlvh8pp5j8wgrzj3is2jlbhgrwgsiy9-nix-2.4";
4− aarch64-linux = "/nix/store/h48lkygcqj4hdibbdnpl67q7ks6vkrd6-nix-2.4";
5− x86_64-darwin = "/nix/store/c3mvzszvyzakvcp9spnjvsb8m2bpjk7m-nix-2.4";
6− aarch64-darwin = "/nix/store/hbfqs62r0hga2yr4zi5kc7fzhf71bq9n-nix-2.4";
2+ x86_64-linux = "/nix/store/0n2wfvi1i3fg97cjc54wslvk0804y0sn-nix-2.7.0";
3+ i686-linux = "/nix/store/4p27c1k9z99pli6x8cxfph20yfyzn9nh-nix-2.7.0";
4+ aarch64-linux = "/nix/store/r9yr8ijsb0gi9r7y92y3yzyld59yp0kj-nix-2.7.0";
5+ x86_64-darwin = "/nix/store/hyfj5imsd0c4amlcjpf8l6w4q2draaj3-nix-2.7.0";
6+ aarch64-darwin = "/nix/store/9l96qllhbb6xrsjaai76dn74ap7rq92n-nix-2.7.0";
77}
nixos/modules/installer/tools/nixos-build-vms/build-vms.nix+3
@@ -25,4 +25,7 @@ pkgs.runCommand "nixos-build-vms" { nativeBuildInputs = [ pkgs.makeWrapper ]; }
2525 ln -s ${interactiveDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms
2626 wrapProgram $out/bin/nixos-test-driver \
2727 --add-flags "--interactive"
28+ wrapProgram $out/bin/nixos-run-vms \
29+ --set testScript "${pkgs.writeText "start-all" "start_all(); join_all();"}" \
30+ --add-flags "--no-interactive"
2831''
nixos/modules/installer/tools/nixos-enter.sh+11−11
@@ -63,32 +63,32 @@ mount --rbind /sys "$mountPoint/sys"
6363
6464# modified from https://github.com/archlinux/arch-install-scripts/blob/bb04ab435a5a89cd5e5ee821783477bc80db797f/arch-chroot.in#L26-L52
6565chroot_add_resolv_conf() {
66− local chrootdir=$1 resolv_conf=$1/etc/resolv.conf
66+ local chrootDir="$1" resolvConf="$1/etc/resolv.conf"
6767
6868 [[ -e /etc/resolv.conf ]] || return 0
6969
7070 # Handle resolv.conf as a symlink to somewhere else.
71− if [[ -L $chrootdir/etc/resolv.conf ]]; then
71+ if [[ -L "$resolvConf" ]]; then
7272 # readlink(1) should always give us *something* since we know at this point
7373 # it's a symlink. For simplicity, ignore the case of nested symlinks.
74− # We also ignore the possibility if `../`s escaping the root.
75− resolv_conf=$(readlink "$chrootdir/etc/resolv.conf")
76− if [[ $resolv_conf = /* ]]; then
77− resolv_conf=$chrootdir$resolv_conf
74+ # We also ignore the possibility of `../`s escaping the root.
75+ resolvConf="$(readlink "$resolvConf")"
76+ if [[ "$resolvConf" = /* ]]; then
77+ resolvConf="$chrootDir$resolvConf"
7878 else
79− resolv_conf=$chrootdir/etc/$resolv_conf
79+ resolvConf="$chrootDir/etc/$resolvConf"
8080 fi
8181 fi
8282
8383 # ensure file exists to bind mount over
84− if [[ ! -f $resolv_conf ]]; then
85− install -Dm644 /dev/null "$resolv_conf" || return 1
84+ if [[ ! -f "$resolvConf" ]]; then
85+ install -Dm644 /dev/null "$resolvConf" || return 1
8686 fi
8787
88− mount --bind /etc/resolv.conf "$resolv_conf"
88+ mount --bind /etc/resolv.conf "$resolvConf"
8989}
9090
91−chroot_add_resolv_conf "$mountPoint" || print "ERROR: failed to set up resolv.conf"
91+chroot_add_resolv_conf "$mountPoint" || echo "$0: failed to set up resolv.conf" >&2
9292
9393(
9494 # If silent, write both stdout and stderr of activation script to /dev/null
nixos/modules/installer/tools/nixos-generate-config.pl+16−6
@@ -51,7 +51,9 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
5151 $n++;
5252 $rootDir = $ARGV[$n];
5353 die "$0: ‘--root’ requires an argument\n" unless defined $rootDir;
54+ die "$0: no need to specify `/` with `--root`, it is the default\n" if $rootDir eq "/";
5455 $rootDir =~ s/\/*$//; # remove trailing slashes
56+ $rootDir = File::Spec->rel2abs($rootDir); # resolve absolute path
5557 }
5658 elsif ($arg eq "--force") {
5759 $force = 1;
@@ -279,7 +281,7 @@ if (`lsblk -o TYPE` =~ "lvm") {
279281 push @initrdKernelModules, "dm-snapshot";
280282}
281283
282−my $virt = `systemd-detect-virt`;
284+my $virt = `@detectvirt@`;
283285chomp $virt;
284286
285287
@@ -398,7 +400,7 @@ foreach my $fs (read_file("/proc/self/mountinfo")) {
398400 # Maybe this is a bind-mount of a filesystem we saw earlier?
399401 if (defined $fsByDev{$fields[2]}) {
400402 # Make sure this isn't a btrfs subvolume.
401− my $msg = `btrfs subvol show $rootDir$mountPoint`;
403+ my $msg = `@btrfs@ subvol show $rootDir$mountPoint`;
402404 if ($? != 0 || $msg =~ /ERROR:/s) {
403405 my $path = $fields[3]; $path = "" if $path eq "/";
404406 my $base = $fsByDev{$fields[2]};
@@ -436,7 +438,7 @@ EOF
436438
437439 # Is this a btrfs filesystem?
438440 if ($fsType eq "btrfs") {
439− my ($status, @info) = runCommand("btrfs subvol show $rootDir$mountPoint");
441+ my ($status, @info) = runCommand("@btrfs@ subvol show $rootDir$mountPoint");
440442 if ($status != 0 || join("", @info) =~ /ERROR:/) {
441443 die "Failed to retrieve subvolume info for $mountPoint\n";
442444 }
@@ -558,6 +560,8 @@ if (!$noFilesystems) {
558560 $fsAndSwap .= "swapDevices =" . multiLineList(" ", @swapDevices) . ";\n";
559561}
560562
563+my $networkingDhcpConfig = generateNetworkingDhcpConfig();
564+
561565my $hwConfig = <<EOF;
562566# Do not modify this file! It was generated by ‘nixos-generate-config’
563567# and may be overwritten by future invocations. Please make changes
@@ -572,6 +576,7 @@ my $hwConfig = <<EOF;
572576 boot.kernelModules = [$kernelModules ];
573577 boot.extraModulePackages = [$modulePackages ];
574578$fsAndSwap
579+$networkingDhcpConfig
575580${\join "", (map { " $_\n" } (uniq @attrs))}}
576581EOF
577582
@@ -580,13 +585,13 @@ sub generateNetworkingDhcpConfig {
580585 # The global useDHCP flag is deprecated, therefore explicitly set to false here.
581586 # Per-interface useDHCP will be mandatory in the future, so this generated config
582587 # replicates the default behaviour.
583− networking.useDHCP = false;
588+ networking.useDHCP = lib.mkDefault false;
584589EOF
585590
586591 foreach my $path (glob "/sys/class/net/*") {
587592 my $dev = basename($path);
588593 if ($dev ne "lo") {
589− $config .= " networking.interfaces.$dev.useDHCP = true;\n";
594+ $config .= " networking.interfaces.$dev.useDHCP = lib.mkDefault true;\n";
590595 }
591596 }
592597
@@ -613,7 +618,12 @@ EOF
613618if ($showHardwareConfig) {
614619 print STDOUT $hwConfig;
615620} else {
616− $outDir = "$rootDir$outDir";
621+ if ($outDir eq "/etc/nixos") {
622+ $outDir = "$rootDir$outDir";
623+ } else {
624+ $outDir = File::Spec->rel2abs($outDir);
625+ $outDir =~ s/\/*$//; # remove trailing slashes
626+ }
617627
618628 my $fn = "$outDir/hardware-configuration.nix";
619629 print STDERR "writing $fn...\n";
nixos/modules/installer/tools/tools.nix+10−4
@@ -33,8 +33,9 @@ let
3333 nixos-generate-config = makeProg {
3434 name = "nixos-generate-config";
3535 src = ./nixos-generate-config.pl;
36− path = lib.optionals (lib.elem "btrfs" config.boot.supportedFilesystems) [ pkgs.btrfs-progs ];
3736 perl = "${pkgs.perl.withPackages (p: [ p.FileSlurp ])}/bin/perl";
37+ detectvirt = "${pkgs.systemd}/bin/systemd-detect-virt";
38+ btrfs = "${pkgs.btrfs-progs}/bin/btrfs";
3839 inherit (config.system.nixos-generate-config) configuration desktopConfiguration;
3940 xserverEnabled = config.services.xserver.enable;
4041 };
@@ -116,7 +117,7 @@ in
116117 '';
117118 };
118119
119− config = lib.mkIf (!config.system.disableInstallerTools) {
120+ config = lib.mkIf (config.nix.enable && !config.system.disableInstallerTools) {
120121
121122 system.nixos-generate-config.configuration = mkDefault ''
122123 # Edit this configuration file to define what should be installed on
@@ -133,12 +134,13 @@ in
133134
134135 $bootLoaderConfig
135136 # networking.hostName = "nixos"; # Define your hostname.
137+ # Pick only one of the below networking options.
136138 # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
139+ # networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
137140
138141 # Set your time zone.
139142 # time.timeZone = "Europe/Amsterdam";
140143
141− $networkingDhcpConfig
142144 # Configure network proxy if necessary
143145 # networking.proxy.default = "http://user:password\@proxy:port/";
144146 # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
@@ -148,6 +150,7 @@ in
148150 # console = {
149151 # font = "Lat2-Terminus16";
150152 # keyMap = "us";
153+ # useXkbConfig = true; # use xkbOptions in tty.
151154 # };
152155
153156 $xserverConfig
@@ -155,7 +158,10 @@ in
155158 $desktopConfiguration
156159 # Configure keymap in X11
157160 # services.xserver.layout = "us";
158− # services.xserver.xkbOptions = "eurosign:e";
161+ # services.xserver.xkbOptions = {
162+ # "eurosign:e";
163+ # "caps:escape" # map caps to escape.
164+ # };
159165
160166 # Enable CUPS to print documents.
161167 # services.printing.enable = true;
nixos/modules/installer/virtualbox-demo.nix+1−1
@@ -25,7 +25,7 @@ with lib;
2525
2626 installer.cloneConfigExtra = ''
2727 # Let demo build as a trusted user.
28− # nix.trustedUsers = [ "demo" ];
28+ # nix.settings.trusted-users = [ "demo" ];
2929
3030 # Mount a VirtualBox shared folder.
3131 # This is configurable in the VirtualBox menu at
nixos/modules/misc/documentation.nix+5−73
@@ -61,85 +61,17 @@ let
6161 in scrubbedEval.options;
6262 baseOptionsJSON =
6363 let
64− filterIntoStore =
64+ filter =
6565 builtins.filterSource
6666 (n: t:
6767 (t == "directory" -> baseNameOf n != "tests")
6868 && (t == "file" -> hasSuffix ".nix" n)
6969 );
70−
71− # Figure out if Nix runs in pure evaluation mode. May return true in
72− # impure mode, but this is highly unlikely.
73− # We need to know because of https://github.com/NixOS/nix/issues/1888
74− # and https://github.com/NixOS/nix/issues/5868
75− isPureEval = builtins.getEnv "PATH" == "" && builtins.getEnv "_" == "";
76−
77− # Return a nixpkgs subpath with minimal copying.
78− #
79− # The sources for the base options json derivation can come in one of
80− # two forms:
81− # - single source: a store path with all of nixpkgs, postfix with
82− # subpaths to access various directories. This has the benefit of
83− # not creating copies of these subtrees in the Nix store, but
84− # can cause unnecessary rebuilds if you update the Nixpkgs `pkgs`
85− # tree often.
86− # - split sources: multiple store paths with subdirectories of
87− # nixpkgs that exclude the bulk of the pkgs directory.
88− # This requires more copying and hashing during evaluation but
89− # requires fewer files to be copied. This method produces fewer
90− # unnecessary rebuilds of the base options json.
91− #
92− # Flake
93− #
94− # Flakes always put a copy of the full nixpkgs sources in the store,
95− # so we can use the "single source" method. This method is ideal
96− # for using nixpkgs as a dependency, as the base options json will be
97− # substitutable from cache.nixos.org.
98− #
99− # This requires that the `self.outPath` is wired into `pkgs` correctly,
100− # which is done for you if `pkgs` comes from the `lib.nixosSystem` or
101− # `legacyPackages` flake attributes.
102− #
103− # Other Nixpkgs invocation
104− #
105− # If you do not use the known-correct flake attributes, but rather
106− # invoke Nixpkgs yourself, set `config.path` to the correct path value,
107− # e.g. `import nixpkgs { config.path = nixpkgs; }`.
108− #
109− # Choosing between single or split source paths
110− #
111− # We make assumptions based on the type and contents of `pkgs.path`.
112− # By passing a different `config.path` to Nixpkgs, you can influence
113− # how your documentation cache is evaluated and rebuilt.
114− #
115− # Single source
116− # - If pkgs.path is a string containing a store path, the code has no
117− # choice but to create this store path, if it hasn't already been.
118− # We assume that the "single source" method is most efficient.
119− # - If pkgs.path is a path value containing that is a store path,
120− # we try to convert it to a string with context without copying.
121− # This occurs for example when nixpkgs was fetched and using its
122− # default `config.path`, which is `./.`.
123− # Nix currently does not allow this conversion when evaluating in
124− # pure mode. If the conversion is not possible, we use the
125− # "split source" method.
126− #
127− # Split source
128− # - If pkgs.path is a path value that is not a store path, we assume
129− # that it's unlikely for all of nixpkgs to end up in the store for
130− # other reasons and try to keep both the copying and rebuilds low.
131− pull =
132− if builtins.typeOf pkgs.path == "string" && isStorePath pkgs.path then
133− dir: "${pkgs.path}/${dir}"
134− else if !isPureEval && isStorePath pkgs.path then
135− dir: "${builtins.storePath pkgs.path}/${dir}"
136− else
137− dir: filterIntoStore "${toString pkgs.path}/${dir}";
13870 in
13971 pkgs.runCommand "lazy-options.json" {
140− libPath = pull "lib";
141− pkgsLibPath = pull "pkgs/pkgs-lib";
142− nixosPath = pull "nixos";
72+ libPath = filter "${toString pkgs.path}/lib";
73+ pkgsLibPath = filter "${toString pkgs.path}/pkgs/pkgs-lib";
74+ nixosPath = filter "${toString pkgs.path}/nixos";
14375 modules = map (p: ''"${removePrefix "${modulesPath}/" (toString p)}"'') docModules.lazy;
14476 } ''
14577 export NIX_STORE_DIR=$TMPDIR/store
@@ -197,7 +129,7 @@ let
197129 genericName = "View NixOS documentation in a web browser";
198130 icon = "nix-snowflake";
199131 exec = "nixos-help";
200− categories = "System";
132+ categories = ["System"];
201133 };
202134
203135 in pkgs.symlinkJoin {
nixos/modules/misc/ids.nix+3−3
@@ -82,14 +82,14 @@ in
8282 git = 41;
8383 #fourstore = 42; # dropped in 20.03
8484 #fourstorehttp = 43; # dropped in 20.03
85− virtuoso = 44;
85+ #virtuoso = 44; dropped module
8686 #rtkit = 45; # dynamically allocated 2021-09-03
8787 dovecot2 = 46;
8888 dovenull2 = 47;
8989 prayer = 49;
9090 mpd = 50;
9191 clamav = 51;
92− fprot = 52;
92+ #fprot = 52; # unused
9393 # bind = 53; #dynamically allocated as of 2021-09-03
9494 wwwrun = 54;
9595 #adm = 55; # unused
@@ -412,7 +412,7 @@ in
412412 prayer = 49;
413413 mpd = 50;
414414 clamav = 51;
415− fprot = 52;
415+ #fprot = 52; # unused
416416 #bind = 53; # unused
417417 wwwrun = 54;
418418 adm = 55;
nixos/modules/misc/locate.nix+5−1
@@ -183,7 +183,11 @@ in
183183
184184 pruneNames = mkOption {
185185 type = listOf str;
186− default = [ ".bzr" ".cache" ".git" ".hg" ".svn" ];
186+ default = lib.optionals (!isFindutils) [ ".bzr" ".cache" ".git" ".hg" ".svn" ];
187+ defaultText = literalDocBook ''
188+ <literal>[ ".bzr" ".cache" ".git" ".hg" ".svn" ]</literal>, if
189+ supported by the locate implementation (i.e. mlocate or plocate).
190+ '';
187191 description = ''
188192 Directory components which should exclude paths containing them from indexing
189193 '';
nixos/modules/misc/nixpkgs.nix−2
@@ -59,8 +59,6 @@ let
5959 inherit (cfg) config overlays localSystem crossSystem;
6060 };
6161
62− # NOTE: flake.nix assumes that nixpkgs.config is only used with ../../..
63− # as nixpkgs.config.path should be equivalent to ../../..
6462 finalPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else defaultPkgs;
6563
6664in
nixos/modules/misc/version.nix+36−19
@@ -1,12 +1,21 @@
11{ config, lib, options, pkgs, ... }:
22
3−with lib;
4−
53let
64 cfg = config.system.nixos;
75 opt = options.system.nixos;
8−in
96
7+ inherit (lib)
8+ concatStringsSep mapAttrsToList toLower
9+ literalExpression mkRenamedOptionModule mkDefault mkOption trivial types;
10+
11+ needsEscaping = s: null != builtins.match "[a-zA-Z0-9]+" s;
12+ escapeIfNeccessary = s: if needsEscaping s then s else ''"${lib.escape [ "\$" "\"" "\\" "\`" ] s}"'';
13+ attrsToText = attrs:
14+ concatStringsSep "\n" (
15+ mapAttrsToList (n: v: ''${n}=${escapeIfNeccessary (toString v)}'') attrs
16+ );
17+
18+in
1019{
1120 imports = [
1221 (mkRenamedOptionModule [ "system" "nixosVersion" ] [ "system" "nixos" "version" ])
@@ -101,22 +110,30 @@ in
101110 # Generate /etc/os-release. See
102111 # https://www.freedesktop.org/software/systemd/man/os-release.html for the
103112 # format.
104− environment.etc.os-release.text =
105− ''
106− NAME=NixOS
107− ID=nixos
108− VERSION="${cfg.release} (${cfg.codeName})"
109− VERSION_CODENAME=${toLower cfg.codeName}
110− VERSION_ID="${cfg.release}"
111− BUILD_ID="${cfg.version}"
112− PRETTY_NAME="NixOS ${cfg.release} (${cfg.codeName})"
113− LOGO="nix-snowflake"
114− HOME_URL="https://nixos.org/"
115− DOCUMENTATION_URL="https://nixos.org/learn.html"
116− SUPPORT_URL="https://nixos.org/community.html"
117− BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
118− '';
119−
113+ environment.etc = {
114+ "lsb-release".text = attrsToText {
115+ LSB_VERSION = "${cfg.release} (${cfg.codeName})";
116+ DISTRIB_ID = "nixos";
117+ DISTRIB_RELEASE = cfg.release;
118+ DISTRIB_CODENAME = toLower cfg.codeName;
119+ DISTRIB_DESCRIPTION = "NixOS ${cfg.release} (${cfg.codeName})";
120+ };
121+
122+ "os-release".text = attrsToText {
123+ NAME = "NixOS";
124+ ID = "nixos";
125+ VERSION = "${cfg.release} (${cfg.codeName})";
126+ VERSION_CODENAME = toLower cfg.codeName;
127+ VERSION_ID = cfg.release;
128+ BUILD_ID = cfg.version;
129+ PRETTY_NAME = "NixOS ${cfg.release} (${cfg.codeName})";
130+ LOGO = "nix-snowflake";
131+ HOME_URL = "https://nixos.org/";
132+ DOCUMENTATION_URL = "https://nixos.org/learn.html";
133+ SUPPORT_URL = "https://nixos.org/community.html";
134+ BUG_REPORT_URL = "https://github.com/NixOS/nixpkgs/issues";
135+ };
136+ };
120137 };
121138
122139 # uses version info nixpkgs, which requires a full nixpkgs path
nixos/modules/misc/wordlist.nixnew file+59
@@ -0,0 +1,59 @@
1+{ config, lib, pkgs, ... }:
2+with lib;
3+let
4+ concatAndSort = name: files: pkgs.runCommand name {} ''
5+ awk 1 ${lib.escapeShellArgs files} | sed '{ /^\s*$/d; s/^\s\+//; s/\s\+$// }' | sort | uniq > $out
6+ '';
7+in
8+{
9+ options = {
10+ environment.wordlist = {
11+ enable = mkEnableOption "environment variables for lists of words";
12+
13+ lists = mkOption {
14+ type = types.attrsOf (types.nonEmptyListOf types.path);
15+
16+ default = {
17+ WORDLIST = [ "${pkgs.scowl}/share/dict/words.txt" ];
18+ };
19+
20+ defaultText = literalExpression ''
21+ {
22+ WORDLIST = [ "''${pkgs.scowl}/share/dict/words.txt" ];
23+ }
24+ '';
25+
26+ description = ''
27+ A set with the key names being the environment variable you'd like to
28+ set and the values being a list of paths to text documents containing
29+ lists of words. The various files will be merged, sorted, duplicates
30+ removed, and extraneous spacing removed.
31+
32+ If you have a handful of words that you want to add to an already
33+ existing wordlist, you may find `builtins.toFile` useful for this
34+ task.
35+ '';
36+
37+ example = literalExpression ''
38+ {
39+ WORDLIST = [ "''${pkgs.scowl}/share/dict/words.txt" ];
40+ AUGMENTED_WORDLIST = [
41+ "''${pkgs.scowl}/share/dict/words.txt"
42+ "''${pkgs.scowl}/share/dict/words.variants.txt"
43+ (builtins.toFile "extra-words" '''
44+ desynchonization
45+ oobleck''')
46+ ];
47+ }
48+ '';
49+ };
50+ };
51+ };
52+
53+ config = mkIf config.environment.wordlist.enable {
54+ environment.variables =
55+ lib.mapAttrs
56+ (name: value: "${concatAndSort "wordlist-${name}" value}")
57+ config.environment.wordlist.lists;
58+ };
59+}
nixos/modules/module-list.nix+36−12
@@ -91,6 +91,7 @@
9191 ./hardware/video/switcheroo-control.nix
9292 ./hardware/video/uvcvideo/default.nix
9393 ./hardware/video/webcam/facetimehd.nix
94+ ./hardware/xone.nix
9495 ./hardware/xpadneo.nix
9596 ./i18n/input-method/default.nix
9697 ./i18n/input-method/fcitx.nix
@@ -115,7 +116,9 @@
115116 ./misc/nixpkgs.nix
116117 ./misc/passthru.nix
117118 ./misc/version.nix
119+ ./misc/wordlist.nix
118120 ./misc/nixops-autoluks.nix
121+ ./programs/_1password-gui.nix
119122 ./programs/adb.nix
120123 ./programs/appgate-sdp.nix
121124 ./programs/atop.nix
@@ -166,6 +169,8 @@
166169 ./programs/iftop.nix
167170 ./programs/iotop.nix
168171 ./programs/java.nix
172+ ./programs/k40-whisperer.nix
173+ ./programs/kclock.nix
169174 ./programs/kdeconnect.nix
170175 ./programs/kbdlight.nix
171176 ./programs/less.nix
@@ -176,8 +181,11 @@
176181 ./programs/msmtp.nix
177182 ./programs/mtr.nix
178183 ./programs/nano.nix
184+ ./programs/nbd.nix
185+ ./programs/nix-ld.nix
179186 ./programs/neovim.nix
180187 ./programs/nm-applet.nix
188+ ./programs/nncp.nix
181189 ./programs/npm.nix
182190 ./programs/noisetorch.nix
183191 ./programs/oblogout.nix
@@ -203,7 +211,6 @@
203211 ./programs/sway.nix
204212 ./programs/system-config-printer.nix
205213 ./programs/thefuck.nix
206− ./programs/tilp2.nix
207214 ./programs/tmux.nix
208215 ./programs/traceroute.nix
209216 ./programs/tsm-client.nix
@@ -253,6 +260,7 @@
253260 ./security/tpm2.nix
254261 ./services/admin/meshcentral.nix
255262 ./services/admin/oxidized.nix
263+ ./services/admin/pgadmin.nix
256264 ./services/admin/salt/master.nix
257265 ./services/admin/salt/minion.nix
258266 ./services/amqp/activemq/default.nix
@@ -297,6 +305,7 @@
297305 ./services/backup/znapzend.nix
298306 ./services/blockchain/ethereum/geth.nix
299307 ./services/backup/zrepl.nix
308+ ./services/cluster/corosync/default.nix
300309 ./services/cluster/hadoop/default.nix
301310 ./services/cluster/k3s/default.nix
302311 ./services/cluster/kubernetes/addons/dns.nix
@@ -309,6 +318,7 @@
309318 ./services/cluster/kubernetes/pki.nix
310319 ./services/cluster/kubernetes/proxy.nix
311320 ./services/cluster/kubernetes/scheduler.nix
321+ ./services/cluster/pacemaker/default.nix
312322 ./services/cluster/spark/default.nix
313323 ./services/computing/boinc/client.nix
314324 ./services/computing/foldingathome/client.nix
@@ -350,14 +360,12 @@
350360 ./services/databases/redis.nix
351361 ./services/databases/riak.nix
352362 ./services/databases/victoriametrics.nix
353− ./services/databases/virtuoso.nix
354363 ./services/desktops/accountsservice.nix
355364 ./services/desktops/bamf.nix
356365 ./services/desktops/blueman.nix
357366 ./services/desktops/cpupower-gui.nix
358367 ./services/desktops/dleyna-renderer.nix
359368 ./services/desktops/dleyna-server.nix
360− ./services/desktops/pantheon/files.nix
361369 ./services/desktops/espanso.nix
362370 ./services/desktops/flatpak.nix
363371 ./services/desktops/geoclue2.nix
@@ -396,6 +404,7 @@
396404 ./services/development/jupyterhub/default.nix
397405 ./services/development/rstudio-server/default.nix
398406 ./services/development/lorri.nix
407+ ./services/development/zammad.nix
399408 ./services/display-managers/greetd.nix
400409 ./services/editors/emacs.nix
401410 ./services/editors/infinoted.nix
@@ -452,6 +461,8 @@
452461 ./services/hardware/undervolt.nix
453462 ./services/hardware/vdr.nix
454463 ./services/hardware/xow.nix
464+ ./services/home-automation/home-assistant.nix
465+ ./services/home-automation/zigbee2mqtt.nix
455466 ./services/logging/SystemdJournal2Gelf.nix
456467 ./services/logging/awstats.nix
457468 ./services/logging/filebeat.nix
@@ -496,6 +507,7 @@
496507 ./services/mail/roundcube.nix
497508 ./services/mail/sympa.nix
498509 ./services/mail/nullmailer.nix
510+ ./services/matrix/matrix-synapse.nix
499511 ./services/matrix/mjolnir.nix
500512 ./services/matrix/pantalaimon.nix
501513 ./services/misc/ananicy.nix
@@ -547,8 +559,8 @@
547559 ./services/misc/headphones.nix
548560 ./services/misc/heisenbridge.nix
549561 ./services/misc/greenclip.nix
550− ./services/misc/home-assistant.nix
551562 ./services/misc/ihaskell.nix
563+ ./services/misc/input-remapper.nix
552564 ./services/misc/irkerd.nix
553565 ./services/misc/jackett.nix
554566 ./services/misc/jellyfin.nix
@@ -562,7 +574,6 @@
562574 ./services/misc/matrix-appservice-discord.nix
563575 ./services/misc/matrix-appservice-irc.nix
564576 ./services/misc/matrix-conduit.nix
565− ./services/misc/matrix-synapse.nix
566577 ./services/misc/mautrix-facebook.nix
567578 ./services/misc/mautrix-telegram.nix
568579 ./services/misc/mbpfan.nix
@@ -597,6 +608,7 @@
597608 ./services/misc/redmine.nix
598609 ./services/misc/rippled.nix
599610 ./services/misc/ripple-data-api.nix
611+ ./services/misc/rmfakecloud.nix
600612 ./services/misc/serviio.nix
601613 ./services/misc/safeeyes.nix
602614 ./services/misc/sdrplay.nix
@@ -622,7 +634,6 @@
622634 ./services/misc/weechat.nix
623635 ./services/misc/xmr-stak.nix
624636 ./services/misc/xmrig.nix
625− ./services/misc/zigbee2mqtt.nix
626637 ./services/misc/zoneminder.nix
627638 ./services/misc/zookeeper.nix
628639 ./services/monitoring/alerta.nix
@@ -684,6 +695,7 @@
684695 ./services/network-filesystems/litestream/default.nix
685696 ./services/network-filesystems/netatalk.nix
686697 ./services/network-filesystems/nfsd.nix
698+ ./services/network-filesystems/moosefs.nix
687699 ./services/network-filesystems/openafs/client.nix
688700 ./services/network-filesystems/openafs/server.nix
689701 ./services/network-filesystems/orangefs/server.nix
@@ -717,6 +729,7 @@
717729 ./services/networking/bird.nix
718730 ./services/networking/bitlbee.nix
719731 ./services/networking/blockbook-frontend.nix
732+ ./services/networking/blocky.nix
720733 ./services/networking/charybdis.nix
721734 ./services/networking/cjdns.nix
722735 ./services/networking/cntlm.nix
@@ -760,12 +773,13 @@
760773 ./services/networking/go-neb.nix
761774 ./services/networking/go-shadowsocks2.nix
762775 ./services/networking/gobgpd.nix
763− ./services/networking/gogoclient.nix
764776 ./services/networking/gvpe.nix
765777 ./services/networking/hans.nix
766778 ./services/networking/haproxy.nix
779+ ./services/networking/headscale.nix
767780 ./services/networking/hostapd.nix
768781 ./services/networking/htpdate.nix
782+ ./services/networking/https-dns-proxy.nix
769783 ./services/networking/hylafax/default.nix
770784 ./services/networking/i2pd.nix
771785 ./services/networking/i2p.nix
@@ -812,6 +826,7 @@
812826 ./services/networking/nar-serve.nix
813827 ./services/networking/nat.nix
814828 ./services/networking/nats.nix
829+ ./services/networking/nbd.nix
815830 ./services/networking/ndppd.nix
816831 ./services/networking/nebula.nix
817832 ./services/networking/networkmanager.nix
@@ -852,7 +867,6 @@
852867 ./services/networking/quassel.nix
853868 ./services/networking/quorum.nix
854869 ./services/networking/quicktun.nix
855− ./services/networking/racoon.nix
856870 ./services/networking/radicale.nix
857871 ./services/networking/radvd.nix
858872 ./services/networking/rdnssd.nix
@@ -872,6 +886,7 @@
872886 ./services/networking/shorewall6.nix
873887 ./services/networking/shout.nix
874888 ./services/networking/sniproxy.nix
889+ ./services/networking/snowflake-proxy.nix
875890 ./services/networking/smartdns.nix
876891 ./services/networking/smokeping.nix
877892 ./services/networking/softether.nix
@@ -896,6 +911,7 @@
896911 ./services/networking/tcpcrypt.nix
897912 ./services/networking/teamspeak3.nix
898913 ./services/networking/tedicross.nix
914+ ./services/networking/tetrd.nix
899915 ./services/networking/teleport.nix
900916 ./services/networking/thelounge.nix
901917 ./services/networking/tinc.nix
@@ -915,6 +931,7 @@
915931 ./services/networking/vsftpd.nix
916932 ./services/networking/wasabibackend.nix
917933 ./services/networking/websockify.nix
934+ ./services/networking/wg-netmanager.nix
918935 ./services/networking/wg-quick.nix
919936 ./services/networking/wireguard.nix
920937 ./services/networking/wpa_supplicant.nix
@@ -944,7 +961,6 @@
944961 ./services/security/clamav.nix
945962 ./services/security/fail2ban.nix
946963 ./services/security/fprintd.nix
947− ./services/security/fprot.nix
948964 ./services/security/haka.nix
949965 ./services/security/haveged.nix
950966 ./services/security/hockeypuck.nix
@@ -977,6 +993,7 @@
977993 ./services/system/nscd.nix
978994 ./services/system/saslauthd.nix
979995 ./services/system/self-deploy.nix
996+ ./services/system/systembus-notify.nix
980997 ./services/system/uptimed.nix
981998 ./services/torrent/deluge.nix
982999 ./services/torrent/flexget.nix
@@ -1006,6 +1023,7 @@
10061023 ./services/web-apps/documize.nix
10071024 ./services/web-apps/dokuwiki.nix
10081025 ./services/web-apps/engelsystem.nix
1026+ ./services/web-apps/ethercalc.nix
10091027 ./services/web-apps/fluidd.nix
10101028 ./services/web-apps/galene.nix
10111029 ./services/web-apps/gerrit.nix
@@ -1055,6 +1073,7 @@
10551073 ./services/web-apps/wordpress.nix
10561074 ./services/web-apps/youtrack.nix
10571075 ./services/web-apps/zabbix.nix
1076+ ./services/web-servers/agate.nix
10581077 ./services/web-servers/apache-httpd/default.nix
10591078 ./services/web-servers/caddy/default.nix
10601079 ./services/web-servers/darkhttpd.nix
@@ -1074,7 +1093,6 @@
10741093 ./services/web-servers/phpfpm/default.nix
10751094 ./services/web-servers/pomerium.nix
10761095 ./services/web-servers/unit/default.nix
1077− ./services/web-servers/shellinabox.nix
10781096 ./services/web-servers/tomcat.nix
10791097 ./services/web-servers/traefik.nix
10801098 ./services/web-servers/trafficserver/default.nix
@@ -1154,15 +1172,21 @@
11541172 ./system/boot/stage-1.nix
11551173 ./system/boot/stage-2.nix
11561174 ./system/boot/systemd.nix
1157− ./system/boot/systemd-nspawn.nix
1175+ ./system/boot/systemd/coredump.nix
1176+ ./system/boot/systemd/journald.nix
1177+ ./system/boot/systemd/logind.nix
1178+ ./system/boot/systemd/nspawn.nix
1179+ ./system/boot/systemd/tmpfiles.nix
1180+ ./system/boot/systemd/user.nix
11581181 ./system/boot/timesyncd.nix
11591182 ./system/boot/tmp.nix
1160− ./system/etc/etc.nix
1183+ ./system/etc/etc-activation.nix
11611184 ./tasks/auto-upgrade.nix
11621185 ./tasks/bcache.nix
11631186 ./tasks/cpu-freq.nix
11641187 ./tasks/encrypted-devices.nix
11651188 ./tasks/filesystems.nix
1189+ ./tasks/filesystems/apfs.nix
11661190 ./tasks/filesystems/bcachefs.nix
11671191 ./tasks/filesystems/btrfs.nix
11681192 ./tasks/filesystems/cifs.nix
nixos/modules/profiles/hardened.nix+1−1
@@ -17,7 +17,7 @@ with lib;
1717
1818 boot.kernelPackages = mkDefault pkgs.linuxPackages_hardened;
1919
20− nix.allowedUsers = mkDefault [ "@users" ];
20+ nix.settings.allowed-users = mkDefault [ "@users" ];
2121
2222 environment.memoryAllocator.provider = mkDefault "scudo";
2323 environment.variables.SCUDO_OPTIONS = mkDefault "ZeroContents=1";
nixos/modules/programs/_1password-gui.nixnew file+69
@@ -0,0 +1,69 @@
1+{ config, pkgs, lib, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.programs._1password-gui;
7+
8+in {
9+ options = {
10+ programs._1password-gui = {
11+ enable = mkEnableOption "The 1Password Desktop application with browser integration";
12+
13+ groupId = mkOption {
14+ type = types.int;
15+ example = literalExpression "5000";
16+ description = ''
17+ The GroupID to assign to the onepassword group, which is needed for browser integration. The group ID must be 1000 or greater.
18+ '';
19+ };
20+
21+ polkitPolicyOwners = mkOption {
22+ type = types.listOf types.str;
23+ default = [];
24+ example = literalExpression "[\"user1\" \"user2\" \"user3\"]";
25+ description = ''
26+ A list of users who should be able to integrate 1Password with polkit-based authentication mechanisms. By default, no users will have such access.
27+ '';
28+ };
29+
30+ package = mkOption {
31+ type = types.package;
32+ default = pkgs._1password-gui;
33+ defaultText = literalExpression "pkgs._1password-gui";
34+ example = literalExpression "pkgs._1password-gui";
35+ description = ''
36+ The 1Password derivation to use. This can be used to upgrade from the stable release that we keep in nixpkgs to the betas.
37+ '';
38+ };
39+ };
40+ };
41+
42+ config = let
43+ package = cfg.package.override {
44+ polkitPolicyOwners = cfg.polkitPolicyOwners;
45+ };
46+ in mkIf cfg.enable {
47+ environment.systemPackages = [ package ];
48+ users.groups.onepassword.gid = cfg.groupId;
49+
50+ security.wrappers = {
51+ "1Password-BrowserSupport" =
52+ { source = "${cfg.package}/share/1password/1Password-BrowserSupport";
53+ owner = "root";
54+ group = "onepassword";
55+ setuid = false;
56+ setgid = true;
57+ };
58+
59+ "1Password-KeyringHelper" =
60+ { source = "${cfg.package}/share/1password/1Password-KeyringHelper";
61+ owner = "root";
62+ group = "onepassword";
63+ setuid = true;
64+ setgid = true;
65+ };
66+ };
67+
68+ };
69+}
nixos/modules/programs/calls.nix+2
@@ -14,6 +14,8 @@ in {
1414 };
1515
1616 config = mkIf cfg.enable {
17+ programs.dconf.enable = true;
18+
1719 environment.systemPackages = [
1820 pkgs.calls
1921 ];
nixos/modules/programs/captive-browser.nix+19−1
@@ -1,8 +1,12 @@
11{ config, lib, pkgs, ... }:
22
3−with lib;
43let
54 cfg = config.programs.captive-browser;
5+
6+ inherit (lib)
7+ concatStringsSep escapeShellArgs optionalString
8+ literalExpression mkEnableOption mkIf mkOption mkOptionDefault types;
9+
610 browserDefault = chromium: concatStringsSep " " [
711 ''env XDG_CONFIG_HOME="$PREV_CONFIG_HOME"''
812 ''${chromium}/bin/chromium''
@@ -15,6 +19,15 @@ let
1519 ''-no-default-browser-check''
1620 ''http://cache.nixos.org/''
1721 ];
22+
23+ desktopItem = pkgs.makeDesktopItem {
24+ name = "captive-browser";
25+ desktopName = "Captive Portal Browser";
26+ exec = "/run/wrappers/bin/captive-browser";
27+ icon = "nix-snowflake";
28+ categories = [ "Network" ];
29+ };
30+
1831in
1932{
2033 ###### interface
@@ -84,6 +97,11 @@ in
8497 ###### implementation
8598
8699 config = mkIf cfg.enable {
100+ environment.systemPackages = [
101+ (pkgs.runCommandNoCC "captive-browser-desktop-item" { } ''
102+ install -Dm444 -t $out/share/applications ${desktopItem}/share/applications/*.desktop
103+ '')
104+ ];
87105
88106 programs.captive-browser.dhcp-dns =
89107 let
nixos/modules/programs/command-not-found/command-not-found.pl+36−4
@@ -21,11 +21,24 @@ my $res = $dbh->selectall_arrayref(
2121 "select package from Programs where system = ? and name = ?",
2222 { Slice => {} }, $system, $program);
2323
24−if (!defined $res || scalar @$res == 0) {
24+my $len = !defined $res ? 0 : scalar @$res;
25+
26+if ($len == 0) {
2527 print STDERR "$program: command not found\n";
26−} elsif (scalar @$res == 1) {
28+} elsif ($len == 1) {
2729 my $package = @$res[0]->{package};
2830 if ($ENV{"NIX_AUTO_RUN"} // "") {
31+ if ($ENV{"NIX_AUTO_RUN_INTERACTIVE"} // "") {
32+ while (1) {
33+ print STDERR "'$program' from package '$package' will be run, confirm? [yn]: ";
34+ chomp(my $comfirm = <STDIN>);
35+ if (lc $comfirm eq "n") {
36+ exit 0;
37+ } elsif (lc $comfirm eq "y") {
38+ last;
39+ }
40+ }
41+ }
2942 exec("nix-shell", "-p", $package, "--run", shell_quote("exec", @ARGV));
3043 } else {
3144 print STDERR <<EOF;
@@ -35,11 +48,30 @@ ephemeral shell by typing:
3548EOF
3649 }
3750} else {
38− print STDERR <<EOF;
51+ if ($ENV{"NIX_AUTO_RUN"} // "") {
52+ print STDERR "Select a package that provides '$program':\n";
53+ for my $i (0 .. $len - 1) {
54+ print STDERR " [", $i + 1, "]: @$res[$i]->{package}\n";
55+ }
56+ my $choice = 0;
57+ while (1) { # exec will break this loop
58+ no warnings "numeric";
59+ print STDERR "Your choice [1-${len}]: ";
60+ # 0 can be invalid user input like non-number string
61+ # so we start from 1
62+ $choice = <STDIN> + 0;
63+ if (1 <= $choice && $choice <= $len) {
64+ exec("nix-shell", "-p", @$res[$choice - 1]->{package},
65+ "--run", shell_quote("exec", @ARGV));
66+ }
67+ }
68+ } else {
69+ print STDERR <<EOF;
3970The program '$program' is not in your PATH. It is provided by several packages.
4071You can make it available in an ephemeral shell by typing one of the following:
4172EOF
42− print STDERR " nix-shell -p $_->{package}\n" foreach @$res;
73+ print STDERR " nix-shell -p $_->{package}\n" foreach @$res;
74+ }
4375}
4476
4577exit 127;
nixos/modules/programs/dconf.nix+1−1
@@ -60,7 +60,7 @@ in
6060 environment.systemPackages = [ pkgs.dconf ];
6161
6262 # Needed for unwrapped applications
63− environment.variables.GIO_EXTRA_MODULES = mkIf cfg.enable [ "${pkgs.dconf.lib}/lib/gio/modules" ];
63+ environment.sessionVariables.GIO_EXTRA_MODULES = mkIf cfg.enable [ "${pkgs.dconf.lib}/lib/gio/modules" ];
6464 };
6565
6666}
nixos/modules/programs/environment.nix+3−1
@@ -40,13 +40,15 @@ in
4040 KDEDIRS = [ "" ];
4141 QT_PLUGIN_PATH = [ "/lib/qt4/plugins" "/lib/kde4/plugins" ];
4242 QTWEBKIT_PLUGIN_PATH = [ "/lib/mozilla/plugins/" ];
43− GTK_PATH = [ "/lib/gtk-2.0" "/lib/gtk-3.0" ];
43+ GTK_PATH = [ "/lib/gtk-2.0" "/lib/gtk-3.0" "/lib/gtk-4.0" ];
4444 XDG_CONFIG_DIRS = [ "/etc/xdg" ];
4545 XDG_DATA_DIRS = [ "/share" ];
4646 MOZ_PLUGIN_PATH = [ "/lib/mozilla/plugins" ];
4747 LIBEXEC_PATH = [ "/lib/libexec" ];
4848 };
4949
50+ environment.pathsToLink = [ "/lib/gtk-2.0" "/lib/gtk-3.0" "/lib/gtk-4.0" ];
51+
5052 environment.extraInit =
5153 ''
5254 unset ASPELL_CONF
nixos/modules/programs/firejail.nix+2−2
@@ -17,8 +17,8 @@ let
1717 then value
1818 else { executable = value; profile = null; extraArgs = []; };
1919 args = lib.escapeShellArgs (
20− (optional (opts.profile != null) "--profile=${toString opts.profile}")
21− ++ opts.extraArgs
20+ opts.extraArgs
21+ ++ (optional (opts.profile != null) "--profile=${toString opts.profile}")
2222 );
2323 in
2424 ''
nixos/modules/programs/k40-whisperer.nixnew file+40
@@ -0,0 +1,40 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.programs.k40-whisperer;
7+ pkg = cfg.package.override {
8+ udevGroup = cfg.group;
9+ };
10+in
11+{
12+ options.programs.k40-whisperer = {
13+ enable = mkEnableOption "K40-Whisperer";
14+
15+ group = mkOption {
16+ type = types.str;
17+ description = ''
18+ Group assigned to the device when connected.
19+ '';
20+ default = "k40";
21+ };
22+
23+ package = mkOption {
24+ type = types.package;
25+ default = pkgs.k40-whisperer;
26+ defaultText = literalExpression "pkgs.k40-whisperer";
27+ example = literalExpression "pkgs.k40-whisperer";
28+ description = ''
29+ K40 Whisperer package to use.
30+ '';
31+ };
32+ };
33+
34+ config = mkIf cfg.enable {
35+ users.groups.${cfg.group} = {};
36+
37+ environment.systemPackages = [ pkg ];
38+ services.udev.packages = [ pkg ];
39+ };
40+}
nixos/modules/programs/kclock.nixnew file+13
@@ -0,0 +1,13 @@
1+{ lib, pkgs, config, ... }:
2+with lib;
3+let
4+ cfg = config.programs.kclock;
5+ kclockPkg = pkgs.libsForQt5.kclock;
6+in {
7+ options.programs.kclock = { enable = mkEnableOption "Enable KClock"; };
8+
9+ config = mkIf cfg.enable {
10+ services.dbus.packages = [ kclockPkg ];
11+ environment.systemPackages = [ kclockPkg ];
12+ };
13+}
nixos/modules/programs/nbd.nixnew file+19
@@ -0,0 +1,19 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.programs.nbd;
7+in
8+{
9+ options = {
10+ programs.nbd = {
11+ enable = mkEnableOption "Network Block Device (nbd) support";
12+ };
13+ };
14+
15+ config = mkIf cfg.enable {
16+ environment.systemPackages = with pkgs; [ nbd ];
17+ boot.kernelModules = [ "nbd" ];
18+ };
19+}
nixos/modules/programs/nix-ld.nixnew file+12
@@ -0,0 +1,12 @@
1+{ pkgs, lib, config, ... }:
2+{
3+ meta.maintainers = [ lib.maintainers.mic92 ];
4+ options = {
5+ programs.nix-ld.enable = lib.mkEnableOption ''nix-ld, Documentation: <link xlink:href="https://github.com/Mic92/nix-ld"/>'';
6+ };
7+ config = lib.mkIf config.programs.nix-ld.enable {
8+ systemd.tmpfiles.rules = [
9+ "L+ ${pkgs.nix-ld.ldPath} - - - - ${pkgs.nix-ld}/libexec/nix-ld"
10+ ];
11+ };
12+}
nixos/modules/programs/nncp.nixnew file+101
@@ -0,0 +1,101 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+let
5+ nncpCfgFile = "/run/nncp.hjson";
6+ programCfg = config.programs.nncp;
7+ settingsFormat = pkgs.formats.json { };
8+ jsonCfgFile = settingsFormat.generate "nncp.json" programCfg.settings;
9+ pkg = programCfg.package;
10+in {
11+ options.programs.nncp = {
12+
13+ enable =
14+ mkEnableOption "NNCP (Node to Node copy) utilities and configuration";
15+
16+ group = mkOption {
17+ type = types.str;
18+ default = "uucp";
19+ description = ''
20+ The group under which NNCP files shall be owned.
21+ Any member of this group may access the secret keys
22+ of this NNCP node.
23+ '';
24+ };
25+
26+ package = mkOption {
27+ type = types.package;
28+ default = pkgs.nncp;
29+ defaultText = literalExpression "pkgs.nncp";
30+ description = "The NNCP package to use system-wide.";
31+ };
32+
33+ secrets = mkOption {
34+ type = with types; listOf str;
35+ example = [ "/run/keys/nncp.hjson" ];
36+ description = ''
37+ A list of paths to NNCP configuration files that should not be
38+ in the Nix store. These files are layered on top of the values at
39+ <xref linkend="opt-programs.nncp.settings"/>.
40+ '';
41+ };
42+
43+ settings = mkOption {
44+ type = settingsFormat.type;
45+ description = ''
46+ NNCP configuration, see
47+ <link xlink:href="http://www.nncpgo.org/Configuration.html"/>.
48+ At runtime these settings will be overlayed by the contents of
49+ <xref linkend="opt-programs.nncp.secrets"/> into the file
50+ <literal>${nncpCfgFile}</literal>. Node keypairs go in
51+ <literal>secrets</literal>, do not specify them in
52+ <literal>settings</literal> as they will be leaked into
53+ <literal>/nix/store</literal>!
54+ '';
55+ default = { };
56+ };
57+
58+ };
59+
60+ config = mkIf programCfg.enable {
61+
62+ environment = {
63+ systemPackages = [ pkg ];
64+ etc."nncp.hjson".source = nncpCfgFile;
65+ };
66+
67+ programs.nncp.settings = {
68+ spool = mkDefault "/var/spool/nncp";
69+ log = mkDefault "/var/spool/nncp/log";
70+ };
71+
72+ systemd.tmpfiles.rules = [
73+ "d ${programCfg.settings.spool} 0770 root ${programCfg.group}"
74+ "f ${programCfg.settings.log} 0770 root ${programCfg.group}"
75+ ];
76+
77+ systemd.services.nncp-config = {
78+ path = [ pkg ];
79+ description = "Generate NNCP configuration";
80+ wantedBy = [ "basic.target" ];
81+ serviceConfig.Type = "oneshot";
82+ script = ''
83+ umask u=rw
84+ nncpCfgDir=$(mktemp --directory nncp.XXX)
85+ for f in ${jsonCfgFile} ${toString config.programs.nncp.secrets}; do
86+ tmpdir=$(mktemp --directory nncp.XXX)
87+ nncp-cfgdir -cfg $f -dump $tmpdir
88+ find $tmpdir -size 1c -delete
89+ cp -a $tmpdir/* $nncpCfgDir/
90+ rm -rf $tmpdir
91+ done
92+ nncp-cfgdir -load $nncpCfgDir > ${nncpCfgFile}
93+ rm -rf $nncpCfgDir
94+ chgrp ${programCfg.group} ${nncpCfgFile}
95+ chmod g+r ${nncpCfgFile}
96+ '';
97+ };
98+ };
99+
100+ meta.maintainers = with lib.maintainers; [ ehmry ];
101+}
nixos/modules/programs/phosh.nix+9−10
@@ -8,18 +8,17 @@ let
88 # Based on https://source.puri.sm/Librem5/librem5-base/-/blob/4596c1056dd75ac7f043aede07887990fd46f572/default/sm.puri.OSK0.desktop
99 oskItem = pkgs.makeDesktopItem {
1010 name = "sm.puri.OSK0";
11− type = "Application";
1211 desktopName = "On-screen keyboard";
1312 exec = "${pkgs.squeekboard}/bin/squeekboard";
14− categories = "GNOME;Core;";
15− extraEntries = ''
16− OnlyShowIn=GNOME;
17− NoDisplay=true
18− X-GNOME-Autostart-Phase=Panel
19− X-GNOME-Provides=inputmethod
20− X-GNOME-Autostart-Notify=true
21− X-GNOME-AutoRestart=true
22− '';
13+ categories = [ "GNOME" "Core" ];
14+ onlyShowIn = [ "GNOME" ];
15+ noDisplay = true;
16+ extraConfig = {
17+ X-GNOME-Autostart-Phase = "Panel";
18+ X-GNOME-Provides = "inputmethod";
19+ X-GNOME-Autostart-Notify = "true";
20+ X-GNOME-AutoRestart = "true";
21+ };
2322 };
2423
2524 phocConfigType = types.submodule {
nixos/modules/programs/spacefm.nix−2
@@ -27,13 +27,11 @@ in
2727 default = {
2828 tmp_dir = "/tmp";
2929 terminal_su = "${pkgs.sudo}/bin/sudo";
30− graphical_su = "${pkgs.gksu}/bin/gksu";
3130 };
3231 defaultText = literalExpression ''
3332 {
3433 tmp_dir = "/tmp";
3534 terminal_su = "''${pkgs.sudo}/bin/sudo";
36− graphical_su = "''${pkgs.gksu}/bin/gksu";
3735 }
3836 '';
3937 description = ''
nixos/modules/programs/sway.nix+1
@@ -134,6 +134,7 @@ in {
134134 '';
135135 };
136136 };
137+ security.polkit.enable = true;
137138 security.pam.services.swaylock = {};
138139 hardware.opengl.enable = mkDefault true;
139140 fonts.enableDefaultFonts = mkDefault true;
nixos/modules/programs/tilp2.nixdeleted−28
@@ -1,28 +0,0 @@
1−{ config, pkgs, lib, ... }:
2−
3−with lib;
4−
5−let
6− cfg = config.programs.tilp2;
7−
8−in {
9− options.programs.tilp2 = {
10− enable = mkOption {
11− type = types.bool;
12− default = false;
13− description = ''
14− Enable tilp2 and udev rules for supported calculators.
15− '';
16− };
17− };
18−
19− config = mkIf cfg.enable {
20− services.udev.packages = [
21− pkgs.libticables2
22− ];
23−
24− environment.systemPackages = [
25− pkgs.tilp2
26− ];
27− };
28−}
nixos/modules/programs/tmux.nix+14−1
@@ -52,6 +52,12 @@ let
5252 set -s escape-time ${toString cfg.escapeTime}
5353 set -g history-limit ${toString cfg.historyLimit}
5454
55+ ${lib.optionalString (cfg.plugins != []) ''
56+ # Run plugins
57+ ${lib.concatMapStringsSep "\n" (x: "run-shell ${x.rtp}") cfg.plugins}
58+
59+ ''}
60+
5561 ${cfg.extraConfig}
5662 '';
5763
@@ -165,6 +171,13 @@ in {
165171 downside it doesn't survive user logout.
166172 '';
167173 };
174+
175+ plugins = mkOption {
176+ default = [];
177+ type = types.listOf types.package;
178+ description = "List of plugins to install.";
179+ example = lib.literalExpression "[ pkgs.tmuxPlugins.nord ]";
180+ };
168181 };
169182 };
170183
@@ -174,7 +187,7 @@ in {
174187 environment = {
175188 etc."tmux.conf".text = tmuxConf;
176189
177− systemPackages = [ pkgs.tmux ];
190+ systemPackages = [ pkgs.tmux ] ++ cfg.plugins;
178191
179192 variables = {
180193 TMUX_TMPDIR = lib.optional cfg.secureSocket ''''${XDG_RUNTIME_DIR:-"/run/user/$(id -u)"}'';
nixos/modules/programs/zsh/zsh-autosuggestions.nix+11−10
@@ -22,17 +22,18 @@ in
2222 };
2323
2424 strategy = mkOption {
25− type = types.enum [ "history" "match_prev_cmd" ];
26− default = "history";
25+ type = types.listOf (types.enum [ "history" "completion" "match_prev_cmd" ]);
26+ default = [ "history" ];
2727 description = ''
28− Set ZSH_AUTOSUGGEST_STRATEGY to choose the strategy for generating suggestions.
29− There are currently two to choose from:
28+ `ZSH_AUTOSUGGEST_STRATEGY` is an array that specifies how suggestions should be generated.
29+ The strategies in the array are tried successively until a suggestion is found.
30+ There are currently three built-in strategies to choose from:
3031
31− * history: Chooses the most recent match.
32− * match_prev_cmd: Chooses the most recent match whose preceding history item matches
33− the most recently executed command (more info). Note that this strategy won't work as
34− expected with ZSH options that don't preserve the history order such as
35− HIST_IGNORE_ALL_DUPS or HIST_EXPIRE_DUPS_FIRST.
32+ - `history`: Chooses the most recent match from history.
33+ - `completion`: Chooses a suggestion based on what tab-completion would suggest. (requires `zpty` module)
34+ - `match_prev_cmd`: Like `history`, but chooses the most recent match whose preceding history item matches
35+ the most recently executed command. Note that this strategy won't work as expected with ZSH options that
36+ don't preserve the history order such as `HIST_IGNORE_ALL_DUPS` or `HIST_EXPIRE_DUPS_FIRST`.
3637 '';
3738 };
3839
@@ -62,7 +63,7 @@ in
6263 source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh
6364
6465 export ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="${cfg.highlightStyle}"
65− export ZSH_AUTOSUGGEST_STRATEGY=("${cfg.strategy}")
66+ export ZSH_AUTOSUGGEST_STRATEGY=(${concatStringsSep " " cfg.strategy})
6667 ${optionalString (!cfg.async) "unset ZSH_AUTOSUGGEST_USE_ASYNC"}
6768
6869 ${concatStringsSep "\n" (mapAttrsToList (key: value: ''export ${key}="${value}"'') cfg.extraConfig)}
nixos/modules/rename.nix+11
@@ -32,6 +32,7 @@ with lib;
3232 '')
3333 (mkRemovedOptionModule [ "networking" "vpnc" ] "Use environment.etc.\"vpnc/service.conf\" instead.")
3434 (mkRemovedOptionModule [ "networking" "wicd" ] "The corresponding package was removed from nixpkgs.")
35+ (mkRemovedOptionModule [ "programs" "tilp2" ] "The corresponding package was removed from nixpkgs.")
3536 (mkRemovedOptionModule [ "programs" "way-cooler" ] ("way-cooler is abandoned by its author: " +
3637 "https://way-cooler.org/blog/2020/01/09/way-cooler-post-mortem.html"))
3738 (mkRemovedOptionModule [ "security" "hideProcessInformation" ] ''
@@ -49,6 +50,7 @@ with lib;
4950 (mkRemovedOptionModule [ "services" "flashpolicyd" ] "The flashpolicyd module has been removed. Adobe Flash Player is deprecated.")
5051 (mkRemovedOptionModule [ "services" "fourStore" ] "The fourStore module has been removed")
5152 (mkRemovedOptionModule [ "services" "fourStoreEndpoint" ] "The fourStoreEndpoint module has been removed")
53+ (mkRemovedOptionModule [ "services" "fprot" ] "The corresponding package was removed from nixpkgs.")
5254 (mkRemovedOptionModule [ "services" "frab" ] "The frab module has been removed")
5355 (mkRemovedOptionModule [ "services" "kippo" ] "The corresponding package was removed from nixpkgs.")
5456 (mkRemovedOptionModule [ "services" "mailpile" ] "The corresponding package was removed from nixpkgs.")
@@ -59,6 +61,9 @@ with lib;
5961 (mkRemovedOptionModule [ "services" "moinmoin" ] "The corresponding package was removed from nixpkgs.")
6062 (mkRemovedOptionModule [ "services" "mwlib" ] "The corresponding package was removed from nixpkgs.")
6163 (mkRemovedOptionModule [ "services" "osquery" ] "The osquery module has been removed")
64+ (mkRemovedOptionModule [ "services" "pantheon" "files" ] ''
65+ This module was removed, please add pkgs.pantheon.elementary-files to environment.systemPackages directly.
66+ '')
6267 (mkRemovedOptionModule [ "services" "prey" ] ''
6368 prey-bash-client is deprecated upstream
6469 '')
@@ -80,6 +85,12 @@ with lib;
8085 libinput and synaptics.
8186 '')
8287 (mkRemovedOptionModule [ "virtualisation" "rkt" ] "The rkt module has been removed, it was archived by upstream")
88+ (mkRemovedOptionModule [ "services" "racoon" ] ''
89+ The racoon module has been removed, because the software project was abandoned upstream.
90+ '')
91+ (mkRemovedOptionModule [ "services" "shellinabox" ] "The corresponding package was removed from nixpkgs.")
92+ (mkRemovedOptionModule [ "services" "gogoclient" ] "The corresponding package was removed from nixpkgs.")
93+ (mkRemovedOptionModule [ "services" "virtuoso" ] "The corresponding package was removed from nixpkgs.")
8394
8495 # Do NOT add any option renames here, see top of the file
8596 ];
nixos/modules/security/google_oslogin.nix+6−3
@@ -5,7 +5,7 @@ with lib;
55let
66
77 cfg = config.security.googleOsLogin;
8− package = pkgs.google-compute-engine-oslogin;
8+ package = pkgs.google-guest-oslogin;
99
1010in
1111
@@ -17,7 +17,7 @@ in
1717 type = types.bool;
1818 default = false;
1919 description = ''
20− Whether to enable Google OS Login
20+ Whether to enable Google OS Login.
2121
2222 The OS Login package enables the following components:
2323 AuthorizedKeysCommand to query valid SSH keys from the user's OS Login
@@ -36,7 +36,7 @@ in
3636 security.pam.services.sshd = {
3737 makeHomeDir = true;
3838 googleOsLoginAccountVerification = true;
39− # disabled for now: googleOsLoginAuthentication = true;
39+ googleOsLoginAuthentication = true;
4040 };
4141
4242 security.sudo.extraConfig = ''
@@ -47,6 +47,9 @@ in
4747 "d /var/google-users.d 750 root root -"
4848 ];
4949
50+ systemd.packages = [ package ];
51+ systemd.timers.google-oslogin-cache.wantedBy = [ "timers.target" ];
52+
5053 # enable the nss module, so user lookups etc. work
5154 system.nssModules = [ package ];
5255 system.nssDatabases.passwd = [ "cache_oslogin" "oslogin" ];
nixos/modules/security/misc.nix+2−2
@@ -123,8 +123,8 @@ with lib;
123123 boot.kernel.sysctl."user.max_user_namespaces" = 0;
124124
125125 assertions = [
126− { assertion = config.nix.useSandbox -> config.security.allowUserNamespaces;
127− message = "`nix.useSandbox = true` conflicts with `!security.allowUserNamespaces`.";
126+ { assertion = config.nix.settings.sandbox -> config.security.allowUserNamespaces;
127+ message = "`nix.settings.sandbox = true` conflicts with `!security.allowUserNamespaces`.";
128128 }
129129 ];
130130 })
nixos/modules/security/pam.nix+8−8
@@ -444,15 +444,15 @@ let
444444 account sufficient ${pam_krb5}/lib/security/pam_krb5.so
445445 '' +
446446 optionalString cfg.googleOsLoginAccountVerification ''
447− account [success=ok ignore=ignore default=die] ${pkgs.google-compute-engine-oslogin}/lib/pam_oslogin_login.so
448− account [success=ok default=ignore] ${pkgs.google-compute-engine-oslogin}/lib/pam_oslogin_admin.so
447+ account [success=ok ignore=ignore default=die] ${pkgs.google-guest-oslogin}/lib/security/pam_oslogin_login.so
448+ account [success=ok default=ignore] ${pkgs.google-guest-oslogin}/lib/security/pam_oslogin_admin.so
449449 '' +
450450 ''
451451
452452 # Authentication management.
453453 '' +
454454 optionalString cfg.googleOsLoginAuthentication ''
455− auth [success=done perm_denied=bad default=ignore] ${pkgs.google-compute-engine-oslogin}/lib/pam_oslogin_login.so
455+ auth [success=done perm_denied=die default=ignore] ${pkgs.google-guest-oslogin}/lib/security/pam_oslogin_login.so
456456 '' +
457457 optionalString cfg.rootOK ''
458458 auth sufficient pam_rootok.so
@@ -518,7 +518,7 @@ let
518518 auth optional ${pkgs.pam_gnupg}/lib/security/pam_gnupg.so ${optionalString cfg.gnupg.storeOnly " store-only"}
519519 '' +
520520 optionalString cfg.googleAuthenticator.enable ''
521− auth required ${pkgs.googleAuthenticator}/lib/security/pam_google_authenticator.so no_increment_hotp
521+ auth required ${pkgs.google-authenticator}/lib/security/pam_google_authenticator.so no_increment_hotp
522522 '' +
523523 optionalString cfg.duoSecurity.enable ''
524524 auth required ${pkgs.duo-unix}/lib/security/pam_duo.so
@@ -1035,7 +1035,7 @@ in
10351035 setuid = true;
10361036 owner = "root";
10371037 group = "root";
1038− source = "${pkgs.pam}/sbin/unix_chkpwd.orig";
1038+ source = "${pkgs.pam}/bin/unix_chkpwd";
10391039 };
10401040 };
10411041
@@ -1091,11 +1091,11 @@ in
10911091 mr ${pam_ccreds}/lib/security/pam_ccreds.so,
10921092 '' +
10931093 optionalString (isEnabled (cfg: cfg.googleOsLoginAccountVerification)) ''
1094− mr ${pkgs.google-compute-engine-oslogin}/lib/pam_oslogin_login.so,
1095− mr ${pkgs.google-compute-engine-oslogin}/lib/pam_oslogin_admin.so,
1094+ mr ${pkgs.google-guest-oslogin}/lib/security/pam_oslogin_login.so,
1095+ mr ${pkgs.google-guest-oslogin}/lib/security/pam_oslogin_admin.so,
10961096 '' +
10971097 optionalString (isEnabled (cfg: cfg.googleOsLoginAuthentication)) ''
1098− mr ${pkgs.google-compute-engine-oslogin}/lib/pam_oslogin_login.so,
1098+ mr ${pkgs.google-guest-oslogin}/lib/security/pam_oslogin_login.so,
10991099 '' +
11001100 optionalString (config.security.pam.enableSSHAgentAuth
11011101 && isEnabled (cfg: cfg.sshAgentAuth)) ''
nixos/modules/security/polkit.nix+1−5
@@ -12,11 +12,7 @@ in
1212
1313 options = {
1414
15− security.polkit.enable = mkOption {
16− type = types.bool;
17− default = true;
18− description = "Whether to enable PolKit.";
19− };
15+ security.polkit.enable = mkEnableOption "polkit";
2016
2117 security.polkit.extraConfig = mkOption {
2218 type = types.lines;
nixos/modules/security/systemd-confinement.nix+2−2
@@ -175,8 +175,8 @@ in {
175175 serviceName = "${name}.service";
176176 excludedPath = rootPaths;
177177 } ''
178− mkdir -p "$out/lib/systemd/system"
179− serviceFile="$out/lib/systemd/system/$serviceName"
178+ mkdir -p "$out/lib/systemd/system/$serviceName.d"
179+ serviceFile="$out/lib/systemd/system/$serviceName.d/confinement.conf"
180180
181181 echo '[Service]' > "$serviceFile"
182182
nixos/modules/security/wrappers/default.nix−1
@@ -92,7 +92,6 @@ let
9292 , permissions
9393 , ...
9494 }:
95− assert (lib.versionAtLeast (lib.getVersion config.boot.kernelPackages.kernel) "4.3");
9695 ''
9796 cp ${securityWrapper}/bin/security-wrapper "$wrapperDir/${program}"
9897 echo -n "${source}" > "$wrapperDir/${program}.real"
nixos/modules/services/admin/pgadmin.nixnew file+127
@@ -0,0 +1,127 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ pkg = pkgs.pgadmin4;
7+ cfg = config.services.pgadmin;
8+
9+ _base = with types; [ int bool str ];
10+ base = with types; oneOf ([ (listOf (oneOf _base)) (attrsOf (oneOf _base)) ] ++ _base);
11+
12+ formatAttrset = attr:
13+ "{${concatStringsSep "\n" (mapAttrsToList (key: value: "${builtins.toJSON key}: ${formatPyValue value},") attr)}}";
14+
15+ formatPyValue = value:
16+ if builtins.isString value then builtins.toJSON value
17+ else if value ? _expr then value._expr
18+ else if builtins.isInt value then toString value
19+ else if builtins.isBool value then (if value then "True" else "False")
20+ else if builtins.isAttrs value then (formatAttrset value)
21+ else if builtins.isList value then "[${concatStringsSep "\n" (map (v: "${formatPyValue v},") value)}]"
22+ else throw "Unrecognized type";
23+
24+ formatPy = attrs:
25+ concatStringsSep "\n" (mapAttrsToList (key: value: "${key} = ${formatPyValue value}") attrs);
26+
27+ pyType = with types; attrsOf (oneOf [ (attrsOf base) (listOf base) base ]);
28+in
29+{
30+ options.services.pgadmin = {
31+ enable = mkEnableOption "PostgreSQL Admin 4";
32+
33+ port = mkOption {
34+ description = "Port for pgadmin4 to run on";
35+ type = types.port;
36+ default = 5050;
37+ };
38+
39+ initialEmail = mkOption {
40+ description = "Initial email for the pgAdmin account.";
41+ type = types.str;
42+ };
43+
44+ initialPasswordFile = mkOption {
45+ description = ''
46+ Initial password file for the pgAdmin account.
47+ NOTE: Should be string not a store path, to prevent the password from being world readable.
48+ '';
49+ type = types.path;
50+ };
51+
52+ openFirewall = mkEnableOption "firewall passthrough for pgadmin4";
53+
54+ settings = mkOption {
55+ description = ''
56+ Settings for pgadmin4.
57+ <link xlink:href="https://www.pgadmin.org/docs/pgadmin4/development/config_py.html">Documentation</link>.
58+ '';
59+ type = pyType;
60+ default= {};
61+ };
62+ };
63+
64+ config = mkIf (cfg.enable) {
65+ networking.firewall.allowedTCPPorts = mkIf (cfg.openFirewall) [ cfg.port ];
66+
67+ services.pgadmin.settings = {
68+ DEFAULT_SERVER_PORT = cfg.port;
69+ SERVER_MODE = true;
70+ } // (optionalAttrs cfg.openFirewall {
71+ DEFAULT_SERVER = mkDefault "::";
72+ });
73+
74+ systemd.services.pgadmin = {
75+ wantedBy = [ "multi-user.target" ];
76+ after = [ "network.target" ];
77+ requires = [ "network.target" ];
78+ # we're adding this optionally so just in case there's any race it'll be caught
79+ # in case postgres doesn't start, pgadmin will just start normally
80+ wants = [ "postgresql.service" ];
81+
82+ path = [ config.services.postgresql.package pkgs.coreutils pkgs.bash ];
83+
84+ preStart = ''
85+ # NOTE: this is idempotent (aka running it twice has no effect)
86+ (
87+ # Email address:
88+ echo ${escapeShellArg cfg.initialEmail}
89+
90+ # file might not contain newline. echo hack fixes that.
91+ PW=$(cat ${escapeShellArg cfg.initialPasswordFile})
92+
93+ # Password:
94+ echo "$PW"
95+ # Retype password:
96+ echo "$PW"
97+ ) | ${pkg}/bin/pgadmin4-setup
98+ '';
99+
100+ restartTriggers = [
101+ "/etc/pgadmin/config_system.py"
102+ ];
103+
104+ serviceConfig = {
105+ User = "pgadmin";
106+ DynamicUser = true;
107+ LogsDirectory = "pgadmin";
108+ StateDirectory = "pgadmin";
109+ ExecStart = "${pkg}/bin/pgadmin4";
110+ };
111+ };
112+
113+ users.users.pgadmin = {
114+ isSystemUser = true;
115+ group = "pgadmin";
116+ };
117+
118+ users.groups.pgadmin = {};
119+
120+ environment.etc."pgadmin/config_system.py" = {
121+ text = formatPy cfg.settings;
122+ mode = "0600";
123+ user = "pgadmin";
124+ group = "pgadmin";
125+ };
126+ };
127+}
nixos/modules/services/audio/jmusicbot.nix+8−1
@@ -9,6 +9,13 @@ in
99 services.jmusicbot = {
1010 enable = mkEnableOption "jmusicbot, a Discord music bot that's easy to set up and run yourself";
1111
12+ package = mkOption {
13+ type = types.package;
14+ default = pkgs.jmusicbot;
15+ defaultText = literalExpression "pkgs.jmusicbot";
16+ description = "JMusicBot package to use";
17+ };
18+
1219 stateDir = mkOption {
1320 type = types.path;
1421 description = ''
@@ -27,7 +34,7 @@ in
2734 after = [ "network-online.target" ];
2835 description = "Discord music bot that's easy to set up and run yourself!";
2936 serviceConfig = mkMerge [{
30− ExecStart = "${pkgs.jmusicbot}/bin/JMusicBot";
37+ ExecStart = "${cfg.package}/bin/JMusicBot";
3138 WorkingDirectory = cfg.stateDir;
3239 Restart = "always";
3340 RestartSec = 20;
nixos/modules/services/audio/snapserver.nix+13−13
@@ -44,24 +44,24 @@ let
4444
4545 optionString = concatStringsSep " " (mapAttrsToList streamToOption cfg.streams
4646 # global options
47− ++ [ "--stream.bind_to_address ${cfg.listenAddress}" ]
48− ++ [ "--stream.port ${toString cfg.port}" ]
49− ++ optionalNull cfg.sampleFormat "--stream.sampleformat ${cfg.sampleFormat}"
50− ++ optionalNull cfg.codec "--stream.codec ${cfg.codec}"
51− ++ optionalNull cfg.streamBuffer "--stream.stream_buffer ${toString cfg.streamBuffer}"
52− ++ optionalNull cfg.buffer "--stream.buffer ${toString cfg.buffer}"
47+ ++ [ "--stream.bind_to_address=${cfg.listenAddress}" ]
48+ ++ [ "--stream.port=${toString cfg.port}" ]
49+ ++ optionalNull cfg.sampleFormat "--stream.sampleformat=${cfg.sampleFormat}"
50+ ++ optionalNull cfg.codec "--stream.codec=${cfg.codec}"
51+ ++ optionalNull cfg.streamBuffer "--stream.stream_buffer=${toString cfg.streamBuffer}"
52+ ++ optionalNull cfg.buffer "--stream.buffer=${toString cfg.buffer}"
5353 ++ optional cfg.sendToMuted "--stream.send_to_muted"
5454 # tcp json rpc
55− ++ [ "--tcp.enabled ${toString cfg.tcp.enable}" ]
55+ ++ [ "--tcp.enabled=${toString cfg.tcp.enable}" ]
5656 ++ optionals cfg.tcp.enable [
57− "--tcp.bind_to_address ${cfg.tcp.listenAddress}"
58− "--tcp.port ${toString cfg.tcp.port}" ]
57+ "--tcp.bind_to_address=${cfg.tcp.listenAddress}"
58+ "--tcp.port=${toString cfg.tcp.port}" ]
5959 # http json rpc
60− ++ [ "--http.enabled ${toString cfg.http.enable}" ]
60+ ++ [ "--http.enabled=${toString cfg.http.enable}" ]
6161 ++ optionals cfg.http.enable [
62− "--http.bind_to_address ${cfg.http.listenAddress}"
63− "--http.port ${toString cfg.http.port}"
64− ] ++ optional (cfg.http.docRoot != null) "--http.doc_root \"${toString cfg.http.docRoot}\"");
62+ "--http.bind_to_address=${cfg.http.listenAddress}"
63+ "--http.port=${toString cfg.http.port}"
64+ ] ++ optional (cfg.http.docRoot != null) "--http.doc_root=\"${toString cfg.http.docRoot}\"");
6565
6666in {
6767 imports = [
nixos/modules/services/audio/squeezelite.nix+17−21
@@ -1,50 +1,46 @@
11{ config, lib, pkgs, ... }:
22
3−with lib;
4−
53let
4+ inherit (lib) mkEnableOption mkIf mkOption optionalString types;
5+
66 dataDir = "/var/lib/squeezelite";
77 cfg = config.services.squeezelite;
8+ pkg = if cfg.pulseAudio then pkgs.squeezelite-pulse else pkgs.squeezelite;
9+ bin = "${pkg}/bin/${pkg.pname}";
810
9−in {
11+in
12+{
1013
1114 ###### interface
1215
13− options = {
14−
15− services.squeezelite= {
16+ options.services.squeezelite = {
17+ enable = mkEnableOption "Squeezelite, a software Squeezebox emulator";
1618
17− enable = mkEnableOption "Squeezelite, a software Squeezebox emulator";
18−
19− extraArguments = mkOption {
20− default = "";
21− type = types.str;
22− description = ''
23− Additional command line arguments to pass to Squeezelite.
24− '';
25− };
19+ pulseAudio = mkEnableOption "pulseaudio support";
2620
21+ extraArguments = mkOption {
22+ default = "";
23+ type = types.str;
24+ description = ''
25+ Additional command line arguments to pass to Squeezelite.
26+ '';
2727 };
28−
2928 };
3029
3130
3231 ###### implementation
3332
3433 config = mkIf cfg.enable {
35−
36− systemd.services.squeezelite= {
34+ systemd.services.squeezelite = {
3735 wantedBy = [ "multi-user.target" ];
3836 after = [ "network.target" "sound.target" ];
3937 description = "Software Squeezebox emulator";
4038 serviceConfig = {
4139 DynamicUser = true;
42− ExecStart = "${pkgs.squeezelite}/bin/squeezelite -N ${dataDir}/player-name ${cfg.extraArguments}";
40+ ExecStart = "${bin} -N ${dataDir}/player-name ${cfg.extraArguments}";
4341 StateDirectory = builtins.baseNameOf dataDir;
4442 SupplementaryGroups = "audio";
4543 };
4644 };
47−
4845 };
49−
5046}
nixos/modules/services/backup/mysql-backup.nix+2−1
@@ -113,9 +113,10 @@ in
113113 };
114114 };
115115 services.mysql-backup = {
116− description = "Mysql backup service";
116+ description = "MySQL backup service";
117117 enable = true;
118118 serviceConfig = {
119+ Type = "oneshot";
119120 User = cfg.user;
120121 };
121122 script = backupScript;
nixos/modules/services/cluster/corosync/default.nixnew file+112
@@ -0,0 +1,112 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+let
5+ cfg = config.services.corosync;
6+in
7+{
8+ # interface
9+ options.services.corosync = {
10+ enable = mkEnableOption "corosync";
11+
12+ package = mkOption {
13+ type = types.package;
14+ default = pkgs.corosync;
15+ defaultText = literalExpression "pkgs.corosync";
16+ description = "Package that should be used for corosync.";
17+ };
18+
19+ clusterName = mkOption {
20+ type = types.str;
21+ default = "nixcluster";
22+ description = "Name of the corosync cluster.";
23+ };
24+
25+ extraOptions = mkOption {
26+ type = with types; listOf str;
27+ default = [];
28+ description = "Additional options with which to start corosync.";
29+ };
30+
31+ nodelist = mkOption {
32+ description = "Corosync nodelist: all cluster members.";
33+ default = [];
34+ type = with types; listOf (submodule {
35+ options = {
36+ nodeid = mkOption {
37+ type = int;
38+ description = "Node ID number";
39+ };
40+ name = mkOption {
41+ type = str;
42+ description = "Node name";
43+ };
44+ ring_addrs = mkOption {
45+ type = listOf str;
46+ description = "List of addresses, one for each ring.";
47+ };
48+ };
49+ });
50+ };
51+ };
52+
53+ # implementation
54+ config = mkIf cfg.enable {
55+ environment.systemPackages = [ cfg.package ];
56+
57+ environment.etc."corosync/corosync.conf".text = ''
58+ totem {
59+ version: 2
60+ secauth: on
61+ cluster_name: ${cfg.clusterName}
62+ transport: knet
63+ }
64+
65+ nodelist {
66+ ${concatMapStrings ({ nodeid, name, ring_addrs }: ''
67+ node {
68+ nodeid: ${toString nodeid}
69+ name: ${name}
70+ ${concatStrings (imap0 (i: addr: ''
71+ ring${toString i}_addr: ${addr}
72+ '') ring_addrs)}
73+ }
74+ '') cfg.nodelist}
75+ }
76+
77+ quorum {
78+ # only corosync_votequorum is supported
79+ provider: corosync_votequorum
80+ wait_for_all: 0
81+ ${optionalString (builtins.length cfg.nodelist < 3) ''
82+ two_node: 1
83+ ''}
84+ }
85+
86+ logging {
87+ to_syslog: yes
88+ }
89+ '';
90+
91+ environment.etc."corosync/uidgid.d/root".text = ''
92+ # allow pacemaker connection by root
93+ uidgid {
94+ uid: 0
95+ gid: 0
96+ }
97+ '';
98+
99+ systemd.packages = [ cfg.package ];
100+ systemd.services.corosync = {
101+ wantedBy = [ "multi-user.target" ];
102+ serviceConfig = {
103+ StateDirectory = "corosync";
104+ StateDirectoryMode = "0700";
105+ };
106+ };
107+
108+ environment.etc."sysconfig/corosync".text = lib.optionalString (cfg.extraOptions != []) ''
109+ COROSYNC_OPTIONS="${lib.escapeShellArgs cfg.extraOptions}"
110+ '';
111+ };
112+}
nixos/modules/services/cluster/hadoop/conf.nix+11−11
@@ -1,6 +1,6 @@
11{ cfg, pkgs, lib }:
22let
3− propertyXml = name: value: ''
3+ propertyXml = name: value: lib.optionalString (value != null) ''
44 <property>
55 <name>${name}</name>
66 <value>${builtins.toString value}</value>
@@ -29,16 +29,16 @@ let
2929 export HADOOP_LOG_DIR=/tmp/hadoop/$USER
3030 '';
3131in
32−pkgs.runCommand "hadoop-conf" {} ''
32+pkgs.runCommand "hadoop-conf" {} (with cfg; ''
3333 mkdir -p $out/
34− cp ${siteXml "core-site.xml" cfg.coreSite}/* $out/
35− cp ${siteXml "hdfs-site.xml" cfg.hdfsSite}/* $out/
36− cp ${siteXml "mapred-site.xml" cfg.mapredSite}/* $out/
37− cp ${siteXml "yarn-site.xml" cfg.yarnSite}/* $out/
38− cp ${siteXml "httpfs-site.xml" cfg.httpfsSite}/* $out/
39− cp ${cfgFile "container-executor.cfg" cfg.containerExecutorCfg}/* $out/
34+ cp ${siteXml "core-site.xml" (coreSite // coreSiteInternal)}/* $out/
35+ cp ${siteXml "hdfs-site.xml" (hdfsSiteDefault // hdfsSite // hdfsSiteInternal)}/* $out/
36+ cp ${siteXml "mapred-site.xml" (mapredSiteDefault // mapredSite)}/* $out/
37+ cp ${siteXml "yarn-site.xml" (yarnSiteDefault // yarnSite // yarnSiteInternal)}/* $out/
38+ cp ${siteXml "httpfs-site.xml" httpfsSite}/* $out/
39+ cp ${cfgFile "container-executor.cfg" containerExecutorCfg}/* $out/
4040 cp ${pkgs.writeTextDir "hadoop-user-functions.sh" userFunctions}/* $out/
4141 cp ${pkgs.writeTextDir "hadoop-env.sh" hadoopEnv}/* $out/
42− cp ${cfg.log4jProperties} $out/log4j.properties
43− ${lib.concatMapStringsSep "\n" (dir: "cp -r ${dir}/* $out/") cfg.extraConfDirs}
44−''
42+ cp ${log4jProperties} $out/log4j.properties
43+ ${lib.concatMapStringsSep "\n" (dir: "cp -r ${dir}/* $out/") extraConfDirs}
44+'')
nixos/modules/services/cluster/hadoop/default.nix+72−25
@@ -21,24 +21,50 @@ with lib;
2121 <link xlink:href="https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml"/>
2222 '';
2323 };
24+ coreSiteInternal = mkOption {
25+ default = {};
26+ type = types.attrsOf types.anything;
27+ internal = true;
28+ description = ''
29+ Internal option to add configs to core-site.xml based on module options
30+ '';
31+ };
2432
25− hdfsSite = mkOption {
33+ hdfsSiteDefault = mkOption {
2634 default = {
2735 "dfs.namenode.rpc-bind-host" = "0.0.0.0";
36+ "dfs.namenode.http-address" = "0.0.0.0:9870";
37+ "dfs.namenode.servicerpc-bind-host" = "0.0.0.0";
38+ "dfs.namenode.http-bind-host" = "0.0.0.0";
2839 };
2940 type = types.attrsOf types.anything;
41+ description = ''
42+ Default options for hdfs-site.xml
43+ '';
44+ };
45+ hdfsSite = mkOption {
46+ default = {};
47+ type = types.attrsOf types.anything;
3048 example = literalExpression ''
3149 {
3250 "dfs.nameservices" = "namenode1";
3351 }
3452 '';
3553 description = ''
36− Hadoop hdfs-site.xml definition
54+ Additional options and overrides for hdfs-site.xml
3755 <link xlink:href="https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml"/>
3856 '';
3957 };
58+ hdfsSiteInternal = mkOption {
59+ default = {};
60+ type = types.attrsOf types.anything;
61+ internal = true;
62+ description = ''
63+ Internal option to add configs to hdfs-site.xml based on module options
64+ '';
65+ };
4066
41− mapredSite = mkOption {
67+ mapredSiteDefault = mkOption {
4268 default = {
4369 "mapreduce.framework.name" = "yarn";
4470 "yarn.app.mapreduce.am.env" = "HADOOP_MAPRED_HOME=${cfg.package}/lib/${cfg.package.untarDir}";
@@ -54,18 +80,25 @@ with lib;
5480 }
5581 '';
5682 type = types.attrsOf types.anything;
83+ description = ''
84+ Default options for mapred-site.xml
85+ '';
86+ };
87+ mapredSite = mkOption {
88+ default = {};
89+ type = types.attrsOf types.anything;
5790 example = literalExpression ''
58− options.services.hadoop.mapredSite.default // {
91+ {
5992 "mapreduce.map.java.opts" = "-Xmx900m -XX:+UseParallelGC";
6093 }
6194 '';
6295 description = ''
63− Hadoop mapred-site.xml definition
96+ Additional options and overrides for mapred-site.xml
6497 <link xlink:href="https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml"/>
6598 '';
6699 };
67100
68− yarnSite = mkOption {
101+ yarnSiteDefault = mkOption {
69102 default = {
70103 "yarn.nodemanager.admin-env" = "PATH=$PATH";
71104 "yarn.nodemanager.aux-services" = "mapreduce_shuffle";
@@ -77,19 +110,34 @@ with lib;
77110 "yarn.nodemanager.linux-container-executor.path" = "/run/wrappers/yarn-nodemanager/bin/container-executor";
78111 "yarn.nodemanager.log-dirs" = "/var/log/hadoop/yarn/nodemanager";
79112 "yarn.resourcemanager.bind-host" = "0.0.0.0";
80− "yarn.resourcemanager.scheduler.class" = "org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler";
113+ "yarn.resourcemanager.scheduler.class" = "org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler";
81114 };
82115 type = types.attrsOf types.anything;
116+ description = ''
117+ Default options for yarn-site.xml
118+ '';
119+ };
120+ yarnSite = mkOption {
121+ default = {};
122+ type = types.attrsOf types.anything;
83123 example = literalExpression ''
84− options.services.hadoop.yarnSite.default // {
124+ {
85125 "yarn.resourcemanager.hostname" = "''${config.networking.hostName}";
86126 }
87127 '';
88128 description = ''
89− Hadoop yarn-site.xml definition
129+ Additional options and overrides for yarn-site.xml
90130 <link xlink:href="https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml"/>
91131 '';
92132 };
133+ yarnSiteInternal = mkOption {
134+ default = {};
135+ type = types.attrsOf types.anything;
136+ internal = true;
137+ description = ''
138+ Internal option to add configs to yarn-site.xml based on module options
139+ '';
140+ };
93141
94142 httpfsSite = mkOption {
95143 default = { };
@@ -123,6 +171,7 @@ with lib;
123171 "yarn.nodemanager.linux-container-executor.group"="hadoop";
124172 "min.user.id"=1000;
125173 "feature.terminal.enabled"=1;
174+ "feature.mount-cgroup.enabled" = 1;
126175 };
127176 type = types.attrsOf types.anything;
128177 example = literalExpression ''
@@ -148,6 +197,8 @@ with lib;
148197 description = "Directories containing additional config files to be added to HADOOP_CONF_DIR";
149198 };
150199
200+ gatewayRole.enable = mkEnableOption "gateway role for deploying hadoop configs";
201+
151202 package = mkOption {
152203 type = types.package;
153204 default = pkgs.hadoop;
@@ -157,20 +208,16 @@ with lib;
157208 };
158209
159210
160− config = mkMerge [
161− (mkIf (builtins.hasAttr "yarn" config.users.users ||
162− builtins.hasAttr "hdfs" config.users.users ||
163− builtins.hasAttr "httpfs" config.users.users) {
164− users.groups.hadoop = {
165− gid = config.ids.gids.hadoop;
166− };
167− environment = {
168− systemPackages = [ cfg.package ];
169− etc."hadoop-conf".source = let
170− hadoopConf = "${import ./conf.nix { inherit cfg pkgs lib; }}/";
171− in "${hadoopConf}";
172− };
173− })
174−
175− ];
211+ config = mkIf cfg.gatewayRole.enable {
212+ users.groups.hadoop = {
213+ gid = config.ids.gids.hadoop;
214+ };
215+ environment = {
216+ systemPackages = [ cfg.package ];
217+ etc."hadoop-conf".source = let
218+ hadoopConf = "${import ./conf.nix { inherit cfg pkgs lib; }}/";
219+ in "${hadoopConf}";
220+ variables.HADOOP_CONF_DIR = "/etc/hadoop-conf/";
221+ };
222+ };
176223}
nixos/modules/services/cluster/hadoop/hdfs.nix+148−147
@@ -1,191 +1,191 @@
1−{ config, lib, pkgs, ...}:
1+{ config, lib, pkgs, ... }:
22with lib;
33let
44 cfg = config.services.hadoop;
5+
6+ # Config files for hadoop services
57 hadoopConf = "${import ./conf.nix { inherit cfg pkgs lib; }}/";
6− restartIfChanged = mkOption {
7− type = types.bool;
8− description = ''
9− Automatically restart the service on config change.
10− This can be set to false to defer restarts on clusters running critical applications.
11− Please consider the security implications of inadvertently running an older version,
12− and the possibility of unexpected behavior caused by inconsistent versions across a cluster when disabling this option.
13− '';
14− default = false;
15− };
8+
9+ # Generator for HDFS service options
10+ hadoopServiceOption = { serviceName, firewallOption ? true, extraOpts ? null }: {
11+ enable = mkEnableOption serviceName;
12+ restartIfChanged = mkOption {
13+ type = types.bool;
14+ description = ''
15+ Automatically restart the service on config change.
16+ This can be set to false to defer restarts on clusters running critical applications.
17+ Please consider the security implications of inadvertently running an older version,
18+ and the possibility of unexpected behavior caused by inconsistent versions across a cluster when disabling this option.
19+ '';
20+ default = false;
21+ };
22+ extraFlags = mkOption{
23+ type = with types; listOf str;
24+ default = [];
25+ description = "Extra command line flags to pass to ${serviceName}";
26+ example = [
27+ "-Dcom.sun.management.jmxremote"
28+ "-Dcom.sun.management.jmxremote.port=8010"
29+ ];
30+ };
31+ extraEnv = mkOption{
32+ type = with types; attrsOf str;
33+ default = {};
34+ description = "Extra environment variables for ${serviceName}";
35+ };
36+ } // (optionalAttrs firewallOption {
37+ openFirewall = mkOption {
38+ type = types.bool;
39+ default = false;
40+ description = "Open firewall ports for ${serviceName}.";
41+ };
42+ }) // (optionalAttrs (extraOpts != null) extraOpts);
43+
44+ # Generator for HDFS service configs
45+ hadoopServiceConfig =
46+ { name
47+ , serviceOptions ? cfg.hdfs."${toLower name}"
48+ , description ? "Hadoop HDFS ${name}"
49+ , User ? "hdfs"
50+ , allowedTCPPorts ? [ ]
51+ , preStart ? ""
52+ , environment ? { }
53+ , extraConfig ? { }
54+ }: (
55+
56+ mkIf serviceOptions.enable ( mkMerge [{
57+ systemd.services."hdfs-${toLower name}" = {
58+ inherit description preStart;
59+ environment = environment // serviceOptions.extraEnv;
60+ wantedBy = [ "multi-user.target" ];
61+ inherit (serviceOptions) restartIfChanged;
62+ serviceConfig = {
63+ inherit User;
64+ SyslogIdentifier = "hdfs-${toLower name}";
65+ ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} ${toLower name} ${escapeShellArgs serviceOptions.extraFlags}";
66+ Restart = "always";
67+ };
68+ };
69+
70+ services.hadoop.gatewayRole.enable = true;
71+
72+ networking.firewall.allowedTCPPorts = mkIf
73+ ((builtins.hasAttr "openFirewall" serviceOptions) && serviceOptions.openFirewall)
74+ allowedTCPPorts;
75+ } extraConfig])
76+ );
77+
1678in
1779{
1880 options.services.hadoop.hdfs = {
19− namenode = {
20− enable = mkEnableOption "Whether to run the HDFS NameNode";
81+
82+ namenode = hadoopServiceOption { serviceName = "HDFS NameNode"; } // {
2183 formatOnInit = mkOption {
2284 type = types.bool;
2385 default = false;
2486 description = ''
25− Format HDFS namenode on first start. This is useful for quickly spinning up ephemeral HDFS clusters with a single namenode.
26− For HA clusters, initialization involves multiple steps across multiple nodes. Follow [this guide](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html)
27− to initialize an HA cluster manually.
28− '';
29− };
30− inherit restartIfChanged;
31− openFirewall = mkOption {
32− type = types.bool;
33− default = true;
34− description = ''
35− Open firewall ports for namenode
36− '';
37− };
38− };
39− datanode = {
40− enable = mkEnableOption "Whether to run the HDFS DataNode";
41− inherit restartIfChanged;
42− openFirewall = mkOption {
43− type = types.bool;
44− default = true;
45− description = ''
46− Open firewall ports for datanode
87+ Format HDFS namenode on first start. This is useful for quickly spinning up
88+ ephemeral HDFS clusters with a single namenode.
89+ For HA clusters, initialization involves multiple steps across multiple nodes.
90+ Follow this guide to initialize an HA cluster manually:
91+ <link xlink:href="https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html"/>
4792 '';
4893 };
4994 };
50− journalnode = {
51− enable = mkEnableOption "Whether to run the HDFS JournalNode";
52− inherit restartIfChanged;
53− openFirewall = mkOption {
54− type = types.bool;
55− default = true;
56− description = ''
57− Open firewall ports for journalnode
58− '';
95+
96+ datanode = hadoopServiceOption { serviceName = "HDFS DataNode"; } // {
97+ dataDirs = mkOption {
98+ default = null;
99+ description = "Tier and path definitions for datanode storage.";
100+ type = with types; nullOr (listOf (submodule {
101+ options = {
102+ type = mkOption {
103+ type = enum [ "SSD" "DISK" "ARCHIVE" "RAM_DISK" ];
104+ description = ''
105+ Storage types ([SSD]/[DISK]/[ARCHIVE]/[RAM_DISK]) for HDFS storage policies.
106+ '';
107+ };
108+ path = mkOption {
109+ type = path;
110+ example = [ "/var/lib/hadoop/hdfs/dn" ];
111+ description = "Determines where on the local filesystem a data node should store its blocks.";
112+ };
113+ };
114+ }));
59115 };
60116 };
61− zkfc = {
62− enable = mkEnableOption "Whether to run the HDFS ZooKeeper failover controller";
63− inherit restartIfChanged;
117+
118+ journalnode = hadoopServiceOption { serviceName = "HDFS JournalNode"; };
119+
120+ zkfc = hadoopServiceOption {
121+ serviceName = "HDFS ZooKeeper failover controller";
122+ firewallOption = false;
64123 };
65− httpfs = {
66− enable = mkEnableOption "Whether to run the HDFS HTTPfs server";
124+
125+ httpfs = hadoopServiceOption { serviceName = "HDFS JournalNode"; } // {
67126 tempPath = mkOption {
68127 type = types.path;
69128 default = "/tmp/hadoop/httpfs";
70− description = ''
71− HTTPFS_TEMP path used by HTTPFS
72− '';
73− };
74− inherit restartIfChanged;
75− openFirewall = mkOption {
76− type = types.bool;
77− default = true;
78− description = ''
79− Open firewall ports for HTTPFS
80− '';
129+ description = "HTTPFS_TEMP path used by HTTPFS";
81130 };
82131 };
132+
83133 };
84134
85135 config = mkMerge [
86− (mkIf cfg.hdfs.namenode.enable {
87− systemd.services.hdfs-namenode = {
88− description = "Hadoop HDFS NameNode";
89− wantedBy = [ "multi-user.target" ];
90− inherit (cfg.hdfs.namenode) restartIfChanged;
91−
92− preStart = (mkIf cfg.hdfs.namenode.formatOnInit ''
93− ${cfg.package}/bin/hdfs --config ${hadoopConf} namenode -format -nonInteractive || true
94− '');
95−
96− serviceConfig = {
97− User = "hdfs";
98− SyslogIdentifier = "hdfs-namenode";
99− ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} namenode";
100− Restart = "always";
101− };
102− };
103−
104− networking.firewall.allowedTCPPorts = (mkIf cfg.hdfs.namenode.openFirewall [
136+ (hadoopServiceConfig {
137+ name = "NameNode";
138+ allowedTCPPorts = [
105139 9870 # namenode.http-address
106140 8020 # namenode.rpc-address
107− 8022 # namenode. servicerpc-address
108− ]);
141+ 8022 # namenode.servicerpc-address
142+ 8019 # dfs.ha.zkfc.port
143+ ];
144+ preStart = (mkIf cfg.hdfs.namenode.formatOnInit
145+ "${cfg.package}/bin/hdfs --config ${hadoopConf} namenode -format -nonInteractive || true"
146+ );
109147 })
110− (mkIf cfg.hdfs.datanode.enable {
111− systemd.services.hdfs-datanode = {
112− description = "Hadoop HDFS DataNode";
113− wantedBy = [ "multi-user.target" ];
114− inherit (cfg.hdfs.datanode) restartIfChanged;
115−
116− serviceConfig = {
117− User = "hdfs";
118− SyslogIdentifier = "hdfs-datanode";
119− ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} datanode";
120− Restart = "always";
121− };
122− };
123148
124− networking.firewall.allowedTCPPorts = (mkIf cfg.hdfs.datanode.openFirewall [
149+ (hadoopServiceConfig {
150+ name = "DataNode";
151+ # port numbers for datanode changed between hadoop 2 and 3
152+ allowedTCPPorts = if versionAtLeast cfg.package.version "3" then [
125153 9864 # datanode.http.address
126154 9866 # datanode.address
127155 9867 # datanode.ipc.address
128− ]);
156+ ] else [
157+ 50075 # datanode.http.address
158+ 50010 # datanode.address
159+ 50020 # datanode.ipc.address
160+ ];
161+ extraConfig.services.hadoop.hdfsSiteInternal."dfs.datanode.data.dir" = let d = cfg.hdfs.datanode.dataDirs; in
162+ if (d!= null) then (concatMapStringsSep "," (x: "["+x.type+"]file://"+x.path) cfg.hdfs.datanode.dataDirs) else d;
129163 })
130− (mkIf cfg.hdfs.journalnode.enable {
131− systemd.services.hdfs-journalnode = {
132− description = "Hadoop HDFS JournalNode";
133− wantedBy = [ "multi-user.target" ];
134− inherit (cfg.hdfs.journalnode) restartIfChanged;
135−
136− serviceConfig = {
137− User = "hdfs";
138− SyslogIdentifier = "hdfs-journalnode";
139− ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} journalnode";
140− Restart = "always";
141− };
142− };
143164
144− networking.firewall.allowedTCPPorts = (mkIf cfg.hdfs.journalnode.openFirewall [
165+ (hadoopServiceConfig {
166+ name = "JournalNode";
167+ allowedTCPPorts = [
145168 8480 # dfs.journalnode.http-address
146169 8485 # dfs.journalnode.rpc-address
147− ]);
170+ ];
148171 })
149− (mkIf cfg.hdfs.zkfc.enable {
150− systemd.services.hdfs-zkfc = {
151− description = "Hadoop HDFS ZooKeeper failover controller";
152− wantedBy = [ "multi-user.target" ];
153− inherit (cfg.hdfs.zkfc) restartIfChanged;
154−
155− serviceConfig = {
156− User = "hdfs";
157− SyslogIdentifier = "hdfs-zkfc";
158− ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} zkfc";
159− Restart = "always";
160− };
161− };
162− })
163− (mkIf cfg.hdfs.httpfs.enable {
164− systemd.services.hdfs-httpfs = {
165− description = "Hadoop httpfs";
166− wantedBy = [ "multi-user.target" ];
167− inherit (cfg.hdfs.httpfs) restartIfChanged;
168−
169− environment.HTTPFS_TEMP = cfg.hdfs.httpfs.tempPath;
170172
171− preStart = ''
172− mkdir -p $HTTPFS_TEMP
173− '';
173+ (hadoopServiceConfig {
174+ name = "zkfc";
175+ description = "Hadoop HDFS ZooKeeper failover controller";
176+ })
174177
175− serviceConfig = {
176− User = "httpfs";
177− SyslogIdentifier = "hdfs-httpfs";
178− ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} httpfs";
179− Restart = "always";
180− };
181− };
182− networking.firewall.allowedTCPPorts = (mkIf cfg.hdfs.httpfs.openFirewall [
178+ (hadoopServiceConfig {
179+ name = "HTTPFS";
180+ environment.HTTPFS_TEMP = cfg.hdfs.httpfs.tempPath;
181+ preStart = "mkdir -p $HTTPFS_TEMP";
182+ User = "httpfs";
183+ allowedTCPPorts = [
183184 14000 # httpfs.http.port
184− ]);
185+ ];
185186 })
186− (mkIf (
187− cfg.hdfs.namenode.enable || cfg.hdfs.datanode.enable || cfg.hdfs.journalnode.enable || cfg.hdfs.zkfc.enable
188− ) {
187+
188+ (mkIf cfg.gatewayRole.enable {
189189 users.users.hdfs = {
190190 description = "Hadoop HDFS user";
191191 group = "hadoop";
@@ -199,5 +199,6 @@ in
199199 isSystemUser = true;
200200 };
201201 })
202+
202203 ];
203204}
nixos/modules/services/cluster/hadoop/yarn.nix+85−13
@@ -13,23 +13,77 @@ let
1313 '';
1414 default = false;
1515 };
16+ extraFlags = mkOption{
17+ type = with types; listOf str;
18+ default = [];
19+ description = "Extra command line flags to pass to the service";
20+ example = [
21+ "-Dcom.sun.management.jmxremote"
22+ "-Dcom.sun.management.jmxremote.port=8010"
23+ ];
24+ };
25+ extraEnv = mkOption{
26+ type = with types; attrsOf str;
27+ default = {};
28+ description = "Extra environment variables";
29+ };
1630in
1731{
1832 options.services.hadoop.yarn = {
1933 resourcemanager = {
20− enable = mkEnableOption "Whether to run the Hadoop YARN ResourceManager";
21− inherit restartIfChanged;
34+ enable = mkEnableOption "Hadoop YARN ResourceManager";
35+ inherit restartIfChanged extraFlags extraEnv;
36+
2237 openFirewall = mkOption {
2338 type = types.bool;
24− default = true;
39+ default = false;
2540 description = ''
2641 Open firewall ports for resourcemanager
2742 '';
2843 };
2944 };
3045 nodemanager = {
31− enable = mkEnableOption "Whether to run the Hadoop YARN NodeManager";
32− inherit restartIfChanged;
46+ enable = mkEnableOption "Hadoop YARN NodeManager";
47+ inherit restartIfChanged extraFlags extraEnv;
48+
49+ resource = {
50+ cpuVCores = mkOption {
51+ description = "Number of vcores that can be allocated for containers.";
52+ type = with types; nullOr ints.positive;
53+ default = null;
54+ };
55+ maximumAllocationVCores = mkOption {
56+ description = "The maximum virtual CPU cores any container can be allocated.";
57+ type = with types; nullOr ints.positive;
58+ default = null;
59+ };
60+ memoryMB = mkOption {
61+ description = "Amount of physical memory, in MB, that can be allocated for containers.";
62+ type = with types; nullOr ints.positive;
63+ default = null;
64+ };
65+ maximumAllocationMB = mkOption {
66+ description = "The maximum physical memory any container can be allocated.";
67+ type = with types; nullOr ints.positive;
68+ default = null;
69+ };
70+ };
71+
72+ useCGroups = mkOption {
73+ type = types.bool;
74+ default = true;
75+ description = ''
76+ Use cgroups to enforce resource limits on containers
77+ '';
78+ };
79+
80+ localDir = mkOption {
81+ description = "List of directories to store localized files in.";
82+ type = with types; nullOr (listOf path);
83+ example = [ "/var/lib/hadoop/yarn/nm" ];
84+ default = null;
85+ };
86+
3387 addBinBash = mkOption {
3488 type = types.bool;
3589 default = true;
@@ -39,7 +93,7 @@ in
3993 };
4094 openFirewall = mkOption {
4195 type = types.bool;
42− default = true;
96+ default = false;
4397 description = ''
4498 Open firewall ports for nodemanager.
4599 Because containers can listen on any ephemeral port, TCP ports 1024–65535 will be opened.
@@ -49,10 +103,7 @@ in
49103 };
50104
51105 config = mkMerge [
52− (mkIf (
53− cfg.yarn.resourcemanager.enable || cfg.yarn.nodemanager.enable
54− ) {
55−
106+ (mkIf cfg.gatewayRole.enable {
56107 users.users.yarn = {
57108 description = "Hadoop YARN user";
58109 group = "hadoop";
@@ -65,15 +116,19 @@ in
65116 description = "Hadoop YARN ResourceManager";
66117 wantedBy = [ "multi-user.target" ];
67118 inherit (cfg.yarn.resourcemanager) restartIfChanged;
119+ environment = cfg.yarn.resourcemanager.extraEnv;
68120
69121 serviceConfig = {
70122 User = "yarn";
71123 SyslogIdentifier = "yarn-resourcemanager";
72124 ExecStart = "${cfg.package}/bin/yarn --config ${hadoopConf} " +
73− " resourcemanager";
125+ " resourcemanager ${escapeShellArgs cfg.yarn.resourcemanager.extraFlags}";
74126 Restart = "always";
75127 };
76128 };
129+
130+ services.hadoop.gatewayRole.enable = true;
131+
77132 networking.firewall.allowedTCPPorts = (mkIf cfg.yarn.resourcemanager.openFirewall [
78133 8088 # resourcemanager.webapp.address
79134 8030 # resourcemanager.scheduler.address
@@ -94,6 +149,7 @@ in
94149 description = "Hadoop YARN NodeManager";
95150 wantedBy = [ "multi-user.target" ];
96151 inherit (cfg.yarn.nodemanager) restartIfChanged;
152+ environment = cfg.yarn.nodemanager.extraEnv;
97153
98154 preStart = ''
99155 # create log dir
@@ -101,8 +157,9 @@ in
101157 chown yarn:hadoop /var/log/hadoop/yarn/nodemanager
102158
103159 # set up setuid container executor binary
160+ umount /run/wrappers/yarn-nodemanager/cgroup/cpu || true
104161 rm -rf /run/wrappers/yarn-nodemanager/ || true
105− mkdir -p /run/wrappers/yarn-nodemanager/{bin,etc/hadoop}
162+ mkdir -p /run/wrappers/yarn-nodemanager/{bin,etc/hadoop,cgroup/cpu}
106163 cp ${cfg.package}/lib/${cfg.package.untarDir}/bin/container-executor /run/wrappers/yarn-nodemanager/bin/
107164 chgrp hadoop /run/wrappers/yarn-nodemanager/bin/container-executor
108165 chmod 6050 /run/wrappers/yarn-nodemanager/bin/container-executor
@@ -114,11 +171,26 @@ in
114171 SyslogIdentifier = "yarn-nodemanager";
115172 PermissionsStartOnly = true;
116173 ExecStart = "${cfg.package}/bin/yarn --config ${hadoopConf} " +
117− " nodemanager";
174+ " nodemanager ${escapeShellArgs cfg.yarn.nodemanager.extraFlags}";
118175 Restart = "always";
119176 };
120177 };
121178
179+ services.hadoop.gatewayRole.enable = true;
180+
181+ services.hadoop.yarnSiteInternal = with cfg.yarn.nodemanager; {
182+ "yarn.nodemanager.local-dirs" = localDir;
183+ "yarn.scheduler.maximum-allocation-vcores" = resource.maximumAllocationVCores;
184+ "yarn.scheduler.maximum-allocation-mb" = resource.maximumAllocationMB;
185+ "yarn.nodemanager.resource.cpu-vcores" = resource.cpuVCores;
186+ "yarn.nodemanager.resource.memory-mb" = resource.memoryMB;
187+ } // mkIf useCGroups {
188+ "yarn.nodemanager.linux-container-executor.cgroups.hierarchy" = "/hadoop-yarn";
189+ "yarn.nodemanager.linux-container-executor.resources-handler.class" = "org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler";
190+ "yarn.nodemanager.linux-container-executor.cgroups.mount" = "true";
191+ "yarn.nodemanager.linux-container-executor.cgroups.mount-path" = "/run/wrappers/yarn-nodemanager/cgroup";
192+ };
193+
122194 networking.firewall.allowedTCPPortRanges = [
123195 (mkIf (cfg.yarn.nodemanager.openFirewall) {from = 1024; to = 65535;})
124196 ];
nixos/modules/services/cluster/k3s/default.nix+1−5
@@ -91,11 +91,6 @@ in
9191 virtualisation.docker = mkIf cfg.docker {
9292 enable = mkDefault true;
9393 };
94−
95− # TODO: disable this once k3s supports cgroupsv2, either by docker
96− # supporting it, or their bundled containerd
97− systemd.enableUnifiedCgroupHierarchy = false;
98−
9994 environment.systemPackages = [ config.services.k3s.package ];
10095
10196 systemd.services.k3s = {
@@ -119,6 +114,7 @@ in
119114 [
120115 "${cfg.package}/bin/k3s ${cfg.role}"
121116 ] ++ (optional cfg.docker "--docker")
117+ ++ (optional (cfg.docker && config.systemd.enableUnifiedCgroupHierarchy) "--kubelet-arg=cgroup-driver=systemd")
122118 ++ (optional cfg.disableAgent "--disable-agent")
123119 ++ (optional (cfg.serverAddr != "") "--server ${cfg.serverAddr}")
124120 ++ (optional (cfg.token != "") "--token ${cfg.token}")
nixos/modules/services/cluster/kubernetes/pki.nix+1−1
@@ -266,7 +266,7 @@ in
266266 in
267267 ''
268268 export KUBECONFIG=${clusterAdminKubeconfig}
269− ${kubectl}/bin/kubectl apply -f ${concatStringsSep " \\\n -f " files}
269+ ${kubernetes}/bin/kubectl apply -f ${concatStringsSep " \\\n -f " files}
270270 '';
271271 })]);
272272
nixos/modules/services/cluster/kubernetes/scheduler.nix+2−2
@@ -66,12 +66,12 @@ in
6666 serviceConfig = {
6767 Slice = "kubernetes.slice";
6868 ExecStart = ''${top.package}/bin/kube-scheduler \
69− --address=${cfg.address} \
69+ --bind-address=${cfg.address} \
7070 ${optionalString (cfg.featureGates != [])
7171 "--feature-gates=${concatMapStringsSep "," (feature: "${feature}=true") cfg.featureGates}"} \
7272 --kubeconfig=${top.lib.mkKubeConfig "kube-scheduler" cfg.kubeconfig} \
7373 --leader-elect=${boolToString cfg.leaderElect} \
74− --port=${toString cfg.port} \
74+ --secure-port=${toString cfg.port} \
7575 ${optionalString (cfg.verbosity != null) "--v=${toString cfg.verbosity}"} \
7676 ${cfg.extraOpts}
7777 '';
nixos/modules/services/cluster/pacemaker/default.nixnew file+52
@@ -0,0 +1,52 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+let
5+ cfg = config.services.pacemaker;
6+in
7+{
8+ # interface
9+ options.services.pacemaker = {
10+ enable = mkEnableOption "pacemaker";
11+
12+ package = mkOption {
13+ type = types.package;
14+ default = pkgs.pacemaker;
15+ defaultText = literalExpression "pkgs.pacemaker";
16+ description = "Package that should be used for pacemaker.";
17+ };
18+ };
19+
20+ # implementation
21+ config = mkIf cfg.enable {
22+ assertions = [ {
23+ assertion = config.services.corosync.enable;
24+ message = ''
25+ Enabling services.pacemaker requires a services.corosync configuration.
26+ '';
27+ } ];
28+
29+ environment.systemPackages = [ cfg.package ];
30+
31+ # required by pacemaker
32+ users.users.hacluster = {
33+ isSystemUser = true;
34+ group = "pacemaker";
35+ home = "/var/lib/pacemaker";
36+ };
37+ users.groups.pacemaker = {};
38+
39+ systemd.tmpfiles.rules = [
40+ "d /var/log/pacemaker 0700 hacluster pacemaker -"
41+ ];
42+
43+ systemd.packages = [ cfg.package ];
44+ systemd.services.pacemaker = {
45+ wantedBy = [ "multi-user.target" ];
46+ serviceConfig = {
47+ StateDirectory = "pacemaker";
48+ StateDirectoryMode = "0700";
49+ };
50+ };
51+ };
52+}
nixos/modules/services/computing/slurm/slurm.nix+5−4
@@ -362,6 +362,7 @@ in
362362
363363 wantedBy = [ "multi-user.target" ];
364364 after = [ "systemd-tmpfiles-clean.service" ];
365+ requires = [ "network.target" ];
365366
366367 serviceConfig = {
367368 Type = "forking";
@@ -371,12 +372,12 @@ in
371372 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
372373 LimitMEMLOCK = "infinity";
373374 };
374−
375− preStart = ''
376− mkdir -p /var/spool
377− '';
378375 };
379376
377+ systemd.tmpfiles.rules = mkIf cfg.client.enable [
378+ "d /var/spool/slurmd 755 root root -"
379+ ];
380+
380381 services.openssh.forwardX11 = mkIf cfg.client.enable (mkDefault true);
381382
382383 systemd.services.slurmctld = mkIf (cfg.server.enable) {
nixos/modules/services/continuous-integration/github-runner.nix+9
@@ -34,6 +34,14 @@ in
3434 Repository to add the runner to.
3535
3636 Changing this option triggers a new runner registration.
37+
38+ IMPORTANT: If your token is org-wide (not per repository), you need to
39+ provide a github org link, not a single repository, so do it like this
40+ <literal>https://github.com/nixos</literal>, not like this
41+ <literal>https://github.com/nixos/nixpkgs</literal>.
42+ Otherwise, you are going to get a <literal>404 NotFound</literal>
43+ from <literal>POST https://api.github.com/actions/runner-registration</literal>
44+ in the configure script.
3745 '';
3846 example = "https://github.com/nixos/nixpkgs";
3947 };
@@ -208,6 +216,7 @@ in
208216 token=$(< "$STATE_DIRECTORY"/${newConfigTokenFilename})
209217 RUNNER_ROOT="$STATE_DIRECTORY" ${cfg.package}/bin/config.sh \
210218 --unattended \
219+ --disableupdate \
211220 --work "$RUNTIME_DIRECTORY" \
212221 --url ${escapeShellArg cfg.url} \
213222 --token "$token" \
nixos/modules/services/continuous-integration/gitlab-runner.nix+1−1
@@ -147,7 +147,7 @@ in
147147 concurrent = mkOption {
148148 type = types.int;
149149 default = 1;
150− example = literalExpression "config.nix.maxJobs";
150+ example = literalExpression "config.nix.settings.max-jobs";
151151 description = ''
152152 Limits how many jobs globally can be run concurrently.
153153 The most upper limit of jobs using all defined runners.
nixos/modules/services/continuous-integration/hercules-ci-agent/default.nix+1−1
@@ -67,7 +67,7 @@ in
6767
6868 # Trusted user allows simplified configuration and better performance
6969 # when operating in a cluster.
70− nix.trustedUsers = [ config.systemd.services.hercules-ci-agent.serviceConfig.User ];
70+ nix.settings.trusted-users = [ config.systemd.services.hercules-ci-agent.serviceConfig.User ];
7171 services.hercules-ci-agent = {
7272 settings = {
7373 nixUserIsTrusted = true;
nixos/modules/services/continuous-integration/hydra/default.nix+15−12
@@ -258,8 +258,6 @@ in
258258 uid = config.ids.uids.hydra-www;
259259 };
260260
261− nix.trustedUsers = [ "hydra-queue-runner" ];
262−
263261 services.hydra.extraConfig =
264262 ''
265263 using_frontend_proxy = 1
@@ -277,16 +275,21 @@ in
277275
278276 environment.variables = hydraEnv;
279277
280− nix.extraOptions = ''
281− keep-outputs = true
282− keep-derivations = true
283−
284−
285− '' + optionalString (versionOlder (getVersion config.nix.package.out) "2.4pre") ''
286− # The default (`true') slows Nix down a lot since the build farm
287− # has so many GC roots.
288− gc-check-reachability = false
289− '';
278+ nix.settings = mkMerge [
279+ {
280+ keep-outputs = true;
281+ keep-derivations = true;
282+ trusted-users = [ "hydra-queue-runner" ];
283+ }
284+
285+ (mkIf (versionOlder (getVersion config.nix.package.out) "2.4pre")
286+ {
287+ # The default (`true') slows Nix down a lot since the build farm
288+ # has so many GC roots.
289+ gc-check-reachability = false;
290+ }
291+ )
292+ ];
290293
291294 systemd.services.hydra-init =
292295 { wantedBy = [ "multi-user.target" ];
nixos/modules/services/databases/redis.nix+8−5
@@ -81,7 +81,9 @@ in {
8181 user = mkOption {
8282 type = types.str;
8383 default = redisName name;
84− defaultText = "\"redis\" or \"redis-\${name}\" if name != \"\"";
84+ defaultText = literalExpression ''
85+ if name == "" then "redis" else "redis-''${name}"
86+ '';
8587 description = "The username and groupname for redis-server.";
8688 };
8789
@@ -105,8 +107,7 @@ in {
105107
106108 bind = mkOption {
107109 type = with types; nullOr str;
108− default = if name == "" then "127.0.0.1" else null;
109− defaultText = literalExpression ''if name == "" then "127.0.0.1" else null'';
110+ default = "127.0.0.1";
110111 description = ''
111112 The IP interface to bind to.
112113 <literal>null</literal> means "all interfaces".
@@ -117,7 +118,9 @@ in {
117118 unixSocket = mkOption {
118119 type = with types; nullOr path;
119120 default = "/run/${redisName name}/redis.sock";
120− defaultText = "\"/run/redis/redis.sock\" or \"/run/redis-\${name}/redis.sock\" if name != \"\"";
121+ defaultText = literalExpression ''
122+ if name == "" then "/run/redis/redis.sock" else "/run/redis-''${name}/redis.sock"
123+ '';
121124 description = "The path to the socket to bind to.";
122125 };
123126
@@ -370,7 +373,7 @@ in {
370373 ProtectKernelTunables = true;
371374 ProtectControlGroups = true;
372375 RestrictAddressFamilies =
373− optionals (conf.bind != null) ["AF_INET" "AF_INET6"] ++
376+ optionals (conf.port != 0) ["AF_INET" "AF_INET6"] ++
374377 optional (conf.unixSocket != null) "AF_UNIX";
375378 RestrictNamespaces = true;
376379 LockPersonality = true;
nixos/modules/services/databases/virtuoso.nixdeleted−99
@@ -1,99 +0,0 @@
1−{ config, lib, pkgs, ... }:
2−let
3− cfg = config.services.virtuoso;
4− virtuosoUser = "virtuoso";
5− stateDir = "/var/lib/virtuoso";
6−in
7−with lib;
8−{
9−
10− ###### interface
11−
12− options = {
13−
14− services.virtuoso = {
15−
16− enable = mkEnableOption "Virtuoso Opensource database server";
17−
18− config = mkOption {
19− type = types.lines;
20− default = "";
21− description = "Extra options to put into Virtuoso configuration file.";
22− };
23−
24− parameters = mkOption {
25− type = types.lines;
26− default = "";
27− description = "Extra options to put into [Parameters] section of Virtuoso configuration file.";
28− };
29−
30− listenAddress = mkOption {
31− type = types.str;
32− default = "1111";
33− example = "myserver:1323";
34− description = "ip:port or port to listen on.";
35− };
36−
37− httpListenAddress = mkOption {
38− type = types.nullOr types.str;
39− default = null;
40− example = "myserver:8080";
41− description = "ip:port or port for Virtuoso HTTP server to listen on.";
42− };
43−
44− dirsAllowed = mkOption {
45− type = types.nullOr types.str; # XXX Maybe use a list in the future?
46− default = null;
47− example = "/www, /home/";
48− description = "A list of directories Virtuoso is allowed to access";
49− };
50− };
51−
52− };
53−
54−
55− ###### implementation
56−
57− config = mkIf cfg.enable {
58−
59− users.users.${virtuosoUser} =
60− { uid = config.ids.uids.virtuoso;
61− description = "virtuoso user";
62− home = stateDir;
63− };
64−
65− systemd.services.virtuoso = {
66− after = [ "network.target" ];
67− wantedBy = [ "multi-user.target" ];
68−
69− preStart = ''
70− mkdir -p ${stateDir}
71− chown ${virtuosoUser} ${stateDir}
72− '';
73−
74− script = ''
75− cd ${stateDir}
76− ${pkgs.virtuoso}/bin/virtuoso-t +foreground +configfile ${pkgs.writeText "virtuoso.ini" cfg.config}
77− '';
78− };
79−
80− services.virtuoso.config = ''
81− [Database]
82− DatabaseFile=${stateDir}/x-virtuoso.db
83− TransactionFile=${stateDir}/x-virtuoso.trx
84− ErrorLogFile=${stateDir}/x-virtuoso.log
85− xa_persistent_file=${stateDir}/x-virtuoso.pxa
86−
87− [Parameters]
88− ServerPort=${cfg.listenAddress}
89− RunAs=${virtuosoUser}
90− ${optionalString (cfg.dirsAllowed != null) "DirsAllowed=${cfg.dirsAllowed}"}
91− ${cfg.parameters}
92−
93− [HTTPServer]
94− ${optionalString (cfg.httpListenAddress != null) "ServerPort=${cfg.httpListenAddress}"}
95− '';
96−
97− };
98−
99−}
nixos/modules/services/desktops/flatpak.nix+2
@@ -30,6 +30,8 @@ in {
3030
3131 environment.systemPackages = [ pkgs.flatpak ];
3232
33+ security.polkit.enable = true;
34+
3335 services.dbus.packages = [ pkgs.flatpak ];
3436
3537 systemd.packages = [ pkgs.flatpak ];
nixos/modules/services/desktops/gnome/glib-networking.nix+1−1
@@ -38,7 +38,7 @@ with lib;
3838
3939 systemd.packages = [ pkgs.glib-networking ];
4040
41− environment.variables.GIO_EXTRA_MODULES = [ "${pkgs.glib-networking.out}/lib/gio/modules" ];
41+ environment.sessionVariables.GIO_EXTRA_MODULES = [ "${pkgs.glib-networking.out}/lib/gio/modules" ];
4242
4343 };
4444
nixos/modules/services/desktops/gvfs.nix+1−1
@@ -57,7 +57,7 @@ in
5757 services.udev.packages = [ pkgs.libmtp.out ];
5858
5959 # Needed for unwrapped applications
60− environment.variables.GIO_EXTRA_MODULES = [ "${cfg.package}/lib/gio/modules" ];
60+ environment.sessionVariables.GIO_EXTRA_MODULES = [ "${cfg.package}/lib/gio/modules" ];
6161
6262 };
6363
nixos/modules/services/desktops/pantheon/files.nixdeleted−13
@@ -1,13 +0,0 @@
1−# pantheon files daemon.
2−
3−{ config, pkgs, lib, ... }:
4−
5−with lib;
6−
7−{
8−
9− imports = [
10− (mkRemovedOptionModule [ "services" "pantheon" "files" "enable" ] "Use `environment.systemPackages [ pkgs.pantheon.elementary-files ];`")
11− ];
12−
13−}
nixos/modules/services/desktops/pipewire/daemon/client-rt.conf.json+1−1
@@ -8,7 +8,7 @@
88 },
99 "context.modules": [
1010 {
11− "name": "libpipewire-module-rtkit",
11+ "name": "libpipewire-module-rt",
1212 "args": {},
1313 "flags": [
1414 "ifexists",
nixos/modules/services/desktops/pipewire/daemon/minimal.conf.jsonnew file+118
@@ -0,0 +1,118 @@
1+{
2+ "context.properties": {
3+ "link.max-buffers": 16,
4+ "core.daemon": true,
5+ "core.name": "pipewire-0",
6+ "settings.check-quantum": true,
7+ "settings.check-rate": true,
8+ "vm.overrides": {
9+ "default.clock.min-quantum": 1024
10+ }
11+ },
12+ "context.spa-libs": {
13+ "audio.convert.*": "audioconvert/libspa-audioconvert",
14+ "api.alsa.*": "alsa/libspa-alsa",
15+ "support.*": "support/libspa-support"
16+ },
17+ "context.modules": [
18+ {
19+ "name": "libpipewire-module-rt",
20+ "args": {
21+ "nice.level": -11
22+ },
23+ "flags": [
24+ "ifexists",
25+ "nofail"
26+ ]
27+ },
28+ {
29+ "name": "libpipewire-module-protocol-native"
30+ },
31+ {
32+ "name": "libpipewire-module-profiler"
33+ },
34+ {
35+ "name": "libpipewire-module-metadata"
36+ },
37+ {
38+ "name": "libpipewire-module-spa-node-factory"
39+ },
40+ {
41+ "name": "libpipewire-module-client-node"
42+ },
43+ {
44+ "name": "libpipewire-module-access",
45+ "args": {}
46+ },
47+ {
48+ "name": "libpipewire-module-adapter"
49+ },
50+ {
51+ "name": "libpipewire-module-link-factory"
52+ }
53+ ],
54+ "context.objects": [
55+ {
56+ "factory": "metadata",
57+ "args": {
58+ "metadata.name": "default"
59+ }
60+ },
61+ {
62+ "factory": "spa-node-factory",
63+ "args": {
64+ "factory.name": "support.node.driver",
65+ "node.name": "Dummy-Driver",
66+ "node.group": "pipewire.dummy",
67+ "priority.driver": 20000
68+ }
69+ },
70+ {
71+ "factory": "spa-node-factory",
72+ "args": {
73+ "factory.name": "support.node.driver",
74+ "node.name": "Freewheel-Driver",
75+ "priority.driver": 19000,
76+ "node.group": "pipewire.freewheel",
77+ "node.freewheel": true
78+ }
79+ },
80+ {
81+ "factory": "adapter",
82+ "args": {
83+ "factory.name": "api.alsa.pcm.source",
84+ "node.name": "system",
85+ "node.description": "system",
86+ "media.class": "Audio/Source",
87+ "api.alsa.path": "hw:0",
88+ "node.suspend-on-idle": true,
89+ "resample.disable": true,
90+ "channelmix.disable": true,
91+ "adapter.auto-port-config": {
92+ "mode": "dsp",
93+ "monitor": false,
94+ "position": "unknown"
95+ }
96+ }
97+ },
98+ {
99+ "factory": "adapter",
100+ "args": {
101+ "factory.name": "api.alsa.pcm.sink",
102+ "node.name": "system",
103+ "node.description": "system",
104+ "media.class": "Audio/Sink",
105+ "api.alsa.path": "hw:0",
106+ "node.suspend-on-idle": true,
107+ "resample.disable": true,
108+ "channelmix.disable": true,
109+ "adapter.auto-port-config": {
110+ "mode": "dsp",
111+ "monitor": false,
112+ "position": "unknown"
113+ }
114+ }
115+ }
116+ ],
117+ "context.exec": []
118+}
nixos/modules/services/desktops/pipewire/daemon/pipewire-pulse.conf.json+61−4
@@ -6,8 +6,10 @@
66 },
77 "context.modules": [
88 {
9− "name": "libpipewire-module-rtkit",
10− "args": {},
9+ "name": "libpipewire-module-rt",
10+ "args": {
11+ "nice.level": -11
12+ },
1113 "flags": [
1214 "ifexists",
1315 "nofail"
@@ -37,6 +39,61 @@
3739 }
3840 }
3941 ],
40− "context.exec": [],
41− "stream.properties": {}
42+ "context.exec": [
43+ {
44+ "path": "pactl",
45+ "args": "load-module module-always-sink"
46+ }
47+ ],
48+ "stream.properties": {},
49+ "pulse.rules": [
50+ {
51+ "matches": [
52+ {}
53+ ],
54+ "actions": {
55+ "update-props": {}
56+ }
57+ },
58+ {
59+ "matches": [
60+ {
61+ "application.process.binary": "teams"
62+ },
63+ {
64+ "application.process.binary": "skypeforlinux"
65+ }
66+ ],
67+ "actions": {
68+ "quirks": [
69+ "force-s16-info"
70+ ]
71+ }
72+ },
73+ {
74+ "matches": [
75+ {
76+ "application.process.binary": "firefox"
77+ }
78+ ],
79+ "actions": {
80+ "quirks": [
81+ "remove-capture-dont-move"
82+ ]
83+ }
84+ },
85+ {
86+ "matches": [
87+ {
88+ "application.name": "~speech-dispatcher*"
89+ }
90+ ],
91+ "actions": {
92+ "update-props": {
93+ "pulse.min.req": "1024/48000",
94+ "pulse.min.quantum": "1024/48000"
95+ }
96+ }
97+ }
98+ ]
4299}
nixos/modules/services/desktops/pipewire/daemon/pipewire.conf.json+5−2
@@ -3,6 +3,7 @@
33 "link.max-buffers": 16,
44 "core.daemon": true,
55 "core.name": "pipewire-0",
6+ "default.clock.min-quantum": 16,
67 "vm.overrides": {
78 "default.clock.min-quantum": 1024
89 }
@@ -19,8 +20,10 @@
1920 },
2021 "context.modules": [
2122 {
22− "name": "libpipewire-module-rtkit",
23− "args": {},
23+ "name": "libpipewire-module-rt",
24+ "args": {
25+ "nice.level": -11
26+ },
2427 "flags": [
2528 "ifexists",
2629 "nofail"
nixos/modules/services/desktops/pipewire/pipewire-media-session.nix+7−3
@@ -38,9 +38,8 @@ in {
3838 services.pipewire.media-session = {
3939 enable = mkOption {
4040 type = types.bool;
41− default = config.services.pipewire.enable;
42− defaultText = literalExpression "config.services.pipewire.enable";
43− description = "Example pipewire session manager";
41+ default = false;
42+ description = "Whether to enable the deprecated example Pipewire session manager";
4443 };
4544
4645 package = mkOption {
@@ -111,6 +110,11 @@ in {
111110 source = json.generate "v4l2-monitor.conf" configs.v4l2-monitor;
112111 };
113112
113+ environment.etc."pipewire/media-session.d/with-audio" =
114+ mkIf config.services.pipewire.audio.enable {
115+ text = "";
116+ };
117+
114118 environment.etc."pipewire/media-session.d/with-alsa" =
115119 mkIf config.services.pipewire.alsa.enable {
116120 text = "";
nixos/modules/services/desktops/pipewire/pipewire.nix+21−3
@@ -25,15 +25,18 @@ let
2525 client = lib.importJSON ./daemon/client.conf.json;
2626 client-rt = lib.importJSON ./daemon/client-rt.conf.json;
2727 jack = lib.importJSON ./daemon/jack.conf.json;
28+ minimal = lib.importJSON ./daemon/minimal.conf.json;
2829 pipewire = lib.importJSON ./daemon/pipewire.conf.json;
2930 pipewire-pulse = lib.importJSON ./daemon/pipewire-pulse.conf.json;
3031 };
3132
33+ useSessionManager = cfg.wireplumber.enable || cfg.media-session.enable;
34+
3235 configs = {
3336 client = recursiveUpdate defaults.client cfg.config.client;
3437 client-rt = recursiveUpdate defaults.client-rt cfg.config.client-rt;
3538 jack = recursiveUpdate defaults.jack cfg.config.jack;
36− pipewire = recursiveUpdate defaults.pipewire cfg.config.pipewire;
39+ pipewire = recursiveUpdate (if useSessionManager then defaults.pipewire else defaults.minimal) cfg.config.pipewire;
3740 pipewire-pulse = recursiveUpdate defaults.pipewire-pulse cfg.config.pipewire-pulse;
3841 };
3942in {
@@ -113,6 +116,16 @@ in {
113116 };
114117 };
115118
119+ audio = {
120+ enable = lib.mkOption {
121+ type = lib.types.bool;
122+ # this is for backwards compatibility
123+ default = cfg.alsa.enable || cfg.jack.enable || cfg.pulse.enable;
124+ defaultText = lib.literalExpression "config.services.pipewire.alsa.enable || config.services.pipewire.jack.enable || config.services.pipewire.pulse.enable";
125+ description = "Whether to use PipeWire as the primary sound server";
126+ };
127+ };
128+
116129 alsa = {
117130 enable = mkEnableOption "ALSA support";
118131 support32Bit = mkEnableOption "32-bit ALSA support on 64-bit systems";
@@ -149,13 +162,18 @@ in {
149162 config = mkIf cfg.enable {
150163 assertions = [
151164 {
152− assertion = cfg.pulse.enable -> !config.hardware.pulseaudio.enable;
153− message = "PipeWire based PulseAudio server emulation replaces PulseAudio. This option requires `hardware.pulseaudio.enable` to be set to false";
165+ assertion = cfg.audio.enable -> !config.hardware.pulseaudio.enable;
166+ message = "Using PipeWire as the sound server conflicts with PulseAudio. This option requires `hardware.pulseaudio.enable` to be set to false";
154167 }
155168 {
156169 assertion = cfg.jack.enable -> !config.services.jack.jackd.enable;
157170 message = "PipeWire based JACK emulation doesn't use the JACK service. This option requires `services.jack.jackd.enable` to be set to false";
158171 }
172+ {
173+ # JACK intentionally not checked, as PW-on-JACK setups are a thing that some people may want
174+ assertion = (cfg.alsa.enable || cfg.pulse.enable) -> cfg.audio.enable;
175+ message = "Using PipeWire's ALSA/PulseAudio compatibility layers requires running PipeWire as the sound server. Set `services.pipewire.audio.enable` to true.";
176+ }
159177 ];
160178
161179 environment.systemPackages = [ cfg.package ]
nixos/modules/services/desktops/pipewire/wireplumber.nix+18−5
@@ -1,22 +1,27 @@
11{ config, lib, pkgs, ... }:
22
33let
4− cfg = config.services.pipewire.wireplumber;
4+ pwCfg = config.services.pipewire;
5+ cfg = pwCfg.wireplumber;
6+ pwUsedForAudio = pwCfg.audio.enable;
57in
68{
79 meta.maintainers = [ lib.maintainers.k900 ];
810
911 options = {
1012 services.pipewire.wireplumber = {
11− enable = lib.mkEnableOption "A modular session / policy manager for PipeWire";
13+ enable = lib.mkOption {
14+ type = lib.types.bool;
15+ default = config.services.pipewire.enable;
16+ defaultText = lib.literalExpression "config.services.pipewire.enable";
17+ description = "Whether to enable Wireplumber, a modular session / policy manager for PipeWire";
18+ };
1219
1320 package = lib.mkOption {
1421 type = lib.types.package;
1522 default = pkgs.wireplumber;
1623 defaultText = lib.literalExpression "pkgs.wireplumber";
17− description = ''
18− The wireplumber derivation to use.
19− '';
24+ description = "The wireplumber derivation to use.";
2025 };
2126 };
2227 };
@@ -30,6 +35,14 @@ in
3035 ];
3136
3237 environment.systemPackages = [ cfg.package ];
38+
39+ environment.etc."wireplumber/main.lua.d/80-nixos.lua" = lib.mkIf (!pwUsedForAudio) {
40+ text = ''
41+ # Pipewire is not used for audio, so prevent it from grabbing audio devices
42+ alsa_monitor.enable = function() end
43+ '';
44+ };
45+
3346 systemd.packages = [ cfg.package ];
3447
3548 systemd.services.wireplumber.enable = config.services.pipewire.systemWide;
nixos/modules/services/development/zammad.nixnew file+323
@@ -0,0 +1,323 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.zammad;
7+ settingsFormat = pkgs.formats.yaml { };
8+ filterNull = filterAttrs (_: v: v != null);
9+ serviceConfig = {
10+ Type = "simple";
11+ Restart = "always";
12+
13+ User = "zammad";
14+ Group = "zammad";
15+ PrivateTmp = true;
16+ StateDirectory = "zammad";
17+ WorkingDirectory = cfg.dataDir;
18+ };
19+ environment = {
20+ RAILS_ENV = "production";
21+ NODE_ENV = "production";
22+ RAILS_SERVE_STATIC_FILES = "true";
23+ RAILS_LOG_TO_STDOUT = "true";
24+ };
25+ databaseConfig = settingsFormat.generate "database.yml" cfg.database.settings;
26+in
27+{
28+
29+ options = {
30+ services.zammad = {
31+ enable = mkEnableOption "Zammad, a web-based, open source user support/ticketing solution.";
32+
33+ package = mkOption {
34+ type = types.package;
35+ default = pkgs.zammad;
36+ defaultText = literalExpression "pkgs.zammad";
37+ description = "Zammad package to use.";
38+ };
39+
40+ dataDir = mkOption {
41+ type = types.path;
42+ default = "/var/lib/zammad";
43+ description = ''
44+ Path to a folder that will contain Zammad working directory.
45+ '';
46+ };
47+
48+ host = mkOption {
49+ type = types.str;
50+ default = "127.0.0.1";
51+ example = "192.168.23.42";
52+ description = "Host address.";
53+ };
54+
55+ openPorts = mkOption {
56+ type = types.bool;
57+ default = false;
58+ description = "Whether to open firewall ports for Zammad";
59+ };
60+
61+ port = mkOption {
62+ type = types.port;
63+ default = 3000;
64+ description = "Web service port.";
65+ };
66+
67+ websocketPort = mkOption {
68+ type = types.port;
69+ default = 6042;
70+ description = "Websocket service port.";
71+ };
72+
73+ database = {
74+ type = mkOption {
75+ type = types.enum [ "PostgreSQL" "MySQL" ];
76+ default = "PostgreSQL";
77+ example = "MySQL";
78+ description = "Database engine to use.";
79+ };
80+
81+ host = mkOption {
82+ type = types.nullOr types.str;
83+ default = {
84+ PostgreSQL = "/run/postgresql";
85+ MySQL = "localhost";
86+ }.${cfg.database.type};
87+ defaultText = literalExpression ''
88+ {
89+ PostgreSQL = "/run/postgresql";
90+ MySQL = "localhost";
91+ }.''${config.services.zammad.database.type};
92+ '';
93+ description = ''
94+ Database host address.
95+ '';
96+ };
97+
98+ port = mkOption {
99+ type = types.nullOr types.port;
100+ default = null;
101+ description = "Database port. Use <literal>null</literal> for default port.";
102+ };
103+
104+ name = mkOption {
105+ type = types.str;
106+ default = "zammad";
107+ description = ''
108+ Database name.
109+ '';
110+ };
111+
112+ user = mkOption {
113+ type = types.nullOr types.str;
114+ default = "zammad";
115+ description = "Database user.";
116+ };
117+
118+ passwordFile = mkOption {
119+ type = types.nullOr types.path;
120+ default = null;
121+ example = "/run/keys/zammad-dbpassword";
122+ description = ''
123+ A file containing the password for <option>services.zammad.database.user</option>.
124+ '';
125+ };
126+
127+ createLocally = mkOption {
128+ type = types.bool;
129+ default = true;
130+ description = "Whether to create a local database automatically.";
131+ };
132+
133+ settings = mkOption {
134+ type = settingsFormat.type;
135+ default = { };
136+ example = literalExpression ''
137+ {
138+ }
139+ '';
140+ description = ''
141+ The <filename>database.yml</filename> configuration file as key value set.
142+ See <link xlink:href='TODO' />
143+ for list of configuration parameters.
144+ '';
145+ };
146+ };
147+
148+ secretKeyBaseFile = mkOption {
149+ type = types.nullOr types.path;
150+ default = null;
151+ example = "/run/keys/secret_key_base";
152+ description = ''
153+ The path to a file containing the
154+ <literal>secret_key_base</literal> secret.
155+
156+ Zammad uses <literal>secret_key_base</literal> to encrypt
157+ the cookie store, which contains session data, and to digest
158+ user auth tokens.
159+
160+ Needs to be a 64 byte long string of hexadecimal
161+ characters. You can generate one by running
162+
163+ <screen>
164+ <prompt>$ </prompt>openssl rand -hex 64 >/path/to/secret_key_base_file
165+ </screen>
166+
167+ This should be a string, not a nix path, since nix paths are
168+ copied into the world-readable nix store.
169+ '';
170+ };
171+ };
172+ };
173+
174+ config = mkIf cfg.enable {
175+
176+ services.zammad.database.settings = {
177+ production = mapAttrs (_: v: mkDefault v) (filterNull {
178+ adapter = {
179+ PostgreSQL = "postgresql";
180+ MySQL = "mysql2";
181+ }.${cfg.database.type};
182+ database = cfg.database.name;
183+ pool = 50;
184+ timeout = 5000;
185+ encoding = "utf8";
186+ username = cfg.database.user;
187+ host = cfg.database.host;
188+ port = cfg.database.port;
189+ });
190+ };
191+
192+ networking.firewall.allowedTCPPorts = mkIf cfg.openPorts [
193+ config.services.zammad.port
194+ config.services.zammad.websocketPort
195+ ];
196+
197+ users.users.zammad = {
198+ isSystemUser = true;
199+ home = cfg.dataDir;
200+ group = "zammad";
201+ };
202+
203+ users.groups.zammad = { };
204+
205+ assertions = [
206+ {
207+ assertion = cfg.database.createLocally -> cfg.database.user == "zammad";
208+ message = "services.zammad.database.user must be set to \"zammad\" if services.zammad.database.createLocally is set to true";
209+ }
210+ {
211+ assertion = cfg.database.createLocally -> cfg.database.passwordFile == null;
212+ message = "a password cannot be specified if services.zammad.database.createLocally is set to true";
213+ }
214+ ];
215+
216+ services.mysql = optionalAttrs (cfg.database.createLocally && cfg.database.type == "MySQL") {
217+ enable = true;
218+ package = mkDefault pkgs.mariadb;
219+ ensureDatabases = [ cfg.database.name ];
220+ ensureUsers = [
221+ {
222+ name = cfg.database.user;
223+ ensurePermissions = { "${cfg.database.name}.*" = "ALL PRIVILEGES"; };
224+ }
225+ ];
226+ };
227+
228+ services.postgresql = optionalAttrs (cfg.database.createLocally && cfg.database.type == "PostgreSQL") {
229+ enable = true;
230+ ensureDatabases = [ cfg.database.name ];
231+ ensureUsers = [
232+ {
233+ name = cfg.database.user;
234+ ensurePermissions = { "DATABASE ${cfg.database.name}" = "ALL PRIVILEGES"; };
235+ }
236+ ];
237+ };
238+
239+ systemd.services.zammad-web = {
240+ inherit environment;
241+ serviceConfig = serviceConfig // {
242+ # loading all the gems takes time
243+ TimeoutStartSec = 1200;
244+ };
245+ after = [
246+ "network.target"
247+ "postgresql.service"
248+ ];
249+ requires = [
250+ "postgresql.service"
251+ ];
252+ description = "Zammad web";
253+ wantedBy = [ "multi-user.target" ];
254+ preStart = ''
255+ # Blindly copy the whole project here.
256+ chmod -R +w .
257+ rm -rf ./public/assets/*
258+ rm -rf ./tmp/*
259+ rm -rf ./log/*
260+ cp -r --no-preserve=owner ${cfg.package}/* .
261+ chmod -R +w .
262+ # config file
263+ cp ${databaseConfig} ./config/database.yml
264+ chmod -R +w .
265+ ${optionalString (cfg.database.passwordFile != null) ''
266+ {
267+ echo -n " password: "
268+ cat ${cfg.database.passwordFile}
269+ } >> ./config/database.yml
270+ ''}
271+ ${optionalString (cfg.secretKeyBaseFile != null) ''
272+ {
273+ echo "production: "
274+ echo -n " secret_key_base: "
275+ cat ${cfg.secretKeyBaseFile}
276+ } > ./config/secrets.yml
277+ ''}
278+
279+ if [ `${config.services.postgresql.package}/bin/psql \
280+ --host ${cfg.database.host} \
281+ ${optionalString
282+ (cfg.database.port != null)
283+ "--port ${toString cfg.database.port}"} \
284+ --username ${cfg.database.user} \
285+ --dbname ${cfg.database.name} \
286+ --command "SELECT COUNT(*) FROM pg_class c \
287+ JOIN pg_namespace s ON s.oid = c.relnamespace \
288+ WHERE s.nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema') \
289+ AND s.nspname NOT LIKE 'pg_temp%';" | sed -n 3p` -eq 0 ]; then
290+ echo "Initialize database"
291+ ./bin/rake --no-system db:migrate
292+ ./bin/rake --no-system db:seed
293+ else
294+ echo "Migrate database"
295+ ./bin/rake --no-system db:migrate
296+ fi
297+ echo "Done"
298+ '';
299+ script = "./script/rails server -b ${cfg.host} -p ${toString cfg.port}";
300+ };
301+
302+ systemd.services.zammad-websocket = {
303+ inherit serviceConfig environment;
304+ after = [ "zammad-web.service" ];
305+ requires = [ "zammad-web.service" ];
306+ description = "Zammad websocket";
307+ wantedBy = [ "multi-user.target" ];
308+ script = "./script/websocket-server.rb -b ${cfg.host} -p ${toString cfg.websocketPort} start";
309+ };
310+
311+ systemd.services.zammad-scheduler = {
312+ inherit environment;
313+ serviceConfig = serviceConfig // { Type = "forking"; };
314+ after = [ "zammad-web.service" ];
315+ requires = [ "zammad-web.service" ];
316+ description = "Zammad scheduler";
317+ wantedBy = [ "multi-user.target" ];
318+ script = "./script/scheduler.rb start";
319+ };
320+ };
321+
322+ meta.maintainers = with lib.maintainers; [ garbas taeer ];
323+}
nixos/modules/services/hardware/ddccontrol.nix+3
@@ -20,6 +20,9 @@ in
2020 ###### implementation
2121
2222 config = lib.mkIf cfg.enable {
23+ # Load the i2c-dev module
24+ boot.kernelModules = [ "i2c_dev" ];
25+
2326 # Give users access to the "gddccontrol" tool
2427 environment.systemPackages = [
2528 pkgs.ddccontrol
nixos/modules/services/hardware/triggerhappy.nix+1−1
@@ -70,7 +70,7 @@ in
7070 type = types.listOf (types.submodule bindingCfg);
7171 default = [];
7272 example = lib.literalExpression ''
73− [ { keys = ["PLAYPAUSE"]; cmd = "''${pkgs.mpc_cli}/bin/mpc -q toggle"; } ]
73+ [ { keys = ["PLAYPAUSE"]; cmd = "''${pkgs.mpc-cli}/bin/mpc -q toggle"; } ]
7474 '';
7575 description = ''
7676 Key bindings for <command>triggerhappy</command>.
nixos/modules/services/hardware/udev.nix+2−1
@@ -317,7 +317,8 @@ in
317317 (isYes "NET")
318318 ];
319319
320− boot.extraModprobeConfig = "options firmware_class path=${config.hardware.firmware}/lib/firmware";
320+ # We don't place this into `extraModprobeConfig` so that stage-1 ramdisk doesn't bloat.
321+ environment.etc."modprobe.d/firmware.conf".text = "options firmware_class path=${config.hardware.firmware}/lib/firmware";
321322
322323 system.activationScripts.udevd =
323324 ''
nixos/modules/services/hardware/udisks2.nix+2
@@ -32,6 +32,8 @@ with lib;
3232
3333 environment.systemPackages = [ pkgs.udisks2 ];
3434
35+ security.polkit.enable = true;
36+
3537 services.dbus.packages = [ pkgs.udisks2 ];
3638
3739 systemd.tmpfiles.rules = [ "d /var/lib/udisks2 0755 root root -" ];
nixos/modules/services/hardware/undervolt.nix+1−3
@@ -164,8 +164,6 @@ in
164164 environment.systemPackages = [ cfg.package ];
165165
166166 systemd.services.undervolt = {
167− path = [ pkgs.undervolt ];
168−
169167 description = "Intel Undervolting Service";
170168
171169 # Apply undervolt on boot, nixos generation switch and resume
@@ -175,7 +173,7 @@ in
175173 serviceConfig = {
176174 Type = "oneshot";
177175 Restart = "no";
178− ExecStart = "${pkgs.undervolt}/bin/undervolt ${toString cliArgs}";
176+ ExecStart = "${cfg.package}/bin/undervolt ${toString cliArgs}";
179177 };
180178 };
181179
nixos/modules/services/hardware/upower.nix+6−6
@@ -155,8 +155,8 @@ in
155155 default = 1200;
156156 description = ''
157157 When <literal>usePercentageForPolicy</literal> is
158− <literal>false</literal>, the time remaining at which UPower will
159− consider the battery low.
158+ <literal>false</literal>, the time remaining in seconds at which
159+ UPower will consider the battery low.
160160
161161 If any value (of <literal>timeLow</literal>,
162162 <literal>timeCritical</literal> and <literal>timeAction</literal>) is
@@ -169,8 +169,8 @@ in
169169 default = 300;
170170 description = ''
171171 When <literal>usePercentageForPolicy</literal> is
172− <literal>false</literal>, the time remaining at which UPower will
173− consider the battery critical.
172+ <literal>false</literal>, the time remaining in seconds at which
173+ UPower will consider the battery critical.
174174
175175 If any value (of <literal>timeLow</literal>,
176176 <literal>timeCritical</literal> and <literal>timeAction</literal>) is
@@ -183,8 +183,8 @@ in
183183 default = 120;
184184 description = ''
185185 When <literal>usePercentageForPolicy</literal> is
186− <literal>false</literal>, the time remaining at which UPower will
187− take action for the critical battery level.
186+ <literal>false</literal>, the time remaining in seconds at which
187+ UPower will take action for the critical battery level.
188188
189189 If any value (of <literal>timeLow</literal>,
190190 <literal>timeCritical</literal> and <literal>timeAction</literal>) is
nixos/modules/services/misc/home-assistant.nix → nixos/modules/services/home-automation/home-assistant.nixrenamed+253−110
@@ -4,35 +4,27 @@ with lib;
44
55let
66 cfg = config.services.home-assistant;
7+ format = pkgs.formats.yaml {};
78
8− # cfg.config != null can be assumed here
9− configJSON = pkgs.writeText "configuration.json"
10− (builtins.toJSON (if cfg.applyDefaultConfig then
11− (recursiveUpdate defaultConfig cfg.config) else cfg.config));
9+ # Render config attribute sets to YAML
10+ # Values that are null will be filtered from the output, so this is one way to have optional
11+ # options shown in settings.
12+ # We post-process the result to add support for YAML functions, like secrets or includes, see e.g.
13+ # https://www.home-assistant.io/docs/configuration/secrets/
14+ filteredConfig = lib.converge (lib.filterAttrsRecursive (_: v: ! elem v [ null ])) cfg.config or {};
1215 configFile = pkgs.runCommand "configuration.yaml" { preferLocalBuild = true; } ''
13− ${pkgs.remarshal}/bin/json2yaml -i ${configJSON} -o $out
14− # Hack to support custom yaml objects,
15− # i.e. secrets: https://www.home-assistant.io/docs/configuration/secrets/
16+ cp ${format.generate "configuration.yaml" filteredConfig} $out
1617 sed -i -e "s/'\!\([a-z_]\+\) \(.*\)'/\!\1 \2/;s/^\!\!/\!/;" $out
1718 '';
19+ lovelaceConfig = cfg.lovelaceConfig or {};
20+ lovelaceConfigFile = format.generate "ui-lovelace.yaml" lovelaceConfig;
1821
19− lovelaceConfigJSON = pkgs.writeText "ui-lovelace.json"
20− (builtins.toJSON cfg.lovelaceConfig);
21− lovelaceConfigFile = pkgs.runCommand "ui-lovelace.yaml" { preferLocalBuild = true; } ''
22− ${pkgs.remarshal}/bin/json2yaml -i ${lovelaceConfigJSON} -o $out
23− '';
24−
22+ # Components advertised by the home-assistant package
2523 availableComponents = cfg.package.availableComponents;
2624
25+ # Components that were added by overriding the package
2726 explicitComponents = cfg.package.extraComponents;
28−
29− usedPlatforms = config:
30− if isAttrs config then
31− optional (config ? platform) config.platform
32− ++ concatMap usedPlatforms (attrValues config)
33− else if isList config then
34− concatMap usedPlatforms config
35− else [ ];
27+ useExplicitComponent = component: elem component explicitComponents;
3628
3729 # Given a component "platform", looks up whether it is used in the config
3830 # as `platform = "platform";`.
@@ -42,34 +34,46 @@ let
4234 # platform = "mqtt";
4335 # ...
4436 # } ];
45− useComponentPlatform = component: elem component (usedPlatforms cfg.config);
37+ usedPlatforms = config:
38+ if isAttrs config then
39+ optional (config ? platform) config.platform
40+ ++ concatMap usedPlatforms (attrValues config)
41+ else if isList config then
42+ concatMap usedPlatforms config
43+ else [ ];
4644
47− useExplicitComponent = component: elem component explicitComponents;
45+ useComponentPlatform = component: elem component (usedPlatforms cfg.config);
4846
49− # Returns whether component is used in config or explicitly passed into package
47+ # Returns whether component is used in config, explicitly passed into package or
48+ # configured in the module.
5049 useComponent = component:
5150 hasAttrByPath (splitString "." component) cfg.config
5251 || useComponentPlatform component
53− || useExplicitComponent component;
52+ || useExplicitComponent component
53+ || builtins.elem component cfg.extraComponents;
5454
55− # List of components used in config
55+ # Final list of components passed into the package to include required dependencies
5656 extraComponents = filter useComponent availableComponents;
5757
58− package = if (cfg.autoExtraComponents && cfg.config != null)
59− then (cfg.package.override { inherit extraComponents; })
60− else cfg.package;
58+ package = (cfg.package.override (oldArgs: {
59+ # Respect overrides that already exist in the passed package and
60+ # concat it with values passed via the module.
61+ extraComponents = oldArgs.extraComponents or [] ++ extraComponents;
62+ extraPackages = ps: (oldArgs.extraPackages or (_: []) ps) ++ (cfg.extraPackages ps);
63+ }));
64+in {
65+ imports = [
66+ # Migrations in NixOS 22.05
67+ (mkRemovedOptionModule [ "services" "home-assistant" "applyDefaultConfig" ] "The default config was migrated into services.home-assistant.config")
68+ (mkRemovedOptionModule [ "services" "home-assistant" "autoExtraComponents" ] "Components are now parsed from services.home-assistant.config unconditionally")
69+ (mkRenamedOptionModule [ "services" "home-assistant" "port" ] [ "services" "home-assistant" "config" "http" "server_port" ])
70+ ];
6171
62− # If you are changing this, please update the description in applyDefaultConfig
63− defaultConfig = {
64− homeassistant.time_zone = config.time.timeZone;
65− http.server_port = cfg.port;
66− } // optionalAttrs (cfg.lovelaceConfig != null) {
67− lovelace.mode = "yaml";
72+ meta = {
73+ buildDocsInSandbox = false;
74+ maintainers = teams.home-assistant.members;
6875 };
6976
70−in {
71− meta.maintainers = teams.home-assistant.members;
72−
7377 options.services.home-assistant = {
7478 # Running home-assistant on NixOS is considered an installation method that is unsupported by the upstream project.
7579 # https://github.com/home-assistant/architecture/blob/master/adr/0012-define-supported-installation-method.md#decision
@@ -81,42 +85,166 @@ in {
8185 description = "The config directory, where your <filename>configuration.yaml</filename> is located.";
8286 };
8387
84− port = mkOption {
85− default = 8123;
86− type = types.port;
87− description = "The port on which to listen.";
88+ extraComponents = mkOption {
89+ type = types.listOf (types.enum availableComponents);
90+ default = [
91+ # List of components required to complete the onboarding
92+ "default_config"
93+ "met"
94+ "esphome"
95+ ] ++ optionals (pkgs.stdenv.hostPlatform.isAarch32 || pkgs.stdenv.hostPlatform.isAarch64) [
96+ # Use the platform as an indicator that we might be running on a RaspberryPi and include
97+ # relevant components
98+ "rpi_power"
99+ ];
100+ example = literalExpression ''
101+ [
102+ "analytics"
103+ "default_config"
104+ "esphome"
105+ "my"
106+ "shopping_list"
107+ "wled"
108+ ]
109+ '';
110+ description = ''
111+ List of <link xlink:href="https://www.home-assistant.io/integrations/">components</link> that have their dependencies included in the package.
112+
113+ The component name can be found in the URL, for example <literal>https://www.home-assistant.io/integrations/ffmpeg/</literal> would map to <literal>ffmpeg</literal>.
114+ '';
88115 };
89116
90− applyDefaultConfig = mkOption {
91− default = true;
92− type = types.bool;
117+ extraPackages = mkOption {
118+ type = types.functionTo (types.listOf types.package);
119+ default = _: [];
120+ defaultText = literalExpression ''
121+ python3Packages: with python3Packages; [];
122+ '';
123+ example = literalExpression ''
124+ python3Packages: with python3Packages; [
125+ # postgresql support
126+ psycopg2
127+ ];
128+ '';
93129 description = ''
94− Setting this option enables a few configuration options for HA based on NixOS configuration (such as time zone) to avoid having to manually specify configuration we already have.
95− </para>
96− <para>
97− Currently one side effect of enabling this is that the <literal>http</literal> component will be enabled.
98− </para>
99− <para>
100− This only takes effect if <literal>config != null</literal> in order to ensure that a manually managed <filename>configuration.yaml</filename> is not overwritten.
130+ List of packages to add to propagatedBuildInputs.
131+
132+ A popular example is <package>python3Packages.psycopg2</package>
133+ for PostgreSQL support in the recorder component.
101134 '';
102135 };
103136
104137 config = mkOption {
105− default = null;
106− # Migrate to new option types later: https://github.com/NixOS/nixpkgs/pull/75584
107− type = with lib.types; let
108− valueType = nullOr (oneOf [
109− bool
110− int
111− float
112− str
113− (lazyAttrsOf valueType)
114− (listOf valueType)
115− ]) // {
116− description = "Yaml value";
117− emptyValue.value = {};
138+ type = types.nullOr (types.submodule {
139+ freeformType = format.type;
140+ options = {
141+ # This is a partial selection of the most common options, so new users can quickly
142+ # pick up how to match home-assistants config structure to ours. It also lets us preset
143+ # config values intelligently.
144+
145+ homeassistant = {
146+ # https://www.home-assistant.io/docs/configuration/basic/
147+ name = mkOption {
148+ type = types.nullOr types.str;
149+ default = null;
150+ example = "Home";
151+ description = ''
152+ Name of the location where Home Assistant is running.
153+ '';
154+ };
155+
156+ latitude = mkOption {
157+ type = types.nullOr (types.either types.float types.str);
158+ default = null;
159+ example = 52.3;
160+ description = ''
161+ Latitude of your location required to calculate the time the sun rises and sets.
162+ '';
163+ };
164+
165+ longitude = mkOption {
166+ type = types.nullOr (types.either types.float types.str);
167+ default = null;
168+ example = 4.9;
169+ description = ''
170+ Longitude of your location required to calculate the time the sun rises and sets.
171+ '';
172+ };
173+
174+ unit_system = mkOption {
175+ type = types.nullOr (types.enum [ "metric" "imperial" ]);
176+ default = null;
177+ example = "metric";
178+ description = ''
179+ The unit system to use. This also sets temperature_unit, Celsius for Metric and Fahrenheit for Imperial.
180+ '';
181+ };
182+
183+ temperature_unit = mkOption {
184+ type = types.nullOr (types.enum [ "C" "F" ]);
185+ default = null;
186+ example = "C";
187+ description = ''
188+ Override temperature unit set by unit_system. <literal>C</literal> for Celsius, <literal>F</literal> for Fahrenheit.
189+ '';
190+ };
191+
192+ time_zone = mkOption {
193+ type = types.nullOr types.str;
194+ default = config.time.timeZone or null;
195+ defaultText = literalExpression ''
196+ config.time.timeZone or null
197+ '';
198+ example = "Europe/Amsterdam";
199+ description = ''
200+ Pick your time zone from the column TZ of Wikipedia’s <link xlink:href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">list of tz database time zones</link>.
201+ '';
202+ };
118203 };
119− in valueType;
204+
205+ http = {
206+ # https://www.home-assistant.io/integrations/http/
207+ server_host = mkOption {
208+ type = types.either types.str (types.listOf types.str);
209+ default = [
210+ "0.0.0.0"
211+ "::"
212+ ];
213+ example = "::1";
214+ description = ''
215+ Only listen to incoming requests on specific IP/host. The default listed assumes support for IPv4 and IPv6.
216+ '';
217+ };
218+
219+ server_port = mkOption {
220+ default = 8123;
221+ type = types.port;
222+ description = ''
223+ The port on which to listen.
224+ '';
225+ };
226+ };
227+
228+ lovelace = {
229+ # https://www.home-assistant.io/lovelace/dashboards/
230+ mode = mkOption {
231+ type = types.enum [ "yaml" "storage" ];
232+ default = if cfg.lovelaceConfig != null
233+ then "yaml"
234+ else "storage";
235+ defaultText = literalExpression ''
236+ if cfg.lovelaceConfig != null
237+ then "yaml"
238+ else "storage";
239+ '';
240+ example = "yaml";
241+ description = ''
242+ In what mode should the main Lovelace panel be, <literal>yaml</literal> or <literal>storage</literal> (UI managed).
243+ '';
244+ };
245+ };
246+ };
247+ });
120248 example = literalExpression ''
121249 {
122250 homeassistant = {
@@ -130,15 +258,19 @@ in {
130258 frontend = {
131259 themes = "!include_dir_merge_named themes";
132260 };
133− http = { };
261+ http = {};
134262 feedreader.urls = [ "https://nixos.org/blogs.xml" ];
135263 }
136264 '';
137265 description = ''
138266 Your <filename>configuration.yaml</filename> as a Nix attribute set.
139− Beware that setting this option will delete your previous <filename>configuration.yaml</filename>.
140− <link xlink:href="https://www.home-assistant.io/docs/configuration/secrets/">Secrets</link>
141− are encoded as strings as shown in the example.
267+
268+ YAML functions like <link xlink:href="https://www.home-assistant.io/docs/configuration/secrets/">secrets</link>
269+ can be passed as a string and will be unquoted automatically.
270+
271+ Unless this option is explicitly set to <literal>null</literal>
272+ we assume your <filename>configuration.yaml</filename> is
273+ managed through this module and thereby overwritten on startup.
142274 '';
143275 };
144276
@@ -147,16 +279,18 @@ in {
147279 type = types.bool;
148280 description = ''
149281 Whether to make <filename>configuration.yaml</filename> writable.
150− This only has an effect if <option>config</option> is set.
282+
151283 This will allow you to edit it from Home Assistant's web interface.
284+
285+ This only has an effect if <option>config</option> is set.
152286 However, bear in mind that it will be overwritten at every start of the service.
153287 '';
154288 };
155289
156290 lovelaceConfig = mkOption {
157291 default = null;
158− type = with types; nullOr attrs;
159− # from https://www.home-assistant.io/lovelace/yaml-mode/
292+ type = types.nullOr format.type;
293+ # from https://www.home-assistant.io/lovelace/dashboards/
160294 example = literalExpression ''
161295 {
162296 title = "My Awesome Home";
@@ -172,8 +306,8 @@ in {
172306 '';
173307 description = ''
174308 Your <filename>ui-lovelace.yaml</filename> as a Nix attribute set.
175− Setting this option will automatically add
176− <literal>lovelace.mode = "yaml";</literal> to your <option>config</option>.
309+ Setting this option will automatically set <literal>lovelace.mode</literal> to <literal>yaml</literal>.
310+
177311 Beware that setting this option will delete your previous <filename>ui-lovelace.yaml</filename>
178312 '';
179313 };
@@ -183,8 +317,10 @@ in {
183317 type = types.bool;
184318 description = ''
185319 Whether to make <filename>ui-lovelace.yaml</filename> writable.
186− This only has an effect if <option>lovelaceConfig</option> is set.
320+
187321 This will allow you to edit it from Home Assistant's web interface.
322+
323+ This only has an effect if <option>lovelaceConfig</option> is set.
188324 However, bear in mind that it will be overwritten at every start of the service.
189325 '';
190326 };
@@ -201,30 +337,18 @@ in {
201337 type = types.package;
202338 example = literalExpression ''
203339 pkgs.home-assistant.override {
204− extraPackages = ps: with ps; [ colorlog ];
340+ extraPackages = python3Packages: with python3Packages; [
341+ psycopg2
342+ ];
343+ extraComponents = [
344+ "default_config"
345+ "esphome"
346+ "met"
347+ ];
205348 }
206349 '';
207350 description = ''
208− Home Assistant package to use. By default the tests are disabled, as they take a considerable amout of time to complete.
209− Override <literal>extraPackages</literal> or <literal>extraComponents</literal> in order to add additional dependencies.
210− If you specify <option>config</option> and do not set <option>autoExtraComponents</option>
211− to <literal>false</literal>, overriding <literal>extraComponents</literal> will have no effect.
212− Avoid <literal>home-assistant.overridePythonAttrs</literal> if you use <literal>autoExtraComponents</literal>.
213− '';
214− };
215−
216− autoExtraComponents = mkOption {
217− default = true;
218− type = types.bool;
219− description = ''
220− If set to <literal>true</literal>, the components used in <literal>config</literal>
221− are set as the specified package's <literal>extraComponents</literal>.
222− This in turn adds all packaged dependencies to the derivation.
223− You might still see import errors in your log.
224− In this case, you will need to package the necessary dependencies yourself
225− or ask for someone else to package them.
226− If a dependency is packaged but not automatically added to this list,
227− you might need to specify it in <literal>extraPackages</literal>.
351+ The Home Assistant package to use.
228352 '';
229353 };
230354
@@ -240,18 +364,30 @@ in {
240364
241365 systemd.services.home-assistant = {
242366 description = "Home Assistant";
243− after = [ "network.target" ];
244− preStart = optionalString (cfg.config != null) (if cfg.configWritable then ''
245− cp --no-preserve=mode ${configFile} "${cfg.configDir}/configuration.yaml"
246− '' else ''
247− rm -f "${cfg.configDir}/configuration.yaml"
248− ln -s ${configFile} "${cfg.configDir}/configuration.yaml"
249− '') + optionalString (cfg.lovelaceConfig != null) (if cfg.lovelaceConfigWritable then ''
250− cp --no-preserve=mode ${lovelaceConfigFile} "${cfg.configDir}/ui-lovelace.yaml"
251− '' else ''
252− rm -f "${cfg.configDir}/ui-lovelace.yaml"
253− ln -s ${lovelaceConfigFile} "${cfg.configDir}/ui-lovelace.yaml"
254− '');
367+ after = [
368+ "network-online.target"
369+
370+ # prevent races with database creation
371+ "mysql.service"
372+ "postgresql.service"
373+ ];
374+ preStart = let
375+ copyConfig = if cfg.configWritable then ''
376+ cp --no-preserve=mode ${configFile} "${cfg.configDir}/configuration.yaml"
377+ '' else ''
378+ rm -f "${cfg.configDir}/configuration.yaml"
379+ ln -s ${configFile} "${cfg.configDir}/configuration.yaml"
380+ '';
381+ copyLovelaceConfig = if cfg.lovelaceConfigWritable then ''
382+ cp --no-preserve=mode ${lovelaceConfigFile} "${cfg.configDir}/ui-lovelace.yaml"
383+ '' else ''
384+ rm -f "${cfg.configDir}/ui-lovelace.yaml"
385+ ln -s ${lovelaceConfigFile} "${cfg.configDir}/ui-lovelace.yaml"
386+ '';
387+ in
388+ (optionalString (cfg.config != null) copyConfig) +
389+ (optionalString (cfg.lovelaceConfig != null) copyLovelaceConfig)
390+ ;
255391 serviceConfig = let
256392 # List of capabilities to equip home-assistant with, depending on configured components
257393 capabilities = [
@@ -278,6 +414,11 @@ in {
278414 "bluetooth_tracker"
279415 "bluetooth_le_tracker"
280416 ];
417+ componentsUsingPing = [
418+ # Components that require the capset syscall for the ping wrapper
419+ "ping"
420+ "wake_on_lan"
421+ ];
281422 componentsUsingSerialDevices = [
282423 # Components that require access to serial devices (/dev/tty*)
283424 # List generated from home-assistant documentation:
@@ -324,7 +465,7 @@ in {
324465 "zwave_js"
325466 ];
326467 in {
327− ExecStart = "${package}/bin/hass --runner --config '${cfg.configDir}'";
468+ ExecStart = "${package}/bin/hass --config '${cfg.configDir}'";
328469 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
329470 User = "hass";
330471 Group = "hass";
@@ -382,6 +523,8 @@ in {
382523 SystemCallFilter = [
383524 "@system-service"
384525 "~@privileged"
526+ ] ++ optionals (any useComponent componentsUsingPing) [
527+ "capset"
385528 ];
386529 UMask = "0077";
387530 };
nixos/modules/services/misc/zigbee2mqtt.nix → nixos/modules/services/home-automation/zigbee2mqtt.nixrenamed
The content is the same.
nixos/modules/services/logging/graylog.nix+1−1
@@ -132,7 +132,7 @@ in
132132 description = "Graylog server daemon user";
133133 };
134134 };
135− users.groups = mkIf (cfg.user == "graylog") {};
135+ users.groups = mkIf (cfg.user == "graylog") { graylog = {}; };
136136
137137 systemd.tmpfiles.rules = [
138138 "d '${cfg.messageJournalDir}' - ${cfg.user} - - -"
nixos/modules/services/logging/logrotate.nix+9−27
@@ -4,7 +4,6 @@ with lib;
44
55let
66 cfg = config.services.logrotate;
7− inherit (config.users) groups;
87
98 pathOpts = { name, ... }: {
109 options = {
@@ -85,10 +84,6 @@ let
8584 };
8685
8786 config.name = name;
88− config.extraConfig = ''
89− missingok
90− notifempty
91− '';
9287 };
9388
9489 mkConf = pathOpts: ''
@@ -102,7 +97,11 @@ let
10297 '';
10398
10499 paths = sortProperties (attrValues (filterAttrs (_: pathOpts: pathOpts.enable) cfg.paths));
105− configFile = pkgs.writeText "logrotate.conf" (concatStringsSep "\n" ((map mkConf paths) ++ [ cfg.extraConfig ]));
100+ configFile = pkgs.writeText "logrotate.conf" (
101+ concatStringsSep "\n" (
102+ [ "missingok" "notifempty" cfg.extraConfig ] ++ (map mkConf paths)
103+ )
104+ );
106105
107106in
108107{
@@ -112,7 +111,10 @@ in
112111
113112 options = {
114113 services.logrotate = {
115− enable = mkEnableOption "the logrotate systemd service";
114+ enable = mkEnableOption "the logrotate systemd service" // {
115+ default = foldr (n: a: a || n.enable) false (attrValues cfg.paths);
116+ defaultText = literalExpression "cfg.paths != {}";
117+ };
116118
117119 paths = mkOption {
118120 type = with types; attrsOf (submodule pathOpts);
@@ -163,28 +165,8 @@ in
163165 }
164166 ) cfg.paths;
165167
166− services.logrotate = {
167− paths = {
168− "/var/log/btmp" = {
169− frequency = mkDefault "monthly";
170− keep = mkDefault 1;
171− extraConfig = ''
172− create 0660 root ${groups.utmp.name}
173− '';
174− };
175− "/var/log/wtmp" = {
176− frequency = mkDefault "monthly";
177− keep = mkDefault 1;
178− extraConfig = ''
179− create 0664 root ${groups.utmp.name}
180− '';
181− };
182− };
183− };
184−
185168 systemd.services.logrotate = {
186169 description = "Logrotate Service";
187− wantedBy = [ "multi-user.target" ];
188170 startAt = "hourly";
189171
190172 serviceConfig = {
nixos/modules/services/logging/promtail.nix+1−1
@@ -45,7 +45,7 @@ in {
4545 Restart = "on-failure";
4646 TimeoutStopSec = 10;
4747
48− ExecStart = "${pkgs.grafana-loki}/bin/promtail -config.file=${prettyJSON cfg.configuration} ${escapeShellArgs cfg.extraFlags}";
48+ ExecStart = "${pkgs.promtail}/bin/promtail -config.file=${prettyJSON cfg.configuration} ${escapeShellArgs cfg.extraFlags}";
4949
5050 ProtectSystem = "strict";
5151 ProtectHome = true;
nixos/modules/services/mail/postfixadmin.nix+1−1
@@ -114,7 +114,7 @@ in
114114 location ~* \.php$ {
115115 fastcgi_split_path_info ^(.+\.php)(/.+)$;
116116 fastcgi_pass unix:${fpm.socket};
117− include ${pkgs.nginx}/conf/fastcgi_params;
117+ include ${config.services.nginx.package}/conf/fastcgi_params;
118118 include ${pkgs.nginx}/conf/fastcgi.conf;
119119 }
120120 '';
nixos/modules/services/mail/roundcube.nix+1−1
@@ -153,7 +153,7 @@ in
153153 location ~* \.php$ {
154154 fastcgi_split_path_info ^(.+\.php)(/.+)$;
155155 fastcgi_pass unix:${fpm.socket};
156− include ${pkgs.nginx}/conf/fastcgi_params;
156+ include ${config.services.nginx.package}/conf/fastcgi_params;
157157 include ${pkgs.nginx}/conf/fastcgi.conf;
158158 }
159159 '';
nixos/modules/services/misc/matrix-synapse-log_config.yaml → nixos/modules/services/matrix/matrix-synapse-log_config.yamlrenamed
The content is the same.
nixos/modules/services/matrix/matrix-synapse.nixnew file+773
@@ -0,0 +1,773 @@
1+{ config, lib, options, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.matrix-synapse;
7+ format = pkgs.formats.yaml {};
8+
9+ # remove null values from the final configuration
10+ finalSettings = lib.filterAttrsRecursive (_: v: v != null) cfg.settings;
11+ configFile = format.generate "homeserver.yaml" finalSettings;
12+ logConfigFile = format.generate "log_config.yaml" cfg.logConfig;
13+
14+ pluginsEnv = cfg.package.python.buildEnv.override {
15+ extraLibs = cfg.plugins;
16+ };
17+
18+ usePostgresql = cfg.settings.database.name == "psycopg2";
19+ hasLocalPostgresDB = let args = cfg.settings.database.args; in
20+ usePostgresql && (!(args ? host) || (elem args.host [ "localhost" "127.0.0.1" "::1" ]));
21+
22+ registerNewMatrixUser =
23+ let
24+ isIpv6 = x: lib.length (lib.splitString ":" x) > 1;
25+ listener =
26+ lib.findFirst (
27+ listener: lib.any (
28+ resource: lib.any (
29+ name: name == "client"
30+ ) resource.names
31+ ) listener.resources
32+ ) (lib.last cfg.settings.listeners) cfg.settings.listeners;
33+ # FIXME: Handle cases with missing client listener properly,
34+ # don't rely on lib.last, this will not work.
35+
36+ # add a tail, so that without any bind_addresses we still have a useable address
37+ bindAddress = head (listener.bind_addresses ++ [ "127.0.0.1" ]);
38+ listenerProtocol = if listener.tls
39+ then "https"
40+ else "http";
41+ in
42+ pkgs.writeShellScriptBin "matrix-synapse-register_new_matrix_user" ''
43+ exec ${cfg.package}/bin/register_new_matrix_user \
44+ $@ \
45+ ${lib.concatMapStringsSep " " (x: "-c ${x}") ([ configFile ] ++ cfg.extraConfigFiles)} \
46+ "${listenerProtocol}://${
47+ if (isIpv6 bindAddress) then
48+ "[${bindAddress}]"
49+ else
50+ "${bindAddress}"
51+ }:${builtins.toString listener.port}/"
52+ '';
53+in {
54+
55+ imports = [
56+
57+ (mkRemovedOptionModule [ "services" "matrix-synapse" "trusted_third_party_id_servers" ] ''
58+ The `trusted_third_party_id_servers` option as been removed in `matrix-synapse` v1.4.0
59+ as the behavior is now obsolete.
60+ '')
61+ (mkRemovedOptionModule [ "services" "matrix-synapse" "create_local_database" ] ''
62+ Database configuration must be done manually. An exemplary setup is demonstrated in
63+ <nixpkgs/nixos/tests/matrix-synapse.nix>
64+ '')
65+ (mkRemovedOptionModule [ "services" "matrix-synapse" "web_client" ] "")
66+ (mkRemovedOptionModule [ "services" "matrix-synapse" "room_invite_state_types" ] ''
67+ You may add additional event types via
68+ `services.matrix-synapse.room_prejoin_state.additional_event_types` and
69+ disable the default events via
70+ `services.matrix-synapse.room_prejoin_state.disable_default_event_types`.
71+ '')
72+
73+ # options that don't exist in synapse anymore
74+ (mkRemovedOptionModule [ "services" "matrix-synapse" "bind_host" ] "Use listener settings instead." )
75+ (mkRemovedOptionModule [ "services" "matrix-synapse" "bind_port" ] "Use listener settings instead." )
76+ (mkRemovedOptionModule [ "services" "matrix-synapse" "expire_access_tokens" ] "" )
77+ (mkRemovedOptionModule [ "services" "matrix-synapse" "no_tls" ] "It is no longer supported by synapse." )
78+ (mkRemovedOptionModule [ "services" "matrix-synapse" "tls_dh_param_path" ] "It was removed from synapse." )
79+ (mkRemovedOptionModule [ "services" "matrix-synapse" "unsecure_port" ] "Use settings.listeners instead." )
80+ (mkRemovedOptionModule [ "services" "matrix-synapse" "user_creation_max_duration" ] "It is no longer supported by synapse." )
81+ (mkRemovedOptionModule [ "services" "matrix-synapse" "verbose" ] "Use a log config instead." )
82+
83+ # options that were moved into rfc42 style settigns
84+ (mkRemovedOptionModule [ "services" "matrix-synapse" "app_service_config_files" ] "Use settings.app_service_config_Files instead" )
85+ (mkRemovedOptionModule [ "services" "matrix-synapse" "database_args" ] "Use settings.database.args instead" )
86+ (mkRemovedOptionModule [ "services" "matrix-synapse" "database_name" ] "Use settings.database.args.database instead" )
87+ (mkRemovedOptionModule [ "services" "matrix-synapse" "database_type" ] "Use settings.database.name instead" )
88+ (mkRemovedOptionModule [ "services" "matrix-synapse" "database_user" ] "Use settings.database.args.user instead" )
89+ (mkRemovedOptionModule [ "services" "matrix-synapse" "dynamic_thumbnails" ] "Use settings.dynamic_thumbnails instead" )
90+ (mkRemovedOptionModule [ "services" "matrix-synapse" "enable_metrics" ] "Use settings.enable_metrics instead" )
91+ (mkRemovedOptionModule [ "services" "matrix-synapse" "enable_registration" ] "Use settings.enable_registration instead" )
92+ (mkRemovedOptionModule [ "services" "matrix-synapse" "extraConfig" ] "Use settings instead." )
93+ (mkRemovedOptionModule [ "services" "matrix-synapse" "listeners" ] "Use settings.listeners instead" )
94+ (mkRemovedOptionModule [ "services" "matrix-synapse" "logConfig" ] "Use settings.log_config instead" )
95+ (mkRemovedOptionModule [ "services" "matrix-synapse" "max_image_pixels" ] "Use settings.max_image_pixels instead" )
96+ (mkRemovedOptionModule [ "services" "matrix-synapse" "max_upload_size" ] "Use settings.max_upload_size instead" )
97+ (mkRemovedOptionModule [ "services" "matrix-synapse" "presence" "enabled" ] "Use settings.presence.enabled instead" )
98+ (mkRemovedOptionModule [ "services" "matrix-synapse" "public_baseurl" ] "Use settings.public_baseurl instead" )
99+ (mkRemovedOptionModule [ "services" "matrix-synapse" "report_stats" ] "Use settings.report_stats instead" )
100+ (mkRemovedOptionModule [ "services" "matrix-synapse" "server_name" ] "Use settings.server_name instead" )
101+ (mkRemovedOptionModule [ "services" "matrix-synapse" "servers" ] "Use settings.trusted_key_servers instead." )
102+ (mkRemovedOptionModule [ "services" "matrix-synapse" "tls_certificate_path" ] "Use settings.tls_certificate_path instead" )
103+ (mkRemovedOptionModule [ "services" "matrix-synapse" "tls_private_key_path" ] "Use settings.tls_private_key_path instead" )
104+ (mkRemovedOptionModule [ "services" "matrix-synapse" "turn_shared_secret" ] "Use settings.turn_shared_secret instead" )
105+ (mkRemovedOptionModule [ "services" "matrix-synapse" "turn_uris" ] "Use settings.turn_uris instead" )
106+ (mkRemovedOptionModule [ "services" "matrix-synapse" "turn_user_lifetime" ] "Use settings.turn_user_lifetime instead" )
107+ (mkRemovedOptionModule [ "services" "matrix-synapse" "url_preview_enabled" ] "Use settings.url_preview_enabled instead" )
108+ (mkRemovedOptionModule [ "services" "matrix-synapse" "url_preview_ip_range_blacklist" ] "Use settings.url_preview_ip_range_blacklist instead" )
109+ (mkRemovedOptionModule [ "services" "matrix-synapse" "url_preview_ip_range_whitelist" ] "Use settings.url_preview_ip_range_whitelist instead" )
110+ (mkRemovedOptionModule [ "services" "matrix-synapse" "url_preview_url_blacklist" ] "Use settings.url_preview_url_blacklist instead" )
111+
112+ # options that are too specific to mention them explicitly in settings
113+ (mkRemovedOptionModule [ "services" "matrix-synapse" "account_threepid_delegates" "email" ] "Use settings.account_threepid_delegates.email instead" )
114+ (mkRemovedOptionModule [ "services" "matrix-synapse" "account_threepid_delegates" "msisdn" ] "Use settings.account_threepid_delegates.msisdn instead" )
115+ (mkRemovedOptionModule [ "services" "matrix-synapse" "allow_guest_access" ] "Use settings.allow_guest_access instead" )
116+ (mkRemovedOptionModule [ "services" "matrix-synapse" "bcrypt_rounds" ] "Use settings.bcrypt_rounds instead" )
117+ (mkRemovedOptionModule [ "services" "matrix-synapse" "enable_registration_captcha" ] "Use settings.enable_registration_captcha instead" )
118+ (mkRemovedOptionModule [ "services" "matrix-synapse" "event_cache_size" ] "Use settings.event_cache_size instead" )
119+ (mkRemovedOptionModule [ "services" "matrix-synapse" "federation_rc_concurrent" ] "Use settings.rc_federation.concurrent instead" )
120+ (mkRemovedOptionModule [ "services" "matrix-synapse" "federation_rc_reject_limit" ] "Use settings.rc_federation.reject_limit instead" )
121+ (mkRemovedOptionModule [ "services" "matrix-synapse" "federation_rc_sleep_delay" ] "Use settings.rc_federation.sleep_delay instead" )
122+ (mkRemovedOptionModule [ "services" "matrix-synapse" "federation_rc_sleep_limit" ] "Use settings.rc_federation.sleep_limit instead" )
123+ (mkRemovedOptionModule [ "services" "matrix-synapse" "federation_rc_window_size" ] "Use settings.rc_federation.window_size instead" )
124+ (mkRemovedOptionModule [ "services" "matrix-synapse" "key_refresh_interval" ] "Use settings.key_refresh_interval instead" )
125+ (mkRemovedOptionModule [ "services" "matrix-synapse" "rc_messages_burst_count" ] "Use settings.rc_messages.burst_count instead" )
126+ (mkRemovedOptionModule [ "services" "matrix-synapse" "rc_messages_per_second" ] "Use settings.rc_messages.per_second instead" )
127+ (mkRemovedOptionModule [ "services" "matrix-synapse" "recaptcha_private_key" ] "Use settings.recaptcha_private_key instead" )
128+ (mkRemovedOptionModule [ "services" "matrix-synapse" "recaptcha_public_key" ] "Use settings.recaptcha_public_key instead" )
129+ (mkRemovedOptionModule [ "services" "matrix-synapse" "redaction_retention_period" ] "Use settings.redaction_retention_period instead" )
130+ (mkRemovedOptionModule [ "services" "matrix-synapse" "room_prejoin_state" "additional_event_types" ] "Use settings.room_prejoin_state.additional_event_types instead" )
131+ (mkRemovedOptionModule [ "services" "matrix-synapse" "room_prejoin_state" "disable_default_event_types" ] "Use settings.room_prejoin-state.disable_default_event_types instead" )
132+
133+ # Options that should be passed via extraConfigFiles, so they are not persisted into the nix store
134+ (mkRemovedOptionModule [ "services" "matrix-synapse" "macaroon_secret_key" ] "Pass this value via extraConfigFiles instead" )
135+ (mkRemovedOptionModule [ "services" "matrix-synapse" "registration_shared_secret" ] "Pass this value via extraConfigFiles instead" )
136+
137+ ];
138+
139+ options = {
140+ services.matrix-synapse = {
141+ enable = mkEnableOption "matrix.org synapse";
142+
143+ configFile = mkOption {
144+ type = types.str;
145+ readOnly = true;
146+ description = ''
147+ Path to the configuration file on the target system. Useful to configure e.g. workers
148+ that also need this.
149+ '';
150+ };
151+
152+ package = mkOption {
153+ type = types.package;
154+ default = pkgs.matrix-synapse;
155+ defaultText = literalExpression "pkgs.matrix-synapse";
156+ description = ''
157+ Overridable attribute of the matrix synapse server package to use.
158+ '';
159+ };
160+
161+ plugins = mkOption {
162+ type = types.listOf types.package;
163+ default = [ ];
164+ example = literalExpression ''
165+ with config.services.matrix-synapse.package.plugins; [
166+ matrix-synapse-ldap3
167+ matrix-synapse-pam
168+ ];
169+ '';
170+ description = ''
171+ List of additional Matrix plugins to make available.
172+ '';
173+ };
174+
175+ withJemalloc = mkOption {
176+ type = types.bool;
177+ default = false;
178+ description = ''
179+ Whether to preload jemalloc to reduce memory fragmentation and overall usage.
180+ '';
181+ };
182+
183+ dataDir = mkOption {
184+ type = types.str;
185+ default = "/var/lib/matrix-synapse";
186+ description = ''
187+ The directory where matrix-synapse stores its stateful data such as
188+ certificates, media and uploads.
189+ '';
190+ };
191+
192+ settings = mkOption {
193+ default = {};
194+ description = ''
195+ The primary synapse configuration. See the
196+ <link xlink:href="https://github.com/matrix-org/synapse/blob/v${cfg.package.version}/docs/sample_config.yaml">sample configuration</link>
197+ for possible values.
198+
199+ Secrets should be passed in by using the <literal>extraConfigFiles</literal> option.
200+ '';
201+ type = with types; submodule {
202+ freeformType = format.type;
203+ options = {
204+ # This is a reduced set of popular options and defaults
205+ # Do not add every available option here, they can be specified
206+ # by the user at their own discretion. This is a freeform type!
207+
208+ server_name = mkOption {
209+ type = types.str;
210+ example = "example.com";
211+ default = config.networking.hostName;
212+ defaultText = literalExpression "config.networking.hostName";
213+ description = ''
214+ The domain name of the server, with optional explicit port.
215+ This is used by remote servers to look up the server address.
216+ This is also the last part of your UserID.
217+
218+ The server_name cannot be changed later so it is important to configure this correctly before you start Synapse.
219+ '';
220+ };
221+
222+ enable_registration = mkOption {
223+ type = types.bool;
224+ default = false;
225+ description = ''
226+ Enable registration for new users.
227+ '';
228+ };
229+
230+ registration_shared_secret = mkOption {
231+ type = types.nullOr types.str;
232+ default = null;
233+ description = ''
234+ If set, allows registration by anyone who also has the shared
235+ secret, even if registration is otherwise disabled.
236+
237+ Secrets should be passed in via <literal>extraConfigFiles</literal>!
238+ '';
239+ };
240+
241+ macaroon_secret_key = mkOption {
242+ type = types.nullOr types.str;
243+ default = null;
244+ description = ''
245+ Secret key for authentication tokens. If none is specified,
246+ the registration_shared_secret is used, if one is given; otherwise,
247+ a secret key is derived from the signing key.
248+
249+ Secrets should be passed in via <literal>extraConfigFiles</literal>!
250+ '';
251+ };
252+
253+ enable_metrics = mkOption {
254+ type = types.bool;
255+ default = false;
256+ description = ''
257+ Enable collection and rendering of performance metrics
258+ '';
259+ };
260+
261+ report_stats = mkOption {
262+ type = types.bool;
263+ default = false;
264+ description = ''
265+ Whether or not to report anonymized homeserver usage statistics.
266+ '';
267+ };
268+
269+ signing_key_path = mkOption {
270+ type = types.path;
271+ default = "${cfg.dataDir}/homeserver.signing.key";
272+ description = ''
273+ Path to the signing key to sign messages with.
274+ '';
275+ };
276+
277+ pid_file = mkOption {
278+ type = types.path;
279+ default = "/run/matrix-synapse.pid";
280+ readOnly = true;
281+ description = ''
282+ The file to store the PID in.
283+ '';
284+ };
285+
286+ log_config = mkOption {
287+ type = types.path;
288+ default = ./matrix-synapse-log_config.yaml;
289+ description = ''
290+ The file that holds the logging configuration.
291+ '';
292+ };
293+
294+ media_store_path = mkOption {
295+ type = types.path;
296+ default = if lib.versionAtLeast config.system.stateVersion "22.05"
297+ then "${cfg.dataDir}/media_store"
298+ else "${cfg.dataDir}/media";
299+ description = ''
300+ Directory where uploaded images and attachments are stored.
301+ '';
302+ };
303+
304+ public_baseurl = mkOption {
305+ type = types.nullOr types.str;
306+ default = null;
307+ example = "https://example.com:8448/";
308+ description = ''
309+ The public-facing base URL for the client API (not including _matrix/...)
310+ '';
311+ };
312+
313+ tls_certificate_path = mkOption {
314+ type = types.nullOr types.str;
315+ default = null;
316+ example = "/var/lib/acme/example.com/fullchain.pem";
317+ description = ''
318+ PEM encoded X509 certificate for TLS.
319+ You can replace the self-signed certificate that synapse
320+ autogenerates on launch with your own SSL certificate + key pair
321+ if you like. Any required intermediary certificates can be
322+ appended after the primary certificate in hierarchical order.
323+ '';
324+ };
325+
326+ tls_private_key_path = mkOption {
327+ type = types.nullOr types.str;
328+ default = null;
329+ example = "/var/lib/acme/example.com/key.pem";
330+ description = ''
331+ PEM encoded private key for TLS. Specify null if synapse is not
332+ speaking TLS directly.
333+ '';
334+ };
335+
336+ presence.enabled = mkOption {
337+ type = types.bool;
338+ default = true;
339+ example = false;
340+ description = ''
341+ Whether to enable presence tracking.
342+
343+ Presence tracking allows users to see the state (e.g online/offline)
344+ of other local and remote users.
345+ '';
346+ };
347+
348+ listeners = mkOption {
349+ type = types.listOf (types.submodule {
350+ options = {
351+ port = mkOption {
352+ type = types.port;
353+ example = 8448;
354+ description = ''
355+ The port to listen for HTTP(S) requests on.
356+ '';
357+ };
358+
359+ bind_addresses = mkOption {
360+ type = types.listOf types.str;
361+ default = [
362+ "::1"
363+ "127.0.0.1"
364+ ];
365+ example = literalExpression ''
366+ [
367+ "::"
368+ "0.0.0.0"
369+ ]
370+ '';
371+ description = ''
372+ IP addresses to bind the listener to.
373+ '';
374+ };
375+
376+ type = mkOption {
377+ type = types.enum [
378+ "http"
379+ "manhole"
380+ "metrics"
381+ "replication"
382+ ];
383+ default = "http";
384+ example = "metrics";
385+ description = ''
386+ The type of the listener, usually http.
387+ '';
388+ };
389+
390+ tls = mkOption {
391+ type = types.bool;
392+ default = true;
393+ example = false;
394+ description = ''
395+ Whether to enable TLS on the listener socket.
396+ '';
397+ };
398+
399+ x_forwarded = mkOption {
400+ type = types.bool;
401+ default = false;
402+ example = true;
403+ description = ''
404+ Use the X-Forwarded-For (XFF) header as the client IP and not the
405+ actual client IP.
406+ '';
407+ };
408+
409+ resources = mkOption {
410+ type = types.listOf (types.submodule {
411+ options = {
412+ names = mkOption {
413+ type = types.listOf (types.enum [
414+ "client"
415+ "consent"
416+ "federation"
417+ "keys"
418+ "media"
419+ "metrics"
420+ "openid"
421+ "replication"
422+ "static"
423+ ]);
424+ description = ''
425+ List of resources to host on this listener.
426+ '';
427+ example = [
428+ "client"
429+ ];
430+ };
431+ compress = mkOption {
432+ type = types.bool;
433+ description = ''
434+ Should synapse compress HTTP responses to clients that support it?
435+ This should be disabled if running synapse behind a load balancer
436+ that can do automatic compression.
437+ '';
438+ };
439+ };
440+ });
441+ description = ''
442+ List of HTTP resources to serve on this listener.
443+ '';
444+ };
445+ };
446+ });
447+ default = [ {
448+ port = 8008;
449+ bind_addresses = [ "127.0.0.1" ];
450+ type = "http";
451+ tls = false;
452+ x_forwarded = true;
453+ resources = [ {
454+ names = [ "client" ];
455+ compress = true;
456+ } {
457+ names = [ "federation" ];
458+ compress = false;
459+ } ];
460+ } ];
461+ description = ''
462+ List of ports that Synapse should listen on, their purpose and their configuration.
463+ '';
464+ };
465+
466+ database.name = mkOption {
467+ type = types.enum [
468+ "sqlite3"
469+ "psycopg2"
470+ ];
471+ default = if versionAtLeast config.system.stateVersion "18.03"
472+ then "psycopg2"
473+ else "sqlite3";
474+ defaultText = literalExpression ''
475+ if versionAtLeast config.system.stateVersion "18.03"
476+ then "psycopg2"
477+ else "sqlite3"
478+ '';
479+ description = ''
480+ The database engine name. Can be sqlite3 or psycopg2.
481+ '';
482+ };
483+
484+ database.args.database = mkOption {
485+ type = types.str;
486+ default = {
487+ sqlite3 = "${cfg.dataDir}/homeserver.db";
488+ psycopg2 = "matrix-synapse";
489+ }.${cfg.settings.database.name};
490+ defaultText = literalExpression ''
491+ {
492+ sqlite3 = "''${${options.services.matrix-synapse.dataDir}}/homeserver.db";
493+ psycopg2 = "matrix-synapse";
494+ }.''${${options.services.matrix-synapse.settings}.database.name};
495+ '';
496+ description = ''
497+ Name of the database when using the psycopg2 backend,
498+ path to the database location when using sqlite3.
499+ '';
500+ };
501+
502+ database.args.user = mkOption {
503+ type = types.nullOr types.str;
504+ default = {
505+ sqlite3 = null;
506+ psycopg2 = "matrix-synapse";
507+ }.${cfg.settings.database.name};
508+ description = ''
509+ Username to connect with psycopg2, set to null
510+ when using sqlite3.
511+ '';
512+ };
513+
514+ url_preview_enabled = mkOption {
515+ type = types.bool;
516+ default = true;
517+ example = false;
518+ description = ''
519+ Is the preview URL API enabled? If enabled, you *must* specify an
520+ explicit url_preview_ip_range_blacklist of IPs that the spider is
521+ denied from accessing.
522+ '';
523+ };
524+
525+ url_preview_ip_range_blacklist = mkOption {
526+ type = types.listOf types.str;
527+ default = [
528+ "10.0.0.0/8"
529+ "100.64.0.0/10"
530+ "127.0.0.0/8"
531+ "169.254.0.0/16"
532+ "172.16.0.0/12"
533+ "192.0.0.0/24"
534+ "192.0.2.0/24"
535+ "192.168.0.0/16"
536+ "192.88.99.0/24"
537+ "198.18.0.0/15"
538+ "198.51.100.0/24"
539+ "2001:db8::/32"
540+ "203.0.113.0/24"
541+ "224.0.0.0/4"
542+ "::1/128"
543+ "fc00::/7"
544+ "fe80::/10"
545+ "fec0::/10"
546+ "ff00::/8"
547+ ];
548+ description = ''
549+ List of IP address CIDR ranges that the URL preview spider is denied
550+ from accessing.
551+ '';
552+ };
553+
554+ url_preview_ip_range_whitelist = mkOption {
555+ type = types.listOf types.str;
556+ default = [];
557+ description = ''
558+ List of IP address CIDR ranges that the URL preview spider is allowed
559+ to access even if they are specified in url_preview_ip_range_blacklist.
560+ '';
561+ };
562+
563+ url_preview_url_blacklist = mkOption {
564+ type = types.listOf types.str;
565+ default = [];
566+ description = ''
567+ Optional list of URL matches that the URL preview spider is
568+ denied from accessing.
569+ '';
570+ };
571+
572+ max_upload_size = mkOption {
573+ type = types.str;
574+ default = "50M";
575+ example = "100M";
576+ description = ''
577+ The largest allowed upload size in bytes
578+ '';
579+ };
580+
581+ max_image_pixels = mkOption {
582+ type = types.str;
583+ default = "32M";
584+ example = "64M";
585+ description = ''
586+ Maximum number of pixels that will be thumbnailed
587+ '';
588+ };
589+
590+ dynamic_thumbnails = mkOption {
591+ type = types.bool;
592+ default = false;
593+ example = true;
594+ description = ''
595+ Whether to generate new thumbnails on the fly to precisely match
596+ the resolution requested by the client. If true then whenever
597+ a new resolution is requested by the client the server will
598+ generate a new thumbnail. If false the server will pick a thumbnail
599+ from a precalculated list.
600+ '';
601+ };
602+
603+ turn_uris = mkOption {
604+ type = types.listOf types.str;
605+ default = [];
606+ example = [
607+ "turn:turn.example.com:3487?transport=udp"
608+ "turn:turn.example.com:3487?transport=tcp"
609+ "turns:turn.example.com:5349?transport=udp"
610+ "turns:turn.example.com:5349?transport=tcp"
611+ ];
612+ description = ''
613+ The public URIs of the TURN server to give to clients
614+ '';
615+ };
616+ turn_shared_secret = mkOption {
617+ type = types.str;
618+ default = "";
619+ example = literalExpression ''
620+ config.services.coturn.static-auth-secret
621+ '';
622+ description = ''
623+ The shared secret used to compute passwords for the TURN server.
624+
625+ Secrets should be passed in via <literal>extraConfigFiles</literal>!
626+ '';
627+ };
628+
629+ trusted_key_servers = mkOption {
630+ type = types.listOf (types.submodule {
631+ options = {
632+ server_name = mkOption {
633+ type = types.str;
634+ example = "matrix.org";
635+ description = ''
636+ Hostname of the trusted server.
637+ '';
638+ };
639+
640+ verify_keys = mkOption {
641+ type = types.nullOr (types.attrsOf types.str);
642+ default = null;
643+ example = literalExpression ''
644+ {
645+ "ed25519:auto" = "Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw";
646+ }
647+ '';
648+ description = ''
649+ Attribute set from key id to base64 encoded public key.
650+
651+ If specified synapse will check that the response is signed
652+ by at least one of the given keys.
653+ '';
654+ };
655+ };
656+ });
657+ default = [ {
658+ server_name = "matrix.org";
659+ verify_keys = {
660+ "ed25519:auto" = "Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw";
661+ };
662+ } ];
663+ description = ''
664+ The trusted servers to download signing keys from.
665+ '';
666+ };
667+
668+ app_service_config_files = mkOption {
669+ type = types.listOf types.path;
670+ default = [ ];
671+ description = ''
672+ A list of application service config file to use
673+ '';
674+ };
675+
676+ };
677+ };
678+ };
679+
680+ extraConfigFiles = mkOption {
681+ type = types.listOf types.path;
682+ default = [];
683+ description = ''
684+ Extra config files to include.
685+
686+ The configuration files will be included based on the command line
687+ argument --config-path. This allows to configure secrets without
688+ having to go through the Nix store, e.g. based on deployment keys if
689+ NixOps is in use.
690+ '';
691+ };
692+ };
693+ };
694+
695+ config = mkIf cfg.enable {
696+ assertions = [
697+ { assertion = hasLocalPostgresDB -> config.services.postgresql.enable;
698+ message = ''
699+ Cannot deploy matrix-synapse with a configuration for a local postgresql database
700+ and a missing postgresql service. Since 20.03 it's mandatory to manually configure the
701+ database (please read the thread in https://github.com/NixOS/nixpkgs/pull/80447 for
702+ further reference).
703+
704+ If you
705+ - try to deploy a fresh synapse, you need to configure the database yourself. An example
706+ for this can be found in <nixpkgs/nixos/tests/matrix-synapse.nix>
707+ - update your existing matrix-synapse instance, you simply need to add `services.postgresql.enable = true`
708+ to your configuration.
709+
710+ For further information about this update, please read the release-notes of 20.03 carefully.
711+ '';
712+ }
713+ ];
714+
715+ services.matrix-synapse.configFile = configFile;
716+
717+ users.users.matrix-synapse = {
718+ group = "matrix-synapse";
719+ home = cfg.dataDir;
720+ createHome = true;
721+ shell = "${pkgs.bash}/bin/bash";
722+ uid = config.ids.uids.matrix-synapse;
723+ };
724+
725+ users.groups.matrix-synapse = {
726+ gid = config.ids.gids.matrix-synapse;
727+ };
728+
729+ systemd.services.matrix-synapse = {
730+ description = "Synapse Matrix homeserver";
731+ after = [ "network.target" ] ++ optional hasLocalPostgresDB "postgresql.service";
732+ wantedBy = [ "multi-user.target" ];
733+ preStart = ''
734+ ${cfg.package}/bin/synapse_homeserver \
735+ --config-path ${configFile} \
736+ --keys-directory ${cfg.dataDir} \
737+ --generate-keys
738+ '';
739+ environment = {
740+ PYTHONPATH = makeSearchPathOutput "lib" cfg.package.python.sitePackages [ pluginsEnv ];
741+ } // optionalAttrs (cfg.withJemalloc) {
742+ LD_PRELOAD = "${pkgs.jemalloc}/lib/libjemalloc.so";
743+ };
744+ serviceConfig = {
745+ Type = "notify";
746+ User = "matrix-synapse";
747+ Group = "matrix-synapse";
748+ WorkingDirectory = cfg.dataDir;
749+ ExecStartPre = [ ("+" + (pkgs.writeShellScript "matrix-synapse-fix-permissions" ''
750+ chown matrix-synapse:matrix-synapse ${cfg.dataDir}/homeserver.signing.key
751+ chmod 0600 ${cfg.dataDir}/homeserver.signing.key
752+ '')) ];
753+ ExecStart = ''
754+ ${cfg.package}/bin/synapse_homeserver \
755+ ${ concatMapStringsSep "\n " (x: "--config-path ${x} \\") ([ configFile ] ++ cfg.extraConfigFiles) }
756+ --keys-directory ${cfg.dataDir}
757+ '';
758+ ExecReload = "${pkgs.util-linux}/bin/kill -HUP $MAINPID";
759+ Restart = "on-failure";
760+ UMask = "0077";
761+ };
762+ };
763+
764+ environment.systemPackages = [ registerNewMatrixUser ];
765+ };
766+
767+ meta = {
768+ buildDocsInSandbox = false;
769+ doc = ./matrix-synapse.xml;
770+ maintainers = teams.matrix.members;
771+ };
772+
773+}
nixos/modules/services/misc/matrix-synapse.xml → nixos/modules/services/matrix/matrix-synapse.xmlrenamed+18−17
@@ -115,20 +115,21 @@ in {
115115 };
116116 services.matrix-synapse = {
117117 <link linkend="opt-services.matrix-synapse.enable">enable</link> = true;
118− <link linkend="opt-services.matrix-synapse.server_name">server_name</link> = config.networking.domain;
119− <link linkend="opt-services.matrix-synapse.listeners">listeners</link> = [
118+ <link linkend="opt-services.matrix-synapse.settings.server_name">server_name</link> = config.networking.domain;
119+ <link linkend="opt-services.matrix-synapse.settings.listeners">listeners</link> = [
120120 {
121− <link linkend="opt-services.matrix-synapse.listeners._.port">port</link> = 8008;
122− <link linkend="opt-services.matrix-synapse.listeners._.bind_address">bind_address</link> = "::1";
123− <link linkend="opt-services.matrix-synapse.listeners._.type">type</link> = "http";
124− <link linkend="opt-services.matrix-synapse.listeners._.tls">tls</link> = false;
125− <link linkend="opt-services.matrix-synapse.listeners._.x_forwarded">x_forwarded</link> = true;
126− <link linkend="opt-services.matrix-synapse.listeners._.resources">resources</link> = [
127− {
128− <link linkend="opt-services.matrix-synapse.listeners._.resources._.names">names</link> = [ "client" "federation" ];
129− <link linkend="opt-services.matrix-synapse.listeners._.resources._.compress">compress</link> = false;
130− }
131− ];
121+ <link linkend="opt-services.matrix-synapse.settings.listeners._.port">port</link> = 8008;
122+ <link linkend="opt-services.matrix-synapse.settings.listeners._.bind_addresses">bind_addresses</link> = [ "::1" ];
123+ <link linkend="opt-services.matrix-synapse.settings.listeners._.type">type</link> = "http";
124+ <link linkend="opt-services.matrix-synapse.settings.listeners._.tls">tls</link> = false;
125+ <link linkend="opt-services.matrix-synapse.settings.listeners._.x_forwarded">x_forwarded</link> = true;
126+ <link linkend="opt-services.matrix-synapse.settings.listeners._.resources">resources</link> = [ {
127+ <link linkend="opt-services.matrix-synapse.settings.listeners._.resources._.names">names</link> = [ "client" ];
128+ <link linkend="opt-services.matrix-synapse.settings.listeners._.resources._.compress">compress</link> = true;
129+ } {
130+ <link linkend="opt-services.matrix-synapse.settings.listeners._.resources._.names">names</link> = [ "federation" ];
131+ <link linkend="opt-services.matrix-synapse.settings.listeners._.resources._.compress">compress</link> = false;
132+ } ];
132133 }
133134 ];
134135 };
@@ -151,11 +152,11 @@ in {
151152
152153 <para>
153154 If you want to run a server with public registration by anybody, you can
154− then enable <literal><link linkend="opt-services.matrix-synapse.enable_registration">services.matrix-synapse.enable_registration</link> =
155+ then enable <literal><link linkend="opt-services.matrix-synapse.settings.enable_registration">services.matrix-synapse.settings.enable_registration</link> =
155156 true;</literal>. Otherwise, or you can generate a registration secret with
156157 <command>pwgen -s 64 1</command> and set it with
157− <option><link linkend="opt-services.matrix-synapse.registration_shared_secret">services.matrix-synapse.registration_shared_secret</link></option>. To
158− create a new user or admin, run the following after you have set the secret
158+ <option><link linkend="opt-services.matrix-synapse.settings.registration_shared_secret">services.matrix-synapse.settings.registration_shared_secret</link></option>.
159+ To create a new user or admin, run the following after you have set the secret
159160 and have rebuilt NixOS:
160161<screen>
161162<prompt>$ </prompt>nix run nixpkgs.matrix-synapse
@@ -170,7 +171,7 @@ Success!
170171 <literal>@your-username:example.org</literal>. Note that the registration
171172 secret ends up in the nix store and therefore is world-readable by any user
172173 on your machine, so it makes sense to only temporarily activate the
173− <link linkend="opt-services.matrix-synapse.registration_shared_secret">registration_shared_secret</link>
174+ <link linkend="opt-services.matrix-synapse.settings.registration_shared_secret">registration_shared_secret</link>
174175 option until a better solution for NixOS is in place.
175176 </para>
176177 </section>
nixos/modules/services/matrix/mjolnir.xml+2−2
@@ -98,7 +98,7 @@
9898 </para>
9999 <para>
100100 To use the Antispam Module, add <package>matrix-synapse-plugins.matrix-synapse-mjolnir-antispam</package>
101− to the Synapse plugin list and enable the <literal>mjolnir.AntiSpam</literal> module.
101+ to the Synapse plugin list and enable the <literal>mjolnir.Module</literal> module.
102102 </para>
103103<programlisting>
104104{
@@ -108,7 +108,7 @@
108108 ];
109109 extraConfig = ''
110110 modules:
111− - module: mjolnir.AntiSpam
111+ - module: mjolnir.Module
112112 config:
113113 # Prevent servers/users in the ban lists from inviting users on this
114114 # server to rooms. Default true.
nixos/modules/services/misc/airsonic.nix+5−3
@@ -39,9 +39,11 @@ in {
3939 default = "127.0.0.1";
4040 description = ''
4141 The host name or IP address on which to bind Airsonic.
42− Only relevant if you have multiple network interfaces and want
43− to make Airsonic available on only one of them. The default value
44− will bind Airsonic to all available network interfaces.
42+ The default value is appropriate for first launch, when the
43+ default credentials are easy to guess. It is also appropriate
44+ if you intend to use the virtualhost option in the service
45+ module. In other cases, you may want to change this to a
46+ specific IP or 0.0.0.0 to listen on all interfaces.
4547 '';
4648 };
4749
nixos/modules/services/misc/autorandr.nix+1
@@ -349,6 +349,7 @@ in {
349349 ExecStart = "${pkgs.autorandr}/bin/autorandr --batch --change --default ${cfg.defaultTarget}";
350350 Type = "oneshot";
351351 RemainAfterExit = false;
352+ KillMode = "process";
352353 };
353354 };
354355
nixos/modules/services/misc/dendrite.nix+94
@@ -110,6 +110,15 @@ in
110110 '';
111111 };
112112 };
113+ options.app_service_api.database = {
114+ connection_string = lib.mkOption {
115+ type = lib.types.str;
116+ default = "file:federationapi.db";
117+ description = ''
118+ Database for the Appservice API.
119+ '';
120+ };
121+ };
113122 options.client_api = {
114123 registration_disabled = lib.mkOption {
115124 type = lib.types.bool;
@@ -120,6 +129,91 @@ in
120129 '';
121130 };
122131 };
132+ options.federation_api.database = {
133+ connection_string = lib.mkOption {
134+ type = lib.types.str;
135+ default = "file:federationapi.db";
136+ description = ''
137+ Database for the Federation API.
138+ '';
139+ };
140+ };
141+ options.key_server.database = {
142+ connection_string = lib.mkOption {
143+ type = lib.types.str;
144+ default = "file:keyserver.db";
145+ description = ''
146+ Database for the Key Server (for end-to-end encryption).
147+ '';
148+ };
149+ };
150+ options.media_api = {
151+ database = {
152+ connection_string = lib.mkOption {
153+ type = lib.types.str;
154+ default = "file:mediaapi.db";
155+ description = ''
156+ Database for the Media API.
157+ '';
158+ };
159+ };
160+ base_path = lib.mkOption {
161+ type = lib.types.str;
162+ default = "${workingDir}/media_store";
163+ description = ''
164+ Storage path for uploaded media.
165+ '';
166+ };
167+ };
168+ options.room_server.database = {
169+ connection_string = lib.mkOption {
170+ type = lib.types.str;
171+ default = "file:roomserver.db";
172+ description = ''
173+ Database for the Room Server.
174+ '';
175+ };
176+ };
177+ options.sync_api.database = {
178+ connection_string = lib.mkOption {
179+ type = lib.types.str;
180+ default = "file:syncserver.db";
181+ description = ''
182+ Database for the Sync API.
183+ '';
184+ };
185+ };
186+ options.user_api = {
187+ account_database = {
188+ connection_string = lib.mkOption {
189+ type = lib.types.str;
190+ default = "file:userapi_accounts.db";
191+ description = ''
192+ Database for the User API, accounts.
193+ '';
194+ };
195+ };
196+ device_database = {
197+ connection_string = lib.mkOption {
198+ type = lib.types.str;
199+ default = "file:userapi_devices.db";
200+ description = ''
201+ Database for the User API, devices.
202+ '';
203+ };
204+ };
205+ };
206+ options.mscs = {
207+ database = {
208+ connection_string = lib.mkOption {
209+ type = lib.types.str;
210+ default = "file:mscs.db";
211+ description = ''
212+ Database for exerimental MSC's.
213+ '';
214+ };
215+ };
216+ };
123217 };
124218 default = { };
125219 description = ''
nixos/modules/services/misc/gitlab.nix+28−17
@@ -72,7 +72,7 @@ let
7272 redis = {
7373 bin = "${pkgs.redis}/bin/redis-cli";
7474 host = "127.0.0.1";
75− port = 6379;
75+ port = config.services.redis.servers.gitlab.port;
7676 database = 0;
7777 namespace = "resque:gitlab";
7878 };
@@ -450,7 +450,8 @@ in {
450450
451451 redisUrl = mkOption {
452452 type = types.str;
453− default = "redis://localhost:6379/";
453+ default = "redis://localhost:${toString config.services.redis.servers.gitlab.port}/";
454+ defaultText = literalExpression ''redis://localhost:''${toString config.services.redis.servers.gitlab.port}/'';
454455 description = "Redis URL for all GitLab services except gitlab-shell";
455456 };
456457
@@ -961,7 +962,11 @@ in {
961962 };
962963
963964 # Redis is required for the sidekiq queue runner.
964− services.redis.enable = mkDefault true;
965+ services.redis.servers.gitlab = {
966+ enable = mkDefault true;
967+ port = mkDefault 31636;
968+ bind = mkDefault "127.0.0.1";
969+ };
965970
966971 # We use postgres as the main data store.
967972 services.postgresql = optionalAttrs databaseActuallyCreateLocally {
@@ -1099,7 +1104,9 @@ in {
10991104 "d ${gitlabConfig.production.shared.path} 0750 ${cfg.user} ${cfg.group} -"
11001105 "d ${gitlabConfig.production.shared.path}/artifacts 0750 ${cfg.user} ${cfg.group} -"
11011106 "d ${gitlabConfig.production.shared.path}/lfs-objects 0750 ${cfg.user} ${cfg.group} -"
1107+ "d ${gitlabConfig.production.shared.path}/packages 0750 ${cfg.user} ${cfg.group} -"
11021108 "d ${gitlabConfig.production.shared.path}/pages 0750 ${cfg.user} ${cfg.group} -"
1109+ "d ${gitlabConfig.production.shared.path}/terraform_state 0750 ${cfg.user} ${cfg.group} -"
11031110 "L+ /run/gitlab/config - - - - ${cfg.statePath}/config"
11041111 "L+ /run/gitlab/log - - - - ${cfg.statePath}/log"
11051112 "L+ /run/gitlab/tmp - - - - ${cfg.statePath}/tmp"
@@ -1129,8 +1136,8 @@ in {
11291136
11301137 ExecStartPre = let
11311138 preStartFullPrivileges = ''
1132− shopt -s dotglob nullglob
1133− set -eu
1139+ set -o errexit -o pipefail -o nounset
1140+ shopt -s dotglob nullglob inherit_errexit
11341141
11351142 chown --no-dereference '${cfg.user}':'${cfg.group}' '${cfg.statePath}'/*
11361143 if [[ -n "$(ls -A '${cfg.statePath}'/config/)" ]]; then
@@ -1140,7 +1147,8 @@ in {
11401147 in "+${pkgs.writeShellScript "gitlab-pre-start-full-privileges" preStartFullPrivileges}";
11411148
11421149 ExecStart = pkgs.writeShellScript "gitlab-config" ''
1143− set -eu
1150+ set -o errexit -o pipefail -o nounset
1151+ shopt -s inherit_errexit
11441152
11451153 umask u=rwx,g=rx,o=
11461154
@@ -1169,7 +1177,8 @@ in {
11691177 rm -f '${cfg.statePath}/config/database.yml'
11701178
11711179 ${if cfg.databasePasswordFile != null then ''
1172− export db_password="$(<'${cfg.databasePasswordFile}')"
1180+ db_password="$(<'${cfg.databasePasswordFile}')"
1181+ export db_password
11731182
11741183 if [[ -z "$db_password" ]]; then
11751184 >&2 echo "Database password was an empty string!"
@@ -1193,10 +1202,11 @@ in {
11931202
11941203 rm -f '${cfg.statePath}/config/secrets.yml'
11951204
1196− export secret="$(<'${cfg.secrets.secretFile}')"
1197− export db="$(<'${cfg.secrets.dbFile}')"
1198− export otp="$(<'${cfg.secrets.otpFile}')"
1199− export jws="$(<'${cfg.secrets.jwsFile}')"
1205+ secret="$(<'${cfg.secrets.secretFile}')"
1206+ db="$(<'${cfg.secrets.dbFile}')"
1207+ otp="$(<'${cfg.secrets.otpFile}')"
1208+ jws="$(<'${cfg.secrets.jwsFile}')"
1209+ export secret db otp jws
12001210 jq -n '{production: {secret_key_base: $ENV.secret,
12011211 otp_key_base: $ENV.otp,
12021212 db_key_base: $ENV.db,
@@ -1230,7 +1240,8 @@ in {
12301240 RemainAfterExit = true;
12311241
12321242 ExecStart = pkgs.writeShellScript "gitlab-db-config" ''
1233− set -eu
1243+ set -o errexit -o pipefail -o nounset
1244+ shopt -s inherit_errexit
12341245 umask u=rwx,g=rx,o=
12351246
12361247 initial_root_password="$(<'${cfg.initialRootPasswordFile}')"
@@ -1243,13 +1254,13 @@ in {
12431254 systemd.services.gitlab-sidekiq = {
12441255 after = [
12451256 "network.target"
1246− "redis.service"
1257+ "redis-gitlab.service"
12471258 "postgresql.service"
12481259 "gitlab-config.service"
12491260 "gitlab-db-config.service"
12501261 ];
12511262 bindsTo = [
1252− "redis.service"
1263+ "redis-gitlab.service"
12531264 "gitlab-config.service"
12541265 "gitlab-db-config.service"
12551266 ] ++ optional (cfg.databaseHost == "") "postgresql.service";
@@ -1364,7 +1375,7 @@ in {
13641375
13651376 systemd.services.gitlab-mailroom = mkIf (gitlabConfig.production.incoming_email.enabled or false) {
13661377 description = "GitLab incoming mail daemon";
1367− after = [ "network.target" "redis.service" "gitlab-config.service" ];
1378+ after = [ "network.target" "redis-gitlab.service" "gitlab-config.service" ];
13681379 bindsTo = [ "gitlab-config.service" ];
13691380 wantedBy = [ "gitlab.target" ];
13701381 partOf = [ "gitlab.target" ];
@@ -1385,12 +1396,12 @@ in {
13851396 after = [
13861397 "gitlab-workhorse.service"
13871398 "network.target"
1388− "redis.service"
1399+ "redis-gitlab.service"
13891400 "gitlab-config.service"
13901401 "gitlab-db-config.service"
13911402 ];
13921403 bindsTo = [
1393− "redis.service"
1404+ "redis-gitlab.service"
13941405 "gitlab-config.service"
13951406 "gitlab-db-config.service"
13961407 ] ++ optional (cfg.databaseHost == "") "postgresql.service";
nixos/modules/services/misc/input-remapper.nixnew file+30
@@ -0,0 +1,30 @@
1+{ pkgs, lib, config, ... }:
2+
3+with lib;
4+
5+let cfg = config.services.input-remapper; in
6+{
7+ options = {
8+ services.input-remapper = {
9+ enable = mkEnableOption "input-remapper, an easy to use tool to change the mapping of your input device buttons.";
10+ package = options.mkPackageOption pkgs "input-remapper" { };
11+ enableUdevRules = mkEnableOption "udev rules added by input-remapper to handle hotplugged devices. Currently disabled by default due to https://github.com/sezanzeb/input-remapper/issues/140";
12+ serviceWantedBy = mkOption {
13+ default = [ "graphical.target" ];
14+ example = [ "multi-user.target" ];
15+ type = types.listOf types.str;
16+ description = "Specifies the WantedBy setting for the input-remapper service.";
17+ };
18+ };
19+ };
20+
21+ config = mkIf cfg.enable {
22+ services.udev.packages = mkIf cfg.enableUdevRules [ cfg.package ];
23+ services.dbus.packages = [ cfg.package ];
24+ systemd.packages = [ cfg.package ];
25+ environment.systemPackages = [ cfg.package ];
26+ systemd.services.input-remapper.wantedBy = cfg.serviceWantedBy;
27+ };
28+
29+ meta.maintainers = with lib.maintainers; [ LunNova ];
30+}
nixos/modules/services/misc/jellyfin.nix+5−3
@@ -70,10 +70,12 @@ in
7070 LockPersonality = true;
7171
7272 PrivateTmp = true;
73− PrivateDevices = true;
73+ # Disabled to allow Jellyfin to access hw accel devices endpoints
74+ # PrivateDevices = true;
7475 PrivateUsers = true;
7576
76− ProtectClock = true;
77+ # Disabled as it does not allow Jellyfin to interface with CUDA devices
78+ # ProtectClock = true;
7779 ProtectControlGroups = true;
7880 ProtectHostname = true;
7981 ProtectKernelLogs = true;
@@ -84,7 +86,7 @@ in
8486
8587 RestrictNamespaces = true;
8688 # AF_NETLINK needed because Jellyfin monitors the network connection
87− RestrictAddressFamilies = [ "AF_NETLINK" "AF_INET" "AF_INET6" ];
89+ RestrictAddressFamilies = [ "AF_NETLINK" "AF_INET" "AF_INET6" "AF_UNIX" ];
8890 RestrictRealtime = true;
8991 RestrictSUIDSGID = true;
9092
nixos/modules/services/misc/matrix-conduit.nix+9
@@ -86,6 +86,15 @@ in
8686 and is set to be read only.
8787 '';
8888 };
89+ global.database_backend = mkOption {
90+ type = types.enum [ "sqlite" "rocksdb" ];
91+ default = "sqlite";
92+ example = "rocksdb";
93+ description = ''
94+ The database backend for the service. Switching it on an existing
95+ instance will require manual migration of data.
96+ '';
97+ };
8998 };
9099 };
91100 default = {};
nixos/modules/services/misc/matrix-synapse.nixdeleted−818
@@ -1,818 +0,0 @@
1−{ config, lib, options, pkgs, ... }:
2−
3−with lib;
4−
5−let
6− cfg = config.services.matrix-synapse;
7− opt = options.services.matrix-synapse;
8− pg = config.services.postgresql;
9− usePostgresql = cfg.database_type == "psycopg2";
10− logConfigFile = pkgs.writeText "log_config.yaml" cfg.logConfig;
11− mkResource = r: ''{names: ${builtins.toJSON r.names}, compress: ${boolToString r.compress}}'';
12− mkListener = l: ''{port: ${toString l.port}, bind_address: "${l.bind_address}", type: ${l.type}, tls: ${boolToString l.tls}, x_forwarded: ${boolToString l.x_forwarded}, resources: [${concatStringsSep "," (map mkResource l.resources)}]}'';
13− pluginsEnv = cfg.package.python.buildEnv.override {
14− extraLibs = cfg.plugins;
15− };
16− configFile = pkgs.writeText "homeserver.yaml" ''
17−${optionalString (cfg.tls_certificate_path != null) ''
18−tls_certificate_path: "${cfg.tls_certificate_path}"
19−''}
20−${optionalString (cfg.tls_private_key_path != null) ''
21−tls_private_key_path: "${cfg.tls_private_key_path}"
22−''}
23−${optionalString (cfg.tls_dh_params_path != null) ''
24−tls_dh_params_path: "${cfg.tls_dh_params_path}"
25−''}
26−no_tls: ${boolToString cfg.no_tls}
27−${optionalString (cfg.bind_port != null) ''
28−bind_port: ${toString cfg.bind_port}
29−''}
30−${optionalString (cfg.unsecure_port != null) ''
31−unsecure_port: ${toString cfg.unsecure_port}
32−''}
33−${optionalString (cfg.bind_host != null) ''
34−bind_host: "${cfg.bind_host}"
35−''}
36−server_name: "${cfg.server_name}"
37−pid_file: "/run/matrix-synapse.pid"
38−${optionalString (cfg.public_baseurl != null) ''
39−public_baseurl: "${cfg.public_baseurl}"
40−''}
41−listeners: [${concatStringsSep "," (map mkListener cfg.listeners)}]
42−database: {
43− name: "${cfg.database_type}",
44− args: {
45− ${concatStringsSep ",\n " (
46− mapAttrsToList (n: v: "\"${n}\": ${builtins.toJSON v}") cfg.database_args
47− )}
48− }
49−}
50−event_cache_size: "${cfg.event_cache_size}"
51−verbose: ${cfg.verbose}
52−log_config: "${logConfigFile}"
53−rc_messages_per_second: ${cfg.rc_messages_per_second}
54−rc_message_burst_count: ${cfg.rc_message_burst_count}
55−federation_rc_window_size: ${cfg.federation_rc_window_size}
56−federation_rc_sleep_limit: ${cfg.federation_rc_sleep_limit}
57−federation_rc_sleep_delay: ${cfg.federation_rc_sleep_delay}
58−federation_rc_reject_limit: ${cfg.federation_rc_reject_limit}
59−federation_rc_concurrent: ${cfg.federation_rc_concurrent}
60−media_store_path: "${cfg.dataDir}/media"
61−uploads_path: "${cfg.dataDir}/uploads"
62−max_upload_size: "${cfg.max_upload_size}"
63−max_image_pixels: "${cfg.max_image_pixels}"
64−dynamic_thumbnails: ${boolToString cfg.dynamic_thumbnails}
65−url_preview_enabled: ${boolToString cfg.url_preview_enabled}
66−${optionalString (cfg.url_preview_enabled == true) ''
67−url_preview_ip_range_blacklist: ${builtins.toJSON cfg.url_preview_ip_range_blacklist}
68−url_preview_ip_range_whitelist: ${builtins.toJSON cfg.url_preview_ip_range_whitelist}
69−url_preview_url_blacklist: ${builtins.toJSON cfg.url_preview_url_blacklist}
70−''}
71−recaptcha_private_key: "${cfg.recaptcha_private_key}"
72−recaptcha_public_key: "${cfg.recaptcha_public_key}"
73−enable_registration_captcha: ${boolToString cfg.enable_registration_captcha}
74−turn_uris: ${builtins.toJSON cfg.turn_uris}
75−turn_shared_secret: "${cfg.turn_shared_secret}"
76−enable_registration: ${boolToString cfg.enable_registration}
77−${optionalString (cfg.registration_shared_secret != null) ''
78−registration_shared_secret: "${cfg.registration_shared_secret}"
79−''}
80−recaptcha_siteverify_api: "https://www.google.com/recaptcha/api/siteverify"
81−turn_user_lifetime: "${cfg.turn_user_lifetime}"
82−user_creation_max_duration: ${cfg.user_creation_max_duration}
83−bcrypt_rounds: ${cfg.bcrypt_rounds}
84−allow_guest_access: ${boolToString cfg.allow_guest_access}
85−
86−account_threepid_delegates:
87− ${optionalString (cfg.account_threepid_delegates.email != null) "email: ${cfg.account_threepid_delegates.email}"}
88− ${optionalString (cfg.account_threepid_delegates.msisdn != null) "msisdn: ${cfg.account_threepid_delegates.msisdn}"}
89−
90−room_prejoin_state:
91− disable_default_event_types: ${boolToString cfg.room_prejoin_state.disable_default_event_types}
92− additional_event_types: ${builtins.toJSON cfg.room_prejoin_state.additional_event_types}
93−${optionalString (cfg.macaroon_secret_key != null) ''
94− macaroon_secret_key: "${cfg.macaroon_secret_key}"
95−''}
96−expire_access_token: ${boolToString cfg.expire_access_token}
97−enable_metrics: ${boolToString cfg.enable_metrics}
98−report_stats: ${boolToString cfg.report_stats}
99−signing_key_path: "${cfg.dataDir}/homeserver.signing.key"
100−key_refresh_interval: "${cfg.key_refresh_interval}"
101−perspectives:
102− servers: {
103− ${concatStringsSep "},\n" (mapAttrsToList (n: v: ''
104− "${n}": {
105− "verify_keys": {
106− ${concatStringsSep "},\n" (mapAttrsToList (n: v: ''
107− "${n}": {
108− "key": "${v}"
109− }'') v)}
110− }
111− '') cfg.servers)}
112− }
113− }
114−redaction_retention_period: ${toString cfg.redaction_retention_period}
115−app_service_config_files: ${builtins.toJSON cfg.app_service_config_files}
116−
117−${cfg.extraConfig}
118−'';
119−
120− hasLocalPostgresDB = let args = cfg.database_args; in
121− usePostgresql && (!(args ? host) || (elem args.host [ "localhost" "127.0.0.1" "::1" ]));
122−in {
123− options = {
124− services.matrix-synapse = {
125− enable = mkEnableOption "matrix.org synapse";
126− configFile = mkOption {
127− type = types.str;
128− readOnly = true;
129− description = ''
130− Path to the configuration file on the target system. Useful to configure e.g. workers
131− that also need this.
132− '';
133− };
134− package = mkOption {
135− type = types.package;
136− default = pkgs.matrix-synapse;
137− defaultText = literalExpression "pkgs.matrix-synapse";
138− description = ''
139− Overridable attribute of the matrix synapse server package to use.
140− '';
141− };
142− plugins = mkOption {
143− type = types.listOf types.package;
144− default = [ ];
145− example = literalExpression ''
146− with config.services.matrix-synapse.package.plugins; [
147− matrix-synapse-ldap3
148− matrix-synapse-pam
149− ];
150− '';
151− description = ''
152− List of additional Matrix plugins to make available.
153− '';
154− };
155− withJemalloc = mkOption {
156− type = types.bool;
157− default = false;
158− description = ''
159− Whether to preload jemalloc to reduce memory fragmentation and overall usage.
160− '';
161− };
162− no_tls = mkOption {
163− type = types.bool;
164− default = false;
165− description = ''
166− Don't bind to the https port
167− '';
168− };
169− bind_port = mkOption {
170− type = types.nullOr types.int;
171− default = null;
172− example = 8448;
173− description = ''
174− DEPRECATED: Use listeners instead.
175− The port to listen for HTTPS requests on.
176− For when matrix traffic is sent directly to synapse.
177− '';
178− };
179− unsecure_port = mkOption {
180− type = types.nullOr types.int;
181− default = null;
182− example = 8008;
183− description = ''
184− DEPRECATED: Use listeners instead.
185− The port to listen for HTTP requests on.
186− For when matrix traffic passes through loadbalancer that unwraps TLS.
187− '';
188− };
189− bind_host = mkOption {
190− type = types.nullOr types.str;
191− default = null;
192− description = ''
193− DEPRECATED: Use listeners instead.
194− Local interface to listen on.
195− The empty string will cause synapse to listen on all interfaces.
196− '';
197− };
198− tls_certificate_path = mkOption {
199− type = types.nullOr types.str;
200− default = null;
201− example = "/var/lib/matrix-synapse/homeserver.tls.crt";
202− description = ''
203− PEM encoded X509 certificate for TLS.
204− You can replace the self-signed certificate that synapse
205− autogenerates on launch with your own SSL certificate + key pair
206− if you like. Any required intermediary certificates can be
207− appended after the primary certificate in hierarchical order.
208− '';
209− };
210− tls_private_key_path = mkOption {
211− type = types.nullOr types.str;
212− default = null;
213− example = "/var/lib/matrix-synapse/homeserver.tls.key";
214− description = ''
215− PEM encoded private key for TLS. Specify null if synapse is not
216− speaking TLS directly.
217− '';
218− };
219− tls_dh_params_path = mkOption {
220− type = types.nullOr types.str;
221− default = null;
222− example = "/var/lib/matrix-synapse/homeserver.tls.dh";
223− description = ''
224− PEM dh parameters for ephemeral keys
225− '';
226− };
227− server_name = mkOption {
228− type = types.str;
229− example = "example.com";
230− default = config.networking.hostName;
231− defaultText = literalExpression "config.networking.hostName";
232− description = ''
233− The domain name of the server, with optional explicit port.
234− This is used by remote servers to look up the server address.
235− This is also the last part of your UserID.
236−
237− The server_name cannot be changed later so it is important to configure this correctly before you start Synapse.
238− '';
239− };
240− public_baseurl = mkOption {
241− type = types.nullOr types.str;
242− default = null;
243− example = "https://example.com:8448/";
244− description = ''
245− The public-facing base URL for the client API (not including _matrix/...)
246− '';
247− };
248− listeners = mkOption {
249− type = types.listOf (types.submodule {
250− options = {
251− port = mkOption {
252− type = types.port;
253− example = 8448;
254− description = ''
255− The port to listen for HTTP(S) requests on.
256− '';
257− };
258− bind_address = mkOption {
259− type = types.str;
260− default = "";
261− example = "203.0.113.42";
262− description = ''
263− Local interface to listen on.
264− The empty string will cause synapse to listen on all interfaces.
265− '';
266− };
267− type = mkOption {
268− type = types.str;
269− default = "http";
270− description = ''
271− Type of listener.
272− '';
273− };
274− tls = mkOption {
275− type = types.bool;
276− default = true;
277− description = ''
278− Whether to listen for HTTPS connections rather than HTTP.
279− '';
280− };
281− x_forwarded = mkOption {
282− type = types.bool;
283− default = false;
284− description = ''
285− Use the X-Forwarded-For (XFF) header as the client IP and not the
286− actual client IP.
287− '';
288− };
289− resources = mkOption {
290− type = types.listOf (types.submodule {
291− options = {
292− names = mkOption {
293− type = types.listOf types.str;
294− description = ''
295− List of resources to host on this listener.
296− '';
297− example = ["client" "webclient" "federation"];
298− };
299− compress = mkOption {
300− type = types.bool;
301− description = ''
302− Should synapse compress HTTP responses to clients that support it?
303− This should be disabled if running synapse behind a load balancer
304− that can do automatic compression.
305− '';
306− };
307− };
308− });
309− description = ''
310− List of HTTP resources to serve on this listener.
311− '';
312− };
313− };
314− });
315− default = [{
316− port = 8448;
317− bind_address = "";
318− type = "http";
319− tls = true;
320− x_forwarded = false;
321− resources = [
322− { names = ["client" "webclient"]; compress = true; }
323− { names = ["federation"]; compress = false; }
324− ];
325− }];
326− description = ''
327− List of ports that Synapse should listen on, their purpose and their configuration.
328− '';
329− };
330− verbose = mkOption {
331− type = types.str;
332− default = "0";
333− description = "Logging verbosity level.";
334− };
335− rc_messages_per_second = mkOption {
336− type = types.str;
337− default = "0.2";
338− description = "Number of messages a client can send per second";
339− };
340− rc_message_burst_count = mkOption {
341− type = types.str;
342− default = "10.0";
343− description = "Number of message a client can send before being throttled";
344− };
345− federation_rc_window_size = mkOption {
346− type = types.str;
347− default = "1000";
348− description = "The federation window size in milliseconds";
349− };
350− federation_rc_sleep_limit = mkOption {
351− type = types.str;
352− default = "10";
353− description = ''
354− The number of federation requests from a single server in a window
355− before the server will delay processing the request.
356− '';
357− };
358− federation_rc_sleep_delay = mkOption {
359− type = types.str;
360− default = "500";
361− description = ''
362− The duration in milliseconds to delay processing events from
363− remote servers by if they go over the sleep limit.
364− '';
365− };
366− federation_rc_reject_limit = mkOption {
367− type = types.str;
368− default = "50";
369− description = ''
370− The maximum number of concurrent federation requests allowed
371− from a single server
372− '';
373− };
374− federation_rc_concurrent = mkOption {
375− type = types.str;
376− default = "3";
377− description = "The number of federation requests to concurrently process from a single server";
378− };
379− database_type = mkOption {
380− type = types.enum [ "sqlite3" "psycopg2" ];
381− default = if versionAtLeast config.system.stateVersion "18.03"
382− then "psycopg2"
383− else "sqlite3";
384− defaultText = literalExpression ''
385− if versionAtLeast config.system.stateVersion "18.03"
386− then "psycopg2"
387− else "sqlite3"
388− '';
389− description = ''
390− The database engine name. Can be sqlite or psycopg2.
391− '';
392− };
393− database_name = mkOption {
394− type = types.str;
395− default = "matrix-synapse";
396− description = "Database name.";
397− };
398− database_user = mkOption {
399− type = types.str;
400− default = "matrix-synapse";
401− description = "Database user name.";
402− };
403− database_args = mkOption {
404− type = types.attrs;
405− default = {
406− sqlite3 = { database = "${cfg.dataDir}/homeserver.db"; };
407− psycopg2 = {
408− user = cfg.database_user;
409− database = cfg.database_name;
410− };
411− }.${cfg.database_type};
412− defaultText = literalDocBook ''
413− <variablelist>
414− <varlistentry>
415− <term>using sqlite3</term>
416− <listitem>
417− <programlisting>
418− { database = "''${config.${opt.dataDir}}/homeserver.db"; }
419− </programlisting>
420− </listitem>
421− </varlistentry>
422− <varlistentry>
423− <term>using psycopg2</term>
424− <listitem>
425− <programlisting>
426− psycopg2 = {
427− user = config.${opt.database_user};
428− database = config.${opt.database_name};
429− }
430− </programlisting>
431− </listitem>
432− </varlistentry>
433− </variablelist>
434− '';
435− description = ''
436− Arguments to pass to the engine.
437− '';
438− };
439− event_cache_size = mkOption {
440− type = types.str;
441− default = "10K";
442− description = "Number of events to cache in memory.";
443− };
444− url_preview_enabled = mkOption {
445− type = types.bool;
446− default = false;
447− description = ''
448− Is the preview URL API enabled? If enabled, you *must* specify an
449− explicit url_preview_ip_range_blacklist of IPs that the spider is
450− denied from accessing.
451− '';
452− };
453− url_preview_ip_range_blacklist = mkOption {
454− type = types.listOf types.str;
455− default = [
456− "127.0.0.0/8"
457− "10.0.0.0/8"
458− "172.16.0.0/12"
459− "192.168.0.0/16"
460− "100.64.0.0/10"
461− "169.254.0.0/16"
462− "::1/128"
463− "fe80::/64"
464− "fc00::/7"
465− ];
466− description = ''
467− List of IP address CIDR ranges that the URL preview spider is denied
468− from accessing.
469− '';
470− };
471− url_preview_ip_range_whitelist = mkOption {
472− type = types.listOf types.str;
473− default = [];
474− description = ''
475− List of IP address CIDR ranges that the URL preview spider is allowed
476− to access even if they are specified in
477− url_preview_ip_range_blacklist.
478− '';
479− };
480− url_preview_url_blacklist = mkOption {
481− type = types.listOf types.str;
482− default = [];
483− description = ''
484− Optional list of URL matches that the URL preview spider is
485− denied from accessing.
486− '';
487− };
488− recaptcha_private_key = mkOption {
489− type = types.str;
490− default = "";
491− description = ''
492− This Home Server's ReCAPTCHA private key.
493− '';
494− };
495− recaptcha_public_key = mkOption {
496− type = types.str;
497− default = "";
498− description = ''
499− This Home Server's ReCAPTCHA public key.
500− '';
501− };
502− enable_registration_captcha = mkOption {
503− type = types.bool;
504− default = false;
505− description = ''
506− Enables ReCaptcha checks when registering, preventing signup
507− unless a captcha is answered. Requires a valid ReCaptcha
508− public/private key.
509− '';
510− };
511− turn_uris = mkOption {
512− type = types.listOf types.str;
513− default = [];
514− description = ''
515− The public URIs of the TURN server to give to clients
516− '';
517− };
518− turn_shared_secret = mkOption {
519− type = types.str;
520− default = "";
521− description = ''
522− The shared secret used to compute passwords for the TURN server
523− '';
524− };
525− turn_user_lifetime = mkOption {
526− type = types.str;
527− default = "1h";
528− description = "How long generated TURN credentials last";
529− };
530− enable_registration = mkOption {
531− type = types.bool;
532− default = false;
533− description = ''
534− Enable registration for new users.
535− '';
536− };
537− registration_shared_secret = mkOption {
538− type = types.nullOr types.str;
539− default = null;
540− description = ''
541− If set, allows registration by anyone who also has the shared
542− secret, even if registration is otherwise disabled.
543− '';
544− };
545− enable_metrics = mkOption {
546− type = types.bool;
547− default = false;
548− description = ''
549− Enable collection and rendering of performance metrics
550− '';
551− };
552− report_stats = mkOption {
553− type = types.bool;
554− default = false;
555− description = "";
556− };
557− servers = mkOption {
558− type = types.attrsOf (types.attrsOf types.str);
559− default = {
560− "matrix.org" = {
561− "ed25519:auto" = "Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw";
562− };
563− };
564− description = ''
565− The trusted servers to download signing keys from.
566− '';
567− };
568− max_upload_size = mkOption {
569− type = types.str;
570− default = "10M";
571− description = "The largest allowed upload size in bytes";
572− };
573− max_image_pixels = mkOption {
574− type = types.str;
575− default = "32M";
576− description = "Maximum number of pixels that will be thumbnailed";
577− };
578− dynamic_thumbnails = mkOption {
579− type = types.bool;
580− default = false;
581− description = ''
582− Whether to generate new thumbnails on the fly to precisely match
583− the resolution requested by the client. If true then whenever
584− a new resolution is requested by the client the server will
585− generate a new thumbnail. If false the server will pick a thumbnail
586− from a precalculated list.
587− '';
588− };
589− user_creation_max_duration = mkOption {
590− type = types.str;
591− default = "1209600000";
592− description = ''
593− Sets the expiry for the short term user creation in
594− milliseconds. The default value is two weeks.
595− '';
596− };
597− bcrypt_rounds = mkOption {
598− type = types.str;
599− default = "12";
600− description = ''
601− Set the number of bcrypt rounds used to generate password hash.
602− Larger numbers increase the work factor needed to generate the hash.
603− '';
604− };
605− allow_guest_access = mkOption {
606− type = types.bool;
607− default = false;
608− description = ''
609− Allows users to register as guests without a password/email/etc, and
610− participate in rooms hosted on this server which have been made
611− accessible to anonymous users.
612− '';
613− };
614− account_threepid_delegates.email = mkOption {
615− type = types.nullOr types.str;
616− default = null;
617− description = ''
618− Delegate email sending to https://example.org
619− '';
620− };
621− account_threepid_delegates.msisdn = mkOption {
622− type = types.nullOr types.str;
623− default = null;
624− description = ''
625− Delegate SMS sending to this local process (https://localhost:8090)
626− '';
627− };
628− room_prejoin_state.additional_event_types = mkOption {
629− default = [];
630− type = types.listOf types.str;
631− description = ''
632− Additional events to share with users who received an invite.
633− '';
634− };
635− room_prejoin_state.disable_default_event_types = mkOption {
636− default = false;
637− type = types.bool;
638− description = ''
639− Whether to disable the default state-event types for users invited to a room.
640− These are:
641−
642− <itemizedlist>
643− <listitem><para>m.room.join_rules</para></listitem>
644− <listitem><para>m.room.canonical_alias</para></listitem>
645− <listitem><para>m.room.avatar</para></listitem>
646− <listitem><para>m.room.encryption</para></listitem>
647− <listitem><para>m.room.name</para></listitem>
648− <listitem><para>m.room.create</para></listitem>
649− </itemizedlist>
650− '';
651− };
652− macaroon_secret_key = mkOption {
653− type = types.nullOr types.str;
654− default = null;
655− description = ''
656− Secret key for authentication tokens
657− '';
658− };
659− expire_access_token = mkOption {
660− type = types.bool;
661− default = false;
662− description = ''
663− Whether to enable access token expiration.
664− '';
665− };
666− key_refresh_interval = mkOption {
667− type = types.str;
668− default = "1d";
669− description = ''
670− How long key response published by this server is valid for.
671− Used to set the valid_until_ts in /key/v2 APIs.
672− Determines how quickly servers will query to check which keys
673− are still valid.
674− '';
675− };
676− app_service_config_files = mkOption {
677− type = types.listOf types.path;
678− default = [ ];
679− description = ''
680− A list of application service config file to use
681− '';
682− };
683− redaction_retention_period = mkOption {
684− type = types.int;
685− default = 7;
686− description = ''
687− How long to keep redacted events in unredacted form in the database.
688− '';
689− };
690− extraConfig = mkOption {
691− type = types.lines;
692− default = "";
693− description = ''
694− Extra config options for matrix-synapse.
695− '';
696− };
697− extraConfigFiles = mkOption {
698− type = types.listOf types.path;
699− default = [];
700− description = ''
701− Extra config files to include.
702−
703− The configuration files will be included based on the command line
704− argument --config-path. This allows to configure secrets without
705− having to go through the Nix store, e.g. based on deployment keys if
706− NixOPS is in use.
707− '';
708− };
709− logConfig = mkOption {
710− type = types.lines;
711− default = readFile ./matrix-synapse-log_config.yaml;
712− description = ''
713− A yaml python logging config file
714− '';
715− };
716− dataDir = mkOption {
717− type = types.str;
718− default = "/var/lib/matrix-synapse";
719− description = ''
720− The directory where matrix-synapse stores its stateful data such as
721− certificates, media and uploads.
722− '';
723− };
724− };
725− };
726−
727− config = mkIf cfg.enable {
728− assertions = [
729− { assertion = hasLocalPostgresDB -> config.services.postgresql.enable;
730− message = ''
731− Cannot deploy matrix-synapse with a configuration for a local postgresql database
732− and a missing postgresql service. Since 20.03 it's mandatory to manually configure the
733− database (please read the thread in https://github.com/NixOS/nixpkgs/pull/80447 for
734− further reference).
735−
736− If you
737− - try to deploy a fresh synapse, you need to configure the database yourself. An example
738− for this can be found in <nixpkgs/nixos/tests/matrix-synapse.nix>
739− - update your existing matrix-synapse instance, you simply need to add `services.postgresql.enable = true`
740− to your configuration.
741−
742− For further information about this update, please read the release-notes of 20.03 carefully.
743− '';
744− }
745− ];
746−
747− services.matrix-synapse.configFile = "${configFile}";
748−
749− users.users.matrix-synapse = {
750− group = "matrix-synapse";
751− home = cfg.dataDir;
752− createHome = true;
753− shell = "${pkgs.bash}/bin/bash";
754− uid = config.ids.uids.matrix-synapse;
755− };
756−
757− users.groups.matrix-synapse = {
758− gid = config.ids.gids.matrix-synapse;
759− };
760−
761− systemd.services.matrix-synapse = {
762− description = "Synapse Matrix homeserver";
763− after = [ "network.target" ] ++ optional hasLocalPostgresDB "postgresql.service";
764− wantedBy = [ "multi-user.target" ];
765− preStart = ''
766− ${cfg.package}/bin/synapse_homeserver \
767− --config-path ${configFile} \
768− --keys-directory ${cfg.dataDir} \
769− --generate-keys
770− '';
771− environment = {
772− PYTHONPATH = makeSearchPathOutput "lib" cfg.package.python.sitePackages [ pluginsEnv ];
773− } // optionalAttrs (cfg.withJemalloc) {
774− LD_PRELOAD = "${pkgs.jemalloc}/lib/libjemalloc.so";
775− };
776− serviceConfig = {
777− Type = "notify";
778− User = "matrix-synapse";
779− Group = "matrix-synapse";
780− WorkingDirectory = cfg.dataDir;
781− ExecStartPre = [ ("+" + (pkgs.writeShellScript "matrix-synapse-fix-permissions" ''
782− chown matrix-synapse:matrix-synapse ${cfg.dataDir}/homeserver.signing.key
783− chmod 0600 ${cfg.dataDir}/homeserver.signing.key
784− '')) ];
785− ExecStart = ''
786− ${cfg.package}/bin/synapse_homeserver \
787− ${ concatMapStringsSep "\n " (x: "--config-path ${x} \\") ([ configFile ] ++ cfg.extraConfigFiles) }
788− --keys-directory ${cfg.dataDir}
789− '';
790− ExecReload = "${pkgs.util-linux}/bin/kill -HUP $MAINPID";
791− Restart = "on-failure";
792− UMask = "0077";
793− };
794− };
795− };
796−
797− imports = [
798− (mkRemovedOptionModule [ "services" "matrix-synapse" "trusted_third_party_id_servers" ] ''
799− The `trusted_third_party_id_servers` option as been removed in `matrix-synapse` v1.4.0
800− as the behavior is now obsolete.
801− '')
802− (mkRemovedOptionModule [ "services" "matrix-synapse" "create_local_database" ] ''
803− Database configuration must be done manually. An exemplary setup is demonstrated in
804− <nixpkgs/nixos/tests/matrix-synapse.nix>
805− '')
806− (mkRemovedOptionModule [ "services" "matrix-synapse" "web_client" ] "")
807− (mkRemovedOptionModule [ "services" "matrix-synapse" "room_invite_state_types" ] ''
808− You may add additional event types via
809− `services.matrix-synapse.room_prejoin_state.additional_event_types` and
810− disable the default events via
811− `services.matrix-synapse.room_prejoin_state.disable_default_event_types`.
812− '')
813− ];
814−
815− meta.doc = ./matrix-synapse.xml;
816− meta.maintainers = teams.matrix.members;
817−
818−}
nixos/modules/services/misc/mbpfan.nix+14−8
@@ -6,7 +6,7 @@ let
66 cfg = config.services.mbpfan;
77 verbose = if cfg.verbose then "v" else "";
88 settingsFormat = pkgs.formats.ini {};
9− settingsFile = settingsFormat.generate "config.conf" cfg.settings;
9+ settingsFile = settingsFormat.generate "mbpfan.ini" cfg.settings;
1010
1111in {
1212 options.services.mbpfan = {
@@ -36,29 +36,35 @@ in {
3636 freeformType = settingsFormat.type;
3737
3838 options.general.min_fan1_speed = mkOption {
39− type = types.int;
39+ type = types.nullOr types.int;
4040 default = 2000;
41− description = "The minimum fan speed.";
41+ description = ''
42+ The minimum fan speed. Setting to null enables automatic detection.
43+ Check minimum fan limits with "cat /sys/devices/platform/applesmc.768/fan*_min".
44+ '';
4245 };
4346 options.general.max_fan1_speed = mkOption {
44− type = types.int;
47+ type = types.nullOr types.int;
4548 default = 6199;
46− description = "The maximum fan speed.";
49+ description = ''
50+ The maximum fan speed. Setting to null enables automatic detection.
51+ Check maximum fan limits with "cat /sys/devices/platform/applesmc.768/fan*_max".
52+ '';
4753 };
4854 options.general.low_temp = mkOption {
4955 type = types.int;
5056 default = 55;
51− description = "The low temperature.";
57+ description = "Temperature below which fan speed will be at minimum. Try ranges 55-63.";
5258 };
5359 options.general.high_temp = mkOption {
5460 type = types.int;
5561 default = 58;
56− description = "The high temperature.";
62+ description = "Fan will increase speed when higher than this temperature. Try ranges 58-66.";
5763 };
5864 options.general.max_temp = mkOption {
5965 type = types.int;
6066 default = 86;
61− description = "The maximum temperature.";
67+ description = "Fan will run at full speed above this temperature. Do not set it > 90.";
6268 };
6369 options.general.polling_interval = mkOption {
6470 type = types.int;
nixos/modules/services/misc/mediatomb.nix+1−1
@@ -217,7 +217,6 @@ in {
217217
218218 package = mkOption {
219219 type = types.package;
220− example = literalExpression "pkgs.mediatomb";
221220 default = pkgs.gerbera;
222221 defaultText = literalExpression "pkgs.gerbera";
223222 description = ''
@@ -367,6 +366,7 @@ in {
367366 wantedBy = [ "multi-user.target" ];
368367 serviceConfig.ExecStart = "${binaryCommand} --port ${toString cfg.port} ${interfaceFlag} ${configFlag} --home ${cfg.dataDir}";
369368 serviceConfig.User = cfg.user;
369+ serviceConfig.Group = cfg.group;
370370 };
371371
372372 users.groups = optionalAttrs (cfg.group == "mediatomb") {
nixos/modules/services/misc/moonraker.nix+40
@@ -79,6 +79,19 @@ in {
7979 for supported values.
8080 '';
8181 };
82+
83+ allowSystemControl = mkOption {
84+ type = types.bool;
85+ default = false;
86+ description = ''
87+ Whether to allow Moonraker to perform system-level operations.
88+
89+ Moonraker exposes APIs to perform system-level operations, such as
90+ reboot, shutdown, and management of systemd units. See the
91+ <link xlink:href="https://moonraker.readthedocs.io/en/latest/web_api/#machine-commands">documentation</link>
92+ for details on what clients are able to do.
93+ '';
94+ };
8295 };
8396 };
8497
@@ -86,6 +99,13 @@ in {
8699 warnings = optional (cfg.settings ? update_manager)
87100 ''Enabling update_manager is not supported on NixOS and will lead to non-removable warnings in some clients.'';
88101
102+ assertions = [
103+ {
104+ assertion = cfg.allowSystemControl -> config.security.polkit.enable;
105+ message = "services.moonraker.allowSystemControl requires polkit to be enabled (security.polkit.enable).";
106+ }
107+ ];
108+
89109 users.users = optionalAttrs (cfg.user == "moonraker") {
90110 moonraker = {
91111 group = cfg.group;
@@ -128,11 +148,31 @@ in {
128148 exec ${pkg}/bin/moonraker -c ${cfg.configDir}/moonraker-temp.cfg
129149 '';
130150
151+ # Needs `ip` command
152+ path = [ pkgs.iproute2 ];
153+
131154 serviceConfig = {
132155 WorkingDirectory = cfg.stateDir;
133156 Group = cfg.group;
134157 User = cfg.user;
135158 };
136159 };
160+
161+ security.polkit.extraConfig = lib.optionalString cfg.allowSystemControl ''
162+ // nixos/moonraker: Allow Moonraker to perform system-level operations
163+ //
164+ // This was enabled via services.moonraker.allowSystemControl.
165+ polkit.addRule(function(action, subject) {
166+ if ((action.id == "org.freedesktop.systemd1.manage-units" ||
167+ action.id == "org.freedesktop.login1.power-off" ||
168+ action.id == "org.freedesktop.login1.power-off-multiple-sessions" ||
169+ action.id == "org.freedesktop.login1.reboot" ||
170+ action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
171+ action.id.startsWith("org.freedesktop.packagekit.")) &&
172+ subject.user == "${cfg.user}") {
173+ return polkit.Result.YES;
174+ }
175+ });
176+ '';
137177 };
138178}
nixos/modules/services/misc/mx-puppet-discord.nix+1−4
@@ -79,10 +79,7 @@ in {
7979
8080 config = mkIf cfg.enable {
8181 systemd.services.mx-puppet-discord = {
82− description = ''
83− mx-puppet-discord is a discord puppeting bridge for matrix.
84− It handles bridging private and group DMs, as well as Guilds (servers).
85− '';
82+ description = "Matrix to Discord puppeting bridge";
8683
8784 wantedBy = [ "multi-user.target" ];
8885 wants = [ "network-online.target" ] ++ cfg.serviceDependencies;
nixos/modules/services/misc/nitter.nix+11−4
@@ -49,6 +49,13 @@ in
4949 services.nitter = {
5050 enable = mkEnableOption "If enabled, start Nitter.";
5151
52+ package = mkOption {
53+ default = pkgs.nitter;
54+ type = types.package;
55+ defaultText = literalExpression "pkgs.nitter";
56+ description = "The nitter derivation to use.";
57+ };
58+
5259 server = {
5360 address = mkOption {
5461 type = types.str;
@@ -78,8 +85,8 @@ in
7885
7986 staticDir = mkOption {
8087 type = types.path;
81− default = "${pkgs.nitter}/share/nitter/public";
82− defaultText = literalExpression ''"''${pkgs.nitter}/share/nitter/public"'';
88+ default = "${cfg.package}/share/nitter/public";
89+ defaultText = literalExpression ''"''${config.services.nitter.package}/share/nitter/public"'';
8390 description = "Path to the static files directory.";
8491 };
8592
@@ -306,8 +313,8 @@ in
306313 Environment = [ "NITTER_CONF_FILE=/var/lib/nitter/nitter.conf" ];
307314 # Some parts of Nitter expect `public` folder in working directory,
308315 # see https://github.com/zedeus/nitter/issues/414
309− WorkingDirectory = "${pkgs.nitter}/share/nitter";
310− ExecStart = "${pkgs.nitter}/bin/nitter";
316+ WorkingDirectory = "${cfg.package}/share/nitter";
317+ ExecStart = "${cfg.package}/bin/nitter";
311318 ExecStartPre = "${preStart}";
312319 AmbientCapabilities = lib.mkIf (cfg.server.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
313320 Restart = "on-failure";
nixos/modules/services/misc/nix-daemon.nix+421−280
@@ -6,20 +6,20 @@ let
66
77 cfg = config.nix;
88
9− nix = cfg.package.out;
9+ nixPackage = cfg.package.out;
1010
11− nixVersion = getVersion nix;
12−
13− isNix23 = versionAtLeast nixVersion "2.3pre";
11+ isNixAtLeast = versionAtLeast (getVersion nixPackage);
1412
1513 makeNixBuildUser = nr: {
16− name = "nixbld${toString nr}";
14+ name = "nixbld${toString nr}";
1715 value = {
1816 description = "Nix build user ${toString nr}";
1917
20− /* For consistency with the setgid(2), setuid(2), and setgroups(2)
21− calls in `libstore/build.cc', don't add any supplementary group
22− here except "nixbld". */
18+ /*
19+ For consistency with the setgid(2), setuid(2), and setgroups(2)
20+ calls in `libstore/build.cc', don't add any supplementary group
21+ here except "nixbld".
22+ */
2323 uid = builtins.add config.ids.uids.nixbld nr;
2424 isSystemUser = true;
2525 group = "nixbld";
@@ -30,53 +30,93 @@ let
3030 nixbldUsers = listToAttrs (map makeNixBuildUser (range 1 cfg.nrBuildUsers));
3131
3232 nixConf =
33− assert versionAtLeast nixVersion "2.2";
34− pkgs.runCommand "nix.conf" { preferLocalBuild = true; extraOptions = cfg.extraOptions; } (
35− ''
36− cat > $out <<END
33+ assert isNixAtLeast "2.2";
34+ let
35+
36+ mkValueString = v:
37+ if v == null then ""
38+ else if isInt v then toString v
39+ else if isBool v then boolToString v
40+ else if isFloat v then floatToString v
41+ else if isList v then toString v
42+ else if isDerivation v then toString v
43+ else if builtins.isPath v then toString v
44+ else if isString v then v
45+ else if isCoercibleToString v then toString v
46+ else abort "The nix conf value: ${toPretty {} v} can not be encoded";
47+
48+ mkKeyValue = k: v: "${escape [ "=" ] k} = ${mkValueString v}";
49+
50+ mkKeyValuePairs = attrs: concatStringsSep "\n" (mapAttrsToList mkKeyValue attrs);
51+
52+ in
53+ pkgs.writeTextFile {
54+ name = "nix.conf";
55+ text = ''
3756 # WARNING: this file is generated from the nix.* options in
3857 # your NixOS configuration, typically
3958 # /etc/nixos/configuration.nix. Do not edit it!
40− build-users-group = nixbld
41− max-jobs = ${toString (cfg.maxJobs)}
42− cores = ${toString (cfg.buildCores)}
43− sandbox = ${if (builtins.isBool cfg.useSandbox) then boolToString cfg.useSandbox else cfg.useSandbox}
44− extra-sandbox-paths = ${toString cfg.sandboxPaths}
45− substituters = ${toString cfg.binaryCaches}
46− trusted-substituters = ${toString cfg.trustedBinaryCaches}
47− trusted-public-keys = ${toString cfg.binaryCachePublicKeys}
48− auto-optimise-store = ${boolToString cfg.autoOptimiseStore}
49− require-sigs = ${boolToString cfg.requireSignedBinaryCaches}
50− trusted-users = ${toString cfg.trustedUsers}
51− allowed-users = ${toString cfg.allowedUsers}
52− ${optionalString (!cfg.distributedBuilds) ''
53− builders =
54− ''}
55− system-features = ${toString cfg.systemFeatures}
56− ${optionalString isNix23 ''
57− sandbox-fallback = false
58− ''}
59− $extraOptions
60− END
61− '' + optionalString cfg.checkConfig (
62− if pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform then ''
63− echo "Ignore nix.checkConfig when cross-compiling"
64− '' else ''
65− echo "Checking that Nix can read nix.conf..."
66− ln -s $out ./nix.conf
67− NIX_CONF_DIR=$PWD ${cfg.package}/bin/nix show-config ${optionalString isNix23 "--no-net --option experimental-features nix-command"} >/dev/null
68− '')
69− );
59+ ${mkKeyValuePairs cfg.settings}
60+ ${cfg.extraOptions}
61+ '';
62+ checkPhase =
63+ if pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform then ''
64+ echo "Ignoring validation for cross-compilation"
65+ ''
66+ else ''
67+ echo "Validating generated nix.conf"
68+ ln -s $out ./nix.conf
69+ set -e
70+ set +o pipefail
71+ NIX_CONF_DIR=$PWD \
72+ ${cfg.package}/bin/nix show-config ${optionalString (isNixAtLeast "2.3pre") "--no-net"} \
73+ ${optionalString (isNixAtLeast "2.4pre") "--option experimental-features nix-command"} \
74+ |& sed -e 's/^warning:/error:/' \
75+ | (! grep '${if cfg.checkConfig then "^error:" else "^error: unknown setting"}')
76+ set -o pipefail
77+ '';
78+ };
79+
80+ legacyConfMappings = {
81+ useSandbox = "sandbox";
82+ buildCores = "cores";
83+ maxJobs = "max-jobs";
84+ sandboxPaths = "extra-sandbox-paths";
85+ binaryCaches = "substituters";
86+ trustedBinaryCaches = "trusted-substituters";
87+ binaryCachePublicKeys = "trusted-public-keys";
88+ autoOptimiseStore = "auto-optimise-store";
89+ requireSignedBinaryCaches = "require-sigs";
90+ trustedUsers = "trusted-users";
91+ allowedUsers = "allowed-users";
92+ systemFeatures = "system-features";
93+ };
94+
95+ semanticConfType = with types;
96+ let
97+ confAtom = nullOr
98+ (oneOf [
99+ bool
100+ int
101+ float
102+ str
103+ path
104+ package
105+ ]) // {
106+ description = "Nix config atom (null, bool, int, float, str, path or package)";
107+ };
108+ in
109+ attrsOf (either confAtom (listOf confAtom));
70110
71111in
72112
73113{
74114 imports = [
75− (mkRenamedOptionModule [ "nix" "useChroot" ] [ "nix" "useSandbox" ])
76− (mkRenamedOptionModule [ "nix" "chrootDirs" ] [ "nix" "sandboxPaths" ])
77− (mkRenamedOptionModule [ "nix" "daemonIONiceLevel" ] [ "nix" "daemonIOSchedPriority" ])
115+ (mkRenamedOptionModuleWith { sinceRelease = 2003; from = [ "nix" "useChroot" ]; to = [ "nix" "useSandbox" ]; })
116+ (mkRenamedOptionModuleWith { sinceRelease = 2003; from = [ "nix" "chrootDirs" ]; to = [ "nix" "sandboxPaths" ]; })
117+ (mkRenamedOptionModuleWith { sinceRelease = 2205; from = [ "nix" "daemonIONiceLevel" ]; to = [ "nix" "daemonIOSchedPriority" ]; })
78118 (mkRemovedOptionModule [ "nix" "daemonNiceLevel" ] "Consider nix.daemonCPUSchedPolicy instead.")
79− ];
119+ ] ++ mapAttrsToList (oldConf: newConf: mkRenamedOptionModuleWith { sinceRelease = 2205; from = [ "nix" oldConf ]; to = [ "nix" "settings" newConf ]; }) legacyConfMappings;
80120
81121 ###### interface
82122
@@ -102,81 +142,6 @@ in
102142 '';
103143 };
104144
105− maxJobs = mkOption {
106− type = types.either types.int (types.enum ["auto"]);
107− default = "auto";
108− example = 64;
109− description = ''
110− This option defines the maximum number of jobs that Nix will try to
111− build in parallel. The default is auto, which means it will use all
112− available logical cores. It is recommend to set it to the total
113− number of logical cores in your system (e.g., 16 for two CPUs with 4
114− cores each and hyper-threading).
115− '';
116− };
117−
118− autoOptimiseStore = mkOption {
119− type = types.bool;
120− default = false;
121− example = true;
122− description = ''
123− If set to true, Nix automatically detects files in the store that have
124− identical contents, and replaces them with hard links to a single copy.
125− This saves disk space. If set to false (the default), you can still run
126− nix-store --optimise to get rid of duplicate files.
127− '';
128− };
129−
130− buildCores = mkOption {
131− type = types.int;
132− default = 0;
133− example = 64;
134− description = ''
135− This option defines the maximum number of concurrent tasks during
136− one build. It affects, e.g., -j option for make.
137− The special value 0 means that the builder should use all
138− available CPU cores in the system. Some builds may become
139− non-deterministic with this option; use with care! Packages will
140− only be affected if enableParallelBuilding is set for them.
141− '';
142− };
143−
144− useSandbox = mkOption {
145− type = types.either types.bool (types.enum ["relaxed"]);
146− default = true;
147− description = "
148− If set, Nix will perform builds in a sandboxed environment that it
149− will set up automatically for each build. This prevents impurities
150− in builds by disallowing access to dependencies outside of the Nix
151− store by using network and mount namespaces in a chroot environment.
152− This is enabled by default even though it has a possible performance
153− impact due to the initial setup time of a sandbox for each build. It
154− doesn't affect derivation hashes, so changing this option will not
155− trigger a rebuild of packages.
156− ";
157− };
158−
159− sandboxPaths = mkOption {
160− type = types.listOf types.str;
161− default = [];
162− example = [ "/dev" "/proc" ];
163− description =
164− ''
165− Directories from the host filesystem to be included
166− in the sandbox.
167− '';
168− };
169−
170− extraOptions = mkOption {
171− type = types.lines;
172− default = "";
173− example = ''
174− keep-outputs = true
175− keep-derivations = true
176− '';
177− description = "Additional text appended to <filename>nix.conf</filename>.";
178− };
179−
180145 distributedBuilds = mkOption {
181146 type = types.bool;
182147 default = false;
@@ -187,7 +152,7 @@ in
187152 };
188153
189154 daemonCPUSchedPolicy = mkOption {
190− type = types.enum ["other" "batch" "idle"];
155+ type = types.enum [ "other" "batch" "idle" ];
191156 default = "other";
192157 example = "batch";
193158 description = ''
@@ -218,7 +183,7 @@ in
218183 };
219184
220185 daemonIOSchedClass = mkOption {
221− type = types.enum ["best-effort" "idle"];
186+ type = types.enum [ "best-effort" "idle" ];
222187 default = "best-effort";
223188 example = "idle";
224189 description = ''
@@ -250,11 +215,11 @@ in
250215 scheduling policy: With idle, priorities are not used in scheduling
251216 decisions. best-effort supports values in the range 0 (high) to 7
252217 (low).
253− '';
218+ '';
254219 };
255220
256221 buildMachines = mkOption {
257− type = types.listOf (types.submodule ({
222+ type = types.listOf (types.submodule {
258223 options = {
259224 hostName = mkOption {
260225 type = types.str;
@@ -276,7 +241,7 @@ in
276241 };
277242 systems = mkOption {
278243 type = types.listOf types.str;
279− default = [];
244+ default = [ ];
280245 example = [ "x86_64-linux" "aarch64-linux" ];
281246 description = ''
282247 The system types the build machine can execute derivations on.
@@ -293,7 +258,7 @@ in
293258 The username to log in as on the remote host. This user must be
294259 able to log in and run nix commands non-interactively. It must
295260 also be privileged to build derivations, so must be included in
296− <option>nix.trustedUsers</option>.
261+ <option>nix.settings.trusted-users</option>.
297262 '';
298263 };
299264 sshKey = mkOption {
@@ -331,7 +296,7 @@ in
331296 };
332297 mandatoryFeatures = mkOption {
333298 type = types.listOf types.str;
334− default = [];
299+ default = [ ];
335300 example = [ "big-parallel" ];
336301 description = ''
337302 A list of features mandatory for this builder. The builder will
@@ -342,7 +307,7 @@ in
342307 };
343308 supportedFeatures = mkOption {
344309 type = types.listOf types.str;
345− default = [];
310+ default = [ ];
346311 example = [ "kvm" "big-parallel" ];
347312 description = ''
348313 A list of features supported by this builder. The builder will
@@ -350,9 +315,18 @@ in
350315 list.
351316 '';
352317 };
318+ publicHostKey = mkOption {
319+ type = types.nullOr types.str;
320+ default = null;
321+ description = ''
322+ The (base64-encoded) public host key of this builder. The field
323+ is calculated via <command>base64 -w0 /etc/ssh/ssh_host_type_key.pub</command>.
324+ If null, SSH will use its regular known-hosts file when connecting.
325+ '';
326+ };
353327 };
354− }));
355− default = [];
328+ });
329+ default = [ ];
356330 description = ''
357331 This option lists the machines to be used if distributed builds are
358332 enabled (see <option>nix.distributedBuilds</option>).
@@ -366,7 +340,7 @@ in
366340 envVars = mkOption {
367341 type = types.attrs;
368342 internal = true;
369− default = {};
343+ default = { };
370344 description = "Environment variables used by Nix.";
371345 };
372346
@@ -391,92 +365,13 @@ in
391365 '';
392366 };
393367
394− binaryCaches = mkOption {
395− type = types.listOf types.str;
396− description = ''
397− List of binary cache URLs used to obtain pre-built binaries
398− of Nix packages.
399−
400− By default https://cache.nixos.org/ is added,
401− to override it use <literal>lib.mkForce []</literal>.
402− '';
403− };
404−
405− trustedBinaryCaches = mkOption {
406− type = types.listOf types.str;
407− default = [ ];
408− example = [ "https://hydra.nixos.org/" ];
409− description = ''
410− List of binary cache URLs that non-root users can use (in
411− addition to those specified using
412− <option>nix.binaryCaches</option>) by passing
413− <literal>--option binary-caches</literal> to Nix commands.
414− '';
415− };
416−
417− requireSignedBinaryCaches = mkOption {
418− type = types.bool;
419− default = true;
420− description = ''
421− If enabled (the default), Nix will only download binaries from binary caches if
422− they are cryptographically signed with any of the keys listed in
423− <option>nix.binaryCachePublicKeys</option>. If disabled, signatures are neither
424− required nor checked, so it's strongly recommended that you use only
425− trustworthy caches and https to prevent man-in-the-middle attacks.
426− '';
427− };
428−
429− binaryCachePublicKeys = mkOption {
430− type = types.listOf types.str;
431− example = [ "hydra.nixos.org-1:CNHJZBh9K4tP3EKF6FkkgeVYsS3ohTl+oS0Qa8bezVs=" ];
432− description = ''
433− List of public keys used to sign binary caches. If
434− <option>nix.requireSignedBinaryCaches</option> is enabled,
435− then Nix will use a binary from a binary cache if and only
436− if it is signed by <emphasis>any</emphasis> of the keys
437− listed here. By default, only the key for
438− <uri>cache.nixos.org</uri> is included.
439− '';
440− };
441−
442− trustedUsers = mkOption {
443− type = types.listOf types.str;
444− default = [ "root" ];
445− example = [ "root" "alice" "@wheel" ];
446− description = ''
447− A list of names of users that have additional rights when
448− connecting to the Nix daemon, such as the ability to specify
449− additional binary caches, or to import unsigned NARs. You
450− can also specify groups by prefixing them with
451− <literal>@</literal>; for instance,
452− <literal>@wheel</literal> means all users in the wheel
453− group.
454− '';
455− };
456−
457− allowedUsers = mkOption {
458− type = types.listOf types.str;
459− default = [ "*" ];
460− example = [ "@wheel" "@builders" "alice" "bob" ];
461− description = ''
462− A list of names of users (separated by whitespace) that are
463− allowed to connect to the Nix daemon. As with
464− <option>nix.trustedUsers</option>, you can specify groups by
465− prefixing them with <literal>@</literal>. Also, you can
466− allow all users by specifying <literal>*</literal>. The
467− default is <literal>*</literal>. Note that trusted users are
468− always allowed to connect.
469− '';
470− };
471−
472368 nixPath = mkOption {
473369 type = types.listOf types.str;
474− default =
475− [
476− "nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos"
477− "nixos-config=/etc/nixos/configuration.nix"
478− "/nix/var/nix/profiles/per-user/root/channels"
479− ];
370+ default = [
371+ "nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos"
372+ "nixos-config=/etc/nixos/configuration.nix"
373+ "/nix/var/nix/profiles/per-user/root/channels"
374+ ];
480375 description = ''
481376 The default Nix expression search path, used by the Nix
482377 evaluator to look up paths enclosed in angle brackets
@@ -484,45 +379,44 @@ in
484379 '';
485380 };
486381
487− systemFeatures = mkOption {
488− type = types.listOf types.str;
489− example = [ "kvm" "big-parallel" "gccarch-skylake" ];
490− description = ''
491− The supported features of a machine
492− '';
493− };
494−
495382 checkConfig = mkOption {
496383 type = types.bool;
497384 default = true;
498385 description = ''
499− If enabled (the default), checks that Nix can parse the generated nix.conf.
386+ If enabled (the default), checks for data type mismatches and that Nix
387+ can parse the generated nix.conf.
500388 '';
501389 };
502390
503391 registry = mkOption {
504392 type = types.attrsOf (types.submodule (
505393 let
506− inputAttrs = types.attrsOf (types.oneOf [types.str types.int types.bool types.package]);
394+ referenceAttrs = with types; attrsOf (oneOf [
395+ str
396+ int
397+ bool
398+ package
399+ ]);
507400 in
508401 { config, name, ... }:
509− { options = {
402+ {
403+ options = {
510404 from = mkOption {
511− type = inputAttrs;
405+ type = referenceAttrs;
512406 example = { type = "indirect"; id = "nixpkgs"; };
513407 description = "The flake reference to be rewritten.";
514408 };
515409 to = mkOption {
516− type = inputAttrs;
410+ type = referenceAttrs;
517411 example = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; };
518− description = "The flake reference to which <option>from></option> is to be rewritten.";
412+ description = "The flake reference <option>from></option> is rewritten to.";
519413 };
520414 flake = mkOption {
521415 type = types.nullOr types.attrs;
522416 default = null;
523417 example = literalExpression "nixpkgs";
524418 description = ''
525− The flake input to which <option>from></option> is to be rewritten.
419+ The flake input <option>from></option> is rewritten to.
526420 '';
527421 };
528422 exact = mkOption {
@@ -537,35 +431,232 @@ in
537431 };
538432 config = {
539433 from = mkDefault { type = "indirect"; id = name; };
540− to = mkIf (config.flake != null)
541− ({ type = "path";
542− path = config.flake.outPath;
543− } // lib.filterAttrs
544− (n: v: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash")
545− config.flake);
434+ to = mkIf (config.flake != null) (mkDefault
435+ {
436+ type = "path";
437+ path = config.flake.outPath;
438+ } // filterAttrs
439+ (n: _: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash")
440+ config.flake);
546441 };
547442 }
548443 ));
549− default = {};
444+ default = { };
550445 description = ''
551446 A system-wide flake registry.
552447 '';
553448 };
554449
555− };
450+ extraOptions = mkOption {
451+ type = types.lines;
452+ default = "";
453+ example = ''
454+ keep-outputs = true
455+ keep-derivations = true
456+ '';
457+ description = "Additional text appended to <filename>nix.conf</filename>.";
458+ };
459+
460+ settings = mkOption {
461+ type = types.submodule {
462+ freeformType = semanticConfType;
463+
464+ options = {
465+ max-jobs = mkOption {
466+ type = types.either types.int (types.enum [ "auto" ]);
467+ default = "auto";
468+ example = 64;
469+ description = ''
470+ This option defines the maximum number of jobs that Nix will try to
471+ build in parallel. The default is auto, which means it will use all
472+ available logical cores. It is recommend to set it to the total
473+ number of logical cores in your system (e.g., 16 for two CPUs with 4
474+ cores each and hyper-threading).
475+ '';
476+ };
477+
478+ auto-optimise-store = mkOption {
479+ type = types.bool;
480+ default = false;
481+ example = true;
482+ description = ''
483+ If set to true, Nix automatically detects files in the store that have
484+ identical contents, and replaces them with hard links to a single copy.
485+ This saves disk space. If set to false (the default), you can still run
486+ nix-store --optimise to get rid of duplicate files.
487+ '';
488+ };
489+
490+ cores = mkOption {
491+ type = types.int;
492+ default = 0;
493+ example = 64;
494+ description = ''
495+ This option defines the maximum number of concurrent tasks during
496+ one build. It affects, e.g., -j option for make.
497+ The special value 0 means that the builder should use all
498+ available CPU cores in the system. Some builds may become
499+ non-deterministic with this option; use with care! Packages will
500+ only be affected if enableParallelBuilding is set for them.
501+ '';
502+ };
503+
504+ sandbox = mkOption {
505+ type = types.either types.bool (types.enum [ "relaxed" ]);
506+ default = true;
507+ description = ''
508+ If set, Nix will perform builds in a sandboxed environment that it
509+ will set up automatically for each build. This prevents impurities
510+ in builds by disallowing access to dependencies outside of the Nix
511+ store by using network and mount namespaces in a chroot environment.
512+ This is enabled by default even though it has a possible performance
513+ impact due to the initial setup time of a sandbox for each build. It
514+ doesn't affect derivation hashes, so changing this option will not
515+ trigger a rebuild of packages.
516+ '';
517+ };
518+
519+ extra-sandbox-paths = mkOption {
520+ type = types.listOf types.str;
521+ default = [ ];
522+ example = [ "/dev" "/proc" ];
523+ description = ''
524+ Directories from the host filesystem to be included
525+ in the sandbox.
526+ '';
527+ };
528+
529+ substituters = mkOption {
530+ type = types.listOf types.str;
531+ description = ''
532+ List of binary cache URLs used to obtain pre-built binaries
533+ of Nix packages.
534+
535+ By default https://cache.nixos.org/ is added.
536+ '';
537+ };
538+
539+ trusted-substituters = mkOption {
540+ type = types.listOf types.str;
541+ default = [ ];
542+ example = [ "https://hydra.nixos.org/" ];
543+ description = ''
544+ List of binary cache URLs that non-root users can use (in
545+ addition to those specified using
546+ <option>nix.settings.substituters</option>) by passing
547+ <literal>--option binary-caches</literal> to Nix commands.
548+ '';
549+ };
550+
551+ require-sigs = mkOption {
552+ type = types.bool;
553+ default = true;
554+ description = ''
555+ If enabled (the default), Nix will only download binaries from binary caches if
556+ they are cryptographically signed with any of the keys listed in
557+ <option>nix.settings.trusted-public-keys</option>. If disabled, signatures are neither
558+ required nor checked, so it's strongly recommended that you use only
559+ trustworthy caches and https to prevent man-in-the-middle attacks.
560+ '';
561+ };
562+
563+ trusted-public-keys = mkOption {
564+ type = types.listOf types.str;
565+ example = [ "hydra.nixos.org-1:CNHJZBh9K4tP3EKF6FkkgeVYsS3ohTl+oS0Qa8bezVs=" ];
566+ description = ''
567+ List of public keys used to sign binary caches. If
568+ <option>nix.settings.trusted-public-keys</option> is enabled,
569+ then Nix will use a binary from a binary cache if and only
570+ if it is signed by <emphasis>any</emphasis> of the keys
571+ listed here. By default, only the key for
572+ <uri>cache.nixos.org</uri> is included.
573+ '';
574+ };
575+
576+ trusted-users = mkOption {
577+ type = types.listOf types.str;
578+ default = [ "root" ];
579+ example = [ "root" "alice" "@wheel" ];
580+ description = ''
581+ A list of names of users that have additional rights when
582+ connecting to the Nix daemon, such as the ability to specify
583+ additional binary caches, or to import unsigned NARs. You
584+ can also specify groups by prefixing them with
585+ <literal>@</literal>; for instance,
586+ <literal>@wheel</literal> means all users in the wheel
587+ group.
588+ '';
589+ };
556590
591+ system-features = mkOption {
592+ type = types.listOf types.str;
593+ example = [ "kvm" "big-parallel" "gccarch-skylake" ];
594+ description = ''
595+ The set of features supported by the machine. Derivations
596+ can express dependencies on system features through the
597+ <literal>requiredSystemFeatures</literal> attribute.
598+
599+ By default, pseudo-features <literal>nixos-test</literal>, <literal>benchmark</literal>,
600+ and <literal>big-parallel</literal> used in Nixpkgs are set, <literal>kvm</literal>
601+ is also included in it is avaliable.
602+ '';
603+ };
604+
605+ allowed-users = mkOption {
606+ type = types.listOf types.str;
607+ default = [ "*" ];
608+ example = [ "@wheel" "@builders" "alice" "bob" ];
609+ description = ''
610+ A list of names of users (separated by whitespace) that are
611+ allowed to connect to the Nix daemon. As with
612+ <option>nix.settings.trusted-users</option>, you can specify groups by
613+ prefixing them with <literal>@</literal>. Also, you can
614+ allow all users by specifying <literal>*</literal>. The
615+ default is <literal>*</literal>. Note that trusted users are
616+ always allowed to connect.
617+ '';
618+ };
619+ };
620+ };
621+ default = { };
622+ example = literalExpression ''
623+ {
624+ use-sandbox = true;
625+ show-trace = true;
626+
627+ system-features = [ "big-parallel" "kvm" "recursive-nix" ];
628+ sandbox-paths = { "/bin/sh" = "''${pkgs.busybox-sandbox-shell.out}/bin/busybox"; };
629+ }
630+ '';
631+ description = ''
632+ Configuration for Nix, see
633+ <link xlink:href="https://nixos.org/manual/nix/stable/#sec-conf-file"/> or
634+ <citerefentry>
635+ <refentrytitle>nix.conf</refentrytitle>
636+ <manvolnum>5</manvolnum>
637+ </citerefentry> for avalaible options.
638+ The value declared here will be translated directly to the key-value pairs Nix expects.
639+ </para>
640+ <para>
641+ You can use <command>nix-instantiate --eval --strict '<nixpkgs/nixos>' -A config.nix.settings</command>
642+ to view the current value. By default it is empty.
643+ </para>
644+ <para>
645+ Nix configurations defined under <option>nix.*</option> will be translated and applied to this
646+ option. In addition, configuration specified in <option>nix.extraOptions</option> which will be appended
647+ verbatim to the resulting config file.
648+ '';
649+ };
650+ };
557651 };
558652
559653
560654 ###### implementation
561655
562656 config = mkIf cfg.enable {
563−
564− nix.binaryCachePublicKeys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
565− nix.binaryCaches = [ "https://cache.nixos.org/" ];
566−
567657 environment.systemPackages =
568− [ nix
658+ [
659+ nixPackage
569660 pkgs.nix-info
570661 ]
571662 ++ optional (config.programs.bash.enableCompletion) pkgs.nix-bash-completions;
@@ -579,44 +670,49 @@ in
579670
580671 # List of machines for distributed Nix builds in the format
581672 # expected by build-remote.pl.
582− environment.etc."nix/machines" =
583− { enable = cfg.buildMachines != [];
584− text =
585− concatMapStrings (machine:
586− "${if machine.sshUser != null then "${machine.sshUser}@" else ""}${machine.hostName} "
587− + (if machine.system != null then machine.system else concatStringsSep "," machine.systems)
588− + " ${if machine.sshKey != null then machine.sshKey else "-"} ${toString machine.maxJobs} "
589− + toString (machine.speedFactor)
590− + " "
591− + concatStringsSep "," (machine.mandatoryFeatures ++ machine.supportedFeatures)
592− + " "
593− + concatStringsSep "," machine.mandatoryFeatures
673+ environment.etc."nix/machines" = mkIf (cfg.buildMachines != [ ]) {
674+ text =
675+ concatMapStrings
676+ (machine:
677+ (concatStringsSep " " ([
678+ "${optionalString (machine.sshUser != null) "${machine.sshUser}@"}${machine.hostName}"
679+ (if machine.system != null then machine.system else if machine.systems != [ ] then concatStringsSep "," machine.systems else "-")
680+ (if machine.sshKey != null then machine.sshKey else "-")
681+ (toString machine.maxJobs)
682+ (toString machine.speedFactor)
683+ (concatStringsSep "," (machine.supportedFeatures ++ machine.mandatoryFeatures))
684+ (concatStringsSep "," machine.mandatoryFeatures)
685+ ]
686+ ++ optional (isNixAtLeast "2.4pre") (if machine.publicHostKey != null then machine.publicHostKey else "-")))
594687 + "\n"
595− ) cfg.buildMachines;
596− };
688+ )
689+ cfg.buildMachines;
690+ };
691+
597692 assertions =
598− let badMachine = m: m.system == null && m.systems == [];
599− in [
693+ let badMachine = m: m.system == null && m.systems == [ ];
694+ in
695+ [
600696 {
601− assertion = !(builtins.any badMachine cfg.buildMachines);
697+ assertion = !(any badMachine cfg.buildMachines);
602698 message = ''
603699 At least one system type (via <varname>system</varname> or
604700 <varname>systems</varname>) must be set for every build machine.
605701 Invalid machine specifications:
606702 '' + " " +
607− (builtins.concatStringsSep "\n "
608− (builtins.map (m: m.hostName)
609− (builtins.filter (badMachine) cfg.buildMachines)));
703+ (concatStringsSep "\n "
704+ (map (m: m.hostName)
705+ (filter (badMachine) cfg.buildMachines)));
610706 }
611707 ];
612708
613−
614− systemd.packages = [ nix ];
709+ systemd.packages = [ nixPackage ];
615710
616711 systemd.sockets.nix-daemon.wantedBy = [ "sockets.target" ];
617712
618713 systemd.services.nix-daemon =
619− { path = [ nix pkgs.util-linux config.programs.ssh.package ]
714+ {
715+ path = [ nixPackage pkgs.util-linux config.programs.ssh.package ]
620716 ++ optionals cfg.distributedBuilds [ pkgs.gzip ];
621717
622718 environment = cfg.envVars
@@ -626,19 +722,52 @@ in
626722 unitConfig.RequiresMountsFor = "/nix/store";
627723
628724 serviceConfig =
629− { CPUSchedulingPolicy = cfg.daemonCPUSchedPolicy;
725+ {
726+ CPUSchedulingPolicy = cfg.daemonCPUSchedPolicy;
630727 IOSchedulingClass = cfg.daemonIOSchedClass;
631728 IOSchedulingPriority = cfg.daemonIOSchedPriority;
632729 LimitNOFILE = 4096;
633730 };
634731
635732 restartTriggers = [ nixConf ];
733+
734+ # `stopIfChanged = false` changes to switch behavior
735+ # from stop -> update units -> start
736+ # to update units -> restart
737+ #
738+ # The `stopIfChanged` setting therefore controls a trade-off between a
739+ # more predictable lifecycle, which runs the correct "version" of
740+ # the `ExecStop` line, and on the other hand the availability of
741+ # sockets during the switch, as the effectiveness of the stop operation
742+ # depends on the socket being stopped as well.
743+ #
744+ # As `nix-daemon.service` does not make use of `ExecStop`, we prefer
745+ # to keep the socket up and available. This is important for machines
746+ # that run Nix-based services, such as automated build, test, and deploy
747+ # services, that expect the daemon socket to be available at all times.
748+ #
749+ # Notably, the Nix client does not retry on failure to connect to the
750+ # daemon socket, and the in-process RemoteStore instance will disable
751+ # itself. This makes retries infeasible even for services that are
752+ # aware of the issue. Failure to connect can affect not only new client
753+ # processes, but also new RemoteStore instances in existing processes,
754+ # as well as existing RemoteStore instances that have not saturated
755+ # their connection pool.
756+ #
757+ # Also note that `stopIfChanged = true` does not kill existing
758+ # connection handling daemons, as one might wish to happen before a
759+ # breaking Nix upgrade (which is rare). The daemon forks that handle
760+ # the individual connections split off into their own sessions, causing
761+ # them not to be stopped by systemd.
762+ # If a Nix upgrade does require all existing daemon processes to stop,
763+ # nix-daemon must do so on its own accord, and only when the new version
764+ # starts and detects that Nix's persistent state needs an upgrade.
765+ stopIfChanged = false;
766+
636767 };
637768
638769 # Set up the environment variables for running Nix.
639− environment.sessionVariables = cfg.envVars //
640− { NIX_PATH = cfg.nixPath;
641− };
770+ environment.sessionVariables = cfg.envVars // { NIX_PATH = cfg.nixPath; };
642771
643772 environment.extraInit =
644773 ''
@@ -647,7 +776,7 @@ in
647776 fi
648777 '';
649778
650− nix.nrBuildUsers = mkDefault (lib.max 32 (if cfg.maxJobs == "auto" then 0 else cfg.maxJobs));
779+ nix.nrBuildUsers = mkDefault (max 32 (if cfg.settings.max-jobs == "auto" then 0 else cfg.settings.max-jobs));
651780
652781 users.users = nixbldUsers;
653782
@@ -663,14 +792,26 @@ in
663792 fi
664793 '';
665794
666− nix.systemFeatures = mkDefault (
667− [ "nixos-test" "benchmark" "big-parallel" "kvm" ] ++
668− optionals (pkgs.hostPlatform ? gcc.arch) (
669− # a builder can run code for `gcc.arch` and inferior architectures
670− [ "gccarch-${pkgs.hostPlatform.gcc.arch}" ] ++
671− map (x: "gccarch-${x}") lib.systems.architectures.inferiors.${pkgs.hostPlatform.gcc.arch}
672− )
673− );
795+ # Legacy configuration conversion.
796+ nix.settings = mkMerge [
797+ {
798+ trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
799+ substituters = mkAfter [ "https://cache.nixos.org/" ];
800+
801+ system-features = mkDefault (
802+ [ "nixos-test" "benchmark" "big-parallel" "kvm" ] ++
803+ optionals (pkgs.hostPlatform ? gcc.arch) (
804+ # a builder can run code for `gcc.arch` and inferior architectures
805+ [ "gccarch-${pkgs.hostPlatform.gcc.arch}" ] ++
806+ map (x: "gccarch-${x}") systems.architectures.inferiors.${pkgs.hostPlatform.gcc.arch}
807+ )
808+ );
809+ }
810+
811+ (mkIf (!cfg.distributedBuilds) { builders = null; })
812+
813+ (mkIf (isNixAtLeast "2.3pre") { sandbox-fallback = false; })
814+ ];
674815
675816 };
676817
nixos/modules/services/misc/nix-gc.nix+8−2
@@ -81,8 +81,14 @@ in
8181 ###### implementation
8282
8383 config = {
84−
85− systemd.services.nix-gc = {
84+ assertions = [
85+ {
86+ assertion = cfg.automatic -> config.nix.enable;
87+ message = ''nix.gc.automatic requires nix.enable'';
88+ }
89+ ];
90+
91+ systemd.services.nix-gc = lib.mkIf config.nix.enable {
8692 description = "Nix Garbage Collector";
8793 script = "exec ${config.nix.package.out}/bin/nix-collect-garbage ${cfg.options}";
8894 startAt = optional cfg.automatic cfg.dates;
nixos/modules/services/misc/nix-optimise.nix+8−2
@@ -37,8 +37,14 @@ in
3737 ###### implementation
3838
3939 config = {
40−
41− systemd.services.nix-optimise =
40+ assertions = [
41+ {
42+ assertion = cfg.automatic -> config.nix.enable;
43+ message = ''nix.optimise.automatic requires nix.enable'';
44+ }
45+ ];
46+
47+ systemd.services.nix-optimise = lib.mkIf config.nix.enable
4248 { description = "Nix Store Optimiser";
4349 # No point this if the nix daemon (and thus the nix store) is outside
4450 unitConfig.ConditionPathIsReadWrite = "/nix/var/nix/daemon-socket";
nixos/modules/services/misc/nix-ssh-serve.nix+1−1
@@ -20,7 +20,7 @@ in {
2020 write = mkOption {
2121 type = types.bool;
2222 default = false;
23− description = "Whether to enable writing to the Nix store as a remote store via SSH. Note: the sshServe user is named nix-ssh and is not a trusted-user. nix-ssh should be added to the nix.trustedUsers option in most use cases, such as allowing remote building of derivations.";
23+ description = "Whether to enable writing to the Nix store as a remote store via SSH. Note: the sshServe user is named nix-ssh and is not a trusted-user. nix-ssh should be added to the <option>nix.settings.trusted-users</option> option in most use cases, such as allowing remote building of derivations.";
2424 };
2525
2626 keys = mkOption {
nixos/modules/services/misc/packagekit.nix+4−2
@@ -13,7 +13,7 @@ let
1313 (iniFmt.generate "PackageKit.conf" (recursiveUpdate
1414 {
1515 Daemon = {
16− DefaultBackend = "test_nop";
16+ DefaultBackend = "nix";
1717 KeepCache = false;
1818 };
1919 }
@@ -35,7 +35,7 @@ let
3535in
3636{
3737 imports = [
38− (mkRemovedOptionModule [ "services" "packagekit" "backend" ] "The only backend that doesn't blow up is `test_nop`.")
38+ (mkRemovedOptionModule [ "services" "packagekit" "backend" ] "Always set to Nix.")
3939 ];
4040
4141 options.services.packagekit = {
@@ -62,6 +62,8 @@ in
6262
6363 services.dbus.packages = with pkgs; [ packagekit ];
6464
65+ environment.systemPackages = with pkgs; [ packagekit ];
66+
6567 systemd.packages = with pkgs; [ packagekit ];
6668
6769 environment.etc = listToAttrs (map
nixos/modules/services/misc/paperless-ng.nix+19−5
@@ -6,12 +6,18 @@ let
66
77 defaultUser = "paperless";
88
9+ hasCustomRedis = hasAttr "PAPERLESS_REDIS" cfg.extraConfig;
10+
911 env = {
1012 PAPERLESS_DATA_DIR = cfg.dataDir;
1113 PAPERLESS_MEDIA_ROOT = cfg.mediaDir;
1214 PAPERLESS_CONSUMPTION_DIR = cfg.consumptionDir;
1315 GUNICORN_CMD_ARGS = "--bind=${cfg.address}:${toString cfg.port}";
14− } // lib.mapAttrs (_: toString) cfg.extraConfig;
16+ } // (
17+ lib.mapAttrs (_: toString) cfg.extraConfig
18+ ) // (optionalAttrs (!hasCustomRedis) {
19+ PAPERLESS_REDIS = "unix://${config.services.redis.servers.paperless-ng.unixSocket}";
20+ });
1521
1622 manage = let
1723 setupEnv = lib.concatStringsSep "\n" (mapAttrsToList (name: val: "export ${name}=\"${val}\"") env);
@@ -30,7 +36,7 @@ let
3036 "-/etc/hosts"
3137 "-/etc/localtime"
3238 "-/run/postgresql"
33− ];
39+ ] ++ (optional (!hasCustomRedis) config.services.redis.servers.paperless-ng.unixSocket);
3440 BindPaths = [
3541 cfg.consumptionDir
3642 cfg.dataDir
@@ -44,8 +50,7 @@ let
4450 NoNewPrivileges = true;
4551 PrivateDevices = true;
4652 PrivateMounts = true;
47− # Needs to connect to redis
48− # PrivateNetwork = true;
53+ PrivateNetwork = true;
4954 PrivateTmp = true;
5055 PrivateUsers = true;
5156 ProcSubset = "pid";
@@ -65,6 +70,7 @@ let
6570 RestrictNamespaces = true;
6671 RestrictRealtime = true;
6772 RestrictSUIDSGID = true;
73+ SupplementaryGroups = optional (!hasCustomRedis) config.services.redis.servers.paperless-ng.user;
6874 SystemCallArchitectures = "native";
6975 SystemCallFilter = [ "@system-service" "~@privileged @resources @setuid @keyring" ];
7076 # Does not work well with the temporary root
@@ -190,7 +196,7 @@ in
190196
191197 config = mkIf cfg.enable {
192198 # Enable redis if no special url is set
193− services.redis.enable = mkIf (!hasAttr "PAPERLESS_REDIS" env) true;
199+ services.redis.servers.paperless-ng.enable = mkIf (!hasCustomRedis) true;
194200
195201 systemd.tmpfiles.rules = [
196202 "d '${cfg.dataDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
@@ -208,6 +214,8 @@ in
208214 User = cfg.user;
209215 ExecStart = "${cfg.package}/bin/paperless-ng qcluster";
210216 Restart = "on-failure";
217+ # The `mbind` syscall is needed for running the classifier.
218+ SystemCallFilter = defaultServiceConfig.SystemCallFilter ++ [ "mbind" ];
211219 };
212220 environment = env;
213221 wantedBy = [ "multi-user.target" ];
@@ -234,6 +242,8 @@ in
234242 echo "$superuserState" > "$superuserStateFile"
235243 fi
236244 '';
245+ } // optionalAttrs (!hasCustomRedis) {
246+ after = [ "redis-paperless-ng.service" ];
237247 };
238248
239249 # Password copying can't be implemented as a privileged preStart script
@@ -248,6 +258,8 @@ in
248258 '${cfg.passwordFile}' '${cfg.dataDir}/superuser-password'
249259 '';
250260 Type = "oneshot";
261+ # Needs to talk to mail server for automated import rules
262+ PrivateNetwork = false;
251263 };
252264 };
253265
@@ -279,6 +291,8 @@ in
279291 CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
280292 # gunicorn needs setuid
281293 SystemCallFilter = defaultServiceConfig.SystemCallFilter ++ [ "@setuid" ];
294+ # Needs to serve web page
295+ PrivateNetwork = false;
282296 };
283297 environment = env // {
284298 PATH = mkForce cfg.package.path;
nixos/modules/services/misc/plex.nix+18−13
@@ -6,6 +6,10 @@ let
66 cfg = config.services.plex;
77in
88{
9+ imports = [
10+ (mkRemovedOptionModule [ "services" "plex" "managePlugins" ] "Please omit or define the option: `services.plex.extraPlugins' instead.")
11+ ];
12+
913 options = {
1014 services.plex = {
1115 enable = mkEnableOption "Plex Media Server";
@@ -42,16 +46,6 @@ in
4246 '';
4347 };
4448
45− managePlugins = mkOption {
46− type = types.bool;
47− default = true;
48− description = ''
49− If set to true, this option will cause all of the symlinks in Plex's
50− plugin directory to be removed and symlinks for paths specified in
51− <option>extraPlugins</option> to be added.
52− '';
53− };
54−
5549 extraPlugins = mkOption {
5650 type = types.listOf types.path;
5751 default = [];
@@ -59,9 +53,20 @@ in
5953 A list of paths to extra plugin bundles to install in Plex's plugin
6054 directory. Every time the systemd unit for Plex starts up, all of the
6155 symlinks in Plex's plugin directory will be cleared and this module
62− will symlink all of the paths specified here to that directory. If
63− this behavior is undesired, set <option>managePlugins</option> to
64− false.
56+ will symlink all of the paths specified here to that directory.
57+ '';
58+ example = literalExpression ''
59+ [
60+ (builtins.path {
61+ name = "Audnexus.bundle";
62+ path = pkgs.fetchFromGitHub {
63+ owner = "djdembeck";
64+ repo = "Audnexus.bundle";
65+ rev = "v0.2.8";
66+ sha256 = "sha256-IWOSz3vYL7zhdHan468xNc6C/eQ2C2BukQlaJNLXh7E=";
67+ };
68+ })
69+ ]
6570 '';
6671 };
6772
nixos/modules/services/misc/rmfakecloud.nixnew file+147
@@ -0,0 +1,147 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.rmfakecloud;
7+ serviceDataDir = "/var/lib/rmfakecloud";
8+
9+in {
10+ options = {
11+ services.rmfakecloud = {
12+ enable = mkEnableOption "rmfakecloud remarkable self-hosted cloud";
13+
14+ package = mkOption {
15+ type = types.package;
16+ default = pkgs.rmfakecloud;
17+ defaultText = literalExpression "pkgs.rmfakecloud";
18+ description = ''
19+ rmfakecloud package to use.
20+
21+ The default does not include the web user interface.
22+ '';
23+ };
24+
25+ storageUrl = mkOption {
26+ type = types.str;
27+ example = "https://local.appspot.com";
28+ description = ''
29+ URL used by the tablet to access the rmfakecloud service.
30+ '';
31+ };
32+
33+ port = mkOption {
34+ type = types.port;
35+ default = 3000;
36+ description = ''
37+ Listening port number.
38+ '';
39+ };
40+
41+ logLevel = mkOption {
42+ type = types.enum [ "info" "debug" "warn" "error" ];
43+ default = "info";
44+ description = ''
45+ Logging level.
46+ '';
47+ };
48+
49+ extraSettings = mkOption {
50+ type = with types; attrsOf str;
51+ default = { };
52+ example = { DATADIR = "/custom/path/for/rmfakecloud/data"; };
53+ description = ''
54+ Extra settings in the form of a set of key-value pairs.
55+ For tokens and secrets, use `environmentFile` instead.
56+
57+ Available settings are listed on
58+ https://ddvk.github.io/rmfakecloud/install/configuration/.
59+ '';
60+ };
61+
62+ environmentFile = mkOption {
63+ type = with types; nullOr path;
64+ default = null;
65+ example = "/etc/secrets/rmfakecloud.env";
66+ description = ''
67+ Path to an environment file loaded for the rmfakecloud service.
68+
69+ This can be used to securely store tokens and secrets outside of the
70+ world-readable Nix store. Since this file is read by systemd, it may
71+ have permission 0400 and be owned by root.
72+ '';
73+ };
74+ };
75+ };
76+
77+ config = mkIf cfg.enable {
78+ systemd.services.rmfakecloud = {
79+ description = "rmfakecloud remarkable self-hosted cloud";
80+
81+ environment = {
82+ STORAGE_URL = cfg.storageUrl;
83+ PORT = toString cfg.port;
84+ LOGLEVEL = cfg.logLevel;
85+ } // cfg.extraSettings;
86+
87+ preStart = ''
88+ # Generate the secret key used to sign client session tokens.
89+ # Replacing it invalidates the previously established sessions.
90+ if [ -z "$JWT_SECRET_KEY" ] && [ ! -f jwt_secret_key ]; then
91+ (umask 077; touch jwt_secret_key)
92+ cat /dev/urandom | tr -cd '[:alnum:]' | head -c 48 >> jwt_secret_key
93+ fi
94+ '';
95+
96+ script = ''
97+ if [ -z "$JWT_SECRET_KEY" ]; then
98+ export JWT_SECRET_KEY="$(cat jwt_secret_key)"
99+ fi
100+
101+ ${cfg.package}/bin/rmfakecloud
102+ '';
103+
104+ wantedBy = [ "multi-user.target" ];
105+ wants = [ "network-online.target" ];
106+ after = [ "network-online.target" ];
107+
108+ serviceConfig = {
109+ Type = "simple";
110+ Restart = "always";
111+
112+ EnvironmentFile =
113+ mkIf (cfg.environmentFile != null) cfg.environmentFile;
114+
115+ AmbientCapabilities =
116+ mkIf (cfg.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
117+
118+ DynamicUser = true;
119+ PrivateDevices = true;
120+ ProtectHome = true;
121+ ProtectKernelTunables = true;
122+ ProtectKernelModules = true;
123+ ProtectControlGroups = true;
124+ CapabilityBoundingSet = [ "" ];
125+ DevicePolicy = "closed";
126+ LockPersonality = true;
127+ MemoryDenyWriteExecute = true;
128+ ProtectClock = true;
129+ ProtectHostname = true;
130+ ProtectKernelLogs = true;
131+ ProtectProc = "invisible";
132+ ProcSubset = "pid";
133+ RemoveIPC = true;
134+ RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
135+ RestrictNamespaces = true;
136+ RestrictRealtime = true;
137+ RestrictSUIDSGID = true;
138+ SystemCallArchitectures = "native";
139+ WorkingDirectory = serviceDataDir;
140+ StateDirectory = baseNameOf serviceDataDir;
141+ UMask = 0027;
142+ };
143+ };
144+ };
145+
146+ meta.maintainers = with maintainers; [ pacien ];
147+}
nixos/modules/services/misc/sourcehut/git.nix+1−1
@@ -207,7 +207,7 @@ in
207207 fastcgi_param PATH_INFO $uri;
208208 fastcgi_param GIT_PROJECT_ROOT $document_root;
209209 fastcgi_read_timeout 500s;
210− include ${pkgs.nginx}/conf/fastcgi_params;
210+ include ${config.services.nginx.package}/conf/fastcgi_params;
211211 gzip off;
212212 }
213213 '';
nixos/modules/services/misc/taskserver/default.nix+6−5
@@ -106,7 +106,7 @@ let
106106
107107 certtool = "${pkgs.gnutls.bin}/bin/certtool";
108108
109− nixos-taskserver = pkgs.pythonPackages.buildPythonApplication {
109+ nixos-taskserver = with pkgs.python2.pkgs; buildPythonApplication {
110110 name = "nixos-taskserver";
111111
112112 src = pkgs.runCommand "nixos-taskserver-src" { preferLocalBuild = true; } ''
@@ -129,7 +129,7 @@ let
129129 EOF
130130 '';
131131
132− propagatedBuildInputs = [ pkgs.pythonPackages.click ];
132+ propagatedBuildInputs = [ click ];
133133 };
134134
135135in {
@@ -138,12 +138,13 @@ in {
138138 enable = mkOption {
139139 type = types.bool;
140140 default = false;
141− description = ''
141+ description = let
142+ url = "https://nixos.org/manual/nixos/stable/index.html#module-services-taskserver";
143+ in ''
142144 Whether to enable the Taskwarrior server.
143145
144146 More instructions about NixOS in conjuction with Taskserver can be
145− found in the NixOS manual at
146− <olink targetdoc="manual" targetptr="module-taskserver"/>.
147+ found <link xlink:href="${url}">in the NixOS manual</link>.
147148 '';
148149 };
149150
nixos/modules/services/misc/taskserver/doc.xml+1−1
@@ -1,7 +1,7 @@
11<chapter xmlns="http://docbook.org/ns/docbook"
22 xmlns:xlink="http://www.w3.org/1999/xlink"
33 version="5.0"
4− xml:id="module-taskserver">
4+ xml:id="module-services-taskserver">
55 <title>Taskserver</title>
66 <para>
77 Taskserver is the server component of
nixos/modules/services/misc/zoneminder.nix+2−2
@@ -254,7 +254,7 @@ in {
254254 location /cgi-bin {
255255 gzip off;
256256
257− include ${pkgs.nginx}/conf/fastcgi_params;
257+ include ${config.services.nginx.package}/conf/fastcgi_params;
258258 fastcgi_param SCRIPT_FILENAME ${pkg}/libexec/zoneminder/${zms};
259259 fastcgi_param HTTP_PROXY "";
260260 fastcgi_intercept_errors on;
@@ -270,7 +270,7 @@ in {
270270 try_files $uri =404;
271271 fastcgi_index index.php;
272272
273− include ${pkgs.nginx}/conf/fastcgi_params;
273+ include ${config.services.nginx.package}/conf/fastcgi_params;
274274 fastcgi_param SCRIPT_FILENAME $request_filename;
275275 fastcgi_param HTTP_PROXY "";
276276
nixos/modules/services/monitoring/prometheus/exporters.nix+2
@@ -29,6 +29,7 @@ let
2929 "blackbox"
3030 "buildkite-agent"
3131 "collectd"
32+ "dmarc"
3233 "dnsmasq"
3334 "domain"
3435 "dovecot"
@@ -55,6 +56,7 @@ let
5556 "postfix"
5657 "postgres"
5758 "process"
59+ "pve"
5860 "py-air-control"
5961 "redis"
6062 "rspamd"
nixos/modules/services/monitoring/prometheus/exporters/dmarc.nixnew file+117
@@ -0,0 +1,117 @@
1+{ config, lib, pkgs, options }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.prometheus.exporters.dmarc;
7+
8+ json = builtins.toJSON {
9+ inherit (cfg) folders port;
10+ listen_addr = cfg.listenAddress;
11+ storage_path = "$STATE_DIRECTORY";
12+ imap = (builtins.removeAttrs cfg.imap [ "passwordFile" ]) // { password = "$IMAP_PASSWORD"; use_ssl = true; };
13+ poll_interval_seconds = cfg.pollIntervalSeconds;
14+ deduplication_max_seconds = cfg.deduplicationMaxSeconds;
15+ logging = {
16+ version = 1;
17+ disable_existing_loggers = false;
18+ };
19+ };
20+in {
21+ port = 9797;
22+ extraOpts = {
23+ imap = {
24+ host = mkOption {
25+ type = types.str;
26+ default = "localhost";
27+ description = ''
28+ Hostname of IMAP server to connect to.
29+ '';
30+ };
31+ port = mkOption {
32+ type = types.port;
33+ default = 993;
34+ description = ''
35+ Port of the IMAP server to connect to.
36+ '';
37+ };
38+ username = mkOption {
39+ type = types.str;
40+ example = "postmaster@example.org";
41+ description = ''
42+ Login username for the IMAP connection.
43+ '';
44+ };
45+ passwordFile = mkOption {
46+ type = types.str;
47+ example = "/run/secrets/dovecot_pw";
48+ description = ''
49+ File containing the login password for the IMAP connection.
50+ '';
51+ };
52+ };
53+ folders = {
54+ inbox = mkOption {
55+ type = types.str;
56+ default = "INBOX";
57+ description = ''
58+ IMAP mailbox that is checked for incoming DMARC aggregate reports
59+ '';
60+ };
61+ done = mkOption {
62+ type = types.str;
63+ default = "Archive";
64+ description = ''
65+ IMAP mailbox that successfully processed reports are moved to.
66+ '';
67+ };
68+ error = mkOption {
69+ type = types.str;
70+ default = "Invalid";
71+ description = ''
72+ IMAP mailbox that emails are moved to that could not be processed.
73+ '';
74+ };
75+ };
76+ pollIntervalSeconds = mkOption {
77+ type = types.ints.unsigned;
78+ default = 60;
79+ description = ''
80+ How often to poll the IMAP server in seconds.
81+ '';
82+ };
83+ deduplicationMaxSeconds = mkOption {
84+ type = types.ints.unsigned;
85+ default = 604800;
86+ defaultText = "7 days (in seconds)";
87+ description = ''
88+ How long individual report IDs will be remembered to avoid
89+ counting double delivered reports twice.
90+ '';
91+ };
92+ debug = mkOption {
93+ type = types.bool;
94+ default = false;
95+ description = ''
96+ Whether to declare enable <literal>--debug</literal>.
97+ '';
98+ };
99+ };
100+ serviceOpts = {
101+ path = with pkgs; [ envsubst coreutils ];
102+ serviceConfig = {
103+ StateDirectory = "prometheus-dmarc-exporter";
104+ WorkingDirectory = "/var/lib/prometheus-dmarc-exporter";
105+ ExecStart = "${pkgs.writeShellScript "setup-cfg" ''
106+ export IMAP_PASSWORD="$(<${cfg.imap.passwordFile})"
107+ envsubst \
108+ -i ${pkgs.writeText "dmarc-exporter.json.template" json} \
109+ -o ''${STATE_DIRECTORY}/dmarc-exporter.json
110+
111+ exec ${pkgs.prometheus-dmarc-exporter}/bin/prometheus-dmarc-exporter \
112+ --configuration /var/lib/prometheus-dmarc-exporter/dmarc-exporter.json \
113+ ${optionalString cfg.debug "--debug"}
114+ ''}";
115+ };
116+ };
117+}
nixos/modules/services/monitoring/prometheus/exporters/pve.nixnew file+118
@@ -0,0 +1,118 @@
1+{ config, lib, pkgs, options }:
2+
3+with lib;
4+let
5+ cfg = config.services.prometheus.exporters.pve;
6+
7+ # pve exporter requires a config file so create an empty one if configFile is not provided
8+ emptyConfigFile = pkgs.writeTextFile {
9+ name = "pve.yml";
10+ text = "default:";
11+ };
12+
13+ computedConfigFile = "${if cfg.configFile == null then emptyConfigFile else cfg.configFile}";
14+in
15+{
16+ port = 9221;
17+ extraOpts = {
18+ package = mkOption {
19+ type = types.package;
20+ default = pkgs.prometheus-pve-exporter;
21+ defaultText = literalExpression "pkgs.prometheus-pve-exporter";
22+ example = literalExpression "pkgs.prometheus-pve-exporter";
23+ description = ''
24+ The package to use for prometheus-pve-exporter
25+ '';
26+ };
27+
28+ environmentFile = mkOption {
29+ type = with types; nullOr path;
30+ default = null;
31+ example = "/etc/prometheus-pve-exporter/pve.env";
32+ description = ''
33+ Path to the service's environment file. This path can either be a computed path in /nix/store or a path in the local filesystem.
34+
35+ The environment file should NOT be stored in /nix/store as it contains passwords and/or keys in plain text.
36+
37+ Environment reference: https://github.com/prometheus-pve/prometheus-pve-exporter#authentication
38+ '';
39+ };
40+
41+ configFile = mkOption {
42+ type = with types; nullOr path;
43+ default = null;
44+ example = "/etc/prometheus-pve-exporter/pve.yml";
45+ description = ''
46+ Path to the service's config file. This path can either be a computed path in /nix/store or a path in the local filesystem.
47+
48+ The config file should NOT be stored in /nix/store as it will contain passwords and/or keys in plain text.
49+
50+ If both configFile and environmentFile are provided, the configFile option will be ignored.
51+
52+ Configuration reference: https://github.com/prometheus-pve/prometheus-pve-exporter/#authentication
53+ '';
54+ };
55+
56+ collectors = {
57+ status = mkOption {
58+ type = types.bool;
59+ default = true;
60+ description = ''
61+ Collect Node/VM/CT status
62+ '';
63+ };
64+ version = mkOption {
65+ type = types.bool;
66+ default = true;
67+ description = ''
68+ Collect PVE version info
69+ '';
70+ };
71+ node = mkOption {
72+ type = types.bool;
73+ default = true;
74+ description = ''
75+ Collect PVE node info
76+ '';
77+ };
78+ cluster = mkOption {
79+ type = types.bool;
80+ default = true;
81+ description = ''
82+ Collect PVE cluster info
83+ '';
84+ };
85+ resources = mkOption {
86+ type = types.bool;
87+ default = true;
88+ description = ''
89+ Collect PVE resources info
90+ '';
91+ };
92+ config = mkOption {
93+ type = types.bool;
94+ default = true;
95+ description = ''
96+ Collect PVE onboot status
97+ '';
98+ };
99+ };
100+ };
101+ serviceOpts = {
102+ serviceConfig = {
103+ ExecStart = ''
104+ ${cfg.package}/bin/pve_exporter \
105+ --${if cfg.collectors.status == true then "" else "no-"}collector.status \
106+ --${if cfg.collectors.version == true then "" else "no-"}collector.version \
107+ --${if cfg.collectors.node == true then "" else "no-"}collector.node \
108+ --${if cfg.collectors.cluster == true then "" else "no-"}collector.cluster \
109+ --${if cfg.collectors.resources == true then "" else "no-"}collector.resources \
110+ --${if cfg.collectors.config == true then "" else "no-"}collector.config \
111+ ${computedConfigFile} \
112+ ${toString cfg.port} ${cfg.listenAddress}
113+ '';
114+ } // optionalAttrs (cfg.environmentFile != null) {
115+ EnvironmentFile = cfg.environmentFile;
116+ };
117+ };
118+}
nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix+13−2
@@ -25,7 +25,8 @@ in {
2525 [ "/dev/sda", "/dev/nvme0n1" ];
2626 '';
2727 description = ''
28− Paths to disks that will be monitored.
28+ Paths to the disks that will be monitored. Will autodiscover
29+ all disks if none given.
2930 '';
3031 };
3132 maxInterval = mkOption {
@@ -41,13 +42,23 @@ in {
4142 serviceOpts = {
4243 serviceConfig = {
4344 AmbientCapabilities = [
45+ "CAP_SYS_RAWIO"
4446 "CAP_SYS_ADMIN"
4547 ];
4648 CapabilityBoundingSet = [
49+ "CAP_SYS_RAWIO"
4750 "CAP_SYS_ADMIN"
4851 ];
4952 DevicePolicy = "closed";
50− DeviceAllow = lib.mkForce cfg.devices;
53+ DeviceAllow = lib.mkOverride 100 (
54+ if cfg.devices != [] then
55+ cfg.devices
56+ else [
57+ "block-blkext rw"
58+ "block-sd rw"
59+ "char-nvme rw"
60+ ]
61+ );
5162 ExecStart = ''
5263 ${pkgs.prometheus-smartctl-exporter}/bin/smartctl_exporter -config ${configFile}
5364 '';
nixos/modules/services/monitoring/prometheus/exporters/systemd.nix+1−1
@@ -11,7 +11,7 @@ in {
1111 serviceConfig = {
1212 ExecStart = ''
1313 ${pkgs.prometheus-systemd-exporter}/bin/systemd_exporter \
14− --web.listen-address ${cfg.listenAddress}:${toString cfg.port}
14+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} ${concatStringsSep " " cfg.extraFlags}
1515 '';
1616 RestrictAddressFamilies = [
1717 # Need AF_UNIX to collect data
nixos/modules/services/network-filesystems/ceph.nix+2−2
@@ -181,8 +181,8 @@ in
181181
182182 rgwMimeTypesFile = mkOption {
183183 type = with types; nullOr path;
184− default = "${pkgs.mime-types}/etc/mime.types";
185− defaultText = literalExpression ''"''${pkgs.mime-types}/etc/mime.types"'';
184+ default = "${pkgs.mailcap}/etc/mime.types";
185+ defaultText = literalExpression ''"''${pkgs.mailcap}/etc/mime.types"'';
186186 description = ''
187187 Path to mime types used by radosgw.
188188 '';
nixos/modules/services/network-filesystems/ipfs.nix+27−28
@@ -1,16 +1,17 @@
1−{ config, lib, pkgs, options, ... }:
1+{ config, lib, pkgs, options, utils, ... }:
22with lib;
33let
44 cfg = config.services.ipfs;
55 opt = options.services.ipfs;
66
7− ipfsFlags = toString ([
8− (optionalString cfg.autoMount "--mount")
9− (optionalString cfg.enableGC "--enable-gc")
10− (optionalString (cfg.serviceFdlimit != null) "--manage-fdlimit=false")
11− (optionalString (cfg.defaultMode == "offline") "--offline")
12− (optionalString (cfg.defaultMode == "norouting") "--routing=none")
13− ] ++ cfg.extraFlags);
7+ ipfsFlags = utils.escapeSystemdExecArgs (
8+ optional cfg.autoMount "--mount" ++
9+ optional cfg.enableGC "--enable-gc" ++
10+ optional (cfg.serviceFdlimit != null) "--manage-fdlimit=false" ++
11+ optional (cfg.defaultMode == "offline") "--offline" ++
12+ optional (cfg.defaultMode == "norouting") "--routing=none" ++
13+ cfg.extraFlags
14+ );
1415
1516 profile =
1617 if cfg.localDiscovery
@@ -239,7 +240,10 @@ in
239240 "d '${cfg.ipnsMountDir}' - ${cfg.user} ${cfg.group} - -"
240241 ];
241242
242− systemd.packages = [ cfg.package ];
243+ # The hardened systemd unit breaks the fuse-mount function according to documentation in the unit file itself
244+ systemd.packages = if cfg.autoMount
245+ then [ cfg.package.systemd_unit ]
246+ else [ cfg.package.systemd_unit_hardened ];
243247
244248 systemd.services.ipfs = {
245249 path = [ "/run/wrappers" cfg.package ];
@@ -259,29 +263,24 @@ in
259263 ipfs --offline config Mounts.IPFS ${cfg.ipfsMountDir}
260264 ipfs --offline config Mounts.IPNS ${cfg.ipnsMountDir}
261265 '' + optionalString cfg.autoMigrate ''
262− ${pkgs.ipfs-migrator}/bin/fs-repo-migrations -y
263− '' + concatStringsSep "\n" (collect
264− isString
265− (mapAttrsRecursive
266− (path: value:
267− # Using heredoc below so that the value is never improperly quoted
268− ''
269− read value <<EOF
270− ${builtins.toJSON value}
271− EOF
272− ipfs --offline config --json "${concatStringsSep "." path}" "$value"
273− '')
274− ({
275− Addresses.API = cfg.apiAddress;
276− Addresses.Gateway = cfg.gatewayAddress;
277− Addresses.Swarm = cfg.swarmAddress;
278− } //
279− cfg.extraConfig))
280− );
266+ ${pkgs.ipfs-migrator}/bin/fs-repo-migrations -to '${cfg.package.repoVersion}' -y
267+ '' + ''
268+ ipfs --offline config show \
269+ | ${pkgs.jq}/bin/jq '. * $extraConfig' --argjson extraConfig ${
270+ escapeShellArg (builtins.toJSON ({
271+ Addresses.API = cfg.apiAddress;
272+ Addresses.Gateway = cfg.gatewayAddress;
273+ Addresses.Swarm = cfg.swarmAddress;
274+ } // cfg.extraConfig))
275+ } \
276+ | ipfs --offline config replace -
277+ '';
281278 serviceConfig = {
282279 ExecStart = [ "" "${cfg.package}/bin/ipfs daemon ${ipfsFlags}" ];
283280 User = cfg.user;
284281 Group = cfg.group;
282+ StateDirectory = "";
283+ ReadWritePaths = [ "" cfg.dataDir ];
285284 } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; };
286285 } // optionalAttrs (!cfg.startWhenNeeded) {
287286 wantedBy = [ "default.target" ];
nixos/modules/services/network-filesystems/moosefs.nixnew file+249
@@ -0,0 +1,249 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.moosefs;
7+
8+ mfsUser = if cfg.runAsUser then "moosefs" else "root";
9+
10+ settingsFormat = let
11+ listSep = " ";
12+ allowedTypes = with types; [ bool int float str ];
13+ valueToString = val:
14+ if isList val then concatStringsSep listSep (map (x: valueToString x) val)
15+ else if isBool val then (if val then "1" else "0")
16+ else toString val;
17+
18+ in {
19+ type = with types; let
20+ valueType = oneOf ([
21+ (listOf valueType)
22+ ] ++ allowedTypes) // {
23+ description = "Flat key-value file";
24+ };
25+ in attrsOf valueType;
26+
27+ generate = name: value:
28+ pkgs.writeText name ( lib.concatStringsSep "\n" (
29+ lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value ));
30+ };
31+
32+
33+ initTool = pkgs.writeShellScriptBin "mfsmaster-init" ''
34+ if [ ! -e ${cfg.master.settings.DATA_PATH}/metadata.mfs ]; then
35+ cp ${pkgs.moosefs}/var/mfs/metadata.mfs.empty ${cfg.master.settings.DATA_PATH}
36+ chmod +w ${cfg.master.settings.DATA_PATH}/metadata.mfs.empty
37+ ${pkgs.moosefs}/bin/mfsmaster -a -c ${masterCfg} start
38+ ${pkgs.moosefs}/bin/mfsmaster -c ${masterCfg} stop
39+ rm ${cfg.master.settings.DATA_PATH}/metadata.mfs.empty
40+ fi
41+ '';
42+
43+ # master config file
44+ masterCfg = settingsFormat.generate
45+ "mfsmaster.cfg" cfg.master.settings;
46+
47+ # metalogger config file
48+ metaloggerCfg = settingsFormat.generate
49+ "mfsmetalogger.cfg" cfg.metalogger.settings;
50+
51+ # chunkserver config file
52+ chunkserverCfg = settingsFormat.generate
53+ "mfschunkserver.cfg" cfg.chunkserver.settings;
54+
55+ # generic template for all deamons
56+ systemdService = name: extraConfig: configFile: {
57+ wantedBy = [ "multi-user.target" ];
58+ wants = [ "network-online.target" ];
59+ after = [ "network.target" "network-online.target" ];
60+
61+ serviceConfig = {
62+ Type = "forking";
63+ ExecStart = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} start";
64+ ExecStop = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} stop";
65+ ExecReload = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} reload";
66+ PIDFile = "${cfg."${name}".settings.DATA_PATH}/.mfs${name}.lock";
67+ } // extraConfig;
68+ };
69+
70+in {
71+ ###### interface
72+
73+ options = {
74+ services.moosefs = {
75+ masterHost = mkOption {
76+ type = types.str;
77+ default = null;
78+ description = "IP or DNS name of master host.";
79+ };
80+
81+ runAsUser = mkOption {
82+ type = types.bool;
83+ default = true;
84+ example = true;
85+ description = "Run daemons as user moosefs instead of root.";
86+ };
87+
88+ client.enable = mkEnableOption "Moosefs client.";
89+
90+ master = {
91+ enable = mkOption {
92+ type = types.bool;
93+ description = ''
94+ Enable Moosefs master daemon.
95+
96+ You need to run <literal>mfsmaster-init</literal> on a freshly installed master server to
97+ initialize the <literal>DATA_PATH</literal> direcory.
98+ '';
99+ default = false;
100+ };
101+
102+ exports = mkOption {
103+ type = with types; listOf str;
104+ default = null;
105+ description = "Paths to export (see mfsexports.cfg).";
106+ example = [
107+ "* / rw,alldirs,admin,maproot=0:0"
108+ "* . rw"
109+ ];
110+ };
111+
112+ openFirewall = mkOption {
113+ type = types.bool;
114+ description = "Whether to automatically open the necessary ports in the firewall.";
115+ default = false;
116+ };
117+
118+ settings = mkOption {
119+ type = types.submodule {
120+ freeformType = settingsFormat.type;
121+
122+ options.DATA_PATH = mkOption {
123+ type = types.str;
124+ default = "/var/lib/mfs";
125+ description = "Data storage directory.";
126+ };
127+ };
128+
129+ description = "Contents of config file (mfsmaster.cfg).";
130+ };
131+ };
132+
133+ metalogger = {
134+ enable = mkEnableOption "Moosefs metalogger daemon.";
135+
136+ settings = mkOption {
137+ type = types.submodule {
138+ freeformType = settingsFormat.type;
139+
140+ options.DATA_PATH = mkOption {
141+ type = types.str;
142+ default = "/var/lib/mfs";
143+ description = "Data storage directory";
144+ };
145+ };
146+
147+ description = "Contents of metalogger config file (mfsmetalogger.cfg).";
148+ };
149+ };
150+
151+ chunkserver = {
152+ enable = mkEnableOption "Moosefs chunkserver daemon.";
153+
154+ openFirewall = mkOption {
155+ type = types.bool;
156+ description = "Whether to automatically open the necessary ports in the firewall.";
157+ default = false;
158+ };
159+
160+ hdds = mkOption {
161+ type = with types; listOf str;
162+ default = null;
163+ description = "Mount points to be used by chunkserver for storage (see mfshdd.cfg).";
164+ example = [ "/mnt/hdd1" ];
165+ };
166+
167+ settings = mkOption {
168+ type = types.submodule {
169+ freeformType = settingsFormat.type;
170+
171+ options.DATA_PATH = mkOption {
172+ type = types.str;
173+ default = "/var/lib/mfs";
174+ description = "Directory for lock file.";
175+ };
176+ };
177+
178+ description = "Contents of chunkserver config file (mfschunkserver.cfg).";
179+ };
180+ };
181+ };
182+ };
183+
184+ ###### implementation
185+
186+ config = mkIf ( cfg.client.enable || cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable ) {
187+
188+ warnings = [ ( mkIf (!cfg.runAsUser) "Running moosefs services as root is not recommended.") ];
189+
190+ # Service settings
191+ services.moosefs = {
192+ master.settings = mkIf cfg.master.enable {
193+ WORKING_USER = mfsUser;
194+ EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg"
195+ (concatStringsSep "\n" cfg.master.exports));
196+ };
197+
198+ metalogger.settings = mkIf cfg.metalogger.enable {
199+ WORKING_USER = mfsUser;
200+ MASTER_HOST = cfg.masterHost;
201+ };
202+
203+ chunkserver.settings = mkIf cfg.chunkserver.enable {
204+ WORKING_USER = mfsUser;
205+ MASTER_HOST = cfg.masterHost;
206+ HDD_CONF_FILENAME = toString ( pkgs.writeText "mfshdd.cfg"
207+ (concatStringsSep "\n" cfg.chunkserver.hdds));
208+ };
209+ };
210+
211+ # Create system user account for daemons
212+ users = mkIf ( cfg.runAsUser && ( cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable ) ) {
213+ users.moosefs = {
214+ isSystemUser = true;
215+ description = "moosefs daemon user";
216+ group = "moosefs";
217+ };
218+ groups.moosefs = {};
219+ };
220+
221+ environment.systemPackages =
222+ (lib.optional cfg.client.enable pkgs.moosefs) ++
223+ (lib.optional cfg.master.enable initTool);
224+
225+ networking.firewall.allowedTCPPorts =
226+ (lib.optionals cfg.master.openFirewall [ 9419 9420 9421 ]) ++
227+ (lib.optional cfg.chunkserver.openFirewall 9422);
228+
229+ # Ensure storage directories exist
230+ systemd.tmpfiles.rules =
231+ optional cfg.master.enable "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser}"
232+ ++ optional cfg.metalogger.enable "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser}"
233+ ++ optional cfg.chunkserver.enable "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser}";
234+
235+ # Service definitions
236+ systemd.services.mfs-master = mkIf cfg.master.enable
237+ ( systemdService "master" {
238+ TimeoutStartSec = 1800;
239+ TimeoutStopSec = 1800;
240+ Restart = "no";
241+ } masterCfg );
242+
243+ systemd.services.mfs-metalogger = mkIf cfg.metalogger.enable
244+ ( systemdService "metalogger" { Restart = "on-abnormal"; } metaloggerCfg );
245+
246+ systemd.services.mfs-chunkserver = mkIf cfg.chunkserver.enable
247+ ( systemdService "chunkserver" { Restart = "on-abnormal"; } chunkserverCfg );
248+ };
249+}
nixos/modules/services/network-filesystems/rsyncd.nix+1−1
@@ -79,7 +79,7 @@ in {
7979 in {
8080 services.rsync = {
8181 enable = !cfg.socketActivated;
82− aliases = [ "rsyncd" ];
82+ aliases = [ "rsyncd.service" ];
8383
8484 description = "fast remote file copy program daemon";
8585 after = [ "network.target" ];
nixos/modules/services/network-filesystems/samba.nix+1
@@ -224,6 +224,7 @@ in
224224 targets.samba = {
225225 description = "Samba Server";
226226 after = [ "network.target" ];
227+ wants = [ "network-online.target" ];
227228 wantedBy = [ "multi-user.target" ];
228229 };
229230 # Refer to https://github.com/samba-team/samba/tree/master/packaging/systemd
nixos/modules/services/networking/amuled.nix+1−1
@@ -76,7 +76,7 @@ in
7676
7777 script = ''
7878 ${pkgs.su}/bin/su -s ${pkgs.runtimeShell} ${user} \
79− -c 'HOME="${cfg.dataDir}" ${pkgs.amuleDaemon}/bin/amuled'
79+ -c 'HOME="${cfg.dataDir}" ${pkgs.amule-daemon}/bin/amuled'
8080 '';
8181 };
8282 };
nixos/modules/services/networking/bird.nix+91−75
@@ -3,85 +3,101 @@
33let
44 inherit (lib) mkEnableOption mkIf mkOption optionalString types;
55
6− generic = variant:
7− let
8− cfg = config.services.${variant};
9− pkg = pkgs.${variant};
10− birdBin = if variant == "bird6" then "bird6" else "bird";
11− birdc = if variant == "bird6" then "birdc6" else "birdc";
12− descr =
13− { bird = "1.6.x with IPv4 support";
14− bird6 = "1.6.x with IPv6 support";
15− bird2 = "2.x";
16− }.${variant};
17− in {
18− ###### interface
19− options = {
20− services.${variant} = {
21− enable = mkEnableOption "BIRD Internet Routing Daemon (${descr})";
22− config = mkOption {
23− type = types.lines;
24− description = ''
25− BIRD Internet Routing Daemon configuration file.
26− <link xlink:href='http://bird.network.cz/'/>
27− '';
28− };
29− checkConfig = mkOption {
30− type = types.bool;
31− default = true;
32− description = ''
33− Whether the config should be checked at build time.
34− Disabling this might become necessary if the config includes files not present during build time.
35− '';
36− };
37− };
6+ cfg = config.services.bird2;
7+ caps = [ "CAP_NET_ADMIN" "CAP_NET_BIND_SERVICE" "CAP_NET_RAW" ];
8+in
9+{
10+ ###### interface
11+ options = {
12+ services.bird2 = {
13+ enable = mkEnableOption "BIRD Internet Routing Daemon";
14+ config = mkOption {
15+ type = types.lines;
16+ description = ''
17+ BIRD Internet Routing Daemon configuration file.
18+ <link xlink:href='http://bird.network.cz/'/>
19+ '';
3820 };
21+ checkConfig = mkOption {
22+ type = types.bool;
23+ default = true;
24+ description = ''
25+ Whether the config should be checked at build time.
26+ When the config can't be checked during build time, for example when it includes
27+ other files, either disable this option or use <code>preCheckConfig</code> to create
28+ the included files before checking.
29+ '';
30+ };
31+ preCheckConfig = mkOption {
32+ type = types.lines;
33+ default = "";
34+ example = ''
35+ echo "cost 100;" > include.conf
36+ '';
37+ description = ''
38+ Commands to execute before the config file check. The file to be checked will be
39+ available as <code>bird2.conf</code> in the current directory.
3940
40− ###### implementation
41− config = mkIf cfg.enable {
42− environment.systemPackages = [ pkg ];
43−
44− environment.etc."bird/${variant}.conf".source = pkgs.writeTextFile {
45− name = "${variant}.conf";
46− text = cfg.config;
47− checkPhase = optionalString cfg.checkConfig ''
48− ${pkg}/bin/${birdBin} -d -p -c $out
49− '';
50− };
51−
52− systemd.services.${variant} = {
53− description = "BIRD Internet Routing Daemon (${descr})";
54− wantedBy = [ "multi-user.target" ];
55− reloadIfChanged = true;
56− restartTriggers = [ config.environment.etc."bird/${variant}.conf".source ];
57− serviceConfig = {
58− Type = "forking";
59− Restart = "on-failure";
60− ExecStart = "${pkg}/bin/${birdBin} -c /etc/bird/${variant}.conf -u ${variant} -g ${variant}";
61− ExecReload = "/bin/sh -c '${pkg}/bin/${birdBin} -c /etc/bird/${variant}.conf -p && ${pkg}/bin/${birdc} configure'";
62− ExecStop = "${pkg}/bin/${birdc} down";
63− CapabilityBoundingSet = [ "CAP_CHOWN" "CAP_FOWNER" "CAP_DAC_OVERRIDE" "CAP_SETUID" "CAP_SETGID"
64− # see bird/sysdep/linux/syspriv.h
65− "CAP_NET_BIND_SERVICE" "CAP_NET_BROADCAST" "CAP_NET_ADMIN" "CAP_NET_RAW" ];
66− ProtectSystem = "full";
67− ProtectHome = "yes";
68− SystemCallFilter="~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io";
69− MemoryDenyWriteExecute = "yes";
70− };
71− };
72− users = {
73− users.${variant} = {
74− description = "BIRD Internet Routing Daemon user";
75− group = variant;
76− isSystemUser = true;
77− };
78− groups.${variant} = {};
79− };
41+ Files created with this option will not be available at service runtime, only during
42+ build time checking.
43+ '';
8044 };
8145 };
46+ };
8247
83−in
8448
85−{
86− imports = map generic [ "bird" "bird6" "bird2" ];
49+ imports = [
50+ (lib.mkRemovedOptionModule [ "services" "bird" ] "Use services.bird2 instead")
51+ (lib.mkRemovedOptionModule [ "services" "bird6" ] "Use services.bird2 instead")
52+ ];
53+
54+ ###### implementation
55+ config = mkIf cfg.enable {
56+ environment.systemPackages = [ pkgs.bird ];
57+
58+ environment.etc."bird/bird2.conf".source = pkgs.writeTextFile {
59+ name = "bird2";
60+ text = cfg.config;
61+ checkPhase = optionalString cfg.checkConfig ''
62+ ln -s $out bird2.conf
63+ ${cfg.preCheckConfig}
64+ ${pkgs.bird}/bin/bird -d -p -c bird2.conf
65+ '';
66+ };
67+
68+ systemd.services.bird2 = {
69+ description = "BIRD Internet Routing Daemon";
70+ wantedBy = [ "multi-user.target" ];
71+ reloadIfChanged = true;
72+ restartTriggers = [ config.environment.etc."bird/bird2.conf".source ];
73+ serviceConfig = {
74+ Type = "forking";
75+ Restart = "on-failure";
76+ User = "bird2";
77+ Group = "bird2";
78+ ExecStart = "${pkgs.bird}/bin/bird -c /etc/bird/bird2.conf";
79+ ExecReload = "${pkgs.bird}/bin/birdc configure";
80+ ExecStop = "${pkgs.bird}/bin/birdc down";
81+ RuntimeDirectory = "bird";
82+ CapabilityBoundingSet = caps;
83+ AmbientCapabilities = caps;
84+ ProtectSystem = "full";
85+ ProtectHome = "yes";
86+ ProtectKernelTunables = true;
87+ ProtectControlGroups = true;
88+ PrivateTmp = true;
89+ PrivateDevices = true;
90+ SystemCallFilter = "~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io";
91+ MemoryDenyWriteExecute = "yes";
92+ };
93+ };
94+ users = {
95+ users.bird2 = {
96+ description = "BIRD Internet Routing Daemon user";
97+ group = "bird2";
98+ isSystemUser = true;
99+ };
100+ groups.bird2 = { };
101+ };
102+ };
87103}
nixos/modules/services/networking/blocky.nixnew file+40
@@ -0,0 +1,40 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.blocky;
7+
8+ format = pkgs.formats.yaml { };
9+ configFile = format.generate "config.yaml" cfg.settings;
10+in
11+{
12+ options.services.blocky = {
13+ enable = mkEnableOption "Fast and lightweight DNS proxy as ad-blocker for local network with many features";
14+
15+ settings = mkOption {
16+ type = format.type;
17+ default = { };
18+ description = ''
19+ Blocky configuration. Refer to
20+ <link xlink:href="https://0xerr0r.github.io/blocky/configuration/"/>
21+ for details on supported values.
22+ '';
23+ };
24+ };
25+
26+ config = mkIf cfg.enable {
27+ systemd.services.blocky = {
28+ description = "A DNS proxy and ad-blocker for the local network";
29+ wantedBy = [ "multi-user.target" ];
30+
31+ serviceConfig = {
32+ DynamicUser = true;
33+ ExecStart = "${pkgs.blocky}/bin/blocky --config ${configFile}";
34+
35+ AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
36+ CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
37+ };
38+ };
39+ };
40+}
nixos/modules/services/networking/connman.nix+2−2
@@ -127,7 +127,7 @@ in {
127127 description = "ConnMan VPN service";
128128 wantedBy = [ "multi-user.target" ];
129129 after = [ "syslog.target" ];
130− before = [ "connman" ];
130+ before = [ "connman.service" ];
131131 serviceConfig = {
132132 Type = "dbus";
133133 BusName = "net.connman.vpn";
@@ -140,7 +140,7 @@ in {
140140 description = "D-BUS Service";
141141 serviceConfig = {
142142 Name = "net.connman.vpn";
143− before = [ "connman" ];
143+ before = [ "connman.service" ];
144144 ExecStart = "${cfg.package}/sbin/connman-vpnd -n";
145145 User = "root";
146146 SystemdService = "connman-vpn.service";
nixos/modules/services/networking/dhcpcd.nix+14
@@ -183,6 +183,20 @@ in
183183
184184 config = mkIf enableDHCP {
185185
186+ assertions = [ {
187+ # dhcpcd doesn't start properly with malloc ∉ [ libc scudo ]
188+ # see https://github.com/NixOS/nixpkgs/issues/151696
189+ assertion =
190+ dhcpcd.enablePrivSep
191+ -> elem config.environment.memoryAllocator.provider [ "libc" "scudo" ];
192+ message = ''
193+ dhcpcd with privilege separation is incompatible with chosen system malloc.
194+ Currently only the `libc` and `scudo` allocators are known to work.
195+ To disable dhcpcd's privilege separation, overlay Nixpkgs and override dhcpcd
196+ to set `enablePrivSep = false`.
197+ '';
198+ } ];
199+
186200 systemd.services.dhcpcd = let
187201 cfgN = config.networking;
188202 hasDefaultGatewaySet = (cfgN.defaultGateway != null && cfgN.defaultGateway.address != "")
nixos/modules/services/networking/dhcpd.nix+45−50
@@ -28,38 +28,45 @@ let
2828 }
2929 '';
3030
31− dhcpdService = postfix: cfg: optionalAttrs cfg.enable {
32− "dhcpd${postfix}" = {
33− description = "DHCPv${postfix} server";
34− wantedBy = [ "multi-user.target" ];
35− after = [ "network.target" ];
36−
37− preStart = ''
38− mkdir -m 755 -p ${cfg.stateDir}
39− chown dhcpd:nogroup ${cfg.stateDir}
40− touch ${cfg.stateDir}/dhcpd.leases
41− '';
42−
43− serviceConfig =
44− let
45− configFile = if cfg.configFile != null then cfg.configFile else writeConfig cfg;
46− args = [ "@${pkgs.dhcp}/sbin/dhcpd" "dhcpd${postfix}" "-${postfix}"
47− "-pf" "/run/dhcpd${postfix}/dhcpd.pid"
48− "-cf" "${configFile}"
49− "-lf" "${cfg.stateDir}/dhcpd.leases"
50− "-user" "dhcpd" "-group" "nogroup"
51− ] ++ cfg.extraFlags
52− ++ cfg.interfaces;
53−
54− in {
55− ExecStart = concatMapStringsSep " " escapeShellArg args;
56− Type = "forking";
57− Restart = "always";
58− RuntimeDirectory = [ "dhcpd${postfix}" ];
59− PIDFile = "/run/dhcpd${postfix}/dhcpd.pid";
31+ dhcpdService = postfix: cfg:
32+ let
33+ configFile =
34+ if cfg.configFile != null
35+ then cfg.configFile
36+ else writeConfig cfg;
37+ leaseFile = "/var/lib/dhcpd${postfix}/dhcpd.leases";
38+ args = [
39+ "@${pkgs.dhcp}/sbin/dhcpd" "dhcpd${postfix}" "-${postfix}"
40+ "-pf" "/run/dhcpd${postfix}/dhcpd.pid"
41+ "-cf" configFile
42+ "-lf" leaseFile
43+ ] ++ cfg.extraFlags
44+ ++ cfg.interfaces;
45+ in
46+ optionalAttrs cfg.enable {
47+ "dhcpd${postfix}" = {
48+ description = "DHCPv${postfix} server";
49+ wantedBy = [ "multi-user.target" ];
50+ after = [ "network.target" ];
51+
52+ preStart = "touch ${leaseFile}";
53+ serviceConfig = {
54+ ExecStart = concatMapStringsSep " " escapeShellArg args;
55+ Type = "forking";
56+ Restart = "always";
57+ DynamicUser = true;
58+ User = "dhcpd";
59+ Group = "dhcpd";
60+ AmbientCapabilities = [
61+ "CAP_NET_RAW" # to send ICMP messages
62+ "CAP_NET_BIND_SERVICE" # to bind on DHCP port (67)
63+ ];
64+ StateDirectory = "dhcpd${postfix}";
65+ RuntimeDirectory = "dhcpd${postfix}";
66+ PIDFile = "/run/dhcpd${postfix}/dhcpd.pid";
67+ };
6068 };
61− };
62− };
69+ };
6370
6471 machineOpts = { ... }: {
6572
@@ -102,15 +109,6 @@ let
102109 '';
103110 };
104111
105− stateDir = mkOption {
106− type = types.path;
107− # We use /var/lib/dhcp for DHCPv4 to save backwards compatibility.
108− default = "/var/lib/dhcp${if postfix == "4" then "" else postfix}";
109− description = ''
110− State directory for the DHCP server.
111− '';
112− };
113−
114112 extraConfig = mkOption {
115113 type = types.lines;
116114 default = "";
@@ -194,7 +192,13 @@ in
194192
195193 imports = [
196194 (mkRenamedOptionModule [ "services" "dhcpd" ] [ "services" "dhcpd4" ])
197− ];
195+ ] ++ flip map [ "4" "6" ] (postfix:
196+ mkRemovedOptionModule [ "services" "dhcpd${postfix}" "stateDir" ] ''
197+ The DHCP server state directory is now managed with the systemd's DynamicUser mechanism.
198+ This means the directory is named after the service (dhcpd${postfix}), created under
199+ /var/lib/private/ and symlinked to /var/lib/.
200+ ''
201+ );
198202
199203 ###### interface
200204
@@ -210,15 +214,6 @@ in
210214
211215 config = mkIf (cfg4.enable || cfg6.enable) {
212216
213− users = {
214− users.dhcpd = {
215− isSystemUser = true;
216− group = "dhcpd";
217− description = "DHCP daemon user";
218− };
219− groups.dhcpd = {};
220− };
221−
222217 systemd.services = dhcpdService "4" cfg4 // dhcpdService "6" cfg6;
223218
224219 };
nixos/modules/services/networking/eternal-terminal.nix+1−1
@@ -90,6 +90,6 @@ in
9090 };
9191
9292 meta = {
93− maintainers = with lib.maintainers; [ pingiun ];
93+ maintainers = with lib.maintainers; [ ];
9494 };
9595}
nixos/modules/services/networking/firewall.nix+1−7
@@ -179,10 +179,6 @@ let
179179 ) cfg.allowedUDPPortRanges
180180 ) allInterfaces)}
181181
182− # Accept IPv4 multicast. Not a big security risk since
183− # probably nobody is listening anyway.
184− #iptables -A nixos-fw -d 224.0.0.0/4 -j nixos-fw-accept
185−
186182 # Optionally respond to ICMPv4 pings.
187183 ${optionalString cfg.allowPing ''
188184 iptables -w -A nixos-fw -p icmp --icmp-type echo-request ${optionalString (cfg.pingLimit != null)
@@ -326,7 +322,7 @@ in
326322 type = types.package;
327323 default = pkgs.iptables;
328324 defaultText = literalExpression "pkgs.iptables";
329− example = literalExpression "pkgs.iptables-nftables-compat";
325+ example = literalExpression "pkgs.iptables-legacy";
330326 description =
331327 ''
332328 The iptables package to use for running the firewall service."
@@ -437,8 +433,6 @@ in
437433 drop the packet if the source address is not reachable via any
438434 interface) or false. Defaults to the value of
439435 kernelHasRPFilter.
440−
441− (needs kernel 3.3+)
442436 '';
443437 };
444438
nixos/modules/services/networking/gogoclient.nixdeleted−87
@@ -1,87 +0,0 @@
1−{ config, lib, pkgs, ... }:
2−
3−with lib;
4−
5−let cfg = config.services.gogoclient;
6−in
7−
8−{
9−
10− ###### interface
11−
12− options = {
13− services.gogoclient = {
14− enable = mkOption {
15− default = false;
16− type = types.bool;
17− description = ''
18− Enable the gogoCLIENT IPv6 tunnel.
19− '';
20− };
21− autorun = mkOption {
22− type = types.bool;
23− default = true;
24− description = ''
25− Whether to automatically start the tunnel.
26− '';
27− };
28−
29− username = mkOption {
30− default = "";
31− type = types.str;
32− description = ''
33− Your Gateway6 login name, if any.
34− '';
35− };
36−
37− password = mkOption {
38− default = "";
39− type = types.str;
40− description = ''
41− Path to a file (as a string), containing your gogoNET password, if any.
42− '';
43− };
44−
45− server = mkOption {
46− type = types.str;
47− default = "anonymous.freenet6.net";
48− example = "broker.freenet6.net";
49− description = "The Gateway6 server to be used.";
50− };
51− };
52− };
53−
54− ###### implementation
55−
56− config = mkIf cfg.enable {
57− boot.kernelModules = [ "tun" ];
58−
59− networking.enableIPv6 = true;
60−
61− systemd.services.gogoclient = {
62− description = "ipv6 tunnel";
63−
64− after = [ "network.target" ];
65− requires = [ "network.target" ];
66−
67− unitConfig.RequiresMountsFor = "/var/lib/gogoc";
68−
69− script = let authMethod = if cfg.password == "" then "anonymous" else "any"; in ''
70− mkdir -p -m 700 /var/lib/gogoc
71− cat ${pkgs.gogoclient}/share/${pkgs.gogoclient.name}/gogoc.conf.sample | \
72− ${pkgs.gnused}/bin/sed \
73− -e "s|^userid=|&${cfg.username}|" \
74− -e "s|^passwd=|&${optionalString (cfg.password != "") "$(cat ${cfg.password})"}|" \
75− -e "s|^server=.*|server=${cfg.server}|" \
76− -e "s|^auth_method=.*|auth_method=${authMethod}|" \
77− -e "s|^#log_file=|log_file=1|" > /var/lib/gogoc/gogoc.conf
78− cd /var/lib/gogoc
79− exec ${pkgs.gogoclient}/bin/gogoc -y -f /var/lib/gogoc/gogoc.conf
80− '';
81− } // optionalAttrs cfg.autorun {
82− wantedBy = [ "multi-user.target" ];
83− };
84−
85− };
86−
87−}
nixos/modules/services/networking/headscale.nixnew file+490
@@ -0,0 +1,490 @@
1+{ config, lib, pkgs, ... }:
2+with lib;
3+let
4+ cfg = config.services.headscale;
5+
6+ dataDir = "/var/lib/headscale";
7+ runDir = "/run/headscale";
8+
9+ settingsFormat = pkgs.formats.yaml { };
10+ configFile = settingsFormat.generate "headscale.yaml" cfg.settings;
11+in
12+{
13+ options = {
14+ services.headscale = {
15+ enable = mkEnableOption "headscale, Open Source coordination server for Tailscale";
16+
17+ package = mkOption {
18+ type = types.package;
19+ default = pkgs.headscale;
20+ defaultText = literalExpression "pkgs.headscale";
21+ description = ''
22+ Which headscale package to use for the running server.
23+ '';
24+ };
25+
26+ user = mkOption {
27+ default = "headscale";
28+ type = types.str;
29+ description = ''
30+ User account under which headscale runs.
31+ <note><para>
32+ If left as the default value this user will automatically be created
33+ on system activation, otherwise you are responsible for
34+ ensuring the user exists before the headscale service starts.
35+ </para></note>
36+ '';
37+ };
38+
39+ group = mkOption {
40+ default = "headscale";
41+ type = types.str;
42+ description = ''
43+ Group under which headscale runs.
44+ <note><para>
45+ If left as the default value this group will automatically be created
46+ on system activation, otherwise you are responsible for
47+ ensuring the user exists before the headscale service starts.
48+ </para></note>
49+ '';
50+ };
51+
52+ serverUrl = mkOption {
53+ type = types.str;
54+ default = "http://127.0.0.1:8080";
55+ description = ''
56+ The url clients will connect to.
57+ '';
58+ example = "https://myheadscale.example.com:443";
59+ };
60+
61+ address = mkOption {
62+ type = types.str;
63+ default = "127.0.0.1";
64+ description = ''
65+ Listening address of headscale.
66+ '';
67+ example = "0.0.0.0";
68+ };
69+
70+ port = mkOption {
71+ type = types.port;
72+ default = 8080;
73+ description = ''
74+ Listening port of headscale.
75+ '';
76+ example = 443;
77+ };
78+
79+ privateKeyFile = mkOption {
80+ type = types.path;
81+ default = "${dataDir}/private.key";
82+ description = ''
83+ Path to private key file, generated automatically if it does not exist.
84+ '';
85+ };
86+
87+ derp = {
88+ urls = mkOption {
89+ type = types.listOf types.str;
90+ default = [ "https://controlplane.tailscale.com/derpmap/default" ];
91+ description = ''
92+ List of urls containing DERP maps.
93+ See <link xlink:href="https://tailscale.com/blog/how-tailscale-works/">How Tailscale works</link> for more information on DERP maps.
94+ '';
95+ };
96+
97+ paths = mkOption {
98+ type = types.listOf types.path;
99+ default = [ ];
100+ description = ''
101+ List of file paths containing DERP maps.
102+ See <link xlink:href="https://tailscale.com/blog/how-tailscale-works/">How Tailscale works</link> for more information on DERP maps.
103+ '';
104+ };
105+
106+
107+ autoUpdate = mkOption {
108+ type = types.bool;
109+ default = true;
110+ description = ''
111+ Whether to automatically update DERP maps on a set frequency.
112+ '';
113+ example = false;
114+ };
115+
116+ updateFrequency = mkOption {
117+ type = types.str;
118+ default = "24h";
119+ description = ''
120+ Frequency to update DERP maps.
121+ '';
122+ example = "5m";
123+ };
124+
125+ };
126+
127+ ephemeralNodeInactivityTimeout = mkOption {
128+ type = types.str;
129+ default = "30m";
130+ description = ''
131+ Time before an inactive ephemeral node is deleted.
132+ '';
133+ example = "5m";
134+ };
135+
136+ database = {
137+ type = mkOption {
138+ type = types.enum [ "sqlite3" "postgres" ];
139+ example = "postgres";
140+ default = "sqlite3";
141+ description = "Database engine to use.";
142+ };
143+
144+ host = mkOption {
145+ type = types.nullOr types.str;
146+ default = null;
147+ example = "127.0.0.1";
148+ description = "Database host address.";
149+ };
150+
151+ port = mkOption {
152+ type = types.nullOr types.port;
153+ default = null;
154+ example = 3306;
155+ description = "Database host port.";
156+ };
157+
158+ name = mkOption {
159+ type = types.nullOr types.str;
160+ default = null;
161+ example = "headscale";
162+ description = "Database name.";
163+ };
164+
165+ user = mkOption {
166+ type = types.nullOr types.str;
167+ default = null;
168+ example = "headscale";
169+ description = "Database user.";
170+ };
171+
172+ passwordFile = mkOption {
173+ type = types.nullOr types.path;
174+ default = null;
175+ example = "/run/keys/headscale-dbpassword";
176+ description = ''
177+ A file containing the password corresponding to
178+ <option>database.user</option>.
179+ '';
180+ };
181+
182+ path = mkOption {
183+ type = types.nullOr types.str;
184+ default = "${dataDir}/db.sqlite";
185+ description = "Path to the sqlite3 database file.";
186+ };
187+ };
188+
189+ logLevel = mkOption {
190+ type = types.str;
191+ default = "info";
192+ description = ''
193+ headscale log level.
194+ '';
195+ example = "debug";
196+ };
197+
198+ dns = {
199+ nameservers = mkOption {
200+ type = types.listOf types.str;
201+ default = [ "1.1.1.1" ];
202+ description = ''
203+ List of nameservers to pass to Tailscale clients.
204+ '';
205+ };
206+
207+ domains = mkOption {
208+ type = types.listOf types.str;
209+ default = [ ];
210+ description = ''
211+ Search domains to inject to Tailscale clients.
212+ '';
213+ example = [ "mydomain.internal" ];
214+ };
215+
216+ magicDns = mkOption {
217+ type = types.bool;
218+ default = true;
219+ description = ''
220+ Whether to use [MagicDNS](https://tailscale.com/kb/1081/magicdns/).
221+ Only works if there is at least a nameserver defined.
222+ '';
223+ example = false;
224+ };
225+
226+ baseDomain = mkOption {
227+ type = types.str;
228+ default = "";
229+ description = ''
230+ Defines the base domain to create the hostnames for MagicDNS.
231+ <option>baseDomain</option> must be a FQDNs, without the trailing dot.
232+ The FQDN of the hosts will be
233+ <literal>hostname.namespace.base_domain</literal> (e.g.
234+ <literal>myhost.mynamespace.example.com</literal>).
235+ '';
236+ };
237+ };
238+
239+ openIdConnect = {
240+ issuer = mkOption {
241+ type = types.str;
242+ default = "";
243+ description = ''
244+ URL to OpenID issuer.
245+ '';
246+ example = "https://openid.example.com";
247+ };
248+
249+ clientId = mkOption {
250+ type = types.str;
251+ default = "";
252+ description = ''
253+ OpenID Connect client ID.
254+ '';
255+ };
256+
257+ clientSecretFile = mkOption {
258+ type = types.nullOr types.path;
259+ default = null;
260+ description = ''
261+ Path to OpenID Connect client secret file.
262+ '';
263+ };
264+
265+ domainMap = mkOption {
266+ type = types.attrsOf types.str;
267+ default = { };
268+ description = ''
269+ Domain map is used to map incomming users (by their email) to
270+ a namespace. The key can be a string, or regex.
271+ '';
272+ example = {
273+ ".*" = "default-namespace";
274+ };
275+ };
276+
277+ };
278+
279+ tls = {
280+ letsencrypt = {
281+ hostname = mkOption {
282+ type = types.nullOr types.str;
283+ default = "";
284+ description = ''
285+ Domain name to request a TLS certificate for.
286+ '';
287+ };
288+ challengeType = mkOption {
289+ type = types.enum [ "TLS_ALPN-01" "HTTP-01" ];
290+ default = "HTTP-01";
291+ description = ''
292+ Type of ACME challenge to use, currently supported types:
293+ <literal>HTTP-01</literal> or <literal>TLS_ALPN-01</literal>.
294+ '';
295+ };
296+ httpListen = mkOption {
297+ type = types.nullOr types.str;
298+ default = ":http";
299+ description = ''
300+ When HTTP-01 challenge is chosen, letsencrypt must set up a
301+ verification endpoint, and it will be listening on:
302+ <literal>:http = port 80</literal>.
303+ '';
304+ };
305+ };
306+
307+ certFile = mkOption {
308+ type = types.nullOr types.path;
309+ default = null;
310+ description = ''
311+ Path to already created certificate.
312+ '';
313+ };
314+ keyFile = mkOption {
315+ type = types.nullOr types.path;
316+ default = null;
317+ description = ''
318+ Path to key for already created certificate.
319+ '';
320+ };
321+ };
322+
323+ aclPolicyFile = mkOption {
324+ type = types.nullOr types.path;
325+ default = null;
326+ description = ''
327+ Path to a file containg ACL policies.
328+ '';
329+ };
330+
331+ settings = mkOption {
332+ type = settingsFormat.type;
333+ default = { };
334+ description = ''
335+ Overrides to <filename>config.yaml</filename> as a Nix attribute set.
336+ This option is ideal for overriding settings not exposed as Nix options.
337+ Check the <link xlink:href="https://github.com/juanfont/headscale/blob/main/config-example.yaml">example config</link>
338+ for possible options.
339+ '';
340+ };
341+
342+
343+ };
344+
345+ };
346+ config = mkIf cfg.enable {
347+
348+ services.headscale.settings = {
349+ server_url = mkDefault cfg.serverUrl;
350+ listen_addr = mkDefault "${cfg.address}:${toString cfg.port}";
351+
352+ private_key_path = mkDefault cfg.privateKeyFile;
353+
354+ derp = {
355+ urls = mkDefault cfg.derp.urls;
356+ paths = mkDefault cfg.derp.paths;
357+ auto_update_enable = mkDefault cfg.derp.autoUpdate;
358+ update_frequency = mkDefault cfg.derp.updateFrequency;
359+ };
360+
361+ # Turn off update checks since the origin of our package
362+ # is nixpkgs and not Github.
363+ disable_check_updates = true;
364+
365+ ephemeral_node_inactivity_timeout = mkDefault cfg.ephemeralNodeInactivityTimeout;
366+
367+ db_type = mkDefault cfg.database.type;
368+ db_path = mkDefault cfg.database.path;
369+
370+ log_level = mkDefault cfg.logLevel;
371+
372+ dns_config = {
373+ nameservers = mkDefault cfg.dns.nameservers;
374+ domains = mkDefault cfg.dns.domains;
375+ magic_dns = mkDefault cfg.dns.magicDns;
376+ base_domain = mkDefault cfg.dns.baseDomain;
377+ };
378+
379+ unix_socket = "${runDir}/headscale.sock";
380+
381+ # OpenID Connect
382+ oidc = {
383+ issuer = mkDefault cfg.openIdConnect.issuer;
384+ client_id = mkDefault cfg.openIdConnect.clientId;
385+ domain_map = mkDefault cfg.openIdConnect.domainMap;
386+ };
387+
388+ tls_letsencrypt_cache_dir = "${dataDir}/.cache";
389+
390+ } // optionalAttrs (cfg.database.host != null) {
391+ db_host = mkDefault cfg.database.host;
392+ } // optionalAttrs (cfg.database.port != null) {
393+ db_port = mkDefault cfg.database.port;
394+ } // optionalAttrs (cfg.database.name != null) {
395+ db_name = mkDefault cfg.database.name;
396+ } // optionalAttrs (cfg.database.user != null) {
397+ db_user = mkDefault cfg.database.user;
398+ } // optionalAttrs (cfg.tls.letsencrypt.hostname != null) {
399+ tls_letsencrypt_hostname = mkDefault cfg.tls.letsencrypt.hostname;
400+ } // optionalAttrs (cfg.tls.letsencrypt.challengeType != null) {
401+ tls_letsencrypt_challenge_type = mkDefault cfg.tls.letsencrypt.challengeType;
402+ } // optionalAttrs (cfg.tls.letsencrypt.httpListen != null) {
403+ tls_letsencrypt_listen = mkDefault cfg.tls.letsencrypt.httpListen;
404+ } // optionalAttrs (cfg.tls.certFile != null) {
405+ tls_cert_path = mkDefault cfg.tls.certFile;
406+ } // optionalAttrs (cfg.tls.keyFile != null) {
407+ tls_key_path = mkDefault cfg.tls.keyFile;
408+ } // optionalAttrs (cfg.aclPolicyFile != null) {
409+ acl_policy_path = mkDefault cfg.aclPolicyFile;
410+ };
411+
412+ # Setup the headscale configuration in a known path in /etc to
413+ # allow both the Server and the Client use it to find the socket
414+ # for communication.
415+ environment.etc."headscale/config.yaml".source = configFile;
416+
417+ users.groups.headscale = mkIf (cfg.group == "headscale") { };
418+
419+ users.users.headscale = mkIf (cfg.user == "headscale") {
420+ description = "headscale user";
421+ home = dataDir;
422+ group = cfg.group;
423+ isSystemUser = true;
424+ };
425+
426+ systemd.services.headscale = {
427+ description = "headscale coordination server for Tailscale";
428+ after = [ "network-online.target" ];
429+ wantedBy = [ "multi-user.target" ];
430+ restartTriggers = [ configFile ];
431+
432+ script = ''
433+ ${optionalString (cfg.database.passwordFile != null) ''
434+ export HEADSCALE_DB_PASS="$(head -n1 ${escapeShellArg cfg.database.passwordFile})"
435+ ''}
436+
437+ export HEADSCALE_OIDC_CLIENT_SECRET="$(head -n1 ${escapeShellArg cfg.openIdConnect.clientSecretFile})"
438+ exec ${cfg.package}/bin/headscale serve
439+ '';
440+
441+ serviceConfig =
442+ let
443+ capabilityBoundingSet = [ "CAP_CHOWN" ] ++ optional (cfg.port < 1024) "CAP_NET_BIND_SERVICE";
444+ in
445+ {
446+ Restart = "always";
447+ Type = "simple";
448+ User = cfg.user;
449+ Group = cfg.group;
450+
451+ # Hardening options
452+ RuntimeDirectory = "headscale";
453+ # Allow headscale group access so users can be added and use the CLI.
454+ RuntimeDirectoryMode = "0750";
455+
456+ StateDirectory = "headscale";
457+ StateDirectoryMode = "0750";
458+
459+ ProtectSystem = "strict";
460+ ProtectHome = true;
461+ PrivateTmp = true;
462+ PrivateDevices = true;
463+ ProtectKernelTunables = true;
464+ ProtectControlGroups = true;
465+ RestrictSUIDSGID = true;
466+ PrivateMounts = true;
467+ ProtectKernelModules = true;
468+ ProtectKernelLogs = true;
469+ ProtectHostname = true;
470+ ProtectClock = true;
471+ ProtectProc = "invisible";
472+ ProcSubset = "pid";
473+ RestrictNamespaces = true;
474+ RemoveIPC = true;
475+ UMask = "0077";
476+
477+ CapabilityBoundingSet = capabilityBoundingSet;
478+ AmbientCapabilities = capabilityBoundingSet;
479+ NoNewPrivileges = true;
480+ LockPersonality = true;
481+ RestrictRealtime = true;
482+ SystemCallFilter = [ "@system-service" "~@priviledged" "@chown" ];
483+ SystemCallArchitectures = "native";
484+ RestrictAddressFamilies = "AF_INET AF_INET6 AF_UNIX";
485+ };
486+ };
487+ };
488+
489+ meta.maintainers = with maintainers; [ kradalby ];
490+}
nixos/modules/services/networking/https-dns-proxy.nixnew file+128
@@ -0,0 +1,128 @@
1+{ config, lib, pkgs, ... }:
2+
3+let
4+ inherit (lib)
5+ concatStringsSep
6+ mkEnableOption mkIf mkOption types;
7+
8+ cfg = config.services.https-dns-proxy;
9+
10+ providers = {
11+ cloudflare = {
12+ ips = [ "1.1.1.1" "1.0.0.1" ];
13+ url = "https://cloudflare-dns.com/dns-query";
14+ };
15+ google = {
16+ ips = [ "8.8.8.8" "8.8.4.4" ];
17+ url = "https://dns.google/dns-query";
18+ };
19+ quad9 = {
20+ ips = [ "9.9.9.9" "149.112.112.112" ];
21+ url = "https://dns.quad9.net/dns-query";
22+ };
23+ };
24+
25+ defaultProvider = "quad9";
26+
27+ providerCfg =
28+ let
29+ isCustom = cfg.provider.kind == "custom";
30+ in
31+ lib.concatStringsSep " " [
32+ "-b"
33+ (concatStringsSep "," (if isCustom then cfg.provider.ips else providers."${cfg.provider.kind}".ips))
34+ "-r"
35+ (if isCustom then cfg.provider.url else providers."${cfg.provider.kind}".url)
36+ ];
37+
38+in
39+{
40+ meta.maintainers = with lib.maintainers; [ peterhoeg ];
41+
42+ ###### interface
43+
44+ options.services.https-dns-proxy = {
45+ enable = mkEnableOption "https-dns-proxy daemon";
46+
47+ address = mkOption {
48+ description = "The address on which to listen";
49+ type = types.str;
50+ default = "127.0.0.1";
51+ };
52+
53+ port = mkOption {
54+ description = "The port on which to listen";
55+ type = types.port;
56+ default = 5053;
57+ };
58+
59+ provider = {
60+ kind = mkOption {
61+ description = ''
62+ The upstream provider to use or custom in case you do not trust any of
63+ the predefined providers or just want to use your own.
64+
65+ The default is ${defaultProvider} and there are privacy and security trade-offs
66+ when using any upstream provider. Please consider that before using any
67+ of them.
68+
69+ If you pick a custom provider, you will need to provide the bootstrap
70+ IP addresses as well as the resolver https URL.
71+ '';
72+ type = types.enum ((builtins.attrNames providers) ++ [ "custom" ]);
73+ default = defaultProvider;
74+ };
75+
76+ ips = mkOption {
77+ description = "The custom provider IPs";
78+ type = types.listOf types.str;
79+ };
80+
81+ url = mkOption {
82+ description = "The custom provider URL";
83+ type = types.str;
84+ };
85+ };
86+
87+ preferIPv4 = mkOption {
88+ description = ''
89+ https_dns_proxy will by default use IPv6 and fail if it is not available.
90+ To play it safe, we choose IPv4.
91+ '';
92+ type = types.bool;
93+ default = true;
94+ };
95+
96+ extraArgs = mkOption {
97+ description = "Additional arguments to pass to the process.";
98+ type = types.listOf types.str;
99+ default = [ "-v" ];
100+ };
101+ };
102+
103+ ###### implementation
104+
105+ config = lib.mkIf cfg.enable {
106+ systemd.services.https-dns-proxy = {
107+ description = "DNS to DNS over HTTPS (DoH) proxy";
108+ after = [ "network.target" ];
109+ wantedBy = [ "multi-user.target" ];
110+ serviceConfig = rec {
111+ Type = "exec";
112+ DynamicUser = true;
113+ ExecStart = lib.concatStringsSep " " (
114+ [
115+ "${pkgs.https-dns-proxy}/bin/https_dns_proxy"
116+ "-a ${toString cfg.address}"
117+ "-p ${toString cfg.port}"
118+ "-l -"
119+ providerCfg
120+ ]
121+ ++ lib.optional cfg.preferIPv4 "-4"
122+ ++ cfg.extraArgs
123+ );
124+ Restart = "on-failure";
125+ };
126+ };
127+ };
128+}
nixos/modules/services/networking/hylafax/options.nix+7−9
@@ -3,7 +3,7 @@
33let
44
55 inherit (lib.options) literalExpression mkEnableOption mkOption;
6− inherit (lib.types) bool enum ints lines attrsOf nullOr path str submodule;
6+ inherit (lib.types) bool enum ints lines attrsOf nonEmptyStr nullOr path str submodule;
77 inherit (lib.modules) mkDefault mkIf mkMerge;
88
99 commonDescr = ''
@@ -17,8 +17,6 @@ let
1717 configuration to yield an operational system.
1818 '';
1919
20− str1 = lib.types.addCheck str (s: s!=""); # non-empty string
21−
2220 configAttrType =
2321 # Options in HylaFAX configuration files can be
2422 # booleans, strings, integers, or list thereof
@@ -37,7 +35,7 @@ let
3735 modemConfigOptions = { name, config, ... }: {
3836 options = {
3937 name = mkOption {
40− type = str1;
38+ type = nonEmptyStr;
4139 example = "ttyS1";
4240 description = ''
4341 Name of modem device,
@@ -45,7 +43,7 @@ let
4543 '';
4644 };
4745 type = mkOption {
48− type = str1;
46+ type = nonEmptyStr;
4947 example = "cirrus";
5048 description = ''
5149 Name of modem configuration file,
@@ -135,14 +133,14 @@ in
135133 };
136134
137135 countryCode = mkOption {
138− type = nullOr str1;
136+ type = nullOr nonEmptyStr;
139137 default = null;
140138 example = "49";
141139 description = "Country code for server and all modems.";
142140 };
143141
144142 areaCode = mkOption {
145− type = nullOr str1;
143+ type = nullOr nonEmptyStr;
146144 default = null;
147145 example = "30";
148146 description = "Area code for server and all modems.";
@@ -279,7 +277,7 @@ in
279277 each time the spooling area is initialized.
280278 '';
281279 faxcron.enable.frequency = mkOption {
282− type = nullOr str1;
280+ type = nullOr nonEmptyStr;
283281 default = null;
284282 example = "daily";
285283 description = ''
@@ -319,7 +317,7 @@ in
319317 each time the spooling area is initialized.
320318 '';
321319 faxqclean.enable.frequency = mkOption {
322− type = nullOr str1;
320+ type = nullOr nonEmptyStr;
323321 default = null;
324322 example = "daily";
325323 description = ''
nixos/modules/services/networking/i2pd.nix+7−9
@@ -222,14 +222,12 @@ let
222222 in concatStringsSep "\n" inTunOpts))];
223223 in pkgs.writeText "i2pd-tunnels.conf" opts;
224224
225− i2pdSh = pkgs.writeScriptBin "i2pd" ''
226− #!/bin/sh
227− exec ${cfg.package}/bin/i2pd \
228− ${if cfg.address == null then "" else "--host="+cfg.address} \
229− --service \
230− --conf=${i2pdConf} \
231− --tunconf=${tunnelConf}
232− '';
225+ i2pdFlags = concatStringsSep " " (
226+ optional (cfg.address != null) ("--host=" + cfg.address) ++ [
227+ "--service"
228+ ("--conf=" + i2pdConf)
229+ ("--tunconf=" + tunnelConf)
230+ ]);
233231
234232in
235233
@@ -686,7 +684,7 @@ in
686684 User = "i2pd";
687685 WorkingDirectory = homeDir;
688686 Restart = "on-abort";
689− ExecStart = "${i2pdSh}/bin/i2pd";
687+ ExecStart = "${cfg.package}/bin/i2pd ${i2pdFlags}";
690688 };
691689 };
692690 };
nixos/modules/services/networking/iwd.nix+15−6
@@ -1,12 +1,21 @@
11{ config, lib, pkgs, ... }:
22
3−with lib;
4−
53let
4+ inherit (lib)
5+ mkEnableOption mkIf mkOption types
6+ recursiveUpdate;
7+
68 cfg = config.networking.wireless.iwd;
79 ini = pkgs.formats.ini { };
8− configFile = ini.generate "main.conf" cfg.settings;
9−in {
10+ defaults = {
11+ # without UseDefaultInterface, sometimes wlan0 simply goes AWOL with NetworkManager
12+ # https://iwd.wiki.kernel.org/interface_lifecycle#interface_management_in_iwd
13+ General.UseDefaultInterface = with config.networking.networkmanager; (enable && (wifi.backend == "iwd"));
14+ };
15+ configFile = ini.generate "main.conf" (recursiveUpdate defaults cfg.settings);
16+
17+in
18+{
1019 options.networking.wireless.iwd = {
1120 enable = mkEnableOption "iwd";
1221
@@ -38,10 +47,10 @@ in {
3847 '';
3948 }];
4049
41− environment.etc."iwd/main.conf".source = configFile;
50+ environment.etc."iwd/${configFile.name}".source = configFile;
4251
4352 # for iwctl
44− environment.systemPackages = [ pkgs.iwd ];
53+ environment.systemPackages = [ pkgs.iwd ];
4554
4655 services.dbus.packages = [ pkgs.iwd ];
4756
nixos/modules/services/networking/kresd.nix+1−1
@@ -9,7 +9,7 @@ let
99 # On Nix level we don't attempt to precisely validate the address specifications.
1010 # The optional IPv6 scope spec comes *after* port, perhaps surprisingly.
1111 mkListen = kind: addr: let
12− al_v4 = builtins.match "([0-9.]+):([0-9]+)()" addr;
12+ al_v4 = builtins.match "([0-9.]+):([0-9]+)($)" addr;
1313 al_v6 = builtins.match "\\[(.+)]:([0-9]+)(%.*|$)" addr;
1414 al_portOnly = builtins.match "([0-9]+)" addr;
1515 al = findFirst (a: a != null)
nixos/modules/services/networking/multipath.nix−15
@@ -242,21 +242,6 @@ in {
242242 '';
243243 };
244244
245− retain_attached_hw_handler = mkOption {
246− type = nullOr (enum [ "yes" "no" ]);
247− default = null; # real default: "yes"
248− description = ''
249− (Obsolete for kernels >= 4.3) If set to "yes" and the SCSI layer has
250− already attached a hardware_handler to the device, multipath will not
251− force the device to use the hardware_handler specified by mutipath.conf.
252− If the SCSI layer has not attached a hardware handler, multipath will
253− continue to use its configured hardware handler.
254−
255− Important Note: Linux kernel 4.3 or newer always behaves as if
256− "retain_attached_hw_handler yes" was set.
257− '';
258− };
259−
260245 detect_prio = mkOption {
261246 type = nullOr (enum [ "yes" "no" ]);
262247 default = null; # real default: "yes"
nixos/modules/services/networking/murmur.nix+2−2
@@ -294,7 +294,7 @@ in
294294 systemd.services.murmur = {
295295 description = "Murmur Chat Service";
296296 wantedBy = [ "multi-user.target" ];
297− after = [ "network-online.target "];
297+ after = [ "network-online.target" ];
298298 preStart = ''
299299 ${pkgs.envsubst}/bin/envsubst \
300300 -o /run/murmur/murmurd.ini \
@@ -306,7 +306,7 @@ in
306306 Type = if forking then "forking" else "simple";
307307 PIDFile = mkIf forking "/run/murmur/murmurd.pid";
308308 EnvironmentFile = mkIf (cfg.environmentFile != null) cfg.environmentFile;
309− ExecStart = "${cfg.package}/bin/murmurd -ini /run/murmur/murmurd.ini";
309+ ExecStart = "${cfg.package}/bin/mumble-server -ini /run/murmur/murmurd.ini";
310310 Restart = "always";
311311 RuntimeDirectory = "murmur";
312312 RuntimeDirectoryMode = "0700";
nixos/modules/services/networking/nbd.nixnew file+146
@@ -0,0 +1,146 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.nbd;
7+ configFormat = pkgs.formats.ini { };
8+ iniFields = with types; attrsOf (oneOf [ bool int float str ]);
9+ serverConfig = configFormat.generate "nbd-server-config"
10+ ({
11+ generic =
12+ (cfg.server.extraOptions // {
13+ user = "root";
14+ group = "root";
15+ port = cfg.server.listenPort;
16+ } // (optionalAttrs (cfg.server.listenAddress != null) {
17+ listenaddr = cfg.server.listenAddress;
18+ }));
19+ }
20+ // (mapAttrs
21+ (_: { path, allowAddresses, extraOptions }:
22+ extraOptions // {
23+ exportname = path;
24+ } // (optionalAttrs (allowAddresses != null) {
25+ authfile = pkgs.writeText "authfile" (concatStringsSep "\n" allowAddresses);
26+ }))
27+ cfg.server.exports)
28+ );
29+ splitLists =
30+ partition
31+ (path: hasPrefix "/dev/" path)
32+ (mapAttrsToList (_: { path, ... }: path) cfg.server.exports);
33+ allowedDevices = splitLists.right;
34+ boundPaths = splitLists.wrong;
35+in
36+{
37+ options = {
38+ services.nbd = {
39+ server = {
40+ enable = mkEnableOption "the Network Block Device (nbd) server";
41+
42+ listenPort = mkOption {
43+ type = types.port;
44+ default = 10809;
45+ description = "Port to listen on. The port is NOT automatically opened in the firewall.";
46+ };
47+
48+ extraOptions = mkOption {
49+ type = iniFields;
50+ default = {
51+ allowlist = false;
52+ };
53+ description = ''
54+ Extra options for the server. See
55+ <citerefentry><refentrytitle>nbd-server</refentrytitle>
56+ <manvolnum>5</manvolnum></citerefentry>.
57+ '';
58+ };
59+
60+ exports = mkOption {
61+ description = "Files or block devices to make available over the network.";
62+ default = { };
63+ type = with types; attrsOf
64+ (submodule {
65+ options = {
66+ path = mkOption {
67+ type = str;
68+ description = "File or block device to export.";
69+ example = "/dev/sdb1";
70+ };
71+
72+ allowAddresses = mkOption {
73+ type = nullOr (listOf str);
74+ default = null;
75+ example = [ "10.10.0.0/24" "127.0.0.1" ];
76+ description = "IPs and subnets that are authorized to connect for this device. If not specified, the server will allow all connections.";
77+ };
78+
79+ extraOptions = mkOption {
80+ type = iniFields;
81+ default = {
82+ flush = true;
83+ fua = true;
84+ };
85+ description = ''
86+ Extra options for this export. See
87+ <citerefentry><refentrytitle>nbd-server</refentrytitle>
88+ <manvolnum>5</manvolnum></citerefentry>.
89+ '';
90+ };
91+ };
92+ });
93+ };
94+
95+ listenAddress = mkOption {
96+ type = with types; nullOr str;
97+ description = "Address to listen on. If not specified, the server will listen on all interfaces.";
98+ default = null;
99+ example = "10.10.0.1";
100+ };
101+ };
102+ };
103+ };
104+
105+ config = mkIf cfg.server.enable {
106+ boot.kernelModules = [ "nbd" ];
107+
108+ systemd.services.nbd-server = {
109+ after = [ "network-online.target" ];
110+ before = [ "multi-user.target" ];
111+ wantedBy = [ "multi-user.target" ];
112+ serviceConfig = {
113+ ExecStart = "${pkgs.nbd}/bin/nbd-server -C ${serverConfig}";
114+ Type = "forking";
115+
116+ DeviceAllow = map (path: "${path} rw") allowedDevices;
117+ BindPaths = boundPaths;
118+
119+ CapabilityBoundingSet = "";
120+ DevicePolicy = "closed";
121+ LockPersonality = true;
122+ MemoryDenyWriteExecute = true;
123+ NoNewPrivileges = true;
124+ PrivateDevices = false;
125+ PrivateMounts = true;
126+ PrivateTmp = true;
127+ PrivateUsers = true;
128+ ProcSubset = "pid";
129+ ProtectClock = true;
130+ ProtectControlGroups = true;
131+ ProtectHome = true;
132+ ProtectHostname = true;
133+ ProtectKernelLogs = true;
134+ ProtectKernelModules = true;
135+ ProtectKernelTunables = true;
136+ ProtectProc = "noaccess";
137+ ProtectSystem = "strict";
138+ RestrictAddressFamilies = "AF_INET AF_INET6";
139+ RestrictNamespaces = true;
140+ RestrictRealtime = true;
141+ RestrictSUIDSGID = true;
142+ UMask = "0077";
143+ };
144+ };
145+ };
146+}
nixos/modules/services/networking/networkmanager.nix+18
@@ -384,6 +384,17 @@ in {
384384 so you don't need to to that yourself.
385385 '';
386386 };
387+
388+ enableFccUnlock = mkOption {
389+ type = types.bool;
390+ default = false;
391+ description = ''
392+ Enable FCC unlock procedures. Since release 1.18.4, the ModemManager daemon no longer
393+ automatically performs the FCC unlock procedure by default. See
394+ <link xlink:href="https://modemmanager.org/docs/modemmanager/fcc-unlock/">the docs</link>
395+ for more details.
396+ '';
397+ };
387398 };
388399 };
389400
@@ -438,7 +449,13 @@ in {
438449
439450 "NetworkManager/VPN/nm-sstp-service.name".source =
440451 "${networkmanager-sstp}/lib/NetworkManager/VPN/nm-sstp-service.name";
452+
441453 }
454+ // optionalAttrs cfg.enableFccUnlock
455+ {
456+ "ModemManager/fcc-unlock.d".source =
457+ "${pkgs.modemmanager}/share/ModemManager/fcc-unlock.available.d/*";
458+ }
442459 // optionalAttrs (cfg.appendNameservers != [] || cfg.insertNameservers != [])
443460 {
444461 "NetworkManager/dispatcher.d/02overridedns".source = overrideNameserversScript;
@@ -539,6 +556,7 @@ in {
539556
540557 boot.kernelModules = [ "ctr" ];
541558
559+ security.polkit.enable = true;
542560 security.polkit.extraConfig = polkitConf;
543561
544562 services.dbus.packages = cfg.packages
nixos/modules/services/networking/nftables.nix+4−12
@@ -25,9 +25,10 @@ in
2525 for more information.
2626
2727 There are other programs that use iptables internally too, such as
28− libvirt.
28+ libvirt. For information on how the two firewalls interact, see [2].
2929
3030 [1]: https://github.com/NixOS/nixpkgs/issues/24318#issuecomment-289216273
31+ [2]: https://wiki.nftables.org/wiki-nftables/index.php/Troubleshooting#Question_4._How_do_nftables_and_iptables_interact_when_used_on_the_same_system.3F
3132 '';
3233 };
3334 networking.nftables.ruleset = mkOption {
@@ -118,20 +119,11 @@ in
118119 flush ruleset
119120 include "${cfg.rulesetFile}"
120121 '';
121− checkScript = pkgs.writeScript "nftables-check" ''
122− #! ${pkgs.runtimeShell} -e
123− if $(${pkgs.kmod}/bin/lsmod | grep -q ip_tables); then
124− echo "Unload ip_tables before using nftables!" 1>&2
125− exit 1
126− else
127− ${rulesScript}
128− fi
129− '';
130122 in {
131123 Type = "oneshot";
132124 RemainAfterExit = true;
133− ExecStart = checkScript;
134− ExecReload = checkScript;
125+ ExecStart = rulesScript;
126+ ExecReload = rulesScript;
135127 ExecStop = "${pkgs.nftables}/bin/nft flush ruleset";
136128 };
137129 };
nixos/modules/services/networking/nsd.nix+8−12
@@ -194,19 +194,8 @@ let
194194 zone.children
195195 );
196196
197− # fighting infinite recursion
198− zoneOptions = zoneOptionsRaw // childConfig zoneOptions1 true;
199− zoneOptions1 = zoneOptionsRaw // childConfig zoneOptions2 false;
200− zoneOptions2 = zoneOptionsRaw // childConfig zoneOptions3 false;
201− zoneOptions3 = zoneOptionsRaw // childConfig zoneOptions4 false;
202− zoneOptions4 = zoneOptionsRaw // childConfig zoneOptions5 false;
203− zoneOptions5 = zoneOptionsRaw // childConfig zoneOptions6 false;
204− zoneOptions6 = zoneOptionsRaw // childConfig null false;
205−
206− childConfig = x: v: { options.children = { type = types.attrsOf x; visible = v; }; };
207−
208197 # options are ordered alphanumerically
209− zoneOptionsRaw = types.submodule {
198+ zoneOptions = types.submodule {
210199 options = {
211200
212201 allowAXFRFallback = mkOption {
@@ -246,6 +235,13 @@ let
246235 };
247236
248237 children = mkOption {
238+ # TODO: This relies on the fact that `types.anything` doesn't set any
239+ # values of its own to any defaults, because in the above zoneConfigs',
240+ # values from children override ones from parents, but only if the
241+ # attributes are defined. Because of this, we can't replace the element
242+ # type here with `zoneConfigs`, since that would set all the attributes
243+ # to default values, breaking the parent inheriting function.
244+ type = types.attrsOf types.anything;
249245 default = {};
250246 description = ''
251247 Children zones inherit all options of their parents. Attributes
nixos/modules/services/networking/ntopng.nix+53−10
@@ -6,7 +6,13 @@ let
66
77 cfg = config.services.ntopng;
88 opt = options.services.ntopng;
9− redisCfg = config.services.redis;
9+
10+ createRedis = cfg.redis.createInstance != null;
11+ redisService =
12+ if cfg.redis.createInstance == "" then
13+ "redis.service"
14+ else
15+ "redis-${cfg.redis.createInstance}.service";
1016
1117 configFile = if cfg.configText != "" then
1218 pkgs.writeText "ntopng.conf" ''
@@ -15,8 +21,10 @@ let
1521 else
1622 pkgs.writeText "ntopng.conf" ''
1723 ${concatStringsSep " " (map (e: "--interface=" + e) cfg.interfaces)}
18− --http-port=${toString cfg.http-port}
19− --redis=localhost:${toString redisCfg.port}
24+ --http-port=${toString cfg.httpPort}
25+ --redis=${cfg.redis.address}
26+ --data-dir=/var/lib/ntopng
27+ --user=ntopng
2028 ${cfg.extraConfig}
2129 '';
2230
@@ -24,6 +32,10 @@ in
2432
2533{
2634
35+ imports = [
36+ (mkRenamedOptionModule [ "services" "ntopng" "http-port" ] [ "services" "ntopng" "httpPort" ])
37+ ];
38+
2739 options = {
2840
2941 services.ntopng = {
@@ -56,7 +68,7 @@ in
5668 '';
5769 };
5870
59− http-port = mkOption {
71+ httpPort = mkOption {
6072 default = 3000;
6173 type = types.int;
6274 description = ''
@@ -64,6 +76,24 @@ in
6476 '';
6577 };
6678
79+ redis.address = mkOption {
80+ type = types.str;
81+ example = literalExpression "config.services.redis.ntopng.unixSocket";
82+ description = ''
83+ Redis address - may be a Unix socket or a network host and port.
84+ '';
85+ };
86+
87+ redis.createInstance = mkOption {
88+ type = types.nullOr types.str;
89+ default = if versionAtLeast config.system.stateVersion "22.05" then "ntopng" else "";
90+ description = ''
91+ Local Redis instance name. Set to <literal>null</literal> to disable
92+ local Redis instance. Defaults to <literal>""</literal> for
93+ <literal>system.stateVersion</literal> older than 22.05.
94+ '';
95+ };
96+
6797 configText = mkOption {
6898 default = "";
6999 example = ''
@@ -95,23 +125,36 @@ in
95125 config = mkIf cfg.enable {
96126
97127 # ntopng uses redis for data storage
98− services.redis.enable = true;
128+ services.ntopng.redis.address =
129+ mkIf createRedis config.services.redis.servers.${cfg.redis.createInstance}.unixSocket;
130+
131+ services.redis.servers = mkIf createRedis {
132+ ${cfg.redis.createInstance} = {
133+ enable = true;
134+ user = mkIf (cfg.redis.createInstance == "ntopng") "ntopng";
135+ };
136+ };
99137
100138 # nice to have manual page and ntopng command in PATH
101139 environment.systemPackages = [ pkgs.ntopng ];
102140
141+ systemd.tmpfiles.rules = [ "d /var/lib/ntopng 0700 ntopng ntopng -" ];
142+
103143 systemd.services.ntopng = {
104144 description = "Ntopng Network Monitor";
105− requires = [ "redis.service" ];
106− after = [ "network.target" "redis.service" ];
145+ requires = optional createRedis redisService;
146+ after = [ "network.target" ] ++ optional createRedis redisService;
107147 wantedBy = [ "multi-user.target" ];
108− preStart = "mkdir -p /var/lib/ntopng/";
109148 serviceConfig.ExecStart = "${pkgs.ntopng}/bin/ntopng ${configFile}";
110149 unitConfig.Documentation = "man:ntopng(8)";
111150 };
112151
113− # ntopng drops priveleges to user "nobody" and that user is already defined
114− # in users-groups.nix.
152+ users.extraUsers.ntopng = {
153+ group = "ntopng";
154+ isSystemUser = true;
155+ };
156+
157+ users.extraGroups.ntopng = { };
115158 };
116159
117160}
nixos/modules/services/networking/pleroma.nix+4−4
@@ -1,6 +1,7 @@
11{ config, options, lib, pkgs, stdenv, ... }:
22let
33 cfg = config.services.pleroma;
4+ cookieFile = "/var/lib/pleroma/.cookie";
45in {
56 options = {
67 services.pleroma = with lib; {
@@ -8,7 +9,7 @@ in {
89
910 package = mkOption {
1011 type = types.package;
11− default = pkgs.pleroma;
12+ default = pkgs.pleroma.override { inherit cookieFile; };
1213 defaultText = literalExpression "pkgs.pleroma";
1314 description = "Pleroma package to use.";
1415 };
@@ -100,7 +101,6 @@ in {
100101 after = [ "network-online.target" "postgresql.service" ];
101102 wantedBy = [ "multi-user.target" ];
102103 restartTriggers = [ config.environment.etc."/pleroma/config.exs".source ];
103− environment.RELEASE_COOKIE = "/var/lib/pleroma/.cookie";
104104 serviceConfig = {
105105 User = cfg.user;
106106 Group = cfg.group;
@@ -118,10 +118,10 @@ in {
118118 # Better be safe than sorry migration-wise.
119119 ExecStartPre =
120120 let preScript = pkgs.writers.writeBashBin "pleromaStartPre" ''
121− if [ ! -f /var/lib/pleroma/.cookie ]
121+ if [ ! -f "${cookieFile}" ] || [ ! -s "${cookieFile}" ]
122122 then
123123 echo "Creating cookie file"
124− dd if=/dev/urandom bs=1 count=16 | hexdump -e '16/1 "%02x"' > /var/lib/pleroma/.cookie
124+ dd if=/dev/urandom bs=1 count=16 | ${pkgs.hexdump}/bin/hexdump -e '16/1 "%02x"' > "${cookieFile}"
125125 fi
126126 ${cfg.package}/bin/pleroma_ctl migrate
127127 '';
nixos/modules/services/networking/racoon.nixdeleted−45
@@ -1,45 +0,0 @@
1−{ config, lib, pkgs, ... }:
2−
3−with lib;
4−
5−let
6− cfg = config.services.racoon;
7−in {
8− options.services.racoon = {
9− enable = mkEnableOption "racoon";
10−
11− config = mkOption {
12− description = "Contents of racoon configuration file.";
13− default = "";
14− type = types.str;
15− };
16−
17− configPath = mkOption {
18− description = "Location of racoon config if config is not provided.";
19− default = "/etc/racoon/racoon.conf";
20− type = types.path;
21− };
22− };
23−
24− config = mkIf cfg.enable {
25− systemd.services.racoon = {
26− description = "Racoon Daemon";
27− wantedBy = [ "multi-user.target" ];
28− after = [ "network.target" ];
29− serviceConfig = {
30− ExecStart = "${pkgs.ipsecTools}/bin/racoon -f ${
31− if (cfg.config != "") then pkgs.writeText "racoon.conf" cfg.config
32− else cfg.configPath
33− }";
34− ExecReload = "${pkgs.ipsecTools}/bin/racoonctl reload-config";
35− PIDFile = "/run/racoon.pid";
36− Type = "forking";
37− Restart = "always";
38− };
39− preStart = ''
40− rm /run/racoon.pid || true
41− mkdir -p /var/racoon
42− '';
43− };
44− };
45−}
nixos/modules/services/networking/seafile.nix+13−17
@@ -1,7 +1,6 @@
11{ config, lib, pkgs, ... }:
22with lib;
33let
4− python = pkgs.python3Packages.python;
54 cfg = config.services.seafile;
65 settingsFormat = pkgs.formats.ini { };
76
@@ -221,9 +220,7 @@ in {
221220 '';
222221 };
223222
224− seahub = let
225− penv = (pkgs.python3.withPackages (ps: with ps; [ gunicorn seahub ]));
226− in {
223+ seahub = {
227224 description = "Seafile Server Web Frontend";
228225 wantedBy = [ "seafile.target" ];
229226 partOf = [ "seafile.target" ];
@@ -231,8 +228,7 @@ in {
231228 requires = [ "seaf-server.service" ];
232229 restartTriggers = [ seahubSettings ];
233230 environment = {
234− PYTHONPATH =
235− "${pkgs.python3Packages.seahub}/thirdpart:${pkgs.python3Packages.seahub}:${penv}/${python.sitePackages}";
231+ PYTHONPATH = "${pkgs.seahub.pythonPath}:${pkgs.seahub}/thirdpart:${pkgs.seahub}";
236232 DJANGO_SETTINGS_MODULE = "seahub.settings";
237233 CCNET_CONF_DIR = ccnetDir;
238234 SEAFILE_CONF_DIR = dataDir;
@@ -249,7 +245,7 @@ in {
249245 LogsDirectory = "seafile";
250246 ConfigurationDirectory = "seafile";
251247 ExecStart = ''
252− ${penv}/bin/gunicorn seahub.wsgi:application \
248+ ${pkgs.seahub.python.pkgs.gunicorn}/bin/gunicorn seahub.wsgi:application \
253249 --name seahub \
254250 --workers ${toString cfg.workers} \
255251 --log-level=info \
@@ -262,27 +258,27 @@ in {
262258 preStart = ''
263259 mkdir -p ${seahubDir}/media
264260 # Link all media except avatars
265− for m in `find ${pkgs.python3Packages.seahub}/media/ -maxdepth 1 -not -name "avatars"`; do
261+ for m in `find ${pkgs.seahub}/media/ -maxdepth 1 -not -name "avatars"`; do
266262 ln -sf $m ${seahubDir}/media/
267263 done
268264 if [ ! -e "${seafRoot}/.seahubSecret" ]; then
269− ${penv}/bin/python ${pkgs.python3Packages.seahub}/tools/secret_key_generator.py > ${seafRoot}/.seahubSecret
265+ ${pkgs.seahub.python}/bin/python ${pkgs.seahub}/tools/secret_key_generator.py > ${seafRoot}/.seahubSecret
270266 chmod 400 ${seafRoot}/.seahubSecret
271267 fi
272268 if [ ! -f "${seafRoot}/seahub-setup" ]; then
273269 # avatars directory should be writable
274− install -D -t ${seahubDir}/media/avatars/ ${pkgs.python3Packages.seahub}/media/avatars/default.png
275− install -D -t ${seahubDir}/media/avatars/groups ${pkgs.python3Packages.seahub}/media/avatars/groups/default.png
270+ install -D -t ${seahubDir}/media/avatars/ ${pkgs.seahub}/media/avatars/default.png
271+ install -D -t ${seahubDir}/media/avatars/groups ${pkgs.seahub}/media/avatars/groups/default.png
276272 # init database
277− ${pkgs.python3Packages.seahub}/manage.py migrate
273+ ${pkgs.seahub}/manage.py migrate
278274 # create admin account
279− ${pkgs.expect}/bin/expect -c 'spawn ${pkgs.python3Packages.seahub}/manage.py createsuperuser --email=${cfg.adminEmail}; expect "Password: "; send "${cfg.initialAdminPassword}\r"; expect "Password (again): "; send "${cfg.initialAdminPassword}\r"; expect "Superuser created successfully."'
280− echo "${pkgs.python3Packages.seahub.version}-sqlite" > "${seafRoot}/seahub-setup"
275+ ${pkgs.expect}/bin/expect -c 'spawn ${pkgs.seahub}/manage.py createsuperuser --email=${cfg.adminEmail}; expect "Password: "; send "${cfg.initialAdminPassword}\r"; expect "Password (again): "; send "${cfg.initialAdminPassword}\r"; expect "Superuser created successfully."'
276+ echo "${pkgs.seahub.version}-sqlite" > "${seafRoot}/seahub-setup"
281277 fi
282− if [ $(cat "${seafRoot}/seahub-setup" | cut -d"-" -f1) != "${pkgs.python3Packages.seahub.version}" ]; then
278+ if [ $(cat "${seafRoot}/seahub-setup" | cut -d"-" -f1) != "${pkgs.seahub.version}" ]; then
283279 # update database
284− ${pkgs.python3Packages.seahub}/manage.py migrate
285− echo "${pkgs.python3Packages.seahub.version}-sqlite" > "${seafRoot}/seahub-setup"
280+ ${pkgs.seahub}/manage.py migrate
281+ echo "${pkgs.seahub.version}-sqlite" > "${seafRoot}/seahub-setup"
286282 fi
287283 '';
288284 };
nixos/modules/services/networking/snowflake-proxy.nixnew file+81
@@ -0,0 +1,81 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.snowflake-proxy;
7+in
8+{
9+ options = {
10+ services.snowflake-proxy = {
11+ enable = mkEnableOption "System to defeat internet censorship";
12+
13+ broker = mkOption {
14+ description = "Broker URL (default \"https://snowflake-broker.torproject.net/\")";
15+ type = with types; nullOr str;
16+ default = null;
17+ };
18+
19+ capacity = mkOption {
20+ description = "Limits the amount of maximum concurrent clients allowed.";
21+ type = with types; nullOr int;
22+ default = null;
23+ };
24+
25+ relay = mkOption {
26+ description = "websocket relay URL (default \"wss://snowflake.bamsoftware.com/\")";
27+ type = with types; nullOr str;
28+ default = null;
29+ };
30+
31+ stun = mkOption {
32+ description = "STUN broker URL (default \"stun:stun.stunprotocol.org:3478\")";
33+ type = with types; nullOr str;
34+ default = null;
35+ };
36+ };
37+ };
38+
39+ config = mkIf cfg.enable {
40+ systemd.services.snowflake-proxy = {
41+ wantedBy = [ "network-online.target" ];
42+ serviceConfig = {
43+ ExecStart =
44+ "${pkgs.snowflake}/bin/proxy " + concatStringsSep " " (
45+ optional (cfg.broker != null) "-broker ${cfg.broker}"
46+ ++ optional (cfg.capacity != null) "-capacity ${builtins.toString cfg.capacity}"
47+ ++ optional (cfg.relay != null) "-relay ${cfg.relay}"
48+ ++ optional (cfg.stun != null) "-stun ${cfg.stun}"
49+ );
50+
51+ # Security Hardening
52+ # Refer to systemd.exec(5) for option descriptions.
53+ CapabilityBoundingSet = "";
54+
55+ # implies RemoveIPC=, PrivateTmp=, NoNewPrivileges=, RestrictSUIDSGID=,
56+ # ProtectSystem=strict, ProtectHome=read-only
57+ DynamicUser = true;
58+ LockPersonality = true;
59+ PrivateDevices = true;
60+ PrivateUsers = true;
61+ ProcSubset = "pid";
62+ ProtectClock = true;
63+ ProtectControlGroups = true;
64+ ProtectHome = true;
65+ ProtectHostname = true;
66+ ProtectKernelLogs = true;
67+ ProtectProc = "invisible";
68+ ProtectKernelModules = true;
69+ ProtectKernelTunables = true;
70+ RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" ];
71+ RestrictNamespaces = true;
72+ RestrictRealtime = true;
73+ SystemCallArchitectures = "native";
74+ SystemCallFilter = "~@clock @cpu-emulation @debug @mount @obsolete @reboot @swap @privileged @resources";
75+ UMask = "0077";
76+ };
77+ };
78+ };
79+
80+ meta.maintainers = with maintainers; [ yayayayaka ];
81+}
nixos/modules/services/networking/squid.nix+23−4
@@ -81,7 +81,9 @@ let
8181 http_access deny all
8282
8383 # Squid normally listens to port 3128
84− http_port ${toString cfg.proxyPort}
84+ http_port ${
85+ optionalString (cfg.proxyAddress != null) "${cfg.proxyAddress}:"
86+ }${toString cfg.proxyPort}
8587
8688 # Leave coredumps in the first cache dir
8789 coredump_dir /var/cache/squid
@@ -109,6 +111,19 @@ in
109111 description = "Whether to run squid web proxy.";
110112 };
111113
114+ package = mkOption {
115+ default = pkgs.squid;
116+ defaultText = literalExpression "pkgs.squid";
117+ type = types.package;
118+ description = "Squid package to use.";
119+ };
120+
121+ proxyAddress = mkOption {
122+ type = types.nullOr types.str;
123+ default = null;
124+ description = "IP address on which squid will listen.";
125+ };
126+
112127 proxyPort = mkOption {
113128 type = types.int;
114129 default = 3128;
@@ -149,17 +164,21 @@ in
149164 users.groups.squid = {};
150165
151166 systemd.services.squid = {
152− description = "Squid caching web proxy";
167+ description = "Squid caching proxy";
168+ documentation = [ "man:squid(8)" ];
153169 after = [ "network.target" "nss-lookup.target" ];
154170 wantedBy = [ "multi-user.target"];
155171 preStart = ''
156172 mkdir -p "/var/log/squid"
157173 chown squid:squid "/var/log/squid"
174+ ${cfg.package}/bin/squid --foreground -z -f ${squidConfig}
158175 '';
159176 serviceConfig = {
160− Type="forking";
161177 PIDFile="/run/squid.pid";
162− ExecStart = "${pkgs.squid}/bin/squid -YCs -f ${squidConfig}";
178+ ExecStart = "${cfg.package}/bin/squid --foreground -YCs -f ${squidConfig}";
179+ ExecReload="kill -HUP $MAINPID";
180+ KillMode="mixed";
181+ NotifyAccess="all";
163182 };
164183 };
165184
nixos/modules/services/networking/syncplay.nix+1−1
@@ -68,7 +68,7 @@ in
6868 systemd.services.syncplay = {
6969 description = "Syncplay Service";
7070 wantedBy = [ "multi-user.target" ];
71− after = [ "network-online.target "];
71+ after = [ "network-online.target" ];
7272
7373 serviceConfig = {
7474 ExecStart = "${pkgs.syncplay}/bin/syncplay-server ${escapeShellArgs cmdArgs}";
nixos/modules/services/networking/tetrd.nix+1−1
@@ -1,7 +1,7 @@
11{ config, lib, pkgs, ... }:
22
33{
4− options.services.tetrd.enable = lib.mkEnableOption pkgs.tetrd.meta.description;
4+ options.services.tetrd.enable = lib.mkEnableOption "tetrd";
55
66 config = lib.mkIf config.services.tetrd.enable {
77 environment = {
nixos/modules/services/networking/tox-node.nix+1−6
@@ -8,12 +8,7 @@ let
88 homeDir = "/var/lib/tox-node";
99
1010 configFile = let
11− # fetchurl should be switched to getting this file from tox-node.src once
12− # the dpkg directory is in a release
13− src = pkgs.fetchurl {
14− url = "https://raw.githubusercontent.com/tox-rs/tox-node/master/dpkg/config.yml";
15− sha256 = "1431wzpzm786mcvyzk1rp7ar418n45dr75hdggxvlm7pkpam31xa";
16− };
11+ src = "${pkg.src}/dpkg/config.yml";
1712 confJSON = pkgs.writeText "config.json" (
1813 builtins.toJSON {
1914 log-type = cfg.logType;
nixos/modules/services/networking/unbound.nix+1
@@ -62,6 +62,7 @@ in {
6262 };
6363
6464 stateDir = mkOption {
65+ type = types.path;
6566 default = "/var/lib/unbound";
6667 description = "Directory holding all state for unbound to run.";
6768 };
nixos/modules/services/networking/vsftpd.nix+1
@@ -153,6 +153,7 @@ in
153153
154154 userlist = mkOption {
155155 default = [];
156+ type = types.listOf types.str;
156157 description = "See <option>userlistFile</option>.";
157158 };
158159
nixos/modules/services/networking/wg-netmanager.nixnew file+42
@@ -0,0 +1,42 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.wg-netmanager;
7+in
8+{
9+
10+ options = {
11+ services.wg-netmanager = {
12+ enable = mkEnableOption "Wireguard network manager";
13+ };
14+ };
15+
16+ ###### implementation
17+ config = mkIf cfg.enable {
18+ # NOTE: wg-netmanager runs as root
19+ systemd.services.wg-netmanager = {
20+ description = "Wireguard network manager";
21+ wantedBy = [ "multi-user.target" ];
22+ after = [ "network.target" ];
23+ path = with pkgs; [ wireguard-tools iproute2 wireguard-go ];
24+ serviceConfig = {
25+ Type = "simple";
26+ Restart = "on-failure";
27+ ExecStart = "${pkgs.wg-netmanager}/bin/wg_netmanager";
28+ ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
29+ ExecStop = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
30+
31+ ReadWritePaths = [
32+ "/tmp" # wg-netmanager creates files in /tmp before deleting them after use
33+ ];
34+ };
35+ unitConfig = {
36+ ConditionPathExists = ["/etc/wg_netmanager/network.yaml" "/etc/wg_netmanager/peer.yaml"];
37+ };
38+ };
39+ };
40+
41+ meta.maintainers = with maintainers; [ gin66 ];
42+}
nixos/modules/services/networking/wg-quick.nix+8−1
@@ -17,6 +17,13 @@ let
1717 description = "The IP addresses of the interface.";
1818 };
1919
20+ autostart = mkOption {
21+ description = "Whether to bring up this interface automatically during boot.";
22+ default = true;
23+ example = false;
24+ type = types.bool;
25+ };
26+
2027 dns = mkOption {
2128 example = [ "192.168.2.2" ];
2229 default = [];
@@ -247,7 +254,7 @@ let
247254 description = "wg-quick WireGuard Tunnel - ${name}";
248255 requires = [ "network-online.target" ];
249256 after = [ "network.target" "network-online.target" ];
250− wantedBy = [ "multi-user.target" ];
257+ wantedBy = optional values.autostart "multi-user.target";
251258 environment.DEVICE = name;
252259 path = [ pkgs.kmod pkgs.wireguard-tools ];
253260
nixos/modules/services/networking/wpa_supplicant.nix+46−3
@@ -10,14 +10,45 @@ let
1010 cfg = config.networking.wireless;
1111 opt = options.networking.wireless;
1212
13+ wpa3Protocols = [ "SAE" "FT-SAE" ];
14+ hasMixedWPA = opts:
15+ let
16+ hasWPA3 = !mutuallyExclusive opts.authProtocols wpa3Protocols;
17+ others = subtractLists wpa3Protocols opts.authProtocols;
18+ in hasWPA3 && others != [];
19+
20+ # Gives a WPA3 network higher priority
21+ increaseWPA3Priority = opts:
22+ opts // optionalAttrs (hasMixedWPA opts)
23+ { priority = if opts.priority == null
24+ then 1
25+ else opts.priority + 1;
26+ };
27+
28+ # Creates a WPA2 fallback network
29+ mkWPA2Fallback = opts:
30+ opts // { authProtocols = subtractLists wpa3Protocols opts.authProtocols; };
31+
32+ # Networks attrset as a list
33+ networkList = mapAttrsToList (ssid: opts: opts // { inherit ssid; })
34+ cfg.networks;
35+
36+ # List of all networks (normal + generated fallbacks)
37+ allNetworks =
38+ if cfg.fallbackToWPA2
39+ then map increaseWPA3Priority networkList
40+ ++ map mkWPA2Fallback (filter hasMixedWPA networkList)
41+ else networkList;
42+
1343 # Content of wpa_supplicant.conf
1444 generatedConfig = concatStringsSep "\n" (
15− (mapAttrsToList mkNetwork cfg.networks)
45+ (map mkNetwork allNetworks)
1646 ++ optional cfg.userControlled.enable (concatStringsSep "\n"
1747 [ "ctrl_interface=/run/wpa_supplicant"
1848 "ctrl_interface_group=${cfg.userControlled.group}"
1949 "update_config=1"
2050 ])
51+ ++ [ "pmf=1" ]
2152 ++ optional cfg.scanOnLowSignal ''bgscan="simple:30:-70:3600"''
2253 ++ optional (cfg.extraConfig != "") cfg.extraConfig);
2354
@@ -33,7 +64,7 @@ let
3364 finalConfig = ''"$RUNTIME_DIRECTORY"/wpa_supplicant.conf'';
3465
3566 # Creates a network block for wpa_supplicant.conf
36− mkNetwork = ssid: opts:
67+ mkNetwork = opts:
3768 let
3869 quote = x: ''"${x}"'';
3970 indent = x: " " + x;
@@ -43,7 +74,7 @@ let
4374 else opts.pskRaw;
4475
4576 options = [
46− "ssid=${quote ssid}"
77+ "ssid=${quote opts.ssid}"
4778 (if pskString != null || opts.auth != null
4879 then "key_mgmt=${concatStringsSep " " opts.authProtocols}"
4980 else "key_mgmt=NONE")
@@ -175,6 +206,18 @@ in {
175206 '';
176207 };
177208
209+ fallbackToWPA2 = mkOption {
210+ type = types.bool;
211+ default = true;
212+ description = ''
213+ Whether to fall back to WPA2 authentication protocols if WPA3 failed.
214+ This allows old wireless cards (that lack recent features required by
215+ WPA3) to connect to mixed WPA2/WPA3 access points.
216+
217+ To avoid possible downgrade attacks, disable this options.
218+ '';
219+ };
220+
178221 environmentFile = mkOption {
179222 type = types.nullOr types.path;
180223 default = null;
nixos/modules/services/networking/yggdrasil.xml−1
@@ -84,7 +84,6 @@ in {
8484 interface eth0
8585 {
8686 AdvSendAdvert on;
87− AdvDefaultLifetime 0;
8887 prefix ${prefix}::/64 {
8988 AdvOnLink on;
9089 AdvAutonomous on;
nixos/modules/services/search/elasticsearch.nix+14
@@ -143,6 +143,17 @@ in
143143 example = lib.literalExpression "[ pkgs.elasticsearchPlugins.discovery-ec2 ]";
144144 };
145145
146+ restartIfChanged = mkOption {
147+ type = types.bool;
148+ description = ''
149+ Automatically restart the service on config change.
150+ This can be set to false to defer restarts on a server or cluster.
151+ Please consider the security implications of inadvertently running an older version,
152+ and the possibility of unexpected behavior caused by inconsistent versions across a cluster when disabling this option.
153+ '';
154+ default = true;
155+ };
156+
146157 };
147158
148159 ###### implementation
@@ -153,6 +164,7 @@ in
153164 wantedBy = [ "multi-user.target" ];
154165 after = [ "network.target" ];
155166 path = [ pkgs.inetutils ];
167+ inherit (cfg) restartIfChanged;
156168 environment = {
157169 ES_HOME = cfg.dataDir;
158170 ES_JAVA_OPTS = toString cfg.extraJavaOptions;
@@ -163,6 +175,8 @@ in
163175 User = "elasticsearch";
164176 PermissionsStartOnly = true;
165177 LimitNOFILE = "1024000";
178+ Restart = "always";
179+ TimeoutStartSec = "infinity";
166180 };
167181 preStart = ''
168182 ${optionalString (!config.boot.isContainer) ''
nixos/modules/services/security/cfssl.nix+54−41
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, options, lib, pkgs, ... }:
22
33with lib;
44
@@ -11,7 +11,16 @@ in {
1111 dataDir = mkOption {
1212 default = "/var/lib/cfssl";
1313 type = types.path;
14− description = "Cfssl work directory.";
14+ description = ''
15+ The work directory for CFSSL.
16+
17+ <note><para>
18+ If left as the default value this directory will automatically be
19+ created before the CFSSL server starts, otherwise you are
20+ responsible for ensuring the directory exists with appropriate
21+ ownership and permissions.
22+ </para></note>
23+ '';
1524 };
1625
1726 address = mkOption {
@@ -22,7 +31,7 @@ in {
2231
2332 port = mkOption {
2433 default = 8888;
25− type = types.ints.u16;
34+ type = types.port;
2635 description = "Port to bind.";
2736 };
2837
@@ -147,13 +156,12 @@ in {
147156 };
148157
149158 config = mkIf cfg.enable {
150− users.extraGroups.cfssl = {
159+ users.groups.cfssl = {
151160 gid = config.ids.gids.cfssl;
152161 };
153162
154− users.extraUsers.cfssl = {
163+ users.users.cfssl = {
155164 description = "cfssl user";
156− createHome = true;
157165 home = cfg.dataDir;
158166 group = "cfssl";
159167 uid = config.ids.uids.cfssl;
@@ -164,41 +172,46 @@ in {
164172 wantedBy = [ "multi-user.target" ];
165173 after = [ "network.target" ];
166174
167− serviceConfig = {
168− WorkingDirectory = cfg.dataDir;
169− StateDirectory = cfg.dataDir;
170− StateDirectoryMode = 700;
171− Restart = "always";
172− User = "cfssl";
173−
174− ExecStart = with cfg; let
175− opt = n: v: optionalString (v != null) ''-${n}="${v}"'';
176− in
177− lib.concatStringsSep " \\\n" [
178− "${pkgs.cfssl}/bin/cfssl serve"
179− (opt "address" address)
180− (opt "port" (toString port))
181− (opt "ca" ca)
182− (opt "ca-key" caKey)
183− (opt "ca-bundle" caBundle)
184− (opt "int-bundle" intBundle)
185− (opt "int-dir" intDir)
186− (opt "metadata" metadata)
187− (opt "remote" remote)
188− (opt "config" configFile)
189− (opt "responder" responder)
190− (opt "responder-key" responderKey)
191− (opt "tls-key" tlsKey)
192− (opt "tls-cert" tlsCert)
193− (opt "mutual-tls-ca" mutualTlsCa)
194− (opt "mutual-tls-cn" mutualTlsCn)
195− (opt "mutual-tls-client-key" mutualTlsClientKey)
196− (opt "mutual-tls-client-cert" mutualTlsClientCert)
197− (opt "tls-remote-ca" tlsRemoteCa)
198− (opt "db-config" dbConfig)
199− (opt "loglevel" (toString logLevel))
200− ];
201− };
175+ serviceConfig = lib.mkMerge [
176+ {
177+ WorkingDirectory = cfg.dataDir;
178+ Restart = "always";
179+ User = "cfssl";
180+ Group = "cfssl";
181+
182+ ExecStart = with cfg; let
183+ opt = n: v: optionalString (v != null) ''-${n}="${v}"'';
184+ in
185+ lib.concatStringsSep " \\\n" [
186+ "${pkgs.cfssl}/bin/cfssl serve"
187+ (opt "address" address)
188+ (opt "port" (toString port))
189+ (opt "ca" ca)
190+ (opt "ca-key" caKey)
191+ (opt "ca-bundle" caBundle)
192+ (opt "int-bundle" intBundle)
193+ (opt "int-dir" intDir)
194+ (opt "metadata" metadata)
195+ (opt "remote" remote)
196+ (opt "config" configFile)
197+ (opt "responder" responder)
198+ (opt "responder-key" responderKey)
199+ (opt "tls-key" tlsKey)
200+ (opt "tls-cert" tlsCert)
201+ (opt "mutual-tls-ca" mutualTlsCa)
202+ (opt "mutual-tls-cn" mutualTlsCn)
203+ (opt "mutual-tls-client-key" mutualTlsClientKey)
204+ (opt "mutual-tls-client-cert" mutualTlsClientCert)
205+ (opt "tls-remote-ca" tlsRemoteCa)
206+ (opt "db-config" dbConfig)
207+ (opt "loglevel" (toString logLevel))
208+ ];
209+ }
210+ (mkIf (cfg.dataDir == options.services.cfssl.dataDir.default) {
211+ StateDirectory = baseNameOf cfg.dataDir;
212+ StateDirectoryMode = 700;
213+ })
214+ ];
202215 };
203216
204217 services.cfssl = {
nixos/modules/services/security/clamav.nix+4−5
@@ -9,7 +9,7 @@ let
99 pkg = pkgs.clamav;
1010
1111 toKeyValue = generators.toKeyValue {
12− mkKeyValue = generators.mkKeyValueDefault {} " ";
12+ mkKeyValue = generators.mkKeyValueDefault { } " ";
1313 listsAsDuplicateKeys = true;
1414 };
1515
@@ -30,7 +30,7 @@ in
3030
3131 settings = mkOption {
3232 type = with types; attrsOf (oneOf [ bool int str (listOf str) ]);
33− default = {};
33+ default = { };
3434 description = ''
3535 ClamAV configuration. Refer to <link xlink:href="https://linux.die.net/man/5/clamd.conf"/>,
3636 for details on supported values.
@@ -59,7 +59,7 @@ in
5959
6060 settings = mkOption {
6161 type = with types; attrsOf (oneOf [ bool int str (listOf str) ]);
62− default = {};
62+ default = { };
6363 description = ''
6464 freshclam configuration. Refer to <link xlink:href="https://linux.die.net/man/5/freshclam.conf"/>,
6565 for details on supported values.
@@ -104,7 +104,6 @@ in
104104 systemd.services.clamav-daemon = mkIf cfg.daemon.enable {
105105 description = "ClamAV daemon (clamd)";
106106 after = optional cfg.updater.enable "clamav-freshclam.service";
107− requires = optional cfg.updater.enable "clamav-freshclam.service";
108107 wantedBy = [ "multi-user.target" ];
109108 restartTriggers = [ clamdConfigFile ];
110109
@@ -134,7 +133,7 @@ in
134133 systemd.services.clamav-freshclam = mkIf cfg.updater.enable {
135134 description = "ClamAV virus database updater (freshclam)";
136135 restartTriggers = [ freshclamConfigFile ];
137−
136+ after = [ "network-online.target" ];
138137 preStart = ''
139138 mkdir -m 0755 -p ${stateDir}
140139 chown ${clamavUser}:${clamavGroup} ${stateDir}
nixos/modules/services/security/fprot.nixdeleted−82
@@ -1,82 +0,0 @@
1−{ config, lib, pkgs, ... }:
2−with lib;
3−let
4− fprotUser = "fprot";
5− stateDir = "/var/lib/fprot";
6− fprotGroup = fprotUser;
7− cfg = config.services.fprot;
8−in {
9− options = {
10−
11− services.fprot = {
12− updater = {
13− enable = mkEnableOption "automatic F-Prot virus definitions database updates";
14−
15− productData = mkOption {
16− description = ''
17− product.data file. Defaults to the one supplied with installation package.
18− '';
19− type = types.path;
20− };
21−
22− frequency = mkOption {
23− default = 30;
24− type = types.int;
25− description = ''
26− Update virus definitions every X minutes.
27− '';
28− };
29−
30− licenseKeyfile = mkOption {
31− type = types.path;
32− description = ''
33− License keyfile. Defaults to the one supplied with installation package.
34− '';
35− };
36−
37− };
38− };
39− };
40−
41− ###### implementation
42−
43− config = mkIf cfg.updater.enable {
44−
45− services.fprot.updater.productData = mkDefault "${pkgs.fprot}/opt/f-prot/product.data";
46− services.fprot.updater.licenseKeyfile = mkDefault "${pkgs.fprot}/opt/f-prot/license.key";
47−
48− environment.systemPackages = [ pkgs.fprot ];
49− environment.etc."f-prot.conf" = {
50− source = "${pkgs.fprot}/opt/f-prot/f-prot.conf";
51− };
52−
53− users.users.${fprotUser} =
54− { uid = config.ids.uids.fprot;
55− description = "F-Prot daemon user";
56− home = stateDir;
57− };
58−
59− users.groups.${fprotGroup} =
60− { gid = config.ids.gids.fprot; };
61−
62− services.cron.systemCronJobs = [ "*/${toString cfg.updater.frequency} * * * * root start fprot-updater" ];
63−
64− systemd.services.fprot-updater = {
65− serviceConfig = {
66− Type = "oneshot";
67− RemainAfterExit = false;
68− };
69− wantedBy = [ "multi-user.target" ];
70−
71− # have to copy fpupdate executable because it insists on storing the virus database in the same dir
72− preStart = ''
73− mkdir -m 0755 -p ${stateDir}
74− chown ${fprotUser}:${fprotGroup} ${stateDir}
75− cp ${pkgs.fprot}/opt/f-prot/fpupdate ${stateDir}
76− ln -sf ${cfg.updater.productData} ${stateDir}/product.data
77− '';
78−
79− script = "/var/lib/fprot/fpupdate --keyfile ${cfg.updater.licenseKeyfile}";
80− };
81− };
82−}
nixos/modules/services/security/haveged.nix+39−29
@@ -3,12 +3,10 @@
33with lib;
44
55let
6−
76 cfg = config.services.haveged;
87
98in
109
11−
1210{
1311
1412 ###### interface
@@ -17,14 +15,11 @@ in
1715
1816 services.haveged = {
1917
20− enable = mkOption {
21− type = types.bool;
22− default = false;
23− description = ''
24− Whether to enable to haveged entropy daemon, which refills
25− /dev/random when low.
26− '';
27− };
18+ enable = mkEnableOption ''
19+ haveged entropy daemon, which refills /dev/random when low.
20+ NOTE: does nothing on kernels newer than 5.6.
21+ '';
22+ # source for the note https://github.com/jirka-h/haveged/issues/57
2823
2924 refill_threshold = mkOption {
3025 type = types.int;
@@ -39,29 +34,44 @@ in
3934
4035 };
4136
42−
43− ###### implementation
44−
4537 config = mkIf cfg.enable {
4638
47− systemd.services.haveged =
48− { description = "Entropy Harvesting Daemon";
49− unitConfig.Documentation = "man:haveged(8)";
50− wantedBy = [ "multi-user.target" ];
51−
52− path = [ pkgs.haveged ];
53−
54− serviceConfig = {
55− ExecStart = "${pkgs.haveged}/bin/haveged -F -w ${toString cfg.refill_threshold} -v 1";
56− SuccessExitStatus = 143;
57− PrivateTmp = true;
58− PrivateDevices = true;
59− PrivateNetwork = true;
60− ProtectSystem = "full";
61− ProtectHome = true;
62− };
39+ # https://github.com/jirka-h/haveged/blob/a4b69d65a8dfc5a9f52ff8505c7f58dcf8b9234f/contrib/Fedora/haveged.service
40+ systemd.services.haveged = {
41+ description = "Entropy Daemon based on the HAVEGE algorithm";
42+ unitConfig = {
43+ Documentation = "man:haveged(8)";
44+ DefaultDependencies = false;
45+ ConditionKernelVersion = "<5.6";
46+ };
47+ wantedBy = [ "sysinit.target" ];
48+ after = [ "systemd-tmpfiles-setup-dev.service" ];
49+ before = [ "sysinit.target" "shutdown.target" "systemd-journald.service" ];
50+
51+ serviceConfig = {
52+ ExecStart = "${pkgs.haveged}/bin/haveged -w ${toString cfg.refill_threshold} --Foreground -v 1";
53+ Restart = "always";
54+ SuccessExitStatus = "137 143";
55+ SecureBits = "noroot-locked";
56+ CapabilityBoundingSet = [ "CAP_SYS_ADMIN" "CAP_SYS_CHROOT" ];
57+ # We can *not* set PrivateTmp=true as it can cause an ordering cycle.
58+ PrivateTmp = false;
59+ PrivateDevices = true;
60+ ProtectSystem = "full";
61+ ProtectHome = true;
62+ ProtectHostname = true;
63+ ProtectKernelLogs = true;
64+ ProtectKernelModules = true;
65+ RestrictNamespaces = true;
66+ RestrictRealtime = true;
67+ LockPersonality = true;
68+ MemoryDenyWriteExecute = true;
69+ SystemCallArchitectures = "native";
70+ SystemCallFilter = [ "@system-service" "newuname" "~@mount" ];
71+ SystemCallErrorNumber = "EPERM";
6372 };
6473
74+ };
6575 };
6676
6777}
nixos/modules/services/security/oauth2_proxy.nix+6−4
@@ -102,17 +102,19 @@ in
102102 # Taken from: https://github.com/oauth2-proxy/oauth2-proxy/blob/master/providers/providers.go
103103 provider = mkOption {
104104 type = types.enum [
105− "google"
105+ "adfs"
106106 "azure"
107+ "bitbucket"
108+ "digitalocean"
107109 "facebook"
108110 "github"
109− "keycloak"
110111 "gitlab"
112+ "google"
113+ "keycloak"
114+ "keycloak-oidc"
111115 "linkedin"
112116 "login.gov"
113− "bitbucket"
114117 "nextcloud"
115− "digitalocean"
116118 "oidc"
117119 ];
118120 default = "google";
nixos/modules/services/security/opensnitch.nix+102−1
@@ -3,22 +3,123 @@
33with lib;
44
55let
6− name = "opensnitch";
76 cfg = config.services.opensnitch;
7+ format = pkgs.formats.json {};
88in {
99 options = {
1010 services.opensnitch = {
1111 enable = mkEnableOption "Opensnitch application firewall";
12+ settings = mkOption {
13+ type = types.submodule {
14+ freeformType = format.type;
15+
16+ options = {
17+ Server = {
18+
19+ Address = mkOption {
20+ type = types.str;
21+ description = ''
22+ Unix socket path (unix:///tmp/osui.sock, the "unix:///" part is
23+ mandatory) or TCP socket (192.168.1.100:50051).
24+ '';
25+ };
26+
27+ LogFile = mkOption {
28+ type = types.path;
29+ description = ''
30+ File to write logs to (use /dev/stdout to write logs to standard
31+ output).
32+ '';
33+ };
34+
35+ };
36+
37+ DefaultAction = mkOption {
38+ type = types.enum [ "allow" "deny" ];
39+ description = ''
40+ Default action whether to block or allow application internet
41+ access.
42+ '';
43+ };
44+
45+ DefaultDuration = mkOption {
46+ type = types.enum [
47+ "once" "always" "until restart" "30s" "5m" "15m" "30m" "1h"
48+ ];
49+ description = ''
50+ Default duration of firewall rule.
51+ '';
52+ };
53+
54+ InterceptUnknown = mkOption {
55+ type = types.bool;
56+ description = ''
57+ Wheter to intercept spare connections.
58+ '';
59+ };
60+
61+ ProcMonitorMethod = mkOption {
62+ type = types.enum [ "ebpf" "proc" "ftrace" "audit" ];
63+ description = ''
64+ Which process monitoring method to use.
65+ '';
66+ };
67+
68+ LogLevel = mkOption {
69+ type = types.enum [ 0 1 2 3 4 ];
70+ description = ''
71+ Default log level from 0 to 4 (debug, info, important, warning,
72+ error).
73+ '';
74+ };
75+
76+ Firewall = mkOption {
77+ type = types.enum [ "iptables" "nftables" ];
78+ description = ''
79+ Which firewall backend to use.
80+ '';
81+ };
82+
83+ Stats = {
84+
85+ MaxEvents = mkOption {
86+ type = types.int;
87+ description = ''
88+ Max events to send to the GUI.
89+ '';
90+ };
91+
92+ MaxStats = mkOption {
93+ type = types.int;
94+ description = ''
95+ Max stats per item to keep in backlog.
96+ '';
97+ };
98+
99+ };
100+ };
101+ };
102+ description = ''
103+ opensnitchd configuration. Refer to
104+ <link xlink:href="https://github.com/evilsocket/opensnitch/wiki/Configurations"/>
105+ for details on supported values.
106+ '';
107+ };
12108 };
13109 };
14110
15111 config = mkIf cfg.enable {
16112
113+ # pkg.opensnitch is referred to elsewhere in the module so we don't need to worry about it being garbage collected
114+ services.opensnitch.settings = mapAttrs (_: v: mkDefault v) (builtins.fromJSON (builtins.unsafeDiscardStringContext (builtins.readFile "${pkgs.opensnitch}/etc/default-config.json")));
115+
17116 systemd = {
18117 packages = [ pkgs.opensnitch ];
19118 services.opensnitchd.wantedBy = [ "multi-user.target" ];
20119 };
21120
121+ environment.etc."opensnitchd/default-config.json".source = format.generate "default-config.json" cfg.settings;
122+
22123 };
23124}
24125
nixos/modules/services/security/step-ca.nix+12−3
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, nixosTests, ... }:
1+{ config, lib, pkgs, ... }:
22let
33 cfg = config.services.step-ca;
44 settingsFormat = (pkgs.formats.json { });
@@ -82,8 +82,6 @@ in
8282 });
8383 in
8484 {
85− passthru.tests.step-ca = nixosTests.step-ca;
86−
8785 assertions =
8886 [
8987 {
@@ -108,6 +106,9 @@ in
108106 ConditionFileNotEmpty = ""; # override upstream
109107 };
110108 serviceConfig = {
109+ User = "step-ca";
110+ Group = "step-ca";
111+ UMask = "0077";
111112 Environment = "HOME=%S/step-ca";
112113 WorkingDirectory = ""; # override upstream
113114 ReadWriteDirectories = ""; # override upstream
@@ -129,6 +130,14 @@ in
129130 };
130131 };
131132
133+ users.users.step-ca = {
134+ home = "/var/lib/step-ca";
135+ group = "step-ca";
136+ isSystemUser = true;
137+ };
138+
139+ users.groups.step-ca = {};
140+
132141 networking.firewall = lib.mkIf cfg.openFirewall {
133142 allowedTCPPorts = [ cfg.port ];
134143 };
nixos/modules/services/security/tor.nix+17−3
@@ -794,6 +794,11 @@ in
794794 };
795795 }));
796796 };
797+ options.ShutdownWaitLength = mkOption {
798+ type = types.int;
799+ default = 30;
800+ description = descriptionGeneric "ShutdownWaitLength";
801+ };
797802 options.SocksPolicy = optionStrings "SocksPolicy" // {
798803 example = ["accept *:*"];
799804 };
@@ -905,6 +910,11 @@ in
905910 ORPort = mkForce [];
906911 PublishServerDescriptor = mkForce false;
907912 })
913+ (mkIf (!cfg.client.enable) {
914+ # Make sure application connections via SOCKS are disabled
915+ # when services.tor.client.enable is false
916+ SOCKSPort = mkForce [ 0 ];
917+ })
908918 (mkIf cfg.client.enable (
909919 { SOCKSPort = [ cfg.client.socksListenAddress ];
910920 } // optionalAttrs cfg.client.transparentProxy.enable {
@@ -957,7 +967,7 @@ in
957967 '') onion.authorizedClients ++
958968 optional (onion.secretKey != null) ''
959969 install -d -o tor -g tor -m 0700 ${escapeShellArg onion.path}
960− key="$(cut -f1 -d: ${escapeShellArg onion.secretKey})"
970+ key="$(cut -f1 -d: ${escapeShellArg onion.secretKey} | head -1)"
961971 case "$key" in
962972 ("== ed25519v"*"-secret")
963973 install -o tor -g tor -m 0400 ${escapeShellArg onion.secretKey} ${escapeShellArg onion.path}/hs_ed25519_secret_key;;
@@ -977,7 +987,7 @@ in
977987 ExecStart = "${cfg.package}/bin/tor -f ${torrc}";
978988 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
979989 KillSignal = "SIGINT";
980− TimeoutSec = 30;
990+ TimeoutSec = cfg.settings.ShutdownWaitLength + 30; # Wait a bit longer than ShutdownWaitLength before actually timing out
981991 Restart = "on-failure";
982992 LimitNOFILE = 32768;
983993 RuntimeDirectory = [
@@ -1003,7 +1013,11 @@ in
10031013 #InaccessiblePaths = [ "-+${runDir}/root" ];
10041014 UMask = "0066";
10051015 BindPaths = [ stateDir ];
1006− BindReadOnlyPaths = [ storeDir "/etc" ];
1016+ BindReadOnlyPaths = [ storeDir "/etc" ] ++
1017+ optionals config.services.resolved.enable [
1018+ "/run/systemd/resolve/stub-resolv.conf"
1019+ "/run/systemd/resolve/resolv.conf"
1020+ ];
10071021 AmbientCapabilities = [""] ++ lib.optional bindsPrivilegedPort "CAP_NET_BIND_SERVICE";
10081022 CapabilityBoundingSet = [""] ++ lib.optional bindsPrivilegedPort "CAP_NET_BIND_SERVICE";
10091023 # ProtectClock= adds DeviceAllow=char-rtc r
nixos/modules/services/security/vaultwarden/default.nix+3−3
@@ -131,7 +131,7 @@ in {
131131 users.groups.vaultwarden = { };
132132
133133 systemd.services.vaultwarden = {
134− aliases = [ "bitwarden_rs" ];
134+ aliases = [ "bitwarden_rs.service" ];
135135 after = [ "network.target" ];
136136 path = with pkgs; [ openssl ];
137137 serviceConfig = {
@@ -151,7 +151,7 @@ in {
151151 };
152152
153153 systemd.services.backup-vaultwarden = mkIf (cfg.backupDir != null) {
154− aliases = [ "backup-bitwarden_rs" ];
154+ aliases = [ "backup-bitwarden_rs.service" ];
155155 description = "Backup vaultwarden";
156156 environment = {
157157 DATA_FOLDER = "/var/lib/bitwarden_rs";
@@ -169,7 +169,7 @@ in {
169169 };
170170
171171 systemd.timers.backup-vaultwarden = mkIf (cfg.backupDir != null) {
172− aliases = [ "backup-bitwarden_rs" ];
172+ aliases = [ "backup-bitwarden_rs.service" ];
173173 description = "Backup vaultwarden on time";
174174 timerConfig = {
175175 OnCalendar = mkDefault "23:00";
nixos/modules/services/system/cloud-init.nix+15−1
@@ -52,11 +52,22 @@ in
5252 '';
5353 };
5454
55+ network.enable = mkOption {
56+ type = types.bool;
57+ default = false;
58+ description = ''
59+ Allow the cloud-init service to configure network interfaces
60+ through systemd-networkd.
61+ '';
62+ };
63+
5564 config = mkOption {
5665 type = types.str;
5766 default = ''
5867 system_info:
5968 distro: nixos
69+ network:
70+ renderers: [ 'networkd' ]
6071 users:
6172 - root
6273
@@ -109,9 +120,12 @@ in
109120
110121 environment.etc."cloud/cloud.cfg".text = cfg.config;
111122
123+ systemd.network.enable = cfg.network.enable;
124+
112125 systemd.services.cloud-init-local =
113126 { description = "Initial cloud-init job (pre-networking)";
114127 wantedBy = [ "multi-user.target" ];
128+ before = ["systemd-networkd.service"];
115129 path = path;
116130 serviceConfig =
117131 { Type = "oneshot";
@@ -129,7 +143,7 @@ in
129143 "sshd.service" "sshd-keygen.service" ];
130144 after = [ "network-online.target" "cloud-init-local.service" ];
131145 before = [ "sshd.service" "sshd-keygen.service" ];
132− requires = [ "network.target "];
146+ requires = [ "network.target"];
133147 path = path;
134148 serviceConfig =
135149 { Type = "oneshot";
nixos/modules/services/system/earlyoom.nix+133−97
@@ -1,124 +1,160 @@
11{ config, lib, pkgs, ... }:
22
3−with lib;
4−
53let
6− ecfg = config.services.earlyoom;
4+ cfg = config.services.earlyoom;
5+
6+ inherit (lib)
7+ mkDefault mkEnableOption mkIf mkOption types
8+ mkRemovedOptionModule literalExpression
9+ escapeShellArg concatStringsSep optional optionalString;
10+
711in
812{
9− options = {
10− services.earlyoom = {
11−
12− enable = mkOption {
13− type = types.bool;
14− default = false;
15− description = ''
16− Enable early out of memory killing.
17− '';
18− };
13+ options.services.earlyoom = {
14+ enable = mkEnableOption "Early out of memory killing";
1915
20− freeMemThreshold = mkOption {
21− type = types.int;
22− default = 10;
23− description = ''
24− Minimum of availabe memory (in percent).
25− If the free memory falls below this threshold and the analog is true for
26− <option>services.earlyoom.freeSwapThreshold</option>
27− the killing begins.
28− '';
29− };
16+ freeMemThreshold = mkOption {
17+ type = types.ints.between 1 100;
18+ default = 10;
19+ description = ''
20+ Minimum available memory (in percent).
3021
31− freeSwapThreshold = mkOption {
32− type = types.int;
33− default = 10;
34− description = ''
35− Minimum of availabe swap space (in percent).
36− If the available swap space falls below this threshold and the analog
37− is true for <option>services.earlyoom.freeMemThreshold</option>
38− the killing begins.
39− '';
40− };
22+ If the available memory falls below this threshold (and the analog is true for
23+ <option>freeSwapThreshold</option>) the killing begins.
24+ SIGTERM is sent first to the process that uses the most memory; then, if the available
25+ memory falls below <option>freeMemKillThreshold</option> (and the analog is true for
26+ <option>freeSwapKillThreshold</option>), SIGKILL is sent.
4127
42− useKernelOOMKiller= mkOption {
43− type = types.bool;
44− default = false;
45− description = ''
46− Use kernel OOM killer instead of own user-space implementation.
47− '';
48− };
28+ See <link xlink:href="https://github.com/rfjakob/earlyoom#command-line-options">README</link> for details.
29+ '';
30+ };
4931
50− ignoreOOMScoreAdjust = mkOption {
51− type = types.bool;
52− default = false;
53− description = ''
54− Ignore oom_score_adjust values of processes.
55− User-space implementation only.
56− '';
57− };
32+ freeMemKillThreshold = mkOption {
33+ type = types.nullOr (types.ints.between 1 100);
34+ default = null;
35+ description = ''
36+ Minimum available memory (in percent) before sending SIGKILL.
37+ If unset, this defaults to half of <option>freeMemThreshold</option>.
5838
59− enableDebugInfo = mkOption {
60− type = types.bool;
61− default = false;
62− description = ''
63− Enable debugging messages.
64− '';
65− };
39+ See the description of <xref linkend="opt-services.earlyoom.freeMemThreshold"/>.
40+ '';
41+ };
6642
67− notificationsCommand = mkOption {
68− type = types.nullOr types.str;
69− default = null;
70− description = ''
71− This option is deprecated and ignored by earlyoom since 1.6.
72− Use <option>services.earlyoom.enableNotifications</option> instead.
73− '';
74− };
43+ freeSwapThreshold = mkOption {
44+ type = types.ints.between 1 100;
45+ default = 10;
46+ description = ''
47+ Minimum free swap space (in percent) before sending SIGTERM.
7548
76− enableNotifications = mkOption {
77− type = types.bool;
78− default = false;
79− description = ''
80− Send notifications about killed processes via the system d-bus.
81− To actually see the notifications in your GUI session, you need to have
82− <literal>systembus-notify</literal> running as your user.
49+ See the description of <xref linkend="opt-services.earlyoom.freeMemThreshold"/>.
50+ '';
51+ };
8352
84− See <link xlink:href="https://github.com/rfjakob/earlyoom#notifications">README</link> for details.
85− '';
86− };
53+ freeSwapKillThreshold = mkOption {
54+ type = types.nullOr (types.ints.between 1 100);
55+ default = null;
56+ description = ''
57+ Minimum free swap space (in percent) before sending SIGKILL.
58+ If unset, this defaults to half of <option>freeSwapThreshold</option>.
59+
60+ See the description of <xref linkend="opt-services.earlyoom.freeMemThreshold"/>.
61+ '';
62+ };
63+
64+ enableDebugInfo = mkOption {
65+ type = types.bool;
66+ default = false;
67+ description = ''
68+ Enable debugging messages.
69+ '';
70+ };
71+
72+ enableNotifications = mkOption {
73+ type = types.bool;
74+ default = false;
75+ description = ''
76+ Send notifications about killed processes via the system d-bus.
77+
78+ WARNING: enabling this option (while convenient) should *not* be done on a
79+ machine where you do not trust the other users as it allows any other
80+ local user to DoS your session by spamming notifications.
81+
82+ To actually see the notifications in your GUI session, you need to have
83+ <literal>systembus-notify</literal> running as your user, which this
84+ option handles by enabling <option>services.systembus-notify</option>.
85+
86+ See <link xlink:href="https://github.com/rfjakob/earlyoom#notifications">README</link> for details.
87+ '';
88+ };
89+
90+ killHook = mkOption {
91+ type = types.nullOr types.path;
92+ default = null;
93+ example = literalExpression ''
94+ pkgs.writeShellScript "earlyoom-kill-hook" '''
95+ echo "Process $EARLYOOM_NAME ($EARLYOOM_PID) was killed" >> /path/to/log
96+ '''
97+ '';
98+ description = ''
99+ An absolute path to an executable to be run for each process killed.
100+ Some environment variables are available, see
101+ <link xlink:href="https://github.com/rfjakob/earlyoom#notifications">README</link> and
102+ <link xlink:href="https://github.com/rfjakob/earlyoom/blob/master/MANPAGE.md#-n-pathtoscript">the man page</link>
103+ for details.
104+ '';
105+ };
106+
107+ reportInterval = mkOption {
108+ type = types.int;
109+ default = 3600;
110+ example = 0;
111+ description = "Interval (in seconds) at which a memory report is printed (set to 0 to disable).";
112+ };
113+
114+ extraArgs = mkOption {
115+ type = types.listOf types.str;
116+ default = [];
117+ example = [ "-g" "--prefer '(^|/)(java|chromium)$'" ];
118+ description = "Extra command-line arguments to be passed to earlyoom.";
87119 };
88120 };
89121
90− config = mkIf ecfg.enable {
91− assertions = [
92− { assertion = ecfg.freeMemThreshold > 0 && ecfg.freeMemThreshold <= 100;
93− message = "Needs to be a positive percentage"; }
94− { assertion = ecfg.freeSwapThreshold > 0 && ecfg.freeSwapThreshold <= 100;
95− message = "Needs to be a positive percentage"; }
96− { assertion = !ecfg.useKernelOOMKiller || !ecfg.ignoreOOMScoreAdjust;
97− message = "Both options in conjunction do not make sense"; }
98− ];
122+ imports = [
123+ (mkRemovedOptionModule [ "services" "earlyoom" "useKernelOOMKiller" ] ''
124+ This option is deprecated and ignored by earlyoom since 1.2.
125+ '')
126+ (mkRemovedOptionModule [ "services" "earlyoom" "notificationsCommand" ] ''
127+ This option was removed in earlyoom 1.6, but was reimplemented in 1.7
128+ and is available as the new option `services.earlyoom.killHook`.
129+ '')
130+ (mkRemovedOptionModule [ "services" "earlyoom" "ignoreOOMScoreAdjust" ] ''
131+ This option is deprecated and ignored by earlyoom since 1.7.
132+ '')
133+ ];
99134
100− warnings = optional (ecfg.notificationsCommand != null)
101− "`services.earlyoom.notificationsCommand` is deprecated and ignored by earlyoom since 1.6.";
135+ config = mkIf cfg.enable {
136+ services.systembus-notify.enable = mkDefault cfg.enableNotifications;
102137
103138 systemd.services.earlyoom = {
104139 description = "Early OOM Daemon for Linux";
105140 wantedBy = [ "multi-user.target" ];
106− path = optional ecfg.enableNotifications pkgs.dbus;
141+ path = optional cfg.enableNotifications pkgs.dbus;
107142 serviceConfig = {
108− StandardOutput = "null";
109143 StandardError = "journal";
110− ExecStart = ''
111− ${pkgs.earlyoom}/bin/earlyoom \
112− -m ${toString ecfg.freeMemThreshold} \
113− -s ${toString ecfg.freeSwapThreshold} \
114− ${optionalString ecfg.useKernelOOMKiller "-k"} \
115− ${optionalString ecfg.ignoreOOMScoreAdjust "-i"} \
116− ${optionalString ecfg.enableDebugInfo "-d"} \
117− ${optionalString ecfg.enableNotifications "-n"}
118− '';
144+ ExecStart = concatStringsSep " " ([
145+ "${pkgs.earlyoom}/bin/earlyoom"
146+ ("-m ${toString cfg.freeMemThreshold}"
147+ + optionalString (cfg.freeMemKillThreshold != null) ",${toString cfg.freeMemKillThreshold}")
148+ ("-s ${toString cfg.freeSwapThreshold}"
149+ + optionalString (cfg.freeSwapKillThreshold != null) ",${toString cfg.freeSwapKillThreshold}")
150+ "-r ${toString cfg.reportInterval}"
151+ ]
152+ ++ optional cfg.enableDebugInfo "-d"
153+ ++ optional cfg.enableNotifications "-n"
154+ ++ optional (cfg.killHook != null) "-N ${escapeShellArg cfg.killHook}"
155+ ++ cfg.extraArgs
156+ );
119157 };
120158 };
121−
122− environment.systemPackages = optional ecfg.enableNotifications pkgs.systembus-notify;
123159 };
124160}
nixos/modules/services/system/self-deploy.nix+3−2
@@ -126,6 +126,8 @@ in
126126
127127 config = lib.mkIf cfg.enable {
128128 systemd.services.self-deploy = {
129+ inherit (cfg) startAt;
130+
129131 wantedBy = [ "multi-user.target" ];
130132
131133 requires = lib.mkIf (!(isPathType cfg.repository)) [ "network-online.target" ];
@@ -138,8 +140,7 @@ in
138140 path = with pkgs; [
139141 git
140142 nix
141− systemd
142− ];
143+ ] ++ lib.optionals (cfg.switchCommand == "boot") [ systemd ];
143144
144145 script = ''
145146 if [ ! -e ${repositoryDirectory} ]; then
nixos/modules/services/system/systembus-notify.nixnew file+27
@@ -0,0 +1,27 @@
1+{ config, lib, pkgs, ... }:
2+
3+let
4+ cfg = config.services.systembus-notify;
5+
6+ inherit (lib) mkEnableOption mkIf;
7+
8+in
9+{
10+ options.services.systembus-notify = {
11+ enable = mkEnableOption ''
12+ System bus notification support
13+
14+ WARNING: enabling this option (while convenient) should *not* be done on a
15+ machine where you do not trust the other users as it allows any other
16+ local user to DoS your session by spamming notifications.
17+ '';
18+ };
19+
20+ config = mkIf cfg.enable {
21+ systemd = {
22+ packages = with pkgs; [ systembus-notify ];
23+
24+ user.services.systembus-notify.wantedBy = [ "graphical-session.target" ];
25+ };
26+ };
27+}
nixos/modules/services/video/epgstation/default.nix+180−168
This diff is too big to show here.
nixos/modules/services/video/epgstation/streaming.json+129−108
This diff is too big to show here.
nixos/modules/services/wayland/cage.nix+2
This diff is too big to show here.
nixos/modules/services/web-apps/bookstack.nix+2−2
This diff is too big to show here.
nixos/modules/services/web-apps/dokuwiki.nix+1−1
This diff is too big to show here.
nixos/modules/services/web-apps/ethercalc.nixnew file+62
This diff is too big to show here.
nixos/modules/services/web-apps/jirafeau.nix+1−1
This diff is too big to show here.
nixos/modules/services/web-apps/keycloak.nix+25−5
This diff is too big to show here.
nixos/modules/services/web-apps/mastodon.nix+1
This diff is too big to show here.
nixos/modules/services/web-apps/matomo.nix+1
This diff is too big to show here.
nixos/modules/services/web-apps/miniflux.nix+26−29
This diff is too big to show here.
nixos/modules/services/web-apps/nextcloud.nix+3−13
This diff is too big to show here.
nixos/modules/services/web-apps/peertube.nix+11−1
This diff is too big to show here.
nixos/modules/services/web-apps/plantuml-server.nix+18−3
This diff is too big to show here.
nixos/modules/services/web-apps/plausible.nix+7−8
This diff is too big to show here.
nixos/modules/services/web-apps/restya-board.nix+1−1
This diff is too big to show here.
nixos/modules/services/web-apps/rss-bridge.nix+1−1
This diff is too big to show here.
nixos/modules/services/web-servers/agate.nixnew file+148
This diff is too big to show here.
nixos/modules/services/web-servers/nginx/default.nix+14−1
This diff is too big to show here.
nixos/modules/services/web-servers/nginx/gitweb.nix+1−1
This diff is too big to show here.
nixos/modules/services/web-servers/pomerium.nix+7−3
This diff is too big to show here.
nixos/modules/services/web-servers/shellinabox.nixdeleted−122
This diff is too big to show here.
nixos/modules/services/web-servers/tomcat.nix+4−3
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/default.nix+1−1
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/gnome.nix+7−58
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/gnome.xml−9
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/mate.nix+5−6
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/pantheon.nix+8−6
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/pantheon.xml+2−2
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/plasma5.nix+4−3
This diff is too big to show here.
nixos/modules/services/x11/desktop-managers/retroarch.nixnew file+40
This diff is too big to show here.
nixos/modules/services/x11/display-managers/default.nix+1
This diff is too big to show here.
nixos/modules/services/x11/display-managers/gdm.nix+4−25
This diff is too big to show here.
nixos/modules/services/x11/display-managers/lightdm.nix+2
This diff is too big to show here.
nixos/modules/services/x11/xserver.nix−3
This diff is too big to show here.
nixos/modules/system/activation/switch-to-configuration.plmode 100644 → 100755+601−266
This diff is too big to show here.
nixos/modules/system/activation/top-level.nix+49−16
This diff is too big to show here.
nixos/modules/system/boot/binfmt.nix+5−8
This diff is too big to show here.
nixos/modules/system/boot/kernel.nix+1−1
This diff is too big to show here.
nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py+16−5
This diff is too big to show here.
nixos/modules/system/boot/modprobe.nix+2−20
This diff is too big to show here.
nixos/modules/system/boot/stage-1-init.sh+3
This diff is too big to show here.
nixos/modules/system/boot/stage-1.nix+4−4
This diff is too big to show here.
nixos/modules/system/boot/systemd.nix+42−651
This diff is too big to show here.
nixos/modules/system/boot/systemd/coredump.nixnew file+57
This diff is too big to show here.
nixos/modules/system/boot/systemd/journald.nixnew file+131
This diff is too big to show here.
nixos/modules/system/boot/systemd/logind.nixnew file+114
This diff is too big to show here.
nixos/modules/system/boot/systemd-nspawn.nix → nixos/modules/system/boot/systemd/nspawn.nixrenamed−8
This diff is too big to show here.
nixos/modules/system/boot/systemd/tmpfiles.nixnew file+104
This diff is too big to show here.
nixos/modules/system/boot/systemd/user.nixnew file+158
This diff is too big to show here.
nixos/modules/system/boot/tmp.nix+6−1
This diff is too big to show here.
nixos/modules/system/build.nixnew file+21
This diff is too big to show here.
nixos/modules/system/etc/etc-activation.nixnew file+12
This diff is too big to show here.
nixos/modules/system/etc/etc.nix+3−3
This diff is too big to show here.
nixos/modules/system/etc/test.nixnew file+70
This diff is too big to show here.
nixos/modules/tasks/auto-upgrade.nix+71−12
This diff is too big to show here.
nixos/modules/tasks/filesystems.nix+1−1
This diff is too big to show here.
nixos/modules/tasks/filesystems/apfs.nixnew file+22
This diff is too big to show here.
nixos/modules/tasks/network-interfaces-scripted.nix+2
This diff is too big to show here.
nixos/modules/tasks/network-interfaces-systemd.nix+2
This diff is too big to show here.
nixos/modules/tasks/network-interfaces.nix+26−13
This diff is too big to show here.
nixos/modules/testing/test-instrumentation.nix+4
This diff is too big to show here.
nixos/modules/virtualisation/amazon-image.nix+6−1
This diff is too big to show here.
nixos/modules/virtualisation/containerd.nix+1
This diff is too big to show here.
nixos/modules/virtualisation/docker-rootless.nix+5−1
This diff is too big to show here.
nixos/modules/virtualisation/fetch-instance-ssh-keys.bashdeleted−36
This diff is too big to show here.
nixos/modules/virtualisation/google-compute-config.nix+32−103
This diff is too big to show here.
nixos/modules/virtualisation/kvmgt.nix+1−1
This diff is too big to show here.
nixos/modules/virtualisation/oci-containers.nix+6−4
This diff is too big to show here.
nixos/modules/virtualisation/openstack-metadata-fetcher.nix+2−1
This diff is too big to show here.
nixos/modules/virtualisation/openvswitch.nix+8−53
This diff is too big to show here.
nixos/modules/virtualisation/proxmox-lxc.nixnew file+64
This diff is too big to show here.
nixos/modules/virtualisation/qemu-vm.nix+13−2
This diff is too big to show here.
nixos/modules/virtualisation/virtualbox-guest.nix+1−1
This diff is too big to show here.
nixos/modules/virtualisation/waydroid.nix+4−2
This diff is too big to show here.
nixos/release-combined.nix+2−2
This diff is too big to show here.
nixos/release-small.nix+4−2
This diff is too big to show here.
nixos/tests/all-tests.nix+33−7
This diff is too big to show here.
nixos/tests/apfs.nixnew file+54
This diff is too big to show here.
nixos/tests/avahi.nix+1−1
This diff is too big to show here.
nixos/tests/bcachefs.nix+6−7
This diff is too big to show here.
nixos/tests/bird.nixnew file+129
This diff is too big to show here.
nixos/tests/blocky.nixnew file+34
This diff is too big to show here.
nixos/tests/boot.nix−1
This diff is too big to show here.
nixos/tests/bpf.nix+5−1
This diff is too big to show here.
nixos/tests/breitbandmessung.nixnew file+33
This diff is too big to show here.
nixos/tests/caddy.nix+3−3
This diff is too big to show here.
nixos/tests/ceph-multi-node.nix+1−1
This diff is too big to show here.
nixos/tests/chromium.nix+20−18
This diff is too big to show here.
nixos/tests/cloud-init.nix+26−1
This diff is too big to show here.
nixos/tests/cntr.nix+16−4
This diff is too big to show here.
nixos/tests/containers-imperative.nix+2−2
This diff is too big to show here.
nixos/tests/cri-o.nix+1−1
This diff is too big to show here.
nixos/tests/doh-proxy-rust.nix+1−1
This diff is too big to show here.
nixos/tests/earlyoom.nixnew file+16
This diff is too big to show here.
nixos/tests/empty-filenew file
No changes to the content.
nixos/tests/geth.nix+1−1
This diff is too big to show here.
nixos/tests/gitolite-fcgiwrap.nix+2−2
This diff is too big to show here.
nixos/tests/google-oslogin/default.nix+2−2
This diff is too big to show here.
nixos/tests/google-oslogin/server.nix+1−3
This diff is too big to show here.
nixos/tests/google-oslogin/server.pymode 100644 → 100755
Only the mode changed.
nixos/tests/hadoop/default.nixnew file+7
This diff is too big to show here.
nixos/tests/hadoop/hadoop.nix+150−123
This diff is too big to show here.
nixos/tests/hadoop/hdfs.nix+43−18
This diff is too big to show here.
nixos/tests/hadoop/yarn.nix+21−13
This diff is too big to show here.
nixos/tests/haproxy.nix−1
This diff is too big to show here.
nixos/tests/hardened.nix+1−1
This diff is too big to show here.
nixos/tests/hibernate.nix+5−5
This diff is too big to show here.
nixos/tests/home-assistant.nix+78−35
This diff is too big to show here.
nixos/tests/hydra/common.nix+1−1
This diff is too big to show here.
nixos/tests/input-remapper.nixnew file+52
This diff is too big to show here.
nixos/tests/installed-tests/appstream-qt.nixnew file+9
This diff is too big to show here.
nixos/tests/installed-tests/appstream.nixnew file+9
This diff is too big to show here.
nixos/tests/installed-tests/default.nix+2
This diff is too big to show here.
nixos/tests/installed-tests/flatpak.nix+1
This diff is too big to show here.
nixos/tests/installed-tests/gjs.nix+6
This diff is too big to show here.
nixos/tests/installer.nix+9−5
This diff is too big to show here.
nixos/tests/ipfs.nix+5
This diff is too big to show here.
nixos/tests/iscsi-multipath-root.nix+5−5
This diff is too big to show here.
nixos/tests/iscsi-root.nix+5−5
This diff is too big to show here.
nixos/tests/jitsi-meet.nix+2−2
This diff is too big to show here.
nixos/tests/keepassxc.nix+42−8
This diff is too big to show here.
nixos/tests/keycloak.nix+20−4
This diff is too big to show here.
nixos/tests/kubernetes/base.nix+2−2
This diff is too big to show here.
nixos/tests/kubernetes/rbac.nix+2−2
This diff is too big to show here.
nixos/tests/logrotate.nixnew file+37
This diff is too big to show here.
nixos/tests/matrix-appservice-irc.nix+25−21
This diff is too big to show here.
nixos/tests/matrix-synapse.nix+46−18
This diff is too big to show here.
nixos/tests/matrix/mjolnir.nix+24−19
This diff is too big to show here.
nixos/tests/matrix/pantalaimon.nix+26−3
This diff is too big to show here.
nixos/tests/minidlna.nix+4−2
This diff is too big to show here.
nixos/tests/miniflux.nix+18−6
This diff is too big to show here.
nixos/tests/misc.nix+3−3
This diff is too big to show here.
nixos/tests/moonraker.nixnew file+45
This diff is too big to show here.
nixos/tests/moosefs.nixnew file+89
This diff is too big to show here.
nixos/tests/mpd.nix+1−1
This diff is too big to show here.
nixos/tests/mysql/common.nix+1−1
This diff is too big to show here.
nixos/tests/mysql/mysql.nix+1−1
This diff is too big to show here.
nixos/tests/nano.nixdeleted−44
This diff is too big to show here.
nixos/tests/nats.nix+11−13
This diff is too big to show here.
nixos/tests/nbd.nixnew file+87
This diff is too big to show here.
nixos/tests/networking.nix+51−6
This diff is too big to show here.
nixos/tests/nextcloud/default.nix+1−1
This diff is too big to show here.
nixos/tests/nginx-modsecurity.nixnew file+39
This diff is too big to show here.
nixos/tests/nix-ld.nixnew file+20
This diff is too big to show here.
nixos/tests/nixops/default.nix+2−2
This diff is too big to show here.
nixos/tests/nixops/legacy/base-configuration.nix+1−1
This diff is too big to show here.
nixos/tests/noto-fonts.nixnew file+44
This diff is too big to show here.
nixos/tests/os-prober.nix+5−5
This diff is too big to show here.
nixos/tests/pacemaker.nixnew file+110
This diff is too big to show here.
nixos/tests/pgadmin4-standalone.nixnew file+43
This diff is too big to show here.
nixos/tests/pgadmin4.nixnew file+142
This diff is too big to show here.
nixos/tests/php/fpm.nix+1−1
This diff is too big to show here.
nixos/tests/plausible.nix+3
This diff is too big to show here.
nixos/tests/pleroma.nix+2−18
This diff is too big to show here.
nixos/tests/podman/default.nix+1−1
This diff is too big to show here.
nixos/tests/podman/tls-ghostunnel.nix+1−1
This diff is too big to show here.
nixos/tests/prometheus-exporters.nix+31−1
This diff is too big to show here.
nixos/tests/retroarch.nixnew file+49
This diff is too big to show here.
nixos/tests/rstudio-server.nix−6
This diff is too big to show here.
nixos/tests/shiori.nix−1
This diff is too big to show here.
nixos/tests/sourcehut.nix+17−2
This diff is too big to show here.
nixos/tests/ssh-keys.nix+1−1
This diff is too big to show here.
nixos/tests/step-ca.nix+2−2
This diff is too big to show here.
nixos/tests/sudo.nix+4
This diff is too big to show here.
nixos/tests/sway.nix+19−10
This diff is too big to show here.
nixos/tests/switch-test.nix+674−25
This diff is too big to show here.
nixos/tests/systemd-confinement.nix+26−3
This diff is too big to show here.
nixos/tests/systemd-escaping.nixnew file+45
This diff is too big to show here.
nixos/tests/systemd-machinectl.nixnew file+85
This diff is too big to show here.
nixos/tests/systemd-unit-path.nix → nixos/tests/systemd-misc.nixrenamed+16−1
This diff is too big to show here.
nixos/tests/systemd-networkd-ipv6-prefix-delegation.nix+5−14
This diff is too big to show here.
nixos/tests/teeworlds.nix+2−2
This diff is too big to show here.
nixos/tests/terminal-emulators.nixnew file+207
This diff is too big to show here.
nixos/tests/tinywl.nix+1
This diff is too big to show here.
nixos/tests/tomcat.nixnew file+21
This diff is too big to show here.
nixos/tests/tor.nix+10−15
This diff is too big to show here.
nixos/tests/unifi.nix+2−1
This diff is too big to show here.
nixos/tests/vscodium.nix+4−5
This diff is too big to show here.
nixos/tests/vsftpd.nixnew file+42
This diff is too big to show here.
nixos/tests/web-apps/mastodon.nixnew file+170
This diff is too big to show here.
nixos/tests/web-apps/peertube.nix+3
This diff is too big to show here.
nixos/tests/web-servers/agate.nixnew file+29
This diff is too big to show here.
nixos/tests/wine.nix+11−4
This diff is too big to show here.
nixos/tests/without-nix.nix+15−6
This diff is too big to show here.
nixos/tests/wpa_supplicant.nix+17−2
This diff is too big to show here.
nixos/tests/xmpp/prosody-mysql.nixnew file+124
This diff is too big to show here.
nixos/tests/xmpp/prosody.nix+1
This diff is too big to show here.
nixos/tests/xxh.nixnew file+67
This diff is too big to show here.
nixos/tests/zammad.nixnew file+60
This diff is too big to show here.
pkgs/applications/accessibility/contrast/default.nix+14−14
This diff is too big to show here.
pkgs/applications/accessibility/squeekboard/default.nix+8−15
This diff is too big to show here.
pkgs/applications/audio/ChowCentaur/default.nixnew file+53
This diff is too big to show here.
pkgs/applications/audio/airwave/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/aj-snapshot/default.nix+2−3
This diff is too big to show here.
pkgs/applications/audio/ams/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/audacity/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/bitwig-studio/bitwig-studio2.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/bitwig-studio/bitwig-studio4.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/callaudiod/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/cantata/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/cardinal/default.nixnew file+76
This diff is too big to show here.
pkgs/applications/audio/carla/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/cider/default.nixnew file+30
This diff is too big to show here.
pkgs/applications/audio/clerk/default.nix+19−6
This diff is too big to show here.
pkgs/applications/audio/cmt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/cozy/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/csound/default.nix+4−4
This diff is too big to show here.
pkgs/applications/audio/cyanrip/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/deadbeef/default.nix−1
This diff is too big to show here.
pkgs/applications/audio/dfasma/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/easyeffects/default.nix+10−8
This diff is too big to show here.
pkgs/applications/audio/eteroj.lv2/default.nixdeleted−23
This diff is too big to show here.
pkgs/applications/audio/fomp/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/freac/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/freewheeling/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/friture/default.nix+3−12
This diff is too big to show here.
pkgs/applications/audio/ft2-clone/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/furnace/default.nixnew file+100
This diff is too big to show here.
pkgs/applications/audio/game-music-emu/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/geonkick/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/gnome-podcasts/default.nix+11
This diff is too big to show here.
pkgs/applications/audio/goattracker/default.nix+2−3
This diff is too big to show here.
pkgs/applications/audio/gpodder/default.nix+9−4
This diff is too big to show here.
pkgs/applications/audio/gpodder/disable-autoupdate.patch+8−29
This diff is too big to show here.
pkgs/applications/audio/helvum/default.nix+6−19
This diff is too big to show here.
pkgs/applications/audio/hybridreverb2/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/indicator-sound-switcher/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/jamesdsp/default.nixnew file+60
This diff is too big to show here.
pkgs/applications/audio/jamin/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/jamulus/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/japa/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/jellycli/default.nixnew file+33
This diff is too big to show here.
pkgs/applications/audio/jellycli/fix-test-dir.patchnew file+13
This diff is too big to show here.
pkgs/applications/audio/jmusicbot/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/kid3/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/lv2lint/default.nixnew file+22
This diff is too big to show here.
pkgs/applications/audio/lyrebird/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/magnetophonDSP/faustCompressors/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/mid2key/default.nix+7−4
This diff is too big to show here.
pkgs/applications/audio/midas/generic.nix+4−5
This diff is too big to show here.
pkgs/applications/audio/milkytracker/default.nix+6
This diff is too big to show here.
pkgs/applications/audio/mixxx/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/mopidy/youtube.nix+6−5
This diff is too big to show here.
pkgs/applications/audio/mopidy/ytmusic.nix+11−2
This diff is too big to show here.
pkgs/applications/audio/mpc/default.nix+40−12
This diff is too big to show here.
pkgs/applications/audio/munt/default.nixdeleted−50
This diff is too big to show here.
pkgs/applications/audio/munt/libmt32emu.nixnew file+38
This diff is too big to show here.
pkgs/applications/audio/munt/mt32emu-qt.nixnew file+75
This diff is too big to show here.
pkgs/applications/audio/munt/mt32emu-smf2wav.nixnew file+50
This diff is too big to show here.
pkgs/applications/audio/musescore/darwin.nix−1
This diff is too big to show here.
pkgs/applications/audio/musescore/default.nix−1
This diff is too big to show here.
pkgs/applications/audio/netease-cloud-music-gtk/default.nix−1
This diff is too big to show here.
pkgs/applications/audio/new-session-manager/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/ocenaudio/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/eteroj.nixnew file+10
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/generic.nixnew file+37
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/jit.nixnew file+12
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/mephisto.nixnew file+17
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/midi_matrix.nixnew file+10
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/moony.nixnew file+13
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/orbit.nixnew file+12
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/patchmatrix.nixnew file+13
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/router.nixnew file+11
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/sherlock.nixnew file+12
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/synthpod.nixnew file+13
This diff is too big to show here.
pkgs/applications/audio/open-music-kontrollers/vm.nixnew file+10
This diff is too big to show here.
pkgs/applications/audio/orca-c/default.nix+3
This diff is too big to show here.
pkgs/applications/audio/parlatype/default.nix−2
This diff is too big to show here.
pkgs/applications/audio/patchmatrix/default.nixdeleted−45
This diff is too big to show here.
pkgs/applications/audio/plexamp/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/plujain-ramp/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/praat/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/psst/default.nixnew file+39
This diff is too big to show here.
pkgs/applications/audio/pt2-clone/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/ptcollab/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/puddletag/default.nix+45−9
This diff is too big to show here.
pkgs/applications/audio/pyradio/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/qmidiarp/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/qmmp/default.nix−1
This diff is too big to show here.
pkgs/applications/audio/qpwgraph/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/r128gain/default.nix+2−8
This diff is too big to show here.
pkgs/applications/audio/reaper/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/redux/default.nixnew file+49
This diff is too big to show here.
pkgs/applications/audio/roomeqwizard/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/rubyripper/default.nix+23−11
This diff is too big to show here.
pkgs/applications/audio/schismtracker/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/shortwave/default.nix+1
This diff is too big to show here.
pkgs/applications/audio/sidplayfp/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/sisco.lv2/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/snd/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/songrec/default.nix+5−4
This diff is too big to show here.
pkgs/applications/audio/sonic-pi/default.nix+58−40
This diff is too big to show here.
pkgs/applications/audio/sony-headphones-client/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/sound-juicer/default.nix+10
This diff is too big to show here.
pkgs/applications/audio/soundconverter/default.nixnew file+85
This diff is too big to show here.
pkgs/applications/audio/soundkonverter/default.nix+1−1
This diff is too big to show here.
pkgs/applications/audio/soundscape-renderer/default.nix+13−11
This diff is too big to show here.
pkgs/applications/audio/spot/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/spotify/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/sptlrx/default.nixnew file+24
This diff is too big to show here.
pkgs/applications/audio/squeezelite/default.nix+48−30
This diff is too big to show here.
pkgs/applications/audio/squishyball/default.nix+21−11
This diff is too big to show here.
pkgs/applications/audio/strawberry/default.nix+3−2
This diff is too big to show here.
pkgs/applications/audio/sunvox/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/synaesthesia/default.nixnew file+33
This diff is too big to show here.
pkgs/applications/audio/tauon/default.nix+17−5
This diff is too big to show here.
pkgs/applications/audio/termusic/default.nixnew file+28
This diff is too big to show here.
pkgs/applications/audio/tonelib-gfx/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/tonelib-jam/default.nix+3−3
This diff is too big to show here.
pkgs/applications/audio/vgmstream/default.nix+21−12
This diff is too big to show here.
pkgs/applications/audio/vgmstream/update.shnew file+77
This diff is too big to show here.
pkgs/applications/audio/vmpk/default.nix+2−2
This diff is too big to show here.
pkgs/applications/audio/vocal/default.nix+7−1
This diff is too big to show here.
pkgs/applications/audio/yoshimi/default.nix+49−18
This diff is too big to show here.
pkgs/applications/audio/zrythm/default.nix+14−13
This diff is too big to show here.
pkgs/applications/backup/deja-dup/default.nix+10−10
This diff is too big to show here.
pkgs/applications/backup/deja-dup/fix-paths.patch+3−3
This diff is too big to show here.
pkgs/applications/backup/vorta/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/aeon/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/alfis/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/besu/default.nixnew file+29
This diff is too big to show here.
pkgs/applications/blockchains/bisq-desktop/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/bitcoin-unlimited/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/btcpayserver/default.nix+5−11
This diff is too big to show here.
pkgs/applications/blockchains/btcpayserver/deps.nix+261−301
This diff is too big to show here.
pkgs/applications/blockchains/chia/default.nix+6−2
This diff is too big to show here.
pkgs/applications/blockchains/clightning/default.nix+13−3
This diff is too big to show here.
pkgs/applications/blockchains/crypto-org-wallet/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/dogecoin/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/electrs/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/elements/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/ergo/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/erigon.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/exodus/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/fulcrum/default.nixnew file+36
This diff is too big to show here.
pkgs/applications/blockchains/go-ethereum/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/ledger-live-desktop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/lightning-loop/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/lightwalletd/default.nix+2−2
This diff is too big to show here.
pkgs/applications/blockchains/litecoin/default.nix+1−2
This diff is too big to show here.
pkgs/applications/blockchains/lnd/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/monero-gui/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/mycrypto/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/namecoin/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/nbxplorer/default.nix+4−4
This diff is too big to show here.
pkgs/applications/blockchains/nbxplorer/deps.nix+6−6
This diff is too big to show here.
pkgs/applications/blockchains/nbxplorer/util/update-common.sh+1−1
This diff is too big to show here.
pkgs/applications/blockchains/oxen/default.nix+4−3
This diff is too big to show here.
pkgs/applications/blockchains/pivx/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/polkadot/default.nix+22−3
This diff is too big to show here.
pkgs/applications/blockchains/snarkos/default.nix+4−4
This diff is too big to show here.
pkgs/applications/blockchains/trezor-suite/default.nix+3−3
This diff is too big to show here.
pkgs/applications/blockchains/wasabiwallet/default.nix+1−1
This diff is too big to show here.
pkgs/applications/blockchains/whirlpool-gui/default.nixdeleted−104
This diff is too big to show here.
pkgs/applications/display-managers/lightdm-enso-os-greeter/default.nix+6−5
This diff is too big to show here.
pkgs/applications/editors/android-studio/common.nix+9−9
This diff is too big to show here.
pkgs/applications/editors/android-studio/default.nix+6−6
This diff is too big to show here.
pkgs/applications/editors/bonzomatic/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/cudatext/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/cudatext/deps.json+16−16
This diff is too big to show here.
pkgs/applications/editors/cudatext/update.sh+1−1
This diff is too big to show here.
pkgs/applications/editors/deadpixi-sam/default.nix+2
This diff is too big to show here.
pkgs/applications/editors/eclipse/build-eclipse.nix+3−2
This diff is too big to show here.
pkgs/applications/editors/ed/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/emacs/elisp-packages/ebuild-mode/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix+345−146
This diff is too big to show here.
pkgs/applications/editors/emacs/elisp-packages/emacs2nix.nix+4−3
This diff is too big to show here.
pkgs/applications/editors/emacs/elisp-packages/emacspeak/default.nix+2−1
This diff is too big to show here.
pkgs/applications/editors/emacs/elisp-packages/nongnu-generated.nix+378−53
This diff is too big to show here.
pkgs/applications/editors/emacs/elisp-packages/recipes-archive-melpa.json+4292−3136
This diff is too big to show here.
pkgs/applications/editors/emacs/generic.nix+6−1
This diff is too big to show here.
pkgs/applications/editors/ghostwriter/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/gnome-builder/default.nix+19−8
This diff is too big to show here.
pkgs/applications/editors/heme/default.nixdeleted−29
This diff is too big to show here.
pkgs/applications/editors/hexdino/default.nix+6−6
This diff is too big to show here.
pkgs/applications/editors/jetbrains/darwin.nixnew file+36
This diff is too big to show here.
pkgs/applications/editors/jetbrains/default.nix+102−97
This diff is too big to show here.
pkgs/applications/editors/jetbrains/common.nix → pkgs/applications/editors/jetbrains/linux.nixrenamed+21−26
This diff is too big to show here.
pkgs/applications/editors/jetbrains/update.pldeleted−101
This diff is too big to show here.
pkgs/applications/editors/jetbrains/update.pynew file+97
This diff is too big to show here.
pkgs/applications/editors/jetbrains/versions.jsonnew file+296
This diff is too big to show here.
pkgs/applications/editors/jove/default.nix+1−1
This diff is too big to show here.
pkgs/applications/editors/jupyter-kernels/octave/default.nix+2−1
This diff is too big to show here.
pkgs/applications/editors/kakoune/plugins/update.py+2−2
This diff is too big to show here.
pkgs/applications/editors/kdevelop5/kdev-php.nix+4−6
This diff is too big to show here.
pkgs/applications/editors/kdevelop5/kdev-python.nix+4−6
This diff is too big to show here.
pkgs/applications/editors/kodestudio/default.nix+1−1
This diff is too big to show here.
pkgs/applications/editors/lapce/default.nixnew file+83
This diff is too big to show here.
pkgs/applications/editors/lapce/fix-version.patchnew file+31
This diff is too big to show here.
pkgs/applications/editors/leo-editor/default.nix+5−7
This diff is too big to show here.
pkgs/applications/editors/lite-xl/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/micro/default.nix+3−1
This diff is too big to show here.
pkgs/applications/editors/micro/test-with-expect.nixnew file+30
This diff is too big to show here.
pkgs/applications/editors/moe/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/monodevelop/default.nixdeleted−81
This diff is too big to show here.
pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patchdeleted−57
This diff is too big to show here.
pkgs/applications/editors/music/tuxguitar/default.nix+3−3
This diff is too big to show here.
pkgs/applications/editors/nano/default.nix+6−4
This diff is too big to show here.
pkgs/applications/editors/nano/test-with-expect.nixnew file+35
This diff is too big to show here.
pkgs/applications/editors/neovim/default.nix+4−2
This diff is too big to show here.
pkgs/applications/editors/neovim/neovide/default.nix+8−6
This diff is too big to show here.
pkgs/applications/editors/neovim/neovide/skia-externals.json+6−6
This diff is too big to show here.
pkgs/applications/editors/netbeans/default.nix+3−3
This diff is too big to show here.
pkgs/applications/editors/nvi/default.nix+1
This diff is too big to show here.
pkgs/applications/editors/okteta/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/pinegrow/default.nixnew file+70
This diff is too big to show here.
pkgs/applications/editors/poke/default.nix+19−2
This diff is too big to show here.
pkgs/applications/editors/quartus-prime/default.nix+2−1
This diff is too big to show here.
pkgs/applications/editors/qxmledit/default.nix+1−1
This diff is too big to show here.
pkgs/applications/editors/rednotebook/default.nix+4−3
This diff is too big to show here.
pkgs/applications/editors/retext/default.nix+37−16
This diff is too big to show here.
pkgs/applications/editors/rstudio/default.nix+7−2
This diff is too big to show here.
pkgs/applications/editors/setzer/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/sigil/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/standardnotes/default.nix+3−3
This diff is too big to show here.
pkgs/applications/editors/sublime/2/default.nix+1−1
This diff is too big to show here.
pkgs/applications/editors/texstudio/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/texworks/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/thonny/default.nix+1−1
This diff is too big to show here.
pkgs/applications/editors/tiled/default.nix+4−4
This diff is too big to show here.
pkgs/applications/editors/vim/common.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/vim/macvim.nix+3−3
This diff is too big to show here.
pkgs/applications/editors/vim/macvim.patch+32−34
This diff is too big to show here.
pkgs/misc/vim-plugins/aliases.nix → pkgs/applications/editors/vim/plugins/aliases.nixrenamed−1
This diff is too big to show here.
pkgs/misc/vim-plugins/build-vim-plugin.nix → pkgs/applications/editors/vim/plugins/build-vim-plugin.nixrenamed
The content is the same.
pkgs/misc/vim-plugins/default.nix → pkgs/applications/editors/vim/plugins/default.nixrenamed
The content is the same.
pkgs/misc/vim-plugins/deprecated.json → pkgs/applications/editors/vim/plugins/deprecated.jsonrenamed
The content is the same.
pkgs/misc/vim-plugins/generated.nix → pkgs/applications/editors/vim/plugins/generated.nixrenamed+1183−859
This diff is too big to show here.
pkgs/misc/vim-plugins/markdown-preview-nvim/fix-node-paths.patch → pkgs/applications/editors/vim/plugins/markdown-preview-nvim/fix-node-paths.patchrenamed
The content is the same.
pkgs/misc/vim-plugins/markdown-preview-nvim/package.json → pkgs/applications/editors/vim/plugins/markdown-preview-nvim/package.jsonrenamed
The content is the same.
pkgs/misc/vim-plugins/overrides.nix → pkgs/applications/editors/vim/plugins/overrides.nixrenamed+103−4
This diff is too big to show here.
pkgs/misc/vim-plugins/patches/fruzzy/get_version.patch → pkgs/applications/editors/vim/plugins/patches/fruzzy/get_version.patchrenamed
The content is the same.
pkgs/misc/vim-plugins/patches/lens-vim/remove_duplicate_g_lens_animate.patch → pkgs/applications/editors/vim/plugins/patches/lens-vim/remove_duplicate_g_lens_animate.patchrenamed
The content is the same.
pkgs/applications/editors/vim/plugins/patches/sniprun/fix-paths.patchnew file+36
This diff is too big to show here.
pkgs/misc/vim-plugins/patches/vim-grammarous/set_default_languagetool.patch → pkgs/applications/editors/vim/plugins/patches/vim-grammarous/set_default_languagetool.patchrenamed
The content is the same.
pkgs/misc/vim-plugins/readme.md → pkgs/applications/editors/vim/plugins/readme.mdrenamed
The content is the same.
pkgs/misc/vim-plugins/update-shell.nix → pkgs/applications/editors/vim/plugins/update-shell.nixrenamed+2−1
This diff is too big to show here.
pkgs/misc/vim-plugins/update.py → pkgs/applications/editors/vim/plugins/update.pyrenamed+6−2
This diff is too big to show here.
pkgs/misc/vim-plugins/vim-gen-doc-hook.sh → pkgs/applications/editors/vim/plugins/vim-gen-doc-hook.shrenamed
The content is the same.
pkgs/misc/vim-plugins/vim-plugin-names → pkgs/applications/editors/vim/plugins/vim-plugin-namesrenamed+30−3
This diff is too big to show here.
pkgs/misc/vim-plugins/vim-utils.nix → pkgs/applications/editors/vim/plugins/vim-utils.nixrenamed+2−1
This diff is too big to show here.
pkgs/misc/vim-plugins/vim2nix/README.txt → pkgs/applications/editors/vim/plugins/vim2nix/README.txtrenamed
The content is the same.
pkgs/misc/vim-plugins/vim2nix/addon-info.json → pkgs/applications/editors/vim/plugins/vim2nix/addon-info.jsonrenamed
The content is the same.
pkgs/misc/vim-plugins/vim2nix/autoload/nix.vim → pkgs/applications/editors/vim/plugins/vim2nix/autoload/nix.vimrenamed
The content is the same.
pkgs/applications/editors/vis/default.nix+4−8
This diff is too big to show here.
pkgs/misc/vscode-extensions/_maintainers/update-bin-srcs-lib.sh → pkgs/applications/editors/vscode/extensions/_maintainers/update-bin-srcs-lib.shrenamed+6−2
This diff is too big to show here.
pkgs/misc/vscode-extensions/cpptools/default.nix → pkgs/applications/editors/vscode/extensions/cpptools/default.nixrenamed+16−4
This diff is too big to show here.
pkgs/misc/vscode-extensions/cpptools/missing_elf_deps.sh → pkgs/applications/editors/vscode/extensions/cpptools/missing_elf_deps.shrenamed
The content is the same.
pkgs/misc/vscode-extensions/cpptools/package-activation-events.json → pkgs/applications/editors/vscode/extensions/cpptools/package-activation-events.jsonrenamed
The content is the same.
pkgs/misc/vscode-extensions/cpptools/update_helper.sh → pkgs/applications/editors/vscode/extensions/cpptools/update_helper.shrenamed
The content is the same.
pkgs/misc/vscode-extensions/default.nix → pkgs/applications/editors/vscode/extensions/default.nixrenamed+359−68
This diff is too big to show here.
pkgs/misc/vscode-extensions/language-packs.nix → pkgs/applications/editors/vscode/extensions/language-packs.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix → pkgs/applications/editors/vscode/extensions/mktplcExtRefToFetchArgs.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/ms-dotnettools-csharp/default.nix → pkgs/applications/editors/vscode/extensions/ms-dotnettools-csharp/default.nixrenamed+20−6
This diff is too big to show here.
pkgs/applications/editors/vscode/extensions/ms-dotnettools-csharp/rt-deps-bin-srcs.jsonnew file+94
This diff is too big to show here.
pkgs/misc/vscode-extensions/ms-dotnettools-csharp/update-bin-srcs → pkgs/applications/editors/vscode/extensions/ms-dotnettools-csharp/update-bin-srcsrenamed+1−1
This diff is too big to show here.
pkgs/misc/vscode-extensions/ms-toolsai-jupyter/default.nix → pkgs/applications/editors/vscode/extensions/ms-toolsai-jupyter/default.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/ms-vsliveshare-vsliveshare/default.nix → pkgs/applications/editors/vscode/extensions/ms-vsliveshare-vsliveshare/default.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/ms-vsliveshare-vsliveshare/noop-syslog.c → pkgs/applications/editors/vscode/extensions/ms-vsliveshare-vsliveshare/noop-syslog.crenamed
The content is the same.
pkgs/misc/vscode-extensions/python/default.nix → pkgs/applications/editors/vscode/extensions/python/default.nixrenamed+9−5
This diff is too big to show here.
pkgs/misc/vscode-extensions/python/extract-nuget.nix → pkgs/applications/editors/vscode/extensions/python/extract-nuget.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/remote-ssh/default.nix → pkgs/applications/editors/vscode/extensions/remote-ssh/default.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/rescript/default.nix → pkgs/applications/editors/vscode/extensions/rescript/default.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/rescript/rescript-editor-analysis.nix → pkgs/applications/editors/vscode/extensions/rescript/rescript-editor-analysis.nixrenamed
The content is the same.
pkgs/applications/editors/vscode/extensions/rust-analyzer/build-deps/package.jsonnew file+19
This diff is too big to show here.
pkgs/misc/vscode-extensions/rust-analyzer/default.nix → pkgs/applications/editors/vscode/extensions/rust-analyzer/default.nixrenamed+3−3
This diff is too big to show here.
pkgs/applications/editors/vscode/extensions/rust-analyzer/update.shnew file+49
This diff is too big to show here.
pkgs/misc/vscode-extensions/terraform/default.nix → pkgs/applications/editors/vscode/extensions/terraform/default.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/terraform/fix-terraform-ls.patch → pkgs/applications/editors/vscode/extensions/terraform/fix-terraform-ls.patchrenamed
The content is the same.
pkgs/misc/vscode-extensions/updateSettings.nix → pkgs/applications/editors/vscode/extensions/updateSettings.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/updateSettingsTest.nix → pkgs/applications/editors/vscode/extensions/updateSettingsTest.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/update_installed_exts.sh → pkgs/applications/editors/vscode/extensions/update_installed_exts.shrenamed+2−2
This diff is too big to show here.
pkgs/misc/vscode-extensions/vscode-lldb/build-deps/package.json → pkgs/applications/editors/vscode/extensions/vscode-lldb/build-deps/package.jsonrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscode-lldb/cmake-build-extension-only.patch → pkgs/applications/editors/vscode/extensions/vscode-lldb/cmake-build-extension-only.patchrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscode-lldb/default.nix → pkgs/applications/editors/vscode/extensions/vscode-lldb/default.nixrenamed+5−5
This diff is too big to show here.
pkgs/misc/vscode-extensions/vscode-lldb/lldb.nix → pkgs/applications/editors/vscode/extensions/vscode-lldb/lldb.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscode-lldb/reset-cargo-config.patch → pkgs/applications/editors/vscode/extensions/vscode-lldb/reset-cargo-config.patchrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscode-lldb/update.sh → pkgs/applications/editors/vscode/extensions/vscode-lldb/update.shrenamed+5−3
This diff is too big to show here.
pkgs/misc/vscode-extensions/vscode-utils.nix → pkgs/applications/editors/vscode/extensions/vscode-utils.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscodeEnv.nix → pkgs/applications/editors/vscode/extensions/vscodeEnv.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscodeEnvTest.nix → pkgs/applications/editors/vscode/extensions/vscodeEnvTest.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscodeExts2nix.nix → pkgs/applications/editors/vscode/extensions/vscodeExts2nix.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix → pkgs/applications/editors/vscode/extensions/vscodeWithConfiguration.nixrenamed
The content is the same.
pkgs/misc/vscode-extensions/wakatime/default.nix → pkgs/applications/editors/vscode/extensions/wakatime/default.nixrenamed+2−2
This diff is too big to show here.
pkgs/applications/editors/vscode/generic.nix+19−26
This diff is too big to show here.
pkgs/applications/editors/vscode/update-shell.nixnew file+18
This diff is too big to show here.
pkgs/applications/editors/vscode/update-vscode.sh+2−2
This diff is too big to show here.
pkgs/applications/editors/vscode/update-vscodium.sh+2−2
This diff is too big to show here.
pkgs/applications/editors/vscode/vscode.nix+6−6
This diff is too big to show here.
pkgs/applications/editors/vscode/vscodium.nix+5−5
This diff is too big to show here.
pkgs/applications/editors/xed-editor/default.nix+2−2
This diff is too big to show here.
pkgs/applications/editors/xxe-pe/default.nix+1−1
This diff is too big to show here.
pkgs/applications/editors/your-editor/default.nix+2−2
This diff is too big to show here.
pkgs/misc/emulators/ares/default.nix → pkgs/applications/emulators/ares/default.nixrenamed
The content is the same.
pkgs/misc/emulators/ares/fix-ruby.patch → pkgs/applications/emulators/ares/fix-ruby.patchrenamed
The content is the same.
pkgs/misc/emulators/atari++/default.nix → pkgs/applications/emulators/atari++/default.nixrenamed
The content is the same.
pkgs/misc/emulators/atari800/default.nix → pkgs/applications/emulators/atari800/default.nixrenamed
The content is the same.
pkgs/misc/emulators/attract-mode/default.nix → pkgs/applications/emulators/attract-mode/default.nixrenamed+2−2
This diff is too big to show here.
pkgs/applications/virtualization/bochs/default.nix → pkgs/applications/emulators/bochs/default.nixrenamed
The content is the same.
pkgs/misc/emulators/bsnes-hd/default.nix → pkgs/applications/emulators/bsnes-hd/default.nixrenamed
The content is the same.
pkgs/misc/emulators/bsnes-hd/macos-copy-app-to-prefix.patch → pkgs/applications/emulators/bsnes-hd/macos-copy-app-to-prefix.patchrenamed
The content is the same.
pkgs/misc/emulators/bsnes-hd/macos-replace-sips-with-png2icns.patch → pkgs/applications/emulators/bsnes-hd/macos-replace-sips-with-png2icns.patchrenamed
The content is the same.
pkgs/misc/emulators/caprice32/default.nix → pkgs/applications/emulators/caprice32/default.nixrenamed
The content is the same.
pkgs/misc/emulators/caprice32/string.patch → pkgs/applications/emulators/caprice32/string.patchrenamed
The content is the same.
pkgs/misc/emulators/ccemux/default.nix → pkgs/applications/emulators/ccemux/default.nixrenamed+1−1
This diff is too big to show here.
pkgs/misc/emulators/cdemu/analyzer.nix → pkgs/applications/emulators/cdemu/analyzer.nixrenamed
The content is the same.
pkgs/misc/emulators/cdemu/base.nix → pkgs/applications/emulators/cdemu/base.nixrenamed
The content is the same.
pkgs/misc/emulators/cdemu/client.nix → pkgs/applications/emulators/cdemu/client.nixrenamed
The content is the same.
pkgs/misc/emulators/cdemu/daemon.nix → pkgs/applications/emulators/cdemu/daemon.nixrenamed
The content is the same.
pkgs/misc/emulators/cdemu/gui.nix → pkgs/applications/emulators/cdemu/gui.nixrenamed
The content is the same.
pkgs/misc/emulators/cdemu/libmirage.nix → pkgs/applications/emulators/cdemu/libmirage.nixrenamed
The content is the same.
pkgs/misc/emulators/cdemu/vhba.nix → pkgs/applications/emulators/cdemu/vhba.nixrenamed+1−1
This diff is too big to show here.
pkgs/misc/emulators/cen64/default.nix → pkgs/applications/emulators/cen64/default.nixrenamed
The content is the same.
pkgs/misc/emulators/citra/default.nix → pkgs/applications/emulators/citra/default.nixrenamed
The content is the same.
pkgs/applications/emulators/collapseos-cvm/default.nixnew file+30
This diff is too big to show here.
pkgs/misc/emulators/commanderx16/emulator.nix → pkgs/applications/emulators/commanderx16/emulator.nixrenamed
The content is the same.
pkgs/misc/emulators/commanderx16/rom.nix → pkgs/applications/emulators/commanderx16/rom.nixrenamed
The content is the same.
pkgs/misc/emulators/commanderx16/run.nix → pkgs/applications/emulators/commanderx16/run.nixrenamed
The content is the same.
pkgs/misc/emulators/craftos-pc/default.nix → pkgs/applications/emulators/craftos-pc/default.nixrenamed
The content is the same.
pkgs/misc/emulators/darcnes/default.nix → pkgs/applications/emulators/darcnes/default.nixrenamed
The content is the same.
pkgs/misc/emulators/darcnes/label.patch → pkgs/applications/emulators/darcnes/label.patchrenamed
The content is the same.
pkgs/misc/emulators/desmume/default.nix → pkgs/applications/emulators/desmume/default.nixrenamed
The content is the same.
pkgs/misc/emulators/dgen-sdl/default.nix → pkgs/applications/emulators/dgen-sdl/default.nixrenamed
The content is the same.
pkgs/misc/emulators/dlx/default.nix → pkgs/applications/emulators/dlx/default.nixrenamed
The content is the same.
pkgs/misc/emulators/dolphin-emu/default.nix → pkgs/applications/emulators/dolphin-emu/default.nixrenamed
The content is the same.
pkgs/misc/emulators/dolphin-emu/master.nix → pkgs/applications/emulators/dolphin-emu/master.nixrenamed+4−4
This diff is too big to show here.
pkgs/misc/emulators/dolphin-emu/primehack.nix → pkgs/applications/emulators/dolphin-emu/primehack.nixrenamed
The content is the same.
pkgs/applications/emulators/dosbox-staging/default.nixnew file+112
This diff is too big to show here.
pkgs/applications/emulators/dosbox/default.nixnew file+75
This diff is too big to show here.
pkgs/misc/emulators/duckstation/default.nix → pkgs/applications/emulators/duckstation/default.nixrenamed+3−3
This diff is too big to show here.
pkgs/applications/virtualization/dynamips/default.nix → pkgs/applications/emulators/dynamips/default.nixrenamed+9−3
This diff is too big to show here.
pkgs/misc/emulators/emu2/default.nix → pkgs/applications/emulators/emu2/default.nixrenamed
The content is the same.
pkgs/misc/emulators/emulationstation/default.nix → pkgs/applications/emulators/emulationstation/default.nixrenamed
The content is the same.
pkgs/misc/emulators/epsxe/default.nix → pkgs/applications/emulators/epsxe/default.nixrenamed
The content is the same.
pkgs/misc/emulators/fakenes/build.patch → pkgs/applications/emulators/fakenes/build.patchrenamed
The content is the same.
pkgs/misc/emulators/fakenes/default.nix → pkgs/applications/emulators/fakenes/default.nixrenamed
The content is the same.
pkgs/misc/emulators/fceux/default.nix → pkgs/applications/emulators/fceux/default.nixrenamed+2−2
This diff is too big to show here.
pkgs/misc/emulators/firebird-emu/default.nix → pkgs/applications/emulators/firebird-emu/default.nixrenamed
The content is the same.
pkgs/misc/emulators/fs-uae/default.nix → pkgs/applications/emulators/fs-uae/default.nixrenamed
The content is the same.
pkgs/misc/emulators/fs-uae/launcher.nix → pkgs/applications/emulators/fs-uae/launcher.nixrenamed
The content is the same.
pkgs/misc/emulators/fuse-emulator/default.nix → pkgs/applications/emulators/fuse-emulator/default.nixrenamed
The content is the same.
pkgs/misc/emulators/gens-gs/default.nix → pkgs/applications/emulators/gens-gs/default.nixrenamed
The content is the same.
pkgs/applications/emulators/goldberg-emu/default.nixnew file+52
This diff is too big to show here.
pkgs/applications/emulators/goldberg-emu/dont-install-unsupported.patchnew file+34
This diff is too big to show here.
pkgs/misc/emulators/gxemul/0001-fix-attributes.patch → pkgs/applications/emulators/gxemul/0001-fix-attributes.patchrenamed
The content is the same.
pkgs/misc/emulators/gxemul/default.nix → pkgs/applications/emulators/gxemul/default.nixrenamed
The content is the same.
pkgs/misc/emulators/hatari/default.nix → pkgs/applications/emulators/hatari/default.nixrenamed
The content is the same.
pkgs/applications/virtualization/hercules/default.nix → pkgs/applications/emulators/hercules/default.nixrenamed+11−2
This diff is too big to show here.
pkgs/misc/emulators/higan/001-include-cmath.patch → pkgs/applications/emulators/higan/001-include-cmath.patchrenamed
The content is the same.
pkgs/misc/emulators/higan/002-sips-to-png2icns.patch → pkgs/applications/emulators/higan/002-sips-to-png2icns.patchrenamed
The content is the same.
pkgs/misc/emulators/higan/default.nix → pkgs/applications/emulators/higan/default.nixrenamed
The content is the same.
pkgs/misc/emulators/kega-fusion/default.nix → pkgs/applications/emulators/kega-fusion/default.nixrenamed
The content is the same.
pkgs/misc/emulators/lambda-delta/default.nix → pkgs/applications/emulators/lambda-delta/default.nixrenamed
The content is the same.
pkgs/misc/emulators/libdsk/default.nix → pkgs/applications/emulators/libdsk/default.nixrenamed+2−2
This diff is too big to show here.
pkgs/misc/emulators/maiko/default.nix → pkgs/applications/emulators/maiko/default.nixrenamed
The content is the same.
pkgs/misc/emulators/mame/default.nix → pkgs/applications/emulators/mame/default.nixrenamed+1−1
This diff is too big to show here.
pkgs/misc/emulators/mame/emuopts.patch → pkgs/applications/emulators/mame/emuopts.patchrenamed
The content is the same.
pkgs/misc/emulators/mednafen/default.nix → pkgs/applications/emulators/mednafen/default.nixrenamed+37−13
This diff is too big to show here.
pkgs/misc/emulators/mednafen/server.nix → pkgs/applications/emulators/mednafen/server.nixrenamed
The content is the same.
pkgs/misc/emulators/mednaffe/default.nix → pkgs/applications/emulators/mednaffe/default.nixrenamed+7−3
This diff is too big to show here.
pkgs/misc/emulators/melonDS/default.nix → pkgs/applications/emulators/melonDS/default.nixrenamed+2−2
This diff is too big to show here.
pkgs/misc/emulators/mgba/default.nix → pkgs/applications/emulators/mgba/default.nixrenamed+4−4
This diff is too big to show here.
pkgs/misc/emulators/mupen64plus/default.nix → pkgs/applications/emulators/mupen64plus/default.nixrenamed
The content is the same.
pkgs/misc/emulators/nestopia/build-fix.patch → pkgs/applications/emulators/nestopia/build-fix.patchrenamed
The content is the same.
pkgs/misc/emulators/nestopia/default.nix → pkgs/applications/emulators/nestopia/default.nixrenamed
The content is the same.
pkgs/misc/emulators/nestopia/gcc6.patch → pkgs/applications/emulators/nestopia/gcc6.patchrenamed
The content is the same.
pkgs/misc/emulators/np2kai/default.nix → pkgs/applications/emulators/np2kai/default.nixrenamed
The content is the same.
pkgs/misc/emulators/oberon-risc-emu/default.nix → pkgs/applications/emulators/oberon-risc-emu/default.nixrenamed
The content is the same.
pkgs/misc/emulators/openmsx/custom-nix.mk → pkgs/applications/emulators/openmsx/custom-nix.mkrenamed
The content is the same.
pkgs/misc/emulators/openmsx/default.nix → pkgs/applications/emulators/openmsx/default.nixrenamed
The content is the same.
pkgs/misc/emulators/pcem/default.nix → pkgs/applications/emulators/pcem/default.nixrenamed
The content is the same.
pkgs/misc/emulators/pcsx2/default.nix → pkgs/applications/emulators/pcsx2/default.nixrenamed
The content is the same.
pkgs/misc/emulators/pcsxr/0001-libpcsxcore-fix-build-with-ffmpeg-4.patch → pkgs/applications/emulators/pcsxr/0001-libpcsxcore-fix-build-with-ffmpeg-4.patchrenamed
The content is the same.
pkgs/misc/emulators/pcsxr/default.nix → pkgs/applications/emulators/pcsxr/default.nixrenamed
The content is the same.
pkgs/misc/emulators/pcsxr/uncompress2.patch → pkgs/applications/emulators/pcsxr/uncompress2.patchrenamed
The content is the same.
pkgs/misc/emulators/ppsspp/default.nix → pkgs/applications/emulators/ppsspp/default.nixrenamed
The content is the same.
pkgs/misc/emulators/proton-caller/default.nix → pkgs/applications/emulators/proton-caller/default.nixrenamed
The content is the same.
pkgs/misc/emulators/punes/default.nix → pkgs/applications/emulators/punes/default.nixrenamed+2−12
This diff is too big to show here.
pkgs/misc/emulators/py65/default.nix → pkgs/applications/emulators/py65/default.nixrenamed
The content is the same.
pkgs/misc/emulators/qmc2/default.nix → pkgs/applications/emulators/qmc2/default.nixrenamed
The content is the same.
pkgs/misc/emulators/reicast/default.nix → pkgs/applications/emulators/reicast/default.nixrenamed
The content is the same.
pkgs/misc/emulators/resim/default.nix → pkgs/applications/emulators/resim/default.nixrenamed
The content is the same.
pkgs/misc/emulators/retroarch/0001-Disable-menu_show_core_updater.patch → pkgs/applications/emulators/retroarch/0001-Disable-menu_show_core_updater.patchrenamed
The content is the same.
pkgs/misc/emulators/retroarch/0002-Use-fixed-paths-on-libretro_info_path.patch → pkgs/applications/emulators/retroarch/0002-Use-fixed-paths-on-libretro_info_path.patchrenamed
The content is the same.
pkgs/misc/emulators/retroarch/cores.nix → pkgs/applications/emulators/retroarch/cores.nixrenamed
The content is the same.
pkgs/misc/emulators/retroarch/default.nix → pkgs/applications/emulators/retroarch/default.nixrenamed+2−2
This diff is too big to show here.
pkgs/misc/emulators/retroarch/disable-menu-show-core-updater.patch → pkgs/applications/emulators/retroarch/disable-menu-show-core-updater.patchrenamed
The content is the same.
pkgs/misc/emulators/retroarch/fix-config.patch → pkgs/applications/emulators/retroarch/fix-config.patchrenamed
The content is the same.
pkgs/misc/emulators/retroarch/fix-libretro-paths.patch → pkgs/applications/emulators/retroarch/fix-libretro-paths.patchrenamed
The content is the same.
pkgs/misc/emulators/retroarch/hashes.json → pkgs/applications/emulators/retroarch/hashes.jsonrenamed
The content is the same.
pkgs/misc/emulators/retroarch/kodi-advanced-launchers.nix → pkgs/applications/emulators/retroarch/kodi-advanced-launchers.nixrenamed
The content is the same.
pkgs/misc/emulators/retroarch/update.py → pkgs/applications/emulators/retroarch/update.pyrenamed
The content is the same.
pkgs/misc/emulators/retroarch/wrapper.nix → pkgs/applications/emulators/retroarch/wrapper.nixrenamed+4−4
This diff is too big to show here.
pkgs/misc/emulators/retrofe/default.nix → pkgs/applications/emulators/retrofe/default.nixrenamed
The content is the same.
pkgs/misc/emulators/retrofe/include-paths.patch → pkgs/applications/emulators/retrofe/include-paths.patchrenamed
The content is the same.
pkgs/applications/emulators/rpcs3/0001-llvm-ExecutionEngine-IntelJITEvents-only-use-ITTAPI_.patchnew file+62
This diff is too big to show here.
pkgs/misc/emulators/rpcs3/default.nix → pkgs/applications/emulators/rpcs3/default.nixrenamed+19−6
This diff is too big to show here.
pkgs/applications/emulators/rpcs3/update.shnew file+59
This diff is too big to show here.
pkgs/misc/emulators/ruffle/default.nix → pkgs/applications/emulators/ruffle/default.nixrenamed+3−3
This diff is too big to show here.
pkgs/applications/emulators/ryujinx/appdir.patchnew file+23
This diff is too big to show here.
pkgs/applications/emulators/ryujinx/default.nixnew file+104
This diff is too big to show here.
pkgs/misc/emulators/ryujinx/deps.nix → pkgs/applications/emulators/ryujinx/deps.nixrenamed+12−11
This diff is too big to show here.
pkgs/applications/emulators/ryujinx/updater.shnew file+59
This diff is too big to show here.
pkgs/misc/emulators/sameboy/default.nix → pkgs/applications/emulators/sameboy/default.nixrenamed
The content is the same.
pkgs/misc/emulators/simh/default.nix → pkgs/applications/emulators/simh/default.nixrenamed
The content is the same.
pkgs/misc/emulators/simplenes/default.nix → pkgs/applications/emulators/simplenes/default.nixrenamed
The content is the same.
pkgs/misc/emulators/snes9x-gtk/default.nix → pkgs/applications/emulators/snes9x-gtk/default.nixrenamed+7−6
This diff is too big to show here.
pkgs/misc/emulators/stella/default.nix → pkgs/applications/emulators/stella/default.nixrenamed
The content is the same.
pkgs/misc/emulators/termtekst/default.nix → pkgs/applications/emulators/termtekst/default.nixrenamed
The content is the same.
pkgs/misc/emulators/tilem/default.nix → pkgs/applications/emulators/tilem/default.nixrenamed
The content is the same.
pkgs/applications/virtualization/tiny8086/default.nix → pkgs/applications/emulators/tiny8086/default.nixrenamed+12−12
This diff is too big to show here.
pkgs/applications/emulators/tinyemu/default.nixnew file+41
This diff is too big to show here.
pkgs/misc/emulators/uae/default.nix → pkgs/applications/emulators/uae/default.nixrenamed
The content is the same.
pkgs/misc/emulators/uxn/default.nix → pkgs/applications/emulators/uxn/default.nixrenamed
The content is the same.
pkgs/misc/emulators/vbam/default.nix → pkgs/applications/emulators/vbam/default.nixrenamed
The content is the same.
pkgs/applications/emulators/vice/default.nixnew file+187
This diff is too big to show here.
pkgs/misc/emulators/wine/base.nix → pkgs/applications/emulators/wine/base.nixrenamed+42−18
This diff is too big to show here.
pkgs/misc/emulators/wine/builder-wow.sh → pkgs/applications/emulators/wine/builder-wow.shrenamed
The content is the same.
pkgs/misc/emulators/wine/cert-path.patch → pkgs/applications/emulators/wine/cert-path.patchrenamed
The content is the same.
pkgs/applications/emulators/wine/darwin-metal-compat.patchnew file+31
This diff is too big to show here.
pkgs/misc/emulators/wine/default.nix → pkgs/applications/emulators/wine/default.nixrenamed+13−17
This diff is too big to show here.
pkgs/misc/emulators/wine/fonts.nix → pkgs/applications/emulators/wine/fonts.nixrenamed
The content is the same.
pkgs/misc/emulators/wine/packages.nix → pkgs/applications/emulators/wine/packages.nixrenamed+9−9
This diff is too big to show here.
pkgs/applications/emulators/wine/setup-hook-darwin.shnew file+37
This diff is too big to show here.
pkgs/misc/emulators/wine/sources.nix → pkgs/applications/emulators/wine/sources.nixrenamed+14−2
This diff is too big to show here.
pkgs/misc/emulators/wine/staging.nix → pkgs/applications/emulators/wine/staging.nixrenamed
The content is the same.
pkgs/misc/emulators/wine/util.nix → pkgs/applications/emulators/wine/util.nixrenamed
The content is the same.
pkgs/misc/emulators/wine/vkd3d.nix → pkgs/applications/emulators/wine/vkd3d.nixrenamed+8−6
This diff is too big to show here.
pkgs/misc/emulators/wine/winetricks.nix → pkgs/applications/emulators/wine/winetricks.nixrenamed
The content is the same.
pkgs/misc/emulators/xcpc/default.nix → pkgs/applications/emulators/xcpc/default.nixrenamed
The content is the same.
pkgs/misc/emulators/yabause/0001-Fixes-for-Qt-5.11-upgrade.patch → pkgs/applications/emulators/yabause/0001-Fixes-for-Qt-5.11-upgrade.patchrenamed
The content is the same.
pkgs/misc/emulators/yabause/default.nix → pkgs/applications/emulators/yabause/default.nixrenamed
The content is the same.
pkgs/misc/emulators/yabause/linkage-rwx-linux-elf.patch → pkgs/applications/emulators/yabause/linkage-rwx-linux-elf.patchrenamed
The content is the same.
pkgs/misc/emulators/yapesdl/default.nix → pkgs/applications/emulators/yapesdl/default.nixrenamed
The content is the same.
pkgs/misc/emulators/yuzu/base.nix → pkgs/applications/emulators/yuzu/base.nixrenamed+1−1
This diff is too big to show here.
pkgs/misc/emulators/yuzu/default.nix → pkgs/applications/emulators/yuzu/default.nixrenamed+4−4
This diff is too big to show here.
pkgs/misc/emulators/zesarux/default.nix → pkgs/applications/emulators/zesarux/default.nixrenamed
The content is the same.
pkgs/misc/emulators/zsnes/default.nix → pkgs/applications/emulators/zsnes/default.nixrenamed+1−1
This diff is too big to show here.
pkgs/applications/finance/irpf/default.nixnew file+66
This diff is too big to show here.
pkgs/applications/finance/odoo/default.nix+7−2
This diff is too big to show here.
pkgs/applications/gis/gmt/dcw.nix+2−2
This diff is too big to show here.
pkgs/applications/gis/gmt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/gis/grass/default.nix+29−15
This diff is too big to show here.
pkgs/applications/gis/qgis/default.nix+10−4
This diff is too big to show here.
pkgs/applications/gis/qgis/ltr.nixnew file+32
This diff is too big to show here.
pkgs/applications/gis/qgis/unwrapped-ltr.nixnew file+153
This diff is too big to show here.
pkgs/applications/gis/qgis/unwrapped.nix+36−11
This diff is too big to show here.
pkgs/applications/graphics/ImageMagick/7.0.nix+52−13
This diff is too big to show here.
pkgs/applications/graphics/antimony/default.nix+3−7
This diff is too big to show here.
pkgs/applications/graphics/avocode/default.nix+3−3
This diff is too big to show here.
pkgs/applications/graphics/azpainter/default.nix+20−11
This diff is too big to show here.
pkgs/applications/graphics/darktable/default.nix+4−14
This diff is too big to show here.
pkgs/applications/graphics/deskew/default.nix+11−9
This diff is too big to show here.
pkgs/applications/graphics/drawio/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/evilpixie/default.nix+4−4
This diff is too big to show here.
pkgs/applications/graphics/feh/default.nix+7−7
This diff is too big to show here.
pkgs/applications/graphics/fig2dev/default.nix+3−1
This diff is too big to show here.
pkgs/applications/graphics/fiji/default.nix+4−9
This diff is too big to show here.
pkgs/applications/graphics/foxotron/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/gcolor3/default.nix+6−2
This diff is too big to show here.
pkgs/applications/graphics/geeqie/default.nix+9−2
This diff is too big to show here.
pkgs/applications/graphics/gimp/default.nix+1
This diff is too big to show here.
pkgs/applications/graphics/gimp/wrapper.nix+2
This diff is too big to show here.
pkgs/applications/graphics/glabels/default.nix+1−1
This diff is too big to show here.
pkgs/applications/graphics/glimpse/default.nix+1
This diff is too big to show here.
pkgs/applications/graphics/glimpse/wrapper.nix+2
This diff is too big to show here.
pkgs/applications/graphics/gnome-obfuscate/default.nixnew file+70
This diff is too big to show here.
pkgs/applications/graphics/gnome-photos/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/gpicview/default.nix−1
This diff is too big to show here.
pkgs/applications/graphics/graphicsmagick/default.nix+17−4
This diff is too big to show here.
pkgs/applications/graphics/gscan2pdf/default.nix+3−3
This diff is too big to show here.
pkgs/applications/graphics/gthumb/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/hdrmerge/default.nixnew file+76
This diff is too big to show here.
pkgs/applications/graphics/hugin/default.nix+2−11
This diff is too big to show here.
pkgs/applications/graphics/hydrus/default.nix+4−2
This diff is too big to show here.
pkgs/applications/graphics/icon-library/default.nix+7−11
This diff is too big to show here.
pkgs/applications/graphics/imagej/default.nix+1−1
This diff is too big to show here.
pkgs/applications/graphics/imlibsetroot/default.nix+13−6
This diff is too big to show here.
pkgs/applications/graphics/inkscape/default.nix+6−22
This diff is too big to show here.
pkgs/applications/graphics/inkscape/extensions.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/ipe/default.nix+4−6
This diff is too big to show here.
pkgs/applications/graphics/lightburn/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/mandelbulber/default.nix+3−3
This diff is too big to show here.
pkgs/applications/graphics/menyoki/default.nix+3−3
This diff is too big to show here.
pkgs/applications/graphics/meshlab/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/mtpaint/default.nix+3−5
This diff is too big to show here.
pkgs/applications/graphics/nomacs/default.nix−1
This diff is too big to show here.
pkgs/applications/graphics/nsxiv/default.nixnew file+61
This diff is too big to show here.
pkgs/applications/graphics/openboard/default.nix+12−3
This diff is too big to show here.
pkgs/applications/graphics/openscad/default.nix+1−2
This diff is too big to show here.
pkgs/applications/graphics/paraview/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/pdfcpu/default.nix+1−1
This diff is too big to show here.
pkgs/applications/graphics/pinta/default.nix+4
This diff is too big to show here.
pkgs/applications/graphics/pixinsight/default.nixnew file+132
This diff is too big to show here.
pkgs/applications/graphics/qiv/default.upstreamdeleted−3
This diff is too big to show here.
pkgs/applications/graphics/renderdoc/default.nix+2−2
This diff is too big to show here.
pkgs/applications/graphics/rnote/default.nixnew file+76
This diff is too big to show here.
pkgs/applications/graphics/skanpage/default.nixnew file+36
This diff is too big to show here.
pkgs/applications/graphics/solvespace/default.nix+63−15
This diff is too big to show here.
pkgs/applications/graphics/swingsane/default.nix+1−1
This diff is too big to show here.
pkgs/applications/graphics/tev/default.nix+3−7
This diff is too big to show here.
pkgs/applications/graphics/unigine-heaven/default.nixnew file+107
This diff is too big to show here.
pkgs/applications/graphics/unigine-superposition/default.nixnew file+146
This diff is too big to show here.
pkgs/applications/graphics/vengi-tools/default.nix+14−21
This diff is too big to show here.
pkgs/applications/graphics/vengi-tools/test-voxconvert-all-formats.nixnew file+15
This diff is too big to show here.
pkgs/applications/graphics/vengi-tools/test-voxconvert-roundtrip.nix+3−3
This diff is too big to show here.
pkgs/applications/graphics/weylus/default.nix+53−38
This diff is too big to show here.
pkgs/applications/graphics/write_stylus/default.nix+1−1
This diff is too big to show here.
pkgs/applications/graphics/xournal/default.nix+5−5
This diff is too big to show here.
pkgs/applications/graphics/xournalpp/default.nix+4−3
This diff is too big to show here.
pkgs/applications/graphics/xrgears/default.nix+14−3
This diff is too big to show here.
pkgs/applications/kde/default.nix+4
This diff is too big to show here.
pkgs/applications/kde/fetch.sh+1−1
This diff is too big to show here.
pkgs/applications/kde/kamoso.nix+1−1
This diff is too big to show here.
pkgs/applications/kde/kio-extras.nix+7
This diff is too big to show here.
pkgs/applications/kde/kitinerary.nix+10−1
This diff is too big to show here.
pkgs/applications/kde/konsole.nix+3−1
This diff is too big to show here.
pkgs/applications/kde/ktorrent.nixnew file+22
This diff is too big to show here.
pkgs/applications/kde/libktorrent.nixnew file+22
This diff is too big to show here.
pkgs/applications/kde/skanlite.nixnew file+18
This diff is too big to show here.
pkgs/applications/kde/srcs.nix+920−920
This diff is too big to show here.
pkgs/applications/kde/zanshin.nixnew file+18
This diff is too big to show here.
pkgs/applications/misc/1password-gui/default.nix+17−4
This diff is too big to show here.
pkgs/applications/misc/1password/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/ArchiSteamFarm/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/ArchiSteamFarm/deps-aarch64-linux.nix+20−19
This diff is too big to show here.
pkgs/applications/misc/ArchiSteamFarm/deps-x86_64-linux.nix+20−19
This diff is too big to show here.
pkgs/applications/misc/ArchiSteamFarm/web-ui/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/ArchiSteamFarm/web-ui/node-packages.nix+658−950
This diff is too big to show here.
pkgs/applications/misc/OSCAR/default.nix+6−4
This diff is too big to show here.
pkgs/applications/misc/abook/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/almanah/default.nix+13−1
This diff is too big to show here.
pkgs/applications/misc/anytype/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/appeditor/default.nix+5
This diff is too big to show here.
pkgs/applications/misc/archivebox/default.nix+15−23
This diff is too big to show here.
pkgs/applications/misc/archivy/default.nix+9−25
This diff is too big to show here.
pkgs/applications/misc/audio/sox/default.nix+14−7
This diff is too big to show here.
pkgs/applications/misc/ausweisapp2/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/auto-multiple-choice/default.nix+2−1
This diff is too big to show here.
pkgs/applications/misc/avizo/default.nix+2−9
This diff is too big to show here.
pkgs/applications/misc/avizo/use-sysconfdir-instead-of-etc.patchdeleted−15
This diff is too big to show here.
pkgs/applications/misc/avrdudess/default.nix+5−4
This diff is too big to show here.
pkgs/applications/misc/azuredatastudio/default.nix+16−20
This diff is too big to show here.
pkgs/applications/misc/batsignal/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/bemenu/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/bicon/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/blender/default.nix+16−15
This diff is too big to show here.
pkgs/applications/misc/bottles/default.nix+31−8
This diff is too big to show here.
pkgs/applications/misc/bottles/update.pynew file+65
This diff is too big to show here.
pkgs/applications/misc/calibre/default.nix+4−6
This diff is too big to show here.
pkgs/applications/misc/cbatticon/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/charm/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/cherrytree/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/clight/clightd.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cloak/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/cobang/0001-Poetry-core-and-pillow-9.patchnew file+31
This diff is too big to show here.
pkgs/applications/misc/cobang/default.nixnew file+102
This diff is too big to show here.
pkgs/applications/misc/cointop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/corectrl/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cpu-x/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/crow-translate/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/crow-translate/dont-fetch-external-libs.patch+1−1
This diff is too big to show here.
pkgs/applications/misc/cubiomes-viewer/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coreaction/default.nix+3−11
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corearchiver/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corefm/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coregarage/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corehunt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coreimage/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coreinfo/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corekeyboard/0001-fix-installPhase.patchnew file+8
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corekeyboard/default.nix+7−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corepad/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corepaint/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corepdf/default.nix+4−3
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corepins/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corerenamer/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coreshot/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corestats/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corestuff/0001-fix-installPhase.patchnew file+11
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/corestuff/default.nix+7−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coreterminal/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coretime/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coretoppings/0001-fix-install-phase.patch+3−3
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coretoppings/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/coreuniverse/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/libcprime/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cubocore-packages/libcsys/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/cura/stable.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/curaengine/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/dasel/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/dbeaver/default.nix+11−14
This diff is too big to show here.
pkgs/applications/misc/ddcui/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/ddgr/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/dmenu/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/dunst/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/dupeguru/default.nix+11−16
This diff is too big to show here.
pkgs/applications/misc/edgetx/default.nixnew file+47
This diff is too big to show here.
pkgs/applications/misc/electron-cash/default.nix+3−2
This diff is too big to show here.
pkgs/applications/misc/electrum-grs/default.nixnew file+129
This diff is too big to show here.
pkgs/applications/misc/electrum/default.nix+6−1
This diff is too big to show here.
pkgs/applications/misc/electrum/ltc.nix+5
This diff is too big to show here.
pkgs/applications/misc/emojipick/default.nixnew file+71
This diff is too big to show here.
pkgs/applications/misc/eos-installer/default.nixnew file+48
This diff is too big to show here.
pkgs/applications/misc/etesync-dav/default.nix+23−7
This diff is too big to show here.
pkgs/applications/misc/eureka-editor/default.nix+10−14
This diff is too big to show here.
pkgs/applications/misc/expenses/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/faircamp/default.nixnew file+56
This diff is too big to show here.
pkgs/applications/misc/faircamp/test-wav.nixnew file+14
This diff is too big to show here.
pkgs/applications/misc/feedbackd/default.nix+13−3
This diff is too big to show here.
pkgs/applications/misc/fetchmail/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/firefly-desktop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/fluidd/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/fme/default.nixdeleted−59
This diff is too big to show here.
pkgs/applications/misc/fnott/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/font-manager/default.nix+2−12
This diff is too big to show here.
pkgs/applications/misc/free42/default.nix+2−4
This diff is too big to show here.
pkgs/applications/misc/fslint/default.nixdeleted−41
This diff is too big to show here.
pkgs/applications/misc/fuzzel/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/gImageReader/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/gallery-dl/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/ganttproject-bin/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/genact/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/geoipupdate/default.nix+5−3
This diff is too big to show here.
pkgs/applications/misc/girara/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/gkrellm/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/gksu/default.nixdeleted−53
This diff is too big to show here.
pkgs/applications/misc/gksu/gksu-2.0.2-glib-2.31.patchdeleted−29
This diff is too big to show here.
pkgs/applications/misc/globe-cli/default.nixnew file+20
This diff is too big to show here.
pkgs/applications/misc/gnome-passwordsafe/default.nix → pkgs/applications/misc/gnome-secrets/default.nixrenamed+22−10
This diff is too big to show here.
pkgs/applications/misc/gnome-solanum/default.nixnew file+70
This diff is too big to show here.
pkgs/applications/misc/golden-cheetah/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/gometer/default.nixnew file+47
This diff is too big to show here.
pkgs/applications/misc/gosmore/default.nix+2−4
This diff is too big to show here.
pkgs/applications/misc/gpsprune/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/gpxsee/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/gramps/default.nix+4
This diff is too big to show here.
pkgs/applications/misc/gremlin-console/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/gremlin-server/default.nixnew file+33
This diff is too big to show here.
pkgs/applications/misc/gsctl/default.nix+12−7
This diff is too big to show here.
pkgs/applications/misc/gxmessage/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/hcl2json/default.nixnew file+27
This diff is too big to show here.
pkgs/applications/misc/hello/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/hivemind/default.nix+5−5
This diff is too big to show here.
pkgs/applications/misc/hubstaff/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/hugo/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/ideamaker/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/index-fm/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/inherd-quake/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/ipmiview/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/iptsd/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/joplin-desktop/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/joshuto/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/josm/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/jotta-cli/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/jrnl/default.nix+6−16
This diff is too big to show here.
pkgs/applications/misc/k40-whisperer/default.nixnew file+74
This diff is too big to show here.
pkgs/applications/misc/kanboard/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/kchmviewer/default.nixnew file+48
This diff is too big to show here.
pkgs/applications/misc/keepass/default.nix+2−5
This diff is too big to show here.
pkgs/applications/misc/keepassx/community.nix+2−1
This diff is too big to show here.
pkgs/applications/misc/klayout/default.nix+8−6
This diff is too big to show here.
pkgs/applications/misc/koreader/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/kratos/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/leetcode-cli/default.nixnew file+41
This diff is too big to show here.
pkgs/applications/misc/lemonade/default.nixnew file+35
This diff is too big to show here.
pkgs/applications/misc/librecad/default.nix+9
This diff is too big to show here.
pkgs/applications/misc/lighthouse/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/limesctl/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/llama/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/logseq/default.nix+5−4
This diff is too big to show here.
pkgs/applications/misc/lscolors/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/lsd2dsl/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/lutris/fhsenv.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/mapproxy/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/markets/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/marktext/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/masterpdfeditor/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/mdzk/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/mediaelch/default.nix+17−5
This diff is too big to show here.
pkgs/applications/misc/megacmd/default.nix+5−10
This diff is too big to show here.
pkgs/applications/misc/megasync/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/mepo/default.nix+6−11
This diff is too big to show here.
pkgs/applications/misc/metadata-cleaner/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/michabo/default.nix−1
This diff is too big to show here.
pkgs/applications/misc/minigalaxy/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/mkgmap/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/mkgmap/splitter/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/mob/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/mobilecoin-wallet/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/moolticute/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/moonlight-qt/default.nix+3−2
This diff is too big to show here.
pkgs/applications/misc/mop/default.nix+8−8
This diff is too big to show here.
pkgs/applications/misc/mucommander/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/mupdf/0001-Use-command-v-in-favor-of-which.patchnew file+25
This diff is too big to show here.
pkgs/applications/misc/mupdf/0002-Add-Darwin-deps.patchnew file+57
This diff is too big to show here.
pkgs/applications/misc/mupdf/1.17.nix−1
This diff is too big to show here.
pkgs/applications/misc/mupdf/default.nix+46−45
This diff is too big to show here.
pkgs/applications/misc/mupdf/default.upstreamdeleted−7
This diff is too big to show here.
pkgs/applications/misc/natural-docs/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/navi/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/neo/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/neo4j-desktop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/nerd-font-patcher/default.nix+9−8
This diff is too big to show here.
pkgs/applications/misc/nix-tour/default.nix+5−4
This diff is too big to show here.
pkgs/applications/misc/notejot/default.nix+4−10
This diff is too big to show here.
pkgs/applications/misc/notejot/use-gtk4-update-icon-cache.patchdeleted−20
This diff is too big to show here.
pkgs/applications/misc/numberstation/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/nut/default.nix−1
This diff is too big to show here.
pkgs/applications/misc/nwg-drawer/default.nix+21−7
This diff is too big to show here.
pkgs/applications/misc/nwg-menu/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/nwg-panel/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/nwg-wrapper/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/obinskit/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/obsidian/default.nix+92−67
This diff is too big to show here.
pkgs/applications/misc/octoprint/default.nix+132−40
This diff is too big to show here.
pkgs/applications/misc/oil-buku/default.nixnew file+44
This diff is too big to show here.
pkgs/applications/misc/openlp/default.nix+2−1
This diff is too big to show here.
pkgs/applications/misc/openrgb/default.nix+3
This diff is too big to show here.
pkgs/applications/misc/opentrack/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/orca/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/osmium-tool/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/otpclient/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/p2pool/default.nix+9−2
This diff is too big to show here.
pkgs/applications/misc/pdfdiff/default.nix+3−5
This diff is too big to show here.
pkgs/applications/misc/pdfmod/default.nixdeleted−49
This diff is too big to show here.
pkgs/applications/misc/pdfpc/default.nix+3−4
This diff is too big to show here.
pkgs/applications/misc/pdfsam-basic/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/pdfstudio/common.nix+2−4
This diff is too big to show here.
pkgs/applications/misc/pdfstudio/default.nix+6−6
This diff is too big to show here.
pkgs/applications/misc/phoc/default.nix+4−3
This diff is too big to show here.
pkgs/applications/misc/plasma-theme-switcher/default.nixnew file+42
This diff is too big to show here.
pkgs/applications/misc/plater/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/playonlinux/default.nix+18−3
This diff is too big to show here.
pkgs/applications/misc/premid/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/prusa-slicer/default.nix+6−6
This diff is too big to show here.
pkgs/applications/misc/prusa-slicer/super-slicer.nix+5−5
This diff is too big to show here.
pkgs/applications/misc/pueue/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/pure-maps/default.nix+5−10
This diff is too big to show here.
pkgs/applications/misc/qMasterPassword/default.nix+11−7
This diff is too big to show here.
pkgs/applications/misc/qcad/default.nix+3−2
This diff is too big to show here.
pkgs/applications/misc/qmetro/default.nix+2−3
This diff is too big to show here.
pkgs/applications/misc/qt-video-wlr/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/ratt/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/regextester/default.nix−1
This diff is too big to show here.
pkgs/applications/misc/remarkable/remarkable-mouse/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/remarkable/rmapi/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/remarkable/rmview/default.nix+2−6
This diff is too big to show here.
pkgs/applications/misc/rivercarro/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/robo3t/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/rofi-emoji/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/rofi-file-browser/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/rofi/default.nix+6−5
This diff is too big to show here.
pkgs/applications/misc/rofi/wayland.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/scli/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/seatd/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/sidequest/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/sigi/default.nix+9−4
This diff is too big to show here.
pkgs/applications/misc/simplenote/default.nix+2−3
This diff is too big to show here.
pkgs/applications/misc/skate/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/sleepyhead/default.nix+2−4
This diff is too big to show here.
pkgs/applications/misc/slic3r/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/slides/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/slmenu/default.nix+10−21
This diff is too big to show here.
pkgs/applications/misc/snapmaker-luban/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/snowsql/default.nix+4−3
This diff is too big to show here.
pkgs/applications/misc/spicetify-cli/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/spotify-tray/default.nix+9−1
This diff is too big to show here.
pkgs/applications/misc/stork/default.nix+10−4
This diff is too big to show here.
pkgs/applications/misc/stretchly/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/subsurface/default.nix+2−1
This diff is too big to show here.
pkgs/applications/misc/surface-control/default.nix+6−5
This diff is too big to show here.
pkgs/applications/misc/survex/default.nix+36−43
This diff is too big to show here.
pkgs/applications/misc/sway-launcher-desktop/default.nixnew file+42
This diff is too big to show here.
pkgs/applications/misc/swaynotificationcenter/default.nixnew file+43
This diff is too big to show here.
pkgs/applications/misc/sweethome3d/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/sweethome3d/editors.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/systembus-notify/default.nix+39−5
This diff is too big to show here.
pkgs/applications/misc/taskwarrior-tui/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/teleprompter/default.nix−1
This diff is too big to show here.
pkgs/applications/misc/ticker/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/tiv/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/todoist-electron/default.nix+4−4
This diff is too big to show here.
pkgs/applications/misc/toggldesktop/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/tomboy/default.nixdeleted−43
This diff is too big to show here.
pkgs/applications/misc/tootle/default.nix+5
This diff is too big to show here.
pkgs/applications/misc/tpmmanager/default.nix+6−5
This diff is too big to show here.
pkgs/applications/misc/trenchbroom/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/tty-share/default.nix+8−6
This diff is too big to show here.
pkgs/applications/misc/tuhi/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/tvbrowser/bin.nix+3−5
This diff is too big to show here.
pkgs/applications/misc/upwork/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/urlscan/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/urlview/default.nix+5−5
This diff is too big to show here.
pkgs/applications/misc/vifm/default.nix−1
This diff is too big to show here.
pkgs/applications/misc/waybar/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/weather/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/wego/default.nix+11−13
This diff is too big to show here.
pkgs/applications/misc/wego/deps.nixdeleted−48
This diff is too big to show here.
pkgs/applications/misc/whalebird/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/wike/default.nix+11−11
This diff is too big to show here.
pkgs/applications/misc/wtf/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/xdg-launch/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/xmind/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/xmr-stak/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/xmrig/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/xmrig/moneroocean.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/xpdf/default.nix+1−2
This diff is too big to show here.
pkgs/applications/misc/xplr/default.nix+3−3
This diff is too big to show here.
pkgs/applications/misc/yambar/default.nix+4−3
This diff is too big to show here.
pkgs/applications/misc/yarssr/default.nixdeleted−81
This diff is too big to show here.
pkgs/applications/misc/yate/default.nix+7−5
This diff is too big to show here.
pkgs/applications/misc/zathura/default.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/zathura/wrapper.nix+1−1
This diff is too big to show here.
pkgs/applications/misc/zettlr/default.nix+2−2
This diff is too big to show here.
pkgs/applications/misc/zscroll/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/aether/default.nix+15−19
This diff is too big to show here.
pkgs/applications/networking/apache-directory-studio/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/appgate-sdp/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/blocky/default.nixnew file+33
This diff is too big to show here.
pkgs/applications/networking/breitbandmessung/default.nixnew file+153
This diff is too big to show here.
pkgs/applications/networking/browsers/bombadillo/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/browsers/brave/default.nix+2−4
This diff is too big to show here.
pkgs/applications/networking/browsers/chromium/common.nix+6−45
This diff is too big to show here.
pkgs/applications/networking/browsers/chromium/default.nix+9−8
This diff is too big to show here.
pkgs/applications/networking/browsers/chromium/patches/m97-ozone-wayland-fix-surface_augmenter.patchdeleted−31
This diff is too big to show here.
pkgs/applications/networking/browsers/chromium/ungoogled-flags.tomlnew file+23
This diff is too big to show here.
pkgs/applications/networking/browsers/chromium/update.py+11
This diff is too big to show here.
pkgs/applications/networking/browsers/chromium/upstream-info.json+30−30
This diff is too big to show here.
pkgs/applications/networking/browsers/falkon/default.nix+2−10
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox-bin/beta_sources.nix+393−393
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox-bin/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox-bin/devedition_sources.nix+393−393
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox-bin/release_sources.nix+393−393
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/common.nix+223−189
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/fix-build-with-wayland-1.20.patchdeleted−13
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/librewolf/default.nixnew file+41
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/librewolf/src.jsonnew file+11
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/librewolf/src.nixnew file+18
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/librewolf/update.nixnew file+65
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/packages.nix+30−5
This diff is too big to show here.
pkgs/applications/networking/browsers/firefox/wrapper.nix+38−44
This diff is too big to show here.
pkgs/applications/networking/browsers/google-chrome/default.nix+8−3
This diff is too big to show here.
pkgs/applications/networking/browsers/icecat-bin/default.nixdeleted−130
This diff is too big to show here.
pkgs/applications/networking/browsers/lagrange/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/browsers/nyxt/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/browsers/opera/default.nix+2−4
This diff is too big to show here.
pkgs/applications/networking/browsers/palemoon/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/browsers/surf/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/browsers/tor-browser-bundle-bin/default.nix+6−4
This diff is too big to show here.
pkgs/applications/networking/browsers/vieb/default.nix+4−4
This diff is too big to show here.
pkgs/applications/networking/browsers/vivaldi/default.nix+7−5
This diff is too big to show here.
pkgs/applications/networking/browsers/vivaldi/ffmpeg-codecs.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/browsers/vivaldi/update.sh+5−1
This diff is too big to show here.
pkgs/applications/networking/browsers/webbrowser/default.nixdeleted−109
This diff is too big to show here.
pkgs/applications/networking/browsers/yandex-browser/default.nix+18−11
This diff is too big to show here.
pkgs/applications/networking/calls/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/cawbird/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/charles/default.nix+10−3
This diff is too big to show here.
pkgs/applications/networking/cisco-packet-tracer/7.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/cisco-packet-tracer/8.nix+4−3
This diff is too big to show here.
pkgs/applications/networking/cloudflared/default.nix+7−7
This diff is too big to show here.
pkgs/applications/networking/cluster/argo-rollouts/default.nixnew file+27
This diff is too big to show here.
pkgs/applications/networking/cluster/argo/default.nix+9−6
This diff is too big to show here.
pkgs/applications/networking/cluster/argocd/default.nix+16−28
This diff is too big to show here.
pkgs/applications/networking/cluster/arkade/default.nix+3−20
This diff is too big to show here.
pkgs/applications/networking/cluster/bosh-cli/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/cilium/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/cloudfoundry-cli/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/clusterctl/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/cmctl/default.nixnew file+38
This diff is too big to show here.
pkgs/applications/networking/cluster/cni/plugins.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/driftctl/default.nix+41−41
This diff is too big to show here.
pkgs/applications/networking/cluster/flink/default.nix+2−3
This diff is too big to show here.
pkgs/applications/networking/cluster/fluxcd/default.nix+4−4
This diff is too big to show here.
pkgs/applications/networking/cluster/fn-cli/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/glooctl/default.nixnew file+36
This diff is too big to show here.
pkgs/applications/networking/cluster/hadoop/default.nix+47−16
This diff is too big to show here.
pkgs/applications/networking/cluster/helm/chart-testing/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/helm/default.nix+6−5
This diff is too big to show here.
pkgs/applications/networking/cluster/helmfile/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/helmsman/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/istioctl/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/k0sctl/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/cluster/k3s/default.nix+147−126
This diff is too big to show here.
pkgs/applications/networking/cluster/k3s/patches/0001-scrips-download-strip-downloading-just-package-CRD.patchnew file+41
This diff is too big to show here.
pkgs/applications/networking/cluster/k3s/patches/0002-Add-nixpkgs-patches.patchdeleted−81
This diff is too big to show here.
pkgs/applications/networking/cluster/k3s/patches/0002-Don-t-build-a-static-binary-in-package-cli.patchnew file+37
This diff is too big to show here.
pkgs/applications/networking/cluster/k3s/update.sh+49−7
This diff is too big to show here.
pkgs/applications/networking/cluster/k3sup/default.nixnew file+48
This diff is too big to show here.
pkgs/applications/networking/cluster/k9s/default.nix+4−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kconf/default.nix+7−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kn/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/kontemplate/default.nix−1
This diff is too big to show here.
pkgs/applications/networking/cluster/kops/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/krane/default.nix−9
This diff is too big to show here.
pkgs/applications/networking/cluster/kube-capacity/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kube-score/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kube3d/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/kubebuilder/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kubeconform/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/kubectl-doctor/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kubedb-cli/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/kubelogin-oidc/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kubelogin/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/kubemqctl/default.nixnew file+25
This diff is too big to show here.
pkgs/applications/networking/cluster/kubent/default.nixnew file+29
This diff is too big to show here.
pkgs/applications/networking/cluster/kubeone/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/kubergrunt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/kubernetes/default.nix+17−16
This diff is too big to show here.
pkgs/applications/networking/cluster/kubernetes/kubectl.nix+18−10
This diff is too big to show here.
pkgs/applications/networking/cluster/kuma/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/lens/default.nix+11−6
This diff is too big to show here.
pkgs/applications/networking/cluster/linkerd/edge.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/minikube/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/nerdctl/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/nixops/default.nix+2
This diff is too big to show here.
pkgs/applications/networking/cluster/nixops/poetry-git-overlay.nix+7−7
This diff is too big to show here.
pkgs/applications/networking/cluster/nixops/poetry.lock+88−117
This diff is too big to show here.
pkgs/applications/networking/cluster/nixops/pyproject.toml+4−1
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad-autoscaler/default.nix+12−14
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad-pack/default.nixnew file+38
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad/1.0.nixdeleted−11
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad/1.1.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad/1.2.nix+4−4
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad/generic.nix+10−5
This diff is too big to show here.
pkgs/applications/networking/cluster/nomad/genericModule.nixdeleted−54
This diff is too big to show here.
pkgs/applications/networking/cluster/octant/default.nix+5−5
This diff is too big to show here.
pkgs/applications/networking/cluster/odo/default.nixnew file+38
This diff is too big to show here.
pkgs/applications/networking/cluster/openshift/default.nix+9−2
This diff is too big to show here.
pkgs/applications/networking/cluster/popeye/default.nix−1
This diff is too big to show here.
pkgs/applications/networking/cluster/qbec/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/sonobuoy/default.nix+4−4
This diff is too big to show here.
pkgs/applications/networking/cluster/spark/default.nix+33−23
This diff is too big to show here.
pkgs/applications/networking/cluster/starboard/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/stern/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/talosctl/default.nixnew file+58
This diff is too big to show here.
pkgs/applications/networking/cluster/tanka/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/tektoncd-cli/default.nix+14−8
This diff is too big to show here.
pkgs/applications/networking/cluster/temporal/default.nix+8−7
This diff is too big to show here.
pkgs/applications/networking/cluster/terraform-providers/default.nix+34−35
This diff is too big to show here.
pkgs/applications/networking/cluster/terraform-providers/providers.json+335−318
This diff is too big to show here.
pkgs/applications/networking/cluster/terraform-providers/update-all-providers+9−6
This diff is too big to show here.
pkgs/applications/networking/cluster/terraform-providers/update-provider+41−44
This diff is too big to show here.
pkgs/applications/networking/cluster/terraform/default.nix+50−9
This diff is too big to show here.
pkgs/applications/networking/cluster/terragrunt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/tfswitch/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cluster/tgswitch/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/tilt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/cluster/vcluster/default.nix+4−4
This diff is too big to show here.
pkgs/applications/networking/cluster/velero/default.nix+4−4
This diff is too big to show here.
pkgs/applications/networking/cluster/waypoint/default.nix+4−6
This diff is too big to show here.
pkgs/applications/networking/cluster/werf/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/cozy-drive/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/dnscontrol/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/dropbox/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/feedreaders/gnome-feeds/default.nix+2
This diff is too big to show here.
pkgs/applications/networking/feedreaders/photon/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/flexget/default.nix+7−4
This diff is too big to show here.
pkgs/applications/networking/ftp/filezilla/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/gmailctl/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/gns3/gui.nix+15−1
This diff is too big to show here.
pkgs/applications/networking/gns3/server.nix+16−1
This diff is too big to show here.
pkgs/applications/networking/hyprspace/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/ids/zeek/default.nix+23−6
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/alfaview/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/bluejeans/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/chatty/default.nix+5−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/cinny/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/coyim/default.nix+1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/deltachat-desktop/default.nix+3−5
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/deltachat-desktop/package.json+1−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/dino/default.nix+12−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/discord/default.nix+37−42
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/discord/linux.nix+3−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/element/element-desktop-package.json+5−4
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/element/element-desktop.nix+30−13
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/element/keytar/default.nix+4
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/element/pin.json+4−4
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/element/seshat/default.nix+5−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/ferdi/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/fluffychat/default.nixnew file+81
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/fractal/default.nix+12−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/franz/generic.nix−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/gajim/default.nix−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/gitter/default.nix+2−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/gomuks/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/gotktrix/default.nixnew file+42
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/gurk-rs/default.nixnew file+30
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/jami/daemon.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/jami/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/jitsi-meet-electron/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/jitsi/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/kdeltachat/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/matrixcli/default.nix+5−5
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/mattermost-desktop/default.nix+86−100
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/mcabber/default.nix−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/mikutter/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/mirage/default.nix+1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/mm/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/neochat/default.nix+9−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/nheko/default.nix+4−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/pantalaimon/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/pidgin-plugins/pidgin-mra/default.nix+8−10
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/pidgin-plugins/telegram-purple/default.nix+6−8
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/pond/default.nix+7−7
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/psi-plus/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/qtox/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/rambox/rambox.nix+1−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/ricochet/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/ripcord/darwin.nixnew file+33
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/ripcord/default.nixmode 100755 → 100644
Only the mode changed.
pkgs/applications/networking/instant-messengers/rocketchat-desktop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/schildichat/pin.json+7−4
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/schildichat/schildichat-desktop.nix+20−20
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/schildichat/schildichat-web.nix+35−10
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/schildichat/update.sh+16−8
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/session-desktop-appimage/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/signal-desktop/default.nix+8−6
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/signalbackup-tools/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/signald/0001-Fetch-buildconfig-during-gradle-build-inside-Nix-FOD.patchnew file+35
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/signald/0002-buildconfig-local-deps-fixes.patchnew file+60
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/signald/default.nix+12−27
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/signald/gradle-plugin.patchdeleted−19
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/sky/default.nixnew file+66
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/skypeforlinux/default.nix+3−4
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/slack/default.nix+31−30
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/slack/update.sh+9−2
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/teams/default.nix+118−77
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/teamspeak/client.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix+205−27
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kotato-10.12-sdk.patchnew file+415
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/shortcuts-binary-path.patchnew file+38
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt-10.12-sdk.patchnew file+55
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix+103−15
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/tdesktop/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/telegram/tdesktop/tg_owt.nix+5−3
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/tensor/default.nix+7−6
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/vk-messenger/default.nix+5−5
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/wavebox/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/wire-desktop/default.nix+2−4
This diff is too big to show here.
pkgs/applications/networking/instant-messengers/zoom-us/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/ipfs-cluster/default.nix+13−4
This diff is too big to show here.
pkgs/applications/networking/ipfs-migrator/all-migrations.nixnew file+63
This diff is too big to show here.
pkgs/applications/networking/ipfs-migrator/default.nix+16−20
This diff is too big to show here.
pkgs/applications/networking/ipfs-migrator/unwrapped.nixnew file+35
This diff is too big to show here.
pkgs/applications/networking/ipfs/default.nix+20−10
This diff is too big to show here.
pkgs/applications/networking/irc/catgirl/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/irc/communi/default.nix+5−4
This diff is too big to show here.
pkgs/applications/networking/irc/hexchat/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/irc/irssi/default.nix+15−5
This diff is too big to show here.
pkgs/applications/networking/irc/irssi/fish/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/irc/kirc/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/irc/quassel/0001-common-Disable-enum-type-stream-operators-for-Qt-5.1.patchdeleted−37
This diff is too big to show here.
pkgs/applications/networking/irc/quassel/default.nix+5−12
This diff is too big to show here.
pkgs/applications/networking/irc/srain/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/irc/tiny/default.nix+8−4
This diff is too big to show here.
pkgs/applications/networking/irc/weechat/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/irc/wraith/configure.patch+2−2
This diff is too big to show here.
pkgs/applications/networking/irc/wraith/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/irc/wraith/dlopen.patch+6−6
This diff is too big to show here.
pkgs/applications/networking/juju/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/lieer/default.nix−1
This diff is too big to show here.
pkgs/applications/networking/maestral-qt/default.nix+4−2
This diff is too big to show here.
pkgs/applications/networking/mailreaders/aerc/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/mailreaders/alot/default.nix+55−33
This diff is too big to show here.
pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/mailreaders/evolution/evolution/default.nix+11−4
This diff is too big to show here.
pkgs/applications/networking/mailreaders/hasmail/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/mailreaders/himalaya/default.nix+10−6
This diff is too big to show here.
pkgs/applications/networking/mailreaders/mutt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/mailreaders/notmuch/default.nix+24−12
This diff is too big to show here.
pkgs/applications/networking/mailreaders/notmuch/test-fix-support-for-gpgsm-in-gnupg-2.3.patchdeleted−28
This diff is too big to show here.
pkgs/applications/networking/mailreaders/thunderbird-bin/release_sources.nix+261−261
This diff is too big to show here.
pkgs/applications/networking/mailreaders/thunderbird/packages.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/mailreaders/tutanota-desktop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/0001-nulldb.patchnew file+15
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/default.nixnew file+141
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/gemset.nixnew file+2608
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/package.jsonnew file+18
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/source.jsonnew file+7
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/update.nixnew file+37
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/update.shnew file+68
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/yarn.locknew file+1275
This diff is too big to show here.
pkgs/applications/networking/misc/zammad/yarn.nixnew file+1549
This diff is too big to show here.
pkgs/applications/networking/mullvad-vpn/default.nix+9−6
This diff is too big to show here.
pkgs/applications/networking/mumble/default.nix+47−73
This diff is too big to show here.
pkgs/applications/networking/mumble/fix-rnnoise-argument.patchdeleted−16
This diff is too big to show here.
pkgs/applications/networking/n8n/default.nix+9−1
This diff is too big to show here.
pkgs/applications/networking/n8n/generate-dependencies.sh+1
This diff is too big to show here.
pkgs/applications/networking/n8n/node-packages.nix+577−392
This diff is too big to show here.
pkgs/applications/networking/nextcloud-client/default.nix+4−2
This diff is too big to show here.
pkgs/applications/networking/nextdns/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/ngadmin/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/novnc/default.nixnew file+30
This diff is too big to show here.
pkgs/applications/networking/opsdroid/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/ostinato/default.nix+6−9
This diff is too big to show here.
pkgs/applications/networking/p2p/dht/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/p2p/fragments/default.nix+55−42
This diff is too big to show here.
pkgs/applications/networking/p2p/fragments/dependency-resolution.patchdeleted−25
This diff is too big to show here.
pkgs/applications/networking/p2p/frostwire/default.nix+7−7
This diff is too big to show here.
pkgs/applications/networking/p2p/frostwire/frostwire-bin.nix+17−4
This diff is too big to show here.
pkgs/applications/networking/p2p/gnunet/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/p2p/ktorrent/default.nixdeleted−32
This diff is too big to show here.
pkgs/applications/networking/p2p/libutp/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/p2p/qbittorrent/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/p2p/transgui/default.nix+3−7
This diff is too big to show here.
pkgs/applications/networking/p2p/tribler/aiohttp-apispec.nixdeleted−37
This diff is too big to show here.
pkgs/applications/networking/p2p/tribler/apispec.nixdeleted−47
This diff is too big to show here.
pkgs/applications/networking/p2p/tribler/default.nix+42−33
This diff is too big to show here.
pkgs/applications/networking/pjsip/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/protonmail-bridge/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/protonvpn-gui/default.nix+30−13
This diff is too big to show here.
pkgs/applications/networking/remote/anydesk/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/remote/freerdp/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/remote/remmina/default.nix+10−6
This diff is too big to show here.
pkgs/applications/networking/remote/rustdesk/cargo.patchnew file+50
This diff is too big to show here.
pkgs/applications/networking/remote/rustdesk/default.nixnew file+104
This diff is too big to show here.
pkgs/applications/networking/remote/teamviewer/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/remote/vmware-horizon-client/default.nix+50−64
This diff is too big to show here.
pkgs/applications/networking/remote/x2goclient/default.nix+36−6
This diff is too big to show here.
pkgs/applications/networking/seafile-client/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/seahub/default.nixnew file+74
This diff is too big to show here.
pkgs/applications/networking/seaweedfs/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/shellhub-agent/default.nix+5−7
This diff is too big to show here.
pkgs/applications/networking/sniffers/sngrep/default.nix+2−13
This diff is too big to show here.
pkgs/applications/networking/sniffers/wireshark/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/soulseek/nicotine-plus/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/ssb-patchwork/default.nix+1−1
This diff is too big to show here.
pkgs/applications/networking/sync/desync/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/sync/onedrive/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/sync/rclone/default.nix+10−5
This diff is too big to show here.
pkgs/applications/networking/sync/unison/default.nix+5−8
This diff is too big to show here.
pkgs/applications/networking/syncthing/default.nix+3−3
This diff is too big to show here.
pkgs/applications/networking/termius/default.nix+8−5
This diff is too big to show here.
pkgs/applications/networking/testssl/default.nix+2−2
This diff is too big to show here.
pkgs/applications/networking/wayback_machine_downloader/Gemfile+2−3
This diff is too big to show here.
pkgs/applications/networking/wayback_machine_downloader/Gemfile.lock+3−3
This diff is too big to show here.
pkgs/applications/networking/wayback_machine_downloader/gemset.nix+2−2
This diff is too big to show here.
pkgs/applications/office/appflowy/default.nix+6−5
This diff is too big to show here.
pkgs/applications/office/autokey/remove-requires-dbus-python.patchdeleted−11
This diff is too big to show here.
pkgs/applications/office/bookworm/default.nix+49−25
This diff is too big to show here.
pkgs/applications/office/elementary-planner/default.nix+14−1
This diff is too big to show here.
pkgs/applications/office/espanso/default.nix+1
This diff is too big to show here.
pkgs/applications/office/foliate/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/gnucash/default.nix+48−25
This diff is too big to show here.
pkgs/applications/office/gnumeric/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/gtg/default.nix+8
This diff is too big to show here.
pkgs/applications/office/homebank/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/impressive/default.nixdeleted−70
This diff is too big to show here.
pkgs/applications/office/jabref/default.nix+3−3
This diff is too big to show here.
pkgs/applications/office/jameica/default.nix+12−11
This diff is too big to show here.
pkgs/applications/office/kalendar/default.nix+4−2
This diff is too big to show here.
pkgs/applications/office/libreoffice/darwin.nixnew file+51
This diff is too big to show here.
pkgs/applications/office/libreoffice/default.nix+12−3
This diff is too big to show here.
pkgs/applications/office/micropad/default.nixnew file+101
This diff is too big to show here.
pkgs/applications/office/micropad/package.jsonnew file+87
This diff is too big to show here.
pkgs/applications/office/micropad/yarn.locknew file+2006
This diff is too big to show here.
pkgs/applications/office/micropad/yarn.nixnew file+2341
This diff is too big to show here.
pkgs/applications/office/mmex/default.nix+26−29
This diff is too big to show here.
pkgs/applications/office/morgen/default.nixnew file+59
This diff is too big to show here.
pkgs/applications/office/paperless-ng/default.nix+29−19
This diff is too big to show here.
pkgs/applications/office/paperwork/openpaperwork-core.nix+1
This diff is too big to show here.
pkgs/applications/office/paperwork/openpaperwork-gtk.nix+1
This diff is too big to show here.
pkgs/applications/office/paperwork/paperwork-gtk.nix+19−3
This diff is too big to show here.
pkgs/applications/office/paperwork/src.nix+2−2
This diff is too big to show here.
pkgs/applications/office/portfolio/default.nix+3−3
This diff is too big to show here.
pkgs/applications/office/pyspread/default.nix+1−1
This diff is too big to show here.
pkgs/applications/office/qownnotes/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/scribus/unstable.nix+35
This diff is too big to show here.
pkgs/applications/office/skanlite/default.nixdeleted−30
This diff is too big to show here.
pkgs/applications/office/skrooge/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/softmaker/desktop_items.nix+72−18
This diff is too big to show here.
pkgs/applications/office/spice-up/default.nix−1
This diff is too big to show here.
pkgs/applications/office/super-productivity/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/timekeeper/default.nixdeleted−44
This diff is too big to show here.
pkgs/applications/office/timeline/default.nix+4−7
This diff is too big to show here.
pkgs/applications/office/treesheets/default.nix+29−31
This diff is too big to show here.
pkgs/applications/office/trilium/0001-Use-console-logger-instead-of-rolling-files.patch+11−42
This diff is too big to show here.
pkgs/applications/office/trilium/default.nix+4−4
This diff is too big to show here.
pkgs/applications/office/tusk/default.nix+1−1
This diff is too big to show here.
pkgs/applications/office/vnote/default.nix+2−2
This diff is too big to show here.
pkgs/applications/office/wpsoffice/default.nix−1
This diff is too big to show here.
pkgs/applications/office/zanshin/default.nixdeleted−38
This diff is too big to show here.
pkgs/applications/office/zotero/default.nix+49−44
This diff is too big to show here.
pkgs/applications/radio/dump1090/default.nix+2−2
This diff is too big to show here.
pkgs/applications/radio/freedv/default.nix+9−6
This diff is too big to show here.
pkgs/applications/radio/gnss-sdr/default.nix+48−29
This diff is too big to show here.
pkgs/applications/radio/gnss-sdr/fix_libcpu_features_install_path.patchnew file+47
This diff is too big to show here.
pkgs/applications/radio/gnuradio/3.8.nix+5−1
This diff is too big to show here.
pkgs/applications/radio/gnuradio/3.9.nix+5−1
This diff is too big to show here.
pkgs/applications/radio/gnuradio/default.nix+10−4
This diff is too big to show here.
pkgs/applications/radio/gnuradio/wrapper.nix+4−3
This diff is too big to show here.
pkgs/applications/radio/gqrx/default.nix+3−4
This diff is too big to show here.
pkgs/applications/radio/qradiolink/default.nix+1−2
This diff is too big to show here.
pkgs/applications/radio/qsstv/default.nix+4−4
This diff is too big to show here.
pkgs/applications/radio/rtl-ais/default.nix+1−1
This diff is too big to show here.
pkgs/applications/radio/sdrangel/default.nix+2−2
This diff is too big to show here.
pkgs/applications/radio/sdrplay/default.nix+1−1
This diff is too big to show here.
pkgs/applications/radio/soapyhackrf/default.nix+2−2
This diff is too big to show here.
pkgs/applications/radio/soapysdrplay/default.nix+2−2
This diff is too big to show here.
pkgs/applications/radio/soundmodem/default.nix+3−3
This diff is too big to show here.
pkgs/applications/radio/svxlink/default.nix+1−1
This diff is too big to show here.
pkgs/applications/radio/urh/default.nix+2−2
This diff is too big to show here.
pkgs/applications/radio/welle-io/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/astronomy/gnuastro/default.nixnew file+36
This diff is too big to show here.
pkgs/applications/science/astronomy/gprojector/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/astronomy/gravit/default.nix+8−6
This diff is too big to show here.
pkgs/applications/science/astronomy/kstars/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/astronomy/phd2/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/astronomy/siril/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/angsd/default.nixnew file+25
This diff is too big to show here.
pkgs/applications/science/biology/bcftools/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/bowtie2/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/febio-studio/default.nixnew file+61
This diff is too big to show here.
pkgs/applications/science/biology/febio-studio/febio-studio-cmake.patchnew file+38
This diff is too big to show here.
pkgs/applications/science/biology/hisat2/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/kallisto/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/last/default.nix+4−4
This diff is too big to show here.
pkgs/applications/science/biology/messer-slim/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/minimap2/default.nix+2−1
This diff is too big to show here.
pkgs/applications/science/biology/mosdepth/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/ncbi-tools/default.nix+3−3
This diff is too big to show here.
pkgs/applications/science/biology/neuron/default.nix+1−1
This diff is too big to show here.
pkgs/applications/science/biology/picard-tools/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/raxml/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/biology/repseek/default.nixnew file+27
This diff is too big to show here.
pkgs/applications/science/biology/spades/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/chemistry/chemtool/default.nix+1
This diff is too big to show here.
pkgs/applications/science/chemistry/d-seams/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/chemistry/jmol/default.nix+12−4
This diff is too big to show here.
pkgs/applications/science/chemistry/marvin/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/chemistry/pymol/default.nix+10−2
This diff is too big to show here.
pkgs/applications/science/computer-architecture/qtrvsim/default.nixnew file+30
This diff is too big to show here.
pkgs/applications/science/electronics/alliance/default.nix+4
This diff is too big to show here.
pkgs/applications/science/electronics/diylc/default.nix+1−1
This diff is too big to show here.
pkgs/applications/science/electronics/eagle/eagle.nix+1−1
This diff is too big to show here.
pkgs/applications/science/electronics/eagle/eagle7.nix+2−2
This diff is too big to show here.
pkgs/applications/science/electronics/gaw/default.nixnew file+34
This diff is too big to show here.
pkgs/applications/science/electronics/kicad/versions.nix+11−11
This diff is too big to show here.
pkgs/applications/science/electronics/lepton-eda/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/electronics/magic-vlsi/0002-fix-format-security.patchdeleted−19
This diff is too big to show here.
pkgs/applications/science/electronics/magic-vlsi/default.nix+2−3
This diff is too big to show here.
pkgs/applications/science/electronics/openhantek6022/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/electronics/verilator/default.nix+13−7
This diff is too big to show here.
pkgs/applications/science/electronics/xcircuit/default.nix+4−8
This diff is too big to show here.
pkgs/applications/science/electronics/xschem/default.nixnew file+46
This diff is too big to show here.
pkgs/applications/science/electronics/xyce/default.nixnew file+182
This diff is too big to show here.
pkgs/applications/science/geometry/gama/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/geometry/tetgen/default.nix+12−5
This diff is too big to show here.
pkgs/applications/science/logic/abc/default.nix+3−3
This diff is too big to show here.
pkgs/applications/science/logic/alt-ergo/default.nix+7−10
This diff is too big to show here.
pkgs/applications/science/logic/anders/default.nixnew file+27
This diff is too big to show here.
pkgs/applications/science/logic/coq/default.nix+12−7
This diff is too big to show here.
pkgs/applications/science/logic/formula/default.nixnew file+32
This diff is too big to show here.
pkgs/applications/science/logic/formula/nuget.nixnew file+77
This diff is too big to show here.
pkgs/applications/science/logic/isabelle/default.nix+37−4
This diff is too big to show here.
pkgs/applications/science/logic/key/default.nix+69−25
This diff is too big to show here.
pkgs/applications/science/logic/lean/default.nix+3−3
This diff is too big to show here.
pkgs/applications/science/logic/leo2/default.upstreamdeleted−6
This diff is too big to show here.
pkgs/applications/science/logic/logisim-evolution/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/logic/logisim/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/logic/naproche/default.nixnew file+38
This diff is too big to show here.
pkgs/applications/science/logic/nuXmv/default.nixnew file+25
This diff is too big to show here.
pkgs/applications/science/logic/opensmt/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/logic/potassco/clingo.upstreamdeleted−6
This diff is too big to show here.
pkgs/applications/science/logic/satallax/default.nix−1
This diff is too big to show here.
pkgs/applications/science/logic/tamarin-prover/default.nix+2
This diff is too big to show here.
pkgs/applications/science/logic/tlaplus/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/logic/tlaplus/tlaps.nix+4−4
This diff is too big to show here.
pkgs/applications/science/logic/tlaplus/toolbox.nix+2−4
This diff is too big to show here.
pkgs/applications/science/logic/why3/default.nix+5−5
This diff is too big to show here.
pkgs/applications/science/logic/why3/with-provers.nix+1−1
This diff is too big to show here.
pkgs/applications/science/logic/workcraft/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/logic/z3/4.4.0.nix+1−1
This diff is too big to show here.
pkgs/applications/science/machine-learning/shogun/default.nix+12−6
This diff is too big to show here.
pkgs/applications/science/machine-learning/vowpal-wabbit/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/R/default.nix+7−2
This diff is too big to show here.
pkgs/applications/science/math/bcal/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/cemu/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/cntk/default.nix+6−5
This diff is too big to show here.
pkgs/applications/science/math/fricas/default.nix+3−6
This diff is too big to show here.
pkgs/applications/science/math/geogebra/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/getdp/default.nix+3−3
This diff is too big to show here.
pkgs/applications/science/math/gfm/default.nixdeleted−55
This diff is too big to show here.
pkgs/applications/science/math/ginac/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/gmsh/default.nix+10−7
This diff is too big to show here.
pkgs/applications/science/math/gretl/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/gurobi/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/mathematica/l10ns.nix+7
This diff is too big to show here.
pkgs/applications/science/math/nasc/default.nix−1
This diff is too big to show here.
pkgs/applications/science/math/pari/default.nix−1
This diff is too big to show here.
pkgs/applications/science/math/polymake/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/qalculate-gtk/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/ratpoints/default.nix−1
This diff is too big to show here.
pkgs/applications/science/math/rofi-calc/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/sage/default.nix+14−11
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/Only-test-external-software-when-all-of-sage-is.patchnew file+46
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/Only-test-py2-py3-optional-tests-when-all-of-sage-is.patchdeleted−26
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/do-not-test-find-library.patch+4−17
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/fonttools-deprecation-warnings.patchdeleted−39
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/linbox-1.7-upgrade.patchnew file+58
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/sphinx-docbuild-subprocesses.patch+6−6
This diff is too big to show here.
pkgs/applications/science/math/sage/patches/tachyon-renamed-focallength.patchnew file+81
This diff is too big to show here.
pkgs/applications/science/math/sage/python-modules/sage-docbuild.nixnew file+28
This diff is too big to show here.
pkgs/applications/science/math/sage/python-modules/sage-setup.nixnew file+28
This diff is too big to show here.
pkgs/applications/science/math/sage/sage-env.nix+3−8
This diff is too big to show here.
pkgs/applications/science/math/sage/sage-src.nix+41−49
This diff is too big to show here.
pkgs/applications/science/math/sage/sage-with-env.nix+4−2
This diff is too big to show here.
pkgs/applications/science/math/sage/sage.nix+4−2
This diff is too big to show here.
pkgs/applications/science/math/sage/sage_docbuild.nixdeleted−20
This diff is too big to show here.
pkgs/applications/science/math/sage/sagedoc.nix+2−2
This diff is too big to show here.
pkgs/applications/science/math/sage/sagelib.nix+48−4
This diff is too big to show here.
pkgs/applications/science/math/scilab-bin/default.nix+18−21
This diff is too big to show here.
pkgs/applications/science/math/singular/default.nix+17−60
This diff is too big to show here.
pkgs/applications/science/math/singular/disable-docs-for-optional-unpackaged-deps.patchdeleted−112
This diff is too big to show here.
pkgs/applications/science/math/singular/redhat-aarch64.patchdeleted−38
This diff is too big to show here.
pkgs/applications/science/math/singular/use-older-ax-prog-cc-for-build.patchdeleted−194
This diff is too big to show here.
pkgs/applications/science/math/singular/vspace-MAX_PROCESS.patchdeleted−35
This diff is too big to show here.
pkgs/applications/science/math/tilp2/default.nixdeleted−57
This diff is too big to show here.
pkgs/applications/science/misc/bada-bib/default.nixnew file+77
This diff is too big to show here.
pkgs/applications/science/misc/colmap/default.nix+3−3
This diff is too big to show here.
pkgs/applications/science/misc/cwltool/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/misc/cytoscape/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/misc/fityk/default.nix+2−5
This diff is too big to show here.
pkgs/applications/science/misc/foldingathome/control.nix+1−1
This diff is too big to show here.
pkgs/applications/science/misc/foldingathome/viewer.nix+1−1
This diff is too big to show here.
pkgs/applications/science/misc/golly/beta.nixdeleted−50
This diff is too big to show here.
pkgs/applications/science/misc/golly/default.upstreamdeleted−5
This diff is too big to show here.
pkgs/applications/science/misc/netlogo/default.nix+1−1
This diff is too big to show here.
pkgs/applications/science/misc/root/default.nix+3−3
This diff is too big to show here.
pkgs/applications/science/misc/sasview/default.nix+38−51
This diff is too big to show here.
pkgs/applications/science/misc/sasview/local_config.patchdeleted−22
This diff is too big to show here.
pkgs/applications/science/misc/sasview/pyparsing-fix.patchdeleted−13
This diff is too big to show here.
pkgs/applications/science/misc/simgrid/default.nix+50−50
This diff is too big to show here.
pkgs/applications/science/misc/snakemake/default.nix+25−6
This diff is too big to show here.
pkgs/applications/science/misc/tulip/default.nix+8−7
This diff is too big to show here.
pkgs/applications/science/molecular-dynamics/gromacs/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/physics/shtns/default.nixnew file+22
This diff is too big to show here.
pkgs/applications/science/programming/groove/default.nix+1−1
This diff is too big to show here.
pkgs/applications/science/robotics/inav-configurator/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/robotics/mission-planner/default.nix+2−2
This diff is too big to show here.
pkgs/applications/science/robotics/qgroundcontrol/default.nix+5−3
This diff is too big to show here.
pkgs/applications/system/monitor/default.nix+3−3
This diff is too big to show here.
pkgs/applications/terminal-emulators/alacritty/default.nix+7−4
This diff is too big to show here.
pkgs/applications/terminal-emulators/contour/default.nix+3−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/cool-retro-term/default.nix+3−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/ctx/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/darktile/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/eterm/default.nix+4−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/foot/default.nix+3−2
This diff is too big to show here.
pkgs/applications/terminal-emulators/germinal/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/gnome-console/default.nixnew file+69
This diff is too big to show here.
pkgs/applications/terminal-emulators/guake/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/hyper/default.nix+6−4
This diff is too big to show here.
pkgs/applications/terminal-emulators/iterm2/default.nix+24−30
This diff is too big to show here.
pkgs/applications/terminal-emulators/kermit-terminal/default.nixnew file+44
This diff is too big to show here.
pkgs/applications/terminal-emulators/kgx/default.nixdeleted−76
This diff is too big to show here.
pkgs/applications/terminal-emulators/kitty/default.nix+53−26
This diff is too big to show here.
pkgs/applications/terminal-emulators/lxterminal/default.nix+3−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/mlterm/default.nix+6−6
This diff is too big to show here.
pkgs/applications/terminal-emulators/mrxvt/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/roxterm/default.nix+5−3
This diff is too big to show here.
pkgs/applications/terminal-emulators/rxvt-unicode-plugins/urxvt-font-size/default.nix+1−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/rxvt-unicode/default.nix+36−8
This diff is too big to show here.
pkgs/applications/terminal-emulators/rxvt-unicode/wrapper.nix+5−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/sakura/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/st/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/stupidterm/default.nix+3−1
This diff is too big to show here.
pkgs/applications/terminal-emulators/terminator/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/termite/default.nix+5−2
This diff is too big to show here.
pkgs/applications/terminal-emulators/termonad/default.nix+5−2
This diff is too big to show here.
pkgs/applications/terminal-emulators/tilda/default.nix+3
This diff is too big to show here.
pkgs/applications/terminal-emulators/tilix/default.nix+5−2
This diff is too big to show here.
pkgs/applications/terminal-emulators/wayst/default.nix+6−6
This diff is too big to show here.
pkgs/applications/terminal-emulators/wezterm/default.nix+6−3
This diff is too big to show here.
pkgs/applications/terminal-emulators/xterm/default.nix+6−3
This diff is too big to show here.
pkgs/applications/version-management/bcompare/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/commitizen/default.nixnew file+122
This diff is too big to show here.
pkgs/applications/version-management/cvs2svn/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/fossil/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/bfg-repo-cleaner/default.nix+39−43
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/cgit/common.nixnew file+77
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/cgit/default.nix+7−69
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/cgit/pink.nixnew file+23
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/delta/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gg/default.nix+17−8
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gg/skip-broken-revert-tests.patchdeleted−12
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gh/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/ghorg/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-annex-remote-b2/default.nix+7−7
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-branchless/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-cliff/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-gone/default.nix+19−16
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-hub/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-machete/default.nix+4−9
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-remote-hg/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-secret/default.nix+3−6
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-team/default.nixnew file+31
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git-vendor/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/git/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gitstatus/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gitstatus/romkatv_libgit2.nix+7−4
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gitty/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/gitui/default.nix+18−6
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/glab/default.nix+1−1
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/glitter/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/hut/default.nixnew file+43
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/lab/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/lucky-commit/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/pass-git-helper/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/stgit/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-and-tools/subgit/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-lfs/default.nix+8−2
This diff is too big to show here.
pkgs/applications/version-management/git-repo/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/git-review/default.nix+2−6
This diff is too big to show here.
pkgs/applications/version-management/gitea/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/github-desktop/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/gitkraken/default.nix+11−6
This diff is too big to show here.
pkgs/applications/version-management/gitlab/data.json+8−8
This diff is too big to show here.
pkgs/applications/version-management/gitlab/default.nix+5−8
This diff is too big to show here.
pkgs/applications/version-management/gitlab/fix-grpc-ar.patchdeleted−10
This diff is too big to show here.
pkgs/applications/version-management/gitlab/gitaly/Gemfile+5−5
This diff is too big to show here.
pkgs/applications/version-management/gitlab/gitaly/Gemfile.lock+32−35
This diff is too big to show here.
pkgs/applications/version-management/gitlab/gitaly/default.nix+6−28
This diff is too big to show here.
pkgs/applications/version-management/gitlab/gitaly/gemset.nix+42−49
This diff is too big to show here.
pkgs/applications/version-management/gitlab/gitlab-shell/default.nix+4−4
This diff is too big to show here.
pkgs/applications/version-management/gitlab/gitlab-workhorse/default.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/gitlab/remove-hardcoded-locations.patch+10
This diff is too big to show here.
pkgs/applications/version-management/gitlab/rubyEnv/Gemfile+26−36
This diff is too big to show here.
pkgs/applications/version-management/gitlab/rubyEnv/Gemfile.lock+130−140
This diff is too big to show here.
pkgs/applications/version-management/gitlab/rubyEnv/gemset.nix+133−181
This diff is too big to show here.
pkgs/applications/version-management/gitless/default.nix+25−10
This diff is too big to show here.
pkgs/applications/version-management/gitqlient/default.nixnew file+41
This diff is too big to show here.
pkgs/applications/version-management/gogs/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/got/default.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/jujutsu/default.nixnew file+60
This diff is too big to show here.
pkgs/applications/version-management/meld/default.nix+11
This diff is too big to show here.
pkgs/applications/version-management/mercurial/default.nix+16−8
This diff is too big to show here.
pkgs/applications/version-management/mercurial/fix-rhg-type-aarch64.patchnew file+12
This diff is too big to show here.
pkgs/applications/version-management/monotone/default.upstreamdeleted−8
This diff is too big to show here.
pkgs/applications/version-management/rcs/default.nix+6−4
This diff is too big to show here.
pkgs/applications/version-management/redmine/Gemfile+1−1
This diff is too big to show here.
pkgs/applications/version-management/redmine/Gemfile.lock+63−60
This diff is too big to show here.
pkgs/applications/version-management/redmine/default.nix+5−3
This diff is too big to show here.
pkgs/applications/version-management/redmine/gemset.nix+70−59
This diff is too big to show here.
pkgs/applications/version-management/smartgithg/default.nix+5−9
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/builds.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/core.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/dispatch.nix+1−1
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/git.nix+7−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/hg.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/lists.nix+7−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/man.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/meta.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/pages.nix+3−3
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/patches/redis-socket/git/0001-Revert-Add-webhook-queue-monitoring.patchnew file+50
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/patches/redis-socket/lists/0001-Revert-Add-webhook-queue-monitoring.patchnew file+48
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/patches/redis-socket/todo/0001-Revert-Add-webhook-queue-monitoring.patchnew file+50
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/scm.nix+2−2
This diff is too big to show here.
pkgs/applications/version-management/sourcehut/todo.nix+7−2
This diff is too big to show here.
pkgs/applications/version-management/tkcvs/default.nix → pkgs/applications/version-management/tkrev/default.nixrenamed+8−5
This diff is too big to show here.
pkgs/applications/version-management/tortoisehg/default.nix+55−41
This diff is too big to show here.
pkgs/applications/version-management/yadm/default.nix+97−5
This diff is too big to show here.
pkgs/applications/video/clapper/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/clipgrab/default.nix+11−2
This diff is too big to show here.
pkgs/applications/video/clipgrab/yt-dlp-path.patchnew file+86
This diff is too big to show here.
pkgs/applications/video/corrscope/default.nix+4−12
This diff is too big to show here.
pkgs/applications/video/droidcam/default.nix+8−4
This diff is too big to show here.
pkgs/applications/video/dvdstyler/default.nix+28−17
This diff is too big to show here.
pkgs/applications/video/epgstation/client/package.jsonnew file+57
This diff is too big to show here.
pkgs/applications/video/epgstation/default.nix+56−19
This diff is too big to show here.
pkgs/applications/video/epgstation/epgstation.1+5−1
This diff is too big to show here.
pkgs/applications/video/epgstation/package.json+50−63
This diff is too big to show here.
pkgs/applications/video/epgstation/update.nix+12−13
This diff is too big to show here.
pkgs/applications/video/epgstation/use-mysql-over-domain-socket.patch+42−13
This diff is too big to show here.
pkgs/applications/video/f1viewer/default.nix+3−3
This diff is too big to show here.
pkgs/applications/video/ffmpeg-normalize/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/filebot/default.nix+5−5
This diff is too big to show here.
pkgs/applications/video/freetube/default.nix+4−4
This diff is too big to show here.
pkgs/applications/video/go-chromecast/default.nix+3−3
This diff is too big to show here.
pkgs/applications/video/gpac/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/gpu-screen-recorder/default.nixnew file+50
This diff is too big to show here.
pkgs/applications/video/gpu-screen-recorder/fix-nvfbc-check.patchnew file+38
This diff is too big to show here.
pkgs/applications/video/gpu-screen-recorder/gpu-screen-recorder-gtk.nixnew file+46
This diff is too big to show here.
pkgs/applications/video/kodi/addons/controller-topology-project/default.nixnew file+35
This diff is too big to show here.
pkgs/applications/video/kodi/addons/controllers/default.nixdeleted−22
This diff is too big to show here.
pkgs/applications/video/kodi/addons/inputstream-adaptive/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/kodi/addons/inputstream-ffmpegdirect/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/kodi/addons/pvr-hdhomerun/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/kodi/addons/pvr-hts/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/kodi/addons/pvr-iptvsimple/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/kodi/unwrapped.nix+5−5
This diff is too big to show here.
pkgs/applications/video/kooha/default.nix+1
This diff is too big to show here.
pkgs/applications/video/lbry/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/losslesscut-bin/appimage.nix+2−2
This diff is too big to show here.
pkgs/applications/video/losslesscut-bin/default.nix+5−5
This diff is too big to show here.
pkgs/applications/video/losslesscut-bin/dmg.nix+2−2
This diff is too big to show here.
pkgs/applications/video/losslesscut-bin/windows.nix+3−2
This diff is too big to show here.
pkgs/applications/video/makemkv/default.nix+12−12
This diff is too big to show here.
pkgs/applications/video/minitube/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/mirakurun/update.nix+1−1
This diff is too big to show here.
pkgs/applications/video/mkvtoolnix/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/mplayer/default.nix+6−8
This diff is too big to show here.
pkgs/applications/video/mplayer/svn-r38199-ffmpeg44fix.patchdeleted−22
This diff is too big to show here.
pkgs/applications/video/mpv/default.nix+3−2
This diff is too big to show here.
pkgs/applications/video/mpv/scripts/vr-reversal.nixnew file+35
This diff is too big to show here.
pkgs/applications/video/obs-studio/Change-product_version-to-user_agent_product.patchdeleted−26
This diff is too big to show here.
pkgs/applications/video/obs-studio/default.nix+9−8
This diff is too big to show here.
pkgs/applications/video/obs-studio/plugins/obs-multi-rtmp.nix+2−2
This diff is too big to show here.
pkgs/applications/video/obs-studio/plugins/obs-websocket.nix+27−3
This diff is too big to show here.
pkgs/applications/video/p2pvc/default.nix+2−1
This diff is too big to show here.
pkgs/applications/video/peek/default.nix+12−1
This diff is too big to show here.
pkgs/applications/video/pitivi/default.nix+2−1
This diff is too big to show here.
pkgs/applications/video/plex-media-player/default.nix+5−1
This diff is too big to show here.
pkgs/applications/video/plex-mpv-shim/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/qmplay2/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/rtabmap/0001-remove-printer-support.patchnew file+139
This diff is too big to show here.
pkgs/applications/video/rtabmap/default.nixnew file+59
This diff is too big to show here.
pkgs/applications/video/shotcut/default.nix+2−4
This diff is too big to show here.
pkgs/applications/video/smplayer/default.nix+5−3
This diff is too big to show here.
pkgs/applications/video/srtrelay/default.nix+5−5
This diff is too big to show here.
pkgs/applications/video/streamlink-twitch-gui/bin.nix+6−6
This diff is too big to show here.
pkgs/applications/video/streamlink/default.nix+2−3
This diff is too big to show here.
pkgs/applications/video/sub-batch/default.nix+3−3
This diff is too big to show here.
pkgs/applications/video/tartube/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/ustreamer/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/vdr/default.nix+2−2
This diff is too big to show here.
pkgs/applications/video/vlc/default.nix+13−8
This diff is too big to show here.
pkgs/applications/video/xine-ui/default.nix+13−1
This diff is too big to show here.
pkgs/applications/video/xplayer/default.nix+1−1
This diff is too big to show here.
pkgs/applications/video/yuview/default.nixnew file+45
This diff is too big to show here.
pkgs/applications/video/yuview/disable_version_check.patchnew file+15
This diff is too big to show here.
pkgs/applications/virtualization/OVMF/default.nix+2−1
This diff is too big to show here.
pkgs/applications/virtualization/charliecloud/default.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/cloud-hypervisor/default.nix+8−3
This diff is too big to show here.
pkgs/applications/virtualization/colima/default.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/containerd/1.4.nixdeleted−51
This diff is too big to show here.
pkgs/applications/virtualization/containerd/default.nix+4−7
This diff is too big to show here.
pkgs/applications/virtualization/cri-o/default.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/crosvm/Cargo.locknew file+1491
This diff is too big to show here.
pkgs/applications/virtualization/crosvm/default.nix+9−41
This diff is too big to show here.
pkgs/applications/virtualization/crosvm/update.py+13−20
This diff is too big to show here.
pkgs/applications/virtualization/crosvm/upstream-info.json+11−20
This diff is too big to show here.
pkgs/applications/virtualization/crun/default.nix+3−2
This diff is too big to show here.
pkgs/applications/virtualization/distrobox/default.nixnew file+38
This diff is too big to show here.
pkgs/applications/virtualization/docker-slim/default.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/docker/buildx.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/docker/compose.nix+3−3
This diff is too big to show here.
pkgs/applications/virtualization/docker/default.nix+22−12
This diff is too big to show here.
pkgs/applications/virtualization/docker/gc.nix+3−3
This diff is too big to show here.
pkgs/applications/virtualization/docker/proxy.nix+3−3
This diff is too big to show here.
pkgs/applications/virtualization/firecracker/default.nix+3−3
This diff is too big to show here.
pkgs/applications/virtualization/flintlock/default.nixnew file+49
This diff is too big to show here.
pkgs/applications/virtualization/gvisor/containerd-shim.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/gvisor/default.nix+1−1
This diff is too big to show here.
pkgs/applications/virtualization/libgovirt/default.nixnew file+53
This diff is too big to show here.
pkgs/applications/virtualization/lima/default.nix+3−3
This diff is too big to show here.
pkgs/applications/virtualization/looking-glass-client/default.nix+1−1
This diff is too big to show here.
pkgs/applications/virtualization/open-vm-tools/default.nix+20−5
This diff is too big to show here.
pkgs/applications/virtualization/podman-compose/default.nix+1−1
This diff is too big to show here.
pkgs/applications/virtualization/podman-tui/default.nixnew file+49
This diff is too big to show here.
pkgs/applications/virtualization/podman/default.nix+24−19
This diff is too big to show here.
pkgs/applications/virtualization/podman/wrapper.nix+22
This diff is too big to show here.
pkgs/applications/virtualization/qemu/9p-ignore-noatime.patchdeleted−44
This diff is too big to show here.
pkgs/applications/virtualization/qemu/allow-virtfs-on-darwin.patchnew file+77
This diff is too big to show here.
pkgs/applications/virtualization/qemu/default.nix+93−80
This diff is too big to show here.
pkgs/applications/virtualization/qemu/provide-fallback-for-utimensat.patchnew file+190
This diff is too big to show here.
pkgs/applications/virtualization/qemu/rename-9p-util.patchnew file+54
This diff is too big to show here.
pkgs/applications/virtualization/qemu/sigrtminmax.patchdeleted−30
This diff is too big to show here.
pkgs/applications/virtualization/qemu/utils.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/seabios/default.nix+7−6
This diff is too big to show here.
pkgs/applications/virtualization/singularity/default.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/spike/default.nix+4−3
This diff is too big to show here.
pkgs/applications/virtualization/tinyemu/default.nixdeleted−23
This diff is too big to show here.
pkgs/applications/virtualization/virt-manager/default.nix+26−22
This diff is too big to show here.
pkgs/applications/virtualization/virt-viewer/default.nix+63−14
This diff is too big to show here.
pkgs/applications/virtualization/virtualbox/default.nix+1
This diff is too big to show here.
pkgs/applications/virtualization/virtualbox/guest-additions/default.nix+1
This diff is too big to show here.
pkgs/applications/virtualization/x11docker/default.nix+2−2
This diff is too big to show here.
pkgs/applications/virtualization/xen/generic.nix+6−2
This diff is too big to show here.
pkgs/applications/window-managers/berry/default.nix+4−6
This diff is too big to show here.
pkgs/applications/window-managers/btops/default.nix+5−5
This diff is too big to show here.
pkgs/applications/window-managers/clfswm/default.nix+3−2
This diff is too big to show here.
pkgs/applications/window-managers/dwl/default.nix+14−10
This diff is too big to show here.
pkgs/applications/window-managers/dwm/dwm-status.nix+3−3
This diff is too big to show here.
pkgs/applications/window-managers/i3/balance-workspace.nix+2−2
This diff is too big to show here.
pkgs/applications/window-managers/i3/status-rust.nix+9−6
This diff is too big to show here.
pkgs/applications/window-managers/i3/swallow.nixnew file+44
This diff is too big to show here.
pkgs/applications/window-managers/i3/wsr.nix+3−3
This diff is too big to show here.
pkgs/applications/window-managers/icewm/default.nix+10−9
This diff is too big to show here.
pkgs/applications/window-managers/jwm/default.nix+2−2
This diff is too big to show here.
pkgs/applications/window-managers/labwc/default.nix+14−13
This diff is too big to show here.
pkgs/applications/window-managers/leftwm/default.nix+3−3
This diff is too big to show here.
pkgs/applications/window-managers/phosh/default.nix+4−3
This diff is too big to show here.
pkgs/applications/window-managers/picom/default.nix+2−2
This diff is too big to show here.
pkgs/applications/window-managers/picom/picom-next.nix+3−3
This diff is too big to show here.
pkgs/applications/window-managers/qtile/default.nix+20−21
This diff is too big to show here.
pkgs/applications/window-managers/qtile/fix-restart.patchnew file+22
This diff is too big to show here.
pkgs/applications/window-managers/river/default.nix+9−10
This diff is too big to show here.
pkgs/applications/window-managers/spectrwm/default.nix+2−2
This diff is too big to show here.
pkgs/applications/window-managers/sway/bg.nix+2−2
This diff is too big to show here.
pkgs/applications/window-managers/sway/default.nix+20−7
This diff is too big to show here.
pkgs/applications/window-managers/sway/idle.nix+5−3
This diff is too big to show here.
pkgs/applications/window-managers/sway/lock.nix+2−7
This diff is too big to show here.
pkgs/applications/window-managers/sway/wrapper.nix+2−1
This diff is too big to show here.
pkgs/applications/window-managers/taffybar/default.nix+2−1
This diff is too big to show here.
pkgs/applications/window-managers/weston/default.nix+4−4
This diff is too big to show here.
pkgs/applications/window-managers/xmonad/wrapper.nix+2−1
This diff is too big to show here.
pkgs/build-support/alternatives/blas/default.nix+17−14
This diff is too big to show here.
pkgs/build-support/alternatives/lapack/default.nix+16−13
This diff is too big to show here.
pkgs/build-support/appimage/default.nix+4−1
This diff is too big to show here.
pkgs/build-support/bintools-wrapper/ld-wrapper.sh+1−1
This diff is too big to show here.
pkgs/build-support/build-dotnet-module/default.nixdeleted−270
This diff is too big to show here.
pkgs/build-support/build-fhs-userenv-bubblewrap/env.nix+33−1
This diff is too big to show here.
pkgs/build-support/build-fhs-userenv/chrootenv/default.nix+1−1
This diff is too big to show here.
pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c → pkgs/build-support/build-fhs-userenv/chrootenv/src/chrootenv.crenamed
The content is the same.
pkgs/build-support/build-fhs-userenv/chrootenv/meson.build → pkgs/build-support/build-fhs-userenv/chrootenv/src/meson.buildrenamed
The content is the same.
pkgs/build-support/build-fhs-userenv/env.nix+33−1
This diff is too big to show here.
pkgs/build-support/cc-wrapper/add-flags.sh+14−4
This diff is too big to show here.
pkgs/build-support/cc-wrapper/cc-wrapper.sh+1−1
This diff is too big to show here.
pkgs/build-support/coq/default.nix+6−3
This diff is too big to show here.
pkgs/build-support/coq/meta-fetch/default.nix+3−4
This diff is too big to show here.
pkgs/build-support/docker/default.nix+3−1
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/default.nixnew file+141
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/hooks/default.nixnew file+62
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.shnew file+41
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-check-hook.shnew file+33
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-configure-hook.shnew file+30
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.shnew file+42
This diff is too big to show here.
pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.shnew file+42
This diff is too big to show here.
pkgs/build-support/build-dotnet-package/default.nix → pkgs/build-support/dotnet/build-dotnet-package/default.nixrenamed
The content is the same.
pkgs/build-support/dotnetbuildhelpers/create-pkg-config-for-dll.sh → pkgs/build-support/dotnet/dotnetbuildhelpers/create-pkg-config-for-dll.shrenamed
The content is the same.
pkgs/build-support/dotnetbuildhelpers/default.nix → pkgs/build-support/dotnet/dotnetbuildhelpers/default.nixrenamed
The content is the same.
pkgs/build-support/dotnetbuildhelpers/patch-fsharp-targets.sh → pkgs/build-support/dotnet/dotnetbuildhelpers/patch-fsharp-targets.shrenamed
The content is the same.
pkgs/build-support/dotnetbuildhelpers/placate-nuget.sh → pkgs/build-support/dotnet/dotnetbuildhelpers/placate-nuget.shrenamed
The content is the same.
pkgs/build-support/dotnetbuildhelpers/placate-paket.sh → pkgs/build-support/dotnet/dotnetbuildhelpers/placate-paket.shrenamed
The content is the same.
pkgs/build-support/dotnetbuildhelpers/remove-duplicated-dlls.sh → pkgs/build-support/dotnet/dotnetbuildhelpers/remove-duplicated-dlls.shrenamed
The content is the same.
pkgs/build-support/dotnetenv/Wrapper/Wrapper.sln → pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper.slnrenamed
The content is the same.
pkgs/build-support/dotnetenv/Wrapper/Wrapper/Properties/AssemblyInfo.cs → pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Properties/AssemblyInfo.csrenamed
The content is the same.
pkgs/build-support/dotnetenv/Wrapper/Wrapper/Wrapper.cs.in → pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.cs.inrenamed
The content is the same.
pkgs/build-support/dotnetenv/Wrapper/Wrapper/Wrapper.csproj.in → pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.csproj.inrenamed
The content is the same.
pkgs/build-support/dotnetenv/build-solution.nix → pkgs/build-support/dotnet/dotnetenv/build-solution.nixrenamed
The content is the same.
pkgs/build-support/dotnetenv/default.nix → pkgs/build-support/dotnet/dotnetenv/default.nixrenamed
The content is the same.
pkgs/build-support/dotnetenv/wrapper.nix → pkgs/build-support/dotnet/dotnetenv/wrapper.nixrenamed
The content is the same.
pkgs/build-support/fetchnuget/default.nix → pkgs/build-support/dotnet/fetchnuget/default.nixrenamed
The content is the same.
pkgs/build-support/dotnet/make-nuget-deps/default.nixnew file+9
This diff is too big to show here.
pkgs/build-support/dotnet/make-nuget-source/default.nixnew file+30
This diff is too big to show here.
pkgs/build-support/nuget-to-nix/default.nix → pkgs/build-support/dotnet/nuget-to-nix/default.nixrenamed
The content is the same.
pkgs/build-support/nuget-to-nix/nuget-to-nix.sh → pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.shrenamed+6−2
This diff is too big to show here.
pkgs/build-support/fetchgit/builder.sh+1
This diff is too big to show here.
pkgs/build-support/fetchgit/default.nix+2−1
This diff is too big to show here.
pkgs/build-support/fetchgit/deterministic-gitnew file+45
This diff is too big to show here.
pkgs/build-support/fetchgit/nix-prefetch-git+7−1
This diff is too big to show here.
pkgs/build-support/fetchgit/tests.nix+11
This diff is too big to show here.
pkgs/build-support/fetchgithub/default.nix+17−3
This diff is too big to show here.
pkgs/build-support/fetchipfs/default.nix−2
This diff is too big to show here.
pkgs/build-support/fetchpatch/default.nix+43−21
This diff is too big to show here.
pkgs/build-support/fetchpatch/tests.nix+16
This diff is too big to show here.
pkgs/build-support/fetchurl/default.nix+4−3
This diff is too big to show here.
pkgs/build-support/fetchurl/mirrors.nix+264−233
This diff is too big to show here.
pkgs/build-support/fetchzip/default.nix+4−4
This diff is too big to show here.
pkgs/build-support/flutter/default.nixnew file+284
This diff is too big to show here.
pkgs/build-support/go/garble.nix+9−9
This diff is too big to show here.
pkgs/build-support/kernel/make-initrd.sh+1−1
This diff is too big to show here.
pkgs/build-support/libredirect/default.nix+36−9
This diff is too big to show here.
pkgs/build-support/libredirect/libredirect.c+128−5
This diff is too big to show here.
pkgs/build-support/libredirect/test.c+66
This diff is too big to show here.
pkgs/build-support/make-darwin-bundle/default.nixnew file+26
This diff is too big to show here.
pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nixnew file+39
This diff is too big to show here.
pkgs/build-support/make-desktopitem/default.nix+106−50
This diff is too big to show here.
pkgs/build-support/nix-gitignore/default.nix−6
This diff is too big to show here.
pkgs/build-support/ocaml/default.nix+2
This diff is too big to show here.
pkgs/build-support/ocaml/dune.nix+1−1
This diff is too big to show here.
pkgs/build-support/ocaml/oasis.nix+4−2
This diff is too big to show here.
pkgs/build-support/rust/hooks/cargo-build-hook.sh+3
This diff is too big to show here.
pkgs/build-support/rust/hooks/default.nix+10
This diff is too big to show here.
pkgs/build-support/rust/hooks/rust-bindgen-hook.shnew file+13
This diff is too big to show here.
pkgs/build-support/rust/import-cargo-lock.nix+6−1
This diff is too big to show here.
pkgs/build-support/setup-hooks/auto-patchelf.pynew file+329
This diff is too big to show here.
pkgs/build-support/setup-hooks/auto-patchelf.sh+17−314
This diff is too big to show here.
pkgs/build-support/setup-hooks/desktop-to-darwin-bundle.shnew file+199
This diff is too big to show here.
pkgs/build-support/setup-hooks/make-wrapper.sh+73−14
This diff is too big to show here.
pkgs/build-support/singularity-tools/default.nix+3−1
This diff is too big to show here.
pkgs/build-support/trivial-builders.nix+9−9
This diff is too big to show here.
pkgs/build-support/trivial-builders/test-overriding.nix+27−36
This diff is too big to show here.
pkgs/build-support/trivial-builders/test/references.nix+1−1
This diff is too big to show here.
pkgs/build-support/upstream-updater/attrset-to-dir.nixdeleted−19
This diff is too big to show here.
pkgs/build-support/upstream-updater/create-src-info-git.shdeleted−24
This diff is too big to show here.
pkgs/build-support/upstream-updater/create-src-info.shdeleted−20
This diff is too big to show here.
pkgs/build-support/upstream-updater/design.txtdeleted−29
This diff is too big to show here.
pkgs/build-support/upstream-updater/snippets.shdeleted−14
This diff is too big to show here.
pkgs/build-support/upstream-updater/test-case.nixdeleted−13
This diff is too big to show here.
pkgs/build-support/upstream-updater/update-upstream-data.shdeleted−182
This diff is too big to show here.
pkgs/build-support/upstream-updater/update-walker-service-specific.shdeleted−20
This diff is too big to show here.
pkgs/build-support/upstream-updater/update-walker.shdeleted−320
This diff is too big to show here.
pkgs/build-support/upstream-updater/update-walker.txtdeleted−118
This diff is too big to show here.
pkgs/build-support/writers/default.nix+37−1
This diff is too big to show here.
pkgs/build-support/writers/test.nix+27
This diff is too big to show here.
pkgs/common-updater/generic-updater.nix+1−1
This diff is too big to show here.
pkgs/common-updater/git-updater.nixnew file+17
This diff is too big to show here.
pkgs/common-updater/http-two-levels-updater.nixnew file+19
This diff is too big to show here.
pkgs/common-updater/scripts/list-archive-two-level-versionsdeleted−35
This diff is too big to show here.
pkgs/common-updater/scripts/list-archive-two-levels-versionsnew file+54
This diff is too big to show here.
pkgs/common-updater/scripts/list-git-tags+37−16
This diff is too big to show here.
pkgs/common-updater/unstable-updater.nix+74−9
This diff is too big to show here.
pkgs/data/documentation/execline-man-pages/default.nix+2−2
This diff is too big to show here.
pkgs/data/documentation/gnome-user-docs/default.nix+2−2
This diff is too big to show here.
pkgs/data/documentation/man-pages/default.nix−1
This diff is too big to show here.
pkgs/data/documentation/s6-man-pages/default.nix+1−1
This diff is too big to show here.
pkgs/data/documentation/s6-networking-man-pages/default.nix+2−2
This diff is too big to show here.
pkgs/data/documentation/std-man-pages/default.nix+4−3
This diff is too big to show here.
pkgs/data/documentation/zeal/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/agave/default.nix+22−11
This diff is too big to show here.
pkgs/data/fonts/andika/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/behdad-fonts/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/borg-sans-mono/default.nixnew file+26
This diff is too big to show here.
pkgs/data/fonts/cantarell-fonts/default.nix+26−5
This diff is too big to show here.
pkgs/data/fonts/ccsymbols/default.nixnew file+32
This diff is too big to show here.
pkgs/data/fonts/charis-sil/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/cm-unicode/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/cozette/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/crimson/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/dejavu-fonts/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/doulos-sil/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/encode-sans/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/gandom-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/fonts/gentium/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/google-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/fonts/iosevka/bin.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/iosevka/update-default.sh+1−1
This diff is too big to show here.
pkgs/data/fonts/iosevka/variants.nix+92−92
This diff is too big to show here.
pkgs/data/fonts/ipaexfont/default.nix+4−4
This diff is too big to show here.
pkgs/data/fonts/ipafont/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/ir-standard-fonts/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/julia-mono/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/lalezar-fonts/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/lmodern/default.nix+5−5
This diff is too big to show here.
pkgs/data/fonts/lxgw-wenkai/default.nixnew file+23
This diff is too big to show here.
pkgs/data/fonts/montserrat/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/nahid-fonts/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/nanum-gothic-coding/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/nika-fonts/default.nix+1−1
This diff is too big to show here.
pkgs/data/fonts/noto-fonts/default.nix+15−15
This diff is too big to show here.
pkgs/data/fonts/parastoo-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/fonts/redhat-official/default.nix+6−4
This diff is too big to show here.
pkgs/data/fonts/rictydiminished-with-firacode/default.nix+5−4
This diff is too big to show here.
pkgs/data/fonts/sahel-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/fonts/samim-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/fonts/sarasa-gothic/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/shabnam-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/fonts/source-sans-pro/default.nixnew file+30
This diff is too big to show here.
pkgs/data/fonts/source-serif-pro/default.nixnew file+30
This diff is too big to show here.
pkgs/data/fonts/sudo/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/unifont/default.nix+6−4
This diff is too big to show here.
pkgs/data/fonts/unifont_upper/default.nix+2−2
This diff is too big to show here.
pkgs/data/fonts/vazir-fonts/default.nix+3−3
This diff is too big to show here.
pkgs/data/icons/comixcursors/default.nixnew file+125
This diff is too big to show here.
pkgs/data/icons/comixcursors/makefile-shell-var.patchnew file+11
This diff is too big to show here.
pkgs/data/icons/faba-icon-theme/default.nix+2−3
This diff is too big to show here.
pkgs/data/icons/kora-icon-theme/default.nix+2−2
This diff is too big to show here.
pkgs/data/icons/luna-icons/default.nix+2−2
This diff is too big to show here.
pkgs/data/icons/numix-icon-theme-circle/default.nix+2−2
This diff is too big to show here.
pkgs/data/icons/numix-icon-theme-square/default.nix+2−2
This diff is too big to show here.
pkgs/data/icons/papirus-icon-theme/default.nix+2−2
This diff is too big to show here.
pkgs/data/icons/phinger-cursors/default.nixnew file+28
This diff is too big to show here.
pkgs/data/icons/tango-icon-theme/default.nix+3−2
This diff is too big to show here.
pkgs/data/icons/tela-circle-icon-theme/default.nix+9−6
This diff is too big to show here.
pkgs/data/icons/tela-icon-theme/default.nix+2−2
This diff is too big to show here.
pkgs/data/icons/vimix-icon-theme/default.nix+23−4
This diff is too big to show here.
pkgs/data/icons/whitesur-icon-theme/default.nix+2−2
This diff is too big to show here.
pkgs/data/misc/brise/default.nix+2−1
This diff is too big to show here.
pkgs/data/misc/cacert/default.nix+2−2
This diff is too big to show here.
pkgs/data/misc/ddccontrol-db/default.nix+2−2
This diff is too big to show here.
pkgs/data/misc/geolite-legacy/builder.shdeleted−20
This diff is too big to show here.
pkgs/data/misc/geolite-legacy/default.nix+23−30
This diff is too big to show here.
pkgs/data/misc/hackage/pin.json+4−4
This diff is too big to show here.
pkgs/data/misc/mime-types/default.nixdeleted−21
This diff is too big to show here.
pkgs/data/misc/miscfiles/default.nix+3−2
This diff is too big to show here.
pkgs/data/misc/mobile-broadband-provider-info/default.nix+2−2
This diff is too big to show here.
pkgs/data/misc/osinfo-db/default.nix+15−4
This diff is too big to show here.
pkgs/data/misc/poppler-data/default.nix+16−6
This diff is too big to show here.
pkgs/data/misc/shared-desktop-ontologies/default.nix+3−2
This diff is too big to show here.
pkgs/data/misc/shared-mime-info/default.nix+5−15
This diff is too big to show here.
pkgs/data/misc/spdx-license-list-data/default.nix+21−4
This diff is too big to show here.
pkgs/data/misc/tzdata/default.nix+2−1
This diff is too big to show here.
pkgs/data/misc/v2ray-domain-list-community/default.nix+2−2
This diff is too big to show here.
pkgs/data/misc/v2ray-geoip/default.nix+3−3
This diff is too big to show here.
pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/default.nix+2−1
This diff is too big to show here.
pkgs/data/soundfonts/fluid/default.nix+2−1
This diff is too big to show here.
pkgs/data/soundfonts/ydp-grand/default.nixnew file+23
This diff is too big to show here.
pkgs/data/themes/arc/default.nix+15−12
This diff is too big to show here.
pkgs/data/themes/artim-dark/default.nixnew file+35
This diff is too big to show here.
pkgs/data/themes/dracula-theme/default.nix+1−1
This diff is too big to show here.
pkgs/data/themes/flat-remix-gtk/default.nix+2−2
This diff is too big to show here.
pkgs/data/themes/gnome-breeze/default.nix+13−9
This diff is too big to show here.
pkgs/data/themes/graphite/default.nix → pkgs/data/themes/graphite-gtk-theme/default.nixrenamed+23−5
This diff is too big to show here.
pkgs/data/themes/graphite-kde-theme/default.nixnew file+41
This diff is too big to show here.
pkgs/data/themes/kwin-decorations/kde-rounded-corners/default.nixnew file+38
This diff is too big to show here.
pkgs/data/themes/layan-kde/default.nixnew file+46
This diff is too big to show here.
pkgs/data/themes/marwaita/default.nix+5−2
This diff is too big to show here.
pkgs/data/themes/nordic/default.nix+17−17
This diff is too big to show here.
pkgs/data/themes/orchis-theme/default.nix+2−2
This diff is too big to show here.
pkgs/data/themes/pitch-black/default.nixnew file+30
This diff is too big to show here.
pkgs/data/themes/plano/default.nix+2−2
This diff is too big to show here.
pkgs/data/themes/stilo/default.nix+2−2
This diff is too big to show here.
pkgs/data/themes/whitesur/default.nix+38−3
This diff is too big to show here.
pkgs/data/themes/yaru/default.nix+2−2
This diff is too big to show here.
pkgs/data/themes/zuki/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/arcan/arcan/clone-sources.nix+1−1
This diff is too big to show here.
pkgs/desktops/arcan/durden/default.nix+7−3
This diff is too big to show here.
pkgs/desktops/arcan/pipeworld/default.nix+7−3
This diff is too big to show here.
pkgs/desktops/arcan/prio/default.nix+5−1
This diff is too big to show here.
pkgs/desktops/arcan/xarcan/default.nix+5−4
This diff is too big to show here.
pkgs/desktops/cdesktopenv/default.nix+4−2
This diff is too big to show here.
pkgs/desktops/cinnamon/nemo/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/cinnamon/xapps/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/cinnamon/xreader/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/cinnamon/xviewer/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/enlightenment/efl/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/enlightenment/enlightenment/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/enlightenment/terminology/default.nix+3−1
This diff is too big to show here.
pkgs/desktops/gnome-2/bindings/libglademm/default.nixdeleted−17
This diff is too big to show here.
pkgs/desktops/gnome-2/default.nix+1−4
This diff is too big to show here.
pkgs/desktops/gnome/apps/file-roller/default.nix+4−16
This diff is too big to show here.
pkgs/desktops/gnome/apps/gedit/default.nix+7−6
This diff is too big to show here.
pkgs/desktops/gnome/apps/ghex/default.nix+36−8
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-boxes/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-calendar/default.nix+20−36
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-calendar/gtk_image_reset_crash.patchdeleted−17
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-characters/default.nix+19−19
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-clocks/default.nix+11−12
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-connections/default.nix+6−4
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-maps/default.nix+15−4
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-music/default.nix+6−15
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-notes/default.nix+12−1
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-sound-recorder/default.nix+8−7
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-text-editor/default.nix+2−10
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-todo/default.nix+13−10
This diff is too big to show here.
pkgs/desktops/gnome/apps/gnome-weather/default.nix+7−9
This diff is too big to show here.
pkgs/desktops/gnome/apps/polari/default.nix+59−12
This diff is too big to show here.
pkgs/desktops/gnome/core/adwaita-icon-theme/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/baobab/default.nix+16−10
This diff is too big to show here.
pkgs/desktops/gnome/core/eog/default.nix+21−14
This diff is too big to show here.
pkgs/desktops/gnome/core/epiphany/default.nix+4−15
This diff is too big to show here.
pkgs/desktops/gnome/core/evince/default.nix+17−27
This diff is too big to show here.
pkgs/desktops/gnome/core/evolution-data-server/default.nix+82−14
This diff is too big to show here.
pkgs/desktops/gnome/core/gdm/default.nix+4−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-backgrounds/default.nix+23−8
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-bluetooth/default.nix+13−16
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-calculator/default.nix+8−16
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-color-manager/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-contacts/default.nix+14−25
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-control-center/default.nix+23−23
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-dictionary/default.nix+56−7
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-disk-utility/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-font-viewer/default.nix+36−8
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-initial-setup/default.nix+4−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-remote-desktop/default.nix+33−7
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-session/ctl.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-session/default.nix+73−25
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-session/fix-paths.patch+4−11
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-settings-daemon/3.38/default.nix+26−1
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-settings-daemon/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-shell-extensions/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-shell/default.nix+7−8
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-shell/wrap-services.patch+5−5
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-software/default.nix+8−6
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-system-monitor/default.nix+2−10
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-terminal/default.nix+5−2
This diff is too big to show here.
pkgs/desktops/gnome/core/gnome-tour/default.nix+6−11
This diff is too big to show here.
pkgs/desktops/gnome/core/gucharmap/default.nix+4−4
This diff is too big to show here.
pkgs/desktops/gnome/core/mutter/default.nix+3−3
This diff is too big to show here.
pkgs/desktops/gnome/core/nautilus/default.nix+6−5
This diff is too big to show here.
pkgs/desktops/gnome/core/simple-scan/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/totem/default.nix+6−8
This diff is too big to show here.
pkgs/desktops/gnome/core/yelp-xsl/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/core/yelp/default.nix+10−4
This diff is too big to show here.
pkgs/desktops/gnome/default.nix+5−6
This diff is too big to show here.
pkgs/desktops/gnome/extensions/arcmenu/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/extensions/collisions.json+10−1
This diff is too big to show here.
pkgs/desktops/gnome/extensions/dash-to-dock/default.nixnew file+48
This diff is too big to show here.
pkgs/desktops/gnome/extensions/dash-to-panel/default.nixdeleted−31
This diff is too big to show here.
pkgs/desktops/gnome/extensions/default.nix+2−1
This diff is too big to show here.
pkgs/desktops/gnome/extensions/extensionOverrides.nix−4
This diff is too big to show here.
pkgs/desktops/gnome/extensions/extensionRenames.nix+3
This diff is too big to show here.
pkgs/desktops/gnome/extensions/extensions.json+227−177
This diff is too big to show here.
pkgs/desktops/gnome/extensions/freon/default.nix+3−3
This diff is too big to show here.
pkgs/desktops/gnome/extensions/freon/fix_paths.patch+1−1
This diff is too big to show here.
pkgs/desktops/gnome/extensions/gsconnect/default.nix+4−4
This diff is too big to show here.
pkgs/desktops/gnome/extensions/manuallyPackaged.nix+1−1
This diff is too big to show here.
pkgs/desktops/gnome/extensions/pop-shell/default.nix+10
This diff is too big to show here.
pkgs/desktops/gnome/extensions/pop-shell/fix-gjs.patch−34
This diff is too big to show here.
pkgs/desktops/gnome/extensions/update-extensions.py+1
This diff is too big to show here.
pkgs/desktops/gnome/games/aisleriot/default.nix+6−7
This diff is too big to show here.
pkgs/desktops/gnome/games/gnome-2048/default.nixnew file+55
This diff is too big to show here.
pkgs/desktops/gnome/games/gnome-chess/default.nix+4−3
This diff is too big to show here.
pkgs/desktops/gnome/games/gnome-mahjongg/default.nix+38−6
This diff is too big to show here.
pkgs/desktops/gnome/games/gnome-mines/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/games/gnome-sudoku/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/games/gnome-tetravex/default.nix+45−8
This diff is too big to show here.
pkgs/desktops/gnome/games/hitori/default.nix+12−1
This diff is too big to show here.
pkgs/desktops/gnome/games/tali/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/misc/gitg/default.nix+16−6
This diff is too big to show here.
pkgs/desktops/gnome/misc/gnome-applets/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/misc/gnome-autoar/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/misc/gnome-flashback/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/misc/gnome-panel/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/misc/gnome-tweaks/default.nix+4−3
This diff is too big to show here.
pkgs/desktops/gnome/misc/gpaste/default.nix+9−4
This diff is too big to show here.
pkgs/desktops/gnome/misc/gpaste/fix-paths.patch+13−7
This diff is too big to show here.
pkgs/desktops/gnome/misc/metacity/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/gnome/update.nix+27−11
This diff is too big to show here.
pkgs/desktops/gnustep/gworkspace/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/lxqt/default.nix+1−2
This diff is too big to show here.
pkgs/desktops/lxqt/lxqt-build-tools/default.nix+7−2
This diff is too big to show here.
pkgs/desktops/lxqt/obconf-qt/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/lxqt/qterminal/default.nix+3
This diff is too big to show here.
pkgs/desktops/mate/default.nix+2−3
This diff is too big to show here.
pkgs/desktops/mate/mate-panel/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/mate/mate-terminal/default.nix+3−1
This diff is too big to show here.
pkgs/desktops/mate/mate-tweak/default.nix+4−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/appcenter/add-packagekit-backend-option.patchdeleted−240
This diff is too big to show here.
pkgs/desktops/pantheon/apps/appcenter/default.nix+9−10
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-calculator/default.nix−3
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-calendar/default.nix+12−17
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-camera/default.nix+21−21
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-code/default.nix+17−22
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-feedback/default.nix+7−13
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-files/default.nix+2−16
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-mail/default.nix+6−8
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-music/default.nix+25−44
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-photos/default.nix+21−18
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-screenshot/default.nix+1−3
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-tasks/default.nix+2−4
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-terminal/default.nix+1−3
This diff is too big to show here.
pkgs/desktops/pantheon/apps/elementary-videos/default.nix+6−7
This diff is too big to show here.
pkgs/desktops/pantheon/apps/sideload/default.nix+6−10
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/about/add-wallpaper-option.patchnew file+82
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix+15−13
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/about/fix-background-path.patchdeleted−13
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix+11−11
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix+13−13
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard-plugs/wacom/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard/default.nix+6−8
This diff is too big to show here.
pkgs/desktops/pantheon/apps/switchboard/wrapper.nix+2−1
This diff is too big to show here.
pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix+2−4
This diff is too big to show here.
pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix+2−4
This diff is too big to show here.
pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix+1−3
This diff is too big to show here.
pkgs/desktops/pantheon/default.nix+17−17
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix+2−5
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.appcenter.dockitemnew file+2
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override+1−1
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix+25−31
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix−1
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix+14−20
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix+7−9
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix+2−4
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix−2
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/file-roller-contract/default.nix+8−1
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/gala/default.nix−2
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/default.nix+11−1
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel-indicators/a11y/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix+17−17
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix+13−13
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel/default.nix+8−6
This diff is too big to show here.
pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix+2−1
This diff is too big to show here.
pkgs/desktops/pantheon/granite/default.nix+1−8
This diff is too big to show here.
pkgs/desktops/pantheon/services/contractor/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix+2−12
This diff is too big to show here.
pkgs/desktops/pantheon/services/elementary-notifications/default.nix+1−3
This diff is too big to show here.
pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix+1−3
This diff is too big to show here.
pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix+6−6
This diff is too big to show here.
pkgs/desktops/pantheon/services/xdg-desktop-portal-pantheon/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/pantheon/third-party/wingpanel-indicator-ayatana/default.nix+7
This diff is too big to show here.
pkgs/desktops/plasma-5/3rdparty/addons/bismuth/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/plasma-5/3rdparty/addons/krunner-ssh.nixnew file+43
This diff is too big to show here.
pkgs/desktops/plasma-5/3rdparty/kwin/scripts/krohnkite.nix+2−2
This diff is too big to show here.
pkgs/desktops/plasma-5/3rdparty/kwin/scripts/parachute.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/bluedevil.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/breeze-grub.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/breeze-gtk.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/breeze-plymouth/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/breeze-qt5.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/default.nix+6−5
This diff is too big to show here.
pkgs/desktops/plasma-5/discover.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/fetch.sh+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kactivitymanagerd.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kde-cli-tools.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kde-gtk-config/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kdecoration.nix+3−3
This diff is too big to show here.
pkgs/desktops/plasma-5/kdeplasma-addons.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kgamma5.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/khotkeys.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kinfocenter.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kmenuedit.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kscreen.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kscreenlocker.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/ksshaskpass.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/ksystemstats.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kwallet-pam.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kwayland-integration.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kwayland-server/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch+4−4
This diff is too big to show here.
pkgs/desktops/plasma-5/kwin/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/kwrited.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/layer-shell-qt.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/libkscreen/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/libksysguard/0001-qdiriterator-follow-symlinks.patch+2−3
This diff is too big to show here.
pkgs/desktops/plasma-5/libksysguard/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/milou.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/oxygen.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-browser-integration.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-desktop/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-disks.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-integration/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-phone-components/default.nix → pkgs/desktops/plasma-5/plasma-mobile/default.nixrenamed+3−3
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-nano/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-nm/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-pa.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-sdk.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-systemmonitor.nix+7−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-thunderbolt.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-vault/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-workspace-wallpapers.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-workspace/0001-startkde.patch+17−26
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-workspace/0002-absolute-wallpaper-install-dir.patch+2−2
This diff is too big to show here.
pkgs/desktops/plasma-5/plasma-workspace/default.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/polkit-kde-agent.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/powerdevil.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/qqc2-breeze-style.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/sddm-kcm.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/srcs.nix+218−218
This diff is too big to show here.
pkgs/desktops/plasma-5/systemsettings.nix+1−1
This diff is too big to show here.
pkgs/desktops/plasma-5/xdg-desktop-portal-kde.nix+1−1
This diff is too big to show here.
pkgs/desktops/xfce/applications/orage/default.nix+2−3
This diff is too big to show here.
pkgs/desktops/xfce/applications/xfce4-notifyd/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/xfce/applications/xfce4-screenshooter/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/xfce/applications/xfce4-terminal/default.nix+3−1
This diff is too big to show here.
pkgs/desktops/xfce/art/xfce4-icon-theme/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/art/xfwm4-themes/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/default.nix+8−7
This diff is too big to show here.
pkgs/desktops/xfce/mkXfceDerivation.nix+2−3
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-cpufreq-plugin/default.nix+2−2
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-cpugraph-plugin/default.nix+3−7
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-embed-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-eyes-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-fsguard-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-genmon-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-mailwatch-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-mpc-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-namebar-plugin/default.nix+4−3
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-notes-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-sensors-plugin/default.nix+3−7
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-systemload-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-timer-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-weather-plugin/default.nix+1−5
This diff is too big to show here.
pkgs/desktops/xfce/panel-plugins/xfce4-windowck-plugin/default.nix+2−3
This diff is too big to show here.
pkgs/desktops/xfce/thunar-plugins/dropbox/default.nix+2−2
This diff is too big to show here.
pkgs/development/beam-modules/elvis-erlang/default.nix+1−1
This diff is too big to show here.
pkgs/development/beam-modules/erlang-ls/default.nix+3−3
This diff is too big to show here.
pkgs/development/beam-modules/erlang-ls/rebar-deps.nix+9−8
This diff is too big to show here.
pkgs/development/chez-modules/chez-mit/default.nix+8−7
This diff is too big to show here.
pkgs/development/chez-modules/chez-scmutils/default.nix+8−7
This diff is too big to show here.
pkgs/development/chez-modules/chez-srfi/default.nix+5−4
This diff is too big to show here.
pkgs/development/compilers/4th/001-install-manual-fixup.diffnew file+12
This diff is too big to show here.
pkgs/development/compilers/4th/default.nix+12−5
This diff is too big to show here.
pkgs/development/compilers/aldor/default.nix+5−4
This diff is too big to show here.
pkgs/development/compilers/ats2/default.nix+4
This diff is too big to show here.
pkgs/development/compilers/bs-platform/ocaml.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/closure/default.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/crystal/build-package.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/crystal/default.nix+23−5
This diff is too big to show here.
pkgs/development/compilers/cudatoolkit/common.nix+39−18
This diff is too big to show here.
pkgs/development/compilers/cudatoolkit/default.nix+8−1
This diff is too big to show here.
pkgs/development/compilers/dictu/default.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/dotnet/build-dotnet.nix+17−18
This diff is too big to show here.
pkgs/development/compilers/dotnet/default.nix+136−50
This diff is too big to show here.
pkgs/development/compilers/dotnet/print-hashes.sh+101−60
This diff is too big to show here.
pkgs/development/compilers/edk2/default.nix+3−15
This diff is too big to show here.
pkgs/development/compilers/elm/default.nix+163−187
This diff is too big to show here.
pkgs/development/compilers/elm/packages/elm-json.nix+20−2
This diff is too big to show here.
pkgs/development/compilers/elm/packages/elm-test-rs.nix+15−2
This diff is too big to show here.
pkgs/development/compilers/elm/packages/elm.nix+1
This diff is too big to show here.
pkgs/development/compilers/fasm/bin.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/flutter/default.nix+4−4
This diff is too big to show here.
pkgs/development/compilers/flutter/flutter.nix+9−1
This diff is too big to show here.
pkgs/development/compilers/flutter/patches/disable-auto-update.patch+8−8
This diff is too big to show here.
pkgs/development/compilers/flutter/patches/move-cache.patch+14−4
This diff is too big to show here.
pkgs/development/compilers/fpc/default.upstreamdeleted−6
This diff is too big to show here.
pkgs/development/compilers/fpc/lazarus.nix+4
This diff is too big to show here.
pkgs/development/compilers/fstar/default.nix+10−4
This diff is too big to show here.
pkgs/development/compilers/gcc/10/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/11/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/4.8/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/4.9/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/6/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/7/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/8/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gcc/9/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/gforth/boot-forth.nixnew file+24
This diff is too big to show here.
pkgs/development/compilers/gforth/default.nix+23−10
This diff is too big to show here.
pkgs/development/compilers/gforth/swig.nixnew file+16
This diff is too big to show here.
pkgs/development/compilers/ghc/8.10.7.nix+9
This diff is too big to show here.
pkgs/development/compilers/ghc/9.0.2.nix+9−8
This diff is too big to show here.
pkgs/development/compilers/ghc/9.2.1.nix+9−8
This diff is too big to show here.
pkgs/development/compilers/ghc/cabal-paths.patchnew file+99
This diff is too big to show here.
pkgs/development/compilers/gleam/default.nix+3−3
This diff is too big to show here.
pkgs/development/compilers/glslang/default.nix+5
This diff is too big to show here.
pkgs/development/compilers/go-jsonnet/default.nix+12−5
This diff is too big to show here.
pkgs/development/compilers/go/1.16.nix+5−3
This diff is too big to show here.
pkgs/development/compilers/go/1.17.nix+5−3
This diff is too big to show here.
pkgs/development/compilers/go/1.15.nix → pkgs/development/compilers/go/1.18.nixrenamed+17−25
This diff is too big to show here.
pkgs/development/compilers/go/go_no_vendor_checks.patchdeleted−23
This diff is too big to show here.
pkgs/development/compilers/go/skip-chown-tests-1.16.patchnew file+42
This diff is too big to show here.
pkgs/development/compilers/go/skip-external-network-tests-1.15.patchdeleted−13
This diff is too big to show here.
pkgs/development/compilers/go/ssl-cert-file-1.15.patchdeleted−76
This diff is too big to show here.
pkgs/development/compilers/graalvm/community-edition/default.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/graalvm/community-edition/hashes.nix+33−33
This diff is too big to show here.
pkgs/development/compilers/haxe/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/hip/default.nix+3−3
This diff is too big to show here.
pkgs/development/compilers/inklecate/deps-darwin.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/inklecate/deps-linux.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/ios-cross-compile/9.2.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/jetbrains-jdk/default.nix+3−2
This diff is too big to show here.
pkgs/development/compilers/julia/1.7-bin.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/ligo/default.nix+43−14
This diff is too big to show here.
pkgs/development/compilers/llvm/10/clang/default.nix−1
This diff is too big to show here.
pkgs/development/compilers/llvm/10/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/10/llvm/default.nix+65−13
This diff is too big to show here.
pkgs/development/compilers/llvm/10/llvm/outputs.patchdeleted−16
This diff is too big to show here.
pkgs/development/compilers/llvm/11/clang/default.nix−1
This diff is too big to show here.
pkgs/development/compilers/llvm/11/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/11/llvm/default.nix+75−13
This diff is too big to show here.
pkgs/development/compilers/llvm/11/llvm/outputs.patchdeleted−16
This diff is too big to show here.
pkgs/development/compilers/llvm/12/clang/default.nix−1
This diff is too big to show here.
pkgs/development/compilers/llvm/12/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/12/libcxx/default.nix−6
This diff is too big to show here.
pkgs/development/compilers/llvm/12/llvm/default.nix+77−13
This diff is too big to show here.
pkgs/development/compilers/llvm/12/llvm/fix-llvm-issue-49955.patchnew file+13
This diff is too big to show here.
pkgs/development/compilers/llvm/12/llvm/outputs.patchdeleted−16
This diff is too big to show here.
pkgs/development/compilers/llvm/13/clang/add-nostdlibinc-flag.patchnew file+18
This diff is too big to show here.
pkgs/development/compilers/llvm/13/clang/default.nix+1−5
This diff is too big to show here.
pkgs/development/compilers/llvm/13/default.nix+7−3
This diff is too big to show here.
pkgs/development/compilers/llvm/13/libcxx/default.nix−6
This diff is too big to show here.
pkgs/development/compilers/llvm/13/llvm/default.nix+47−13
This diff is too big to show here.
pkgs/development/compilers/llvm/13/llvm/outputs.patchdeleted−16
This diff is too big to show here.
pkgs/development/compilers/llvm/14/bintools/default.nixnew file+29
This diff is too big to show here.
pkgs/development/compilers/llvm/14/clang/default.nixnew file+131
This diff is too big to show here.
pkgs/development/compilers/llvm/14/clang/gnu-install-dirs.patchnew file+50
This diff is too big to show here.
pkgs/development/compilers/llvm/14/clang/purity.patchnew file+28
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/X86-support-extension.patchnew file+21
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/armv7l.patchnew file+32
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/codesign.patchnew file+33
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/darwin-targetconditionals.patchnew file+71
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/default.nixnew file+126
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/gnu-install-dirs.patchnew file+42
This diff is too big to show here.
pkgs/development/compilers/llvm/14/compiler-rt/normalize-var.patchnew file+16
This diff is too big to show here.
pkgs/development/compilers/llvm/14/default.nix+278
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libcxx/default.nix+89
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libcxx/gnu-install-dirs.patch+85
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libcxxabi/default.nix+87
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libcxxabi/gnu-install-dirs.patch+46
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libcxxabi/wasm.patch+16
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libunwind/default.nix+48
This diff is too big to show here.
pkgs/development/compilers/llvm/14/libunwind/gnu-install-dirs.patch+65
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lld/default.nix+55
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lld/fix-root-src-dir.patch+13
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lld/gnu-install-dirs.patch+22
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lldb/default.nix+145
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lldb/gnu-install-dirs.patch+36
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lldb/procfs.patch+31
This diff is too big to show here.
pkgs/development/compilers/llvm/14/lldb/resource-dir.patch+13
This diff is too big to show here.
pkgs/development/compilers/llvm/14/llvm/default.nix+257
This diff is too big to show here.
pkgs/development/compilers/llvm/14/llvm/gnu-install-dirs-polly.patch+102
This diff is too big to show here.
pkgs/development/compilers/llvm/14/llvm/gnu-install-dirs.patch+220
This diff is too big to show here.
pkgs/development/compilers/llvm/14/openmp/default.nix+66
This diff is too big to show here.
pkgs/development/compilers/llvm/14/openmp/gnu-install-dirs.patch+45
This diff is too big to show here.
pkgs/development/compilers/llvm/14/openmp/run-lit-directly.patch+12
This diff is too big to show here.
pkgs/development/compilers/llvm/5/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/5/llvm/default.nix+62−14
This diff is too big to show here.
pkgs/development/compilers/llvm/5/llvm/outputs.patch−16
This diff is too big to show here.
pkgs/development/compilers/llvm/6/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/6/llvm/default.nix+64−14
This diff is too big to show here.
pkgs/development/compilers/llvm/6/llvm/outputs.patch−16
This diff is too big to show here.
pkgs/development/compilers/llvm/7/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/7/llvm/default.nix+66−14
This diff is too big to show here.
pkgs/development/compilers/llvm/7/llvm/outputs.patch−16
This diff is too big to show here.
pkgs/development/compilers/llvm/8/clang/default.nix−1
This diff is too big to show here.
pkgs/development/compilers/llvm/8/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/8/llvm/default.nix+66−14
This diff is too big to show here.
pkgs/development/compilers/llvm/8/llvm/outputs.patch−16
This diff is too big to show here.
pkgs/development/compilers/llvm/9/clang/default.nix−1
This diff is too big to show here.
pkgs/development/compilers/llvm/9/default.nix+5−1
This diff is too big to show here.
pkgs/development/compilers/llvm/9/llvm/default.nix+65−13
This diff is too big to show here.
pkgs/development/compilers/llvm/9/llvm/outputs.patch−16
This diff is too big to show here.
pkgs/development/compilers/llvm/git/clang/default.nix+11−5
This diff is too big to show here.
pkgs/development/compilers/llvm/git/clang/gnu-install-dirs.patch+21−21
This diff is too big to show here.
pkgs/development/compilers/llvm/git/compiler-rt/default.nix+14−3
This diff is too big to show here.
pkgs/development/compilers/llvm/git/compiler-rt/gnu-install-dirs.patch+55
This diff is too big to show here.
pkgs/development/compilers/llvm/git/default.nix+11−7
This diff is too big to show here.
pkgs/development/compilers/llvm/git/libcxx/default.nix+20−10
This diff is too big to show here.
pkgs/development/compilers/llvm/git/libcxx/gnu-install-dirs.patch+50−47
This diff is too big to show here.
pkgs/development/compilers/llvm/git/libcxxabi/default.nix+16−3
This diff is too big to show here.
pkgs/development/compilers/llvm/git/libcxxabi/gnu-install-dirs.patch+19−10
This diff is too big to show here.
pkgs/development/compilers/llvm/git/libunwind/default.nix+17−3
This diff is too big to show here.
pkgs/development/compilers/llvm/git/libunwind/gnu-install-dirs.patch+45−16
This diff is too big to show here.
pkgs/development/compilers/llvm/git/lld/default.nix+17−6
This diff is too big to show here.
pkgs/development/compilers/llvm/git/lld/fix-root-src-dir.patch+13
This diff is too big to show here.
pkgs/development/compilers/llvm/git/lld/gnu-install-dirs.patch+6−52
This diff is too big to show here.
pkgs/development/compilers/llvm/git/lldb/default.nix+8−3
This diff is too big to show here.
pkgs/development/compilers/llvm/git/lldb/gnu-install-dirs.patch+7−62
This diff is too big to show here.
pkgs/development/compilers/llvm/git/llvm/default.nix+54−17
This diff is too big to show here.
pkgs/development/compilers/llvm/git/llvm/gnu-install-dirs-polly.patch+7−10
This diff is too big to show here.
pkgs/development/compilers/llvm/git/llvm/gnu-install-dirs.patch+56−217
This diff is too big to show here.
pkgs/development/compilers/llvm/git/llvm/outputs.patch−16
This diff is too big to show here.
pkgs/development/compilers/llvm/git/openmp/default.nix+19−4
This diff is too big to show here.
pkgs/development/compilers/llvm/git/openmp/fix-find-tool.patch+54
This diff is too big to show here.
pkgs/development/compilers/llvm/git/openmp/gnu-install-dirs.patch+89
This diff is too big to show here.
pkgs/development/compilers/llvm/llvm-config-link-static.patch+12
This diff is too big to show here.
pkgs/development/compilers/llvm/rocm/llvm/default.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/llvm/update.sh+6−2
This diff is too big to show here.
pkgs/development/compilers/mezzo/default.nix+4
This diff is too big to show here.
pkgs/development/compilers/mit-scheme/default.nix+2−1
This diff is too big to show here.
pkgs/development/compilers/mlton/from-git-source.nix+3
This diff is too big to show here.
pkgs/development/compilers/myrddin/default.nix+1
This diff is too big to show here.
pkgs/development/compilers/nim/default.nix+6−6
This diff is too big to show here.
pkgs/development/compilers/ocaml/4.12.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/ocaml/4.14.nix+9
This diff is too big to show here.
pkgs/development/compilers/open-watcom/v2.nix+6−7
This diff is too big to show here.
pkgs/development/compilers/opendylan/default.nix+5−4
This diff is too big to show here.
pkgs/development/compilers/openjdk/8.nix+11−70
This diff is too big to show here.
pkgs/development/compilers/openjdk/darwin/8.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/openjdk/jre.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/openjdk/openjfx/11.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/openjdk/openjfx/15.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/openjdk/openjfx/17.nix+106
This diff is too big to show here.
pkgs/development/compilers/oraclejdk/jdk-linux-base.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/orc/default.nix+3
This diff is too big to show here.
pkgs/development/compilers/osl/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/passerine/default.nix+5−5
This diff is too big to show here.
pkgs/development/compilers/purescript/purescript/default.nix+3−3
This diff is too big to show here.
pkgs/development/compilers/qbe/default.nix+3−3
This diff is too big to show here.
pkgs/development/compilers/reason/default.nix+7−7
This diff is too big to show here.
pkgs/development/compilers/roslyn/create-deps.sh+1−1
This diff is too big to show here.
pkgs/development/compilers/roslyn/default.nix+2−3
This diff is too big to show here.
pkgs/development/compilers/roslyn/deps.nix+142−142
This diff is too big to show here.
pkgs/development/compilers/rust/1_58.nix+15−15
This diff is too big to show here.
pkgs/development/compilers/rust/clippy.nix+1−5
This diff is too big to show here.
pkgs/development/compilers/rust/make-rust-platform.nix+4−4
This diff is too big to show here.
pkgs/development/compilers/rust/print-hashes.sh+1
This diff is too big to show here.
pkgs/development/compilers/rust/rust-lib-src.nix+5−10
This diff is too big to show here.
pkgs/development/compilers/rust/rust-src.nix+20−24
This diff is too big to show here.
pkgs/development/compilers/rust/rustc.nix+3
This diff is too big to show here.
pkgs/development/compilers/sbcl/common.nix+1−3
This diff is too big to show here.
pkgs/development/compilers/scala/dotty.nix+2−1
This diff is too big to show here.
pkgs/development/compilers/sdcc/default.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/souffle/default.nix+8−27
This diff is too big to show here.
pkgs/development/compilers/squeak/default.nix+180−28
This diff is too big to show here.
pkgs/development/compilers/squeak/squeak-configure-version.patch+94
This diff is too big to show here.
pkgs/development/compilers/squeak/squeak-plugins-discovery.patch+34
This diff is too big to show here.
pkgs/development/compilers/squeak/squeak-squeaksh-nixpkgs.patch+40
This diff is too big to show here.
pkgs/development/compilers/swift/default.nix+73−51
This diff is too big to show here.
pkgs/development/compilers/tvm/default.nix+2−2
This diff is too big to show here.
pkgs/development/compilers/uasm/default.nix+50
This diff is too big to show here.
pkgs/development/compilers/unison/default.nix+1−1
This diff is too big to show here.
pkgs/development/compilers/urn/default.nix+2−1
This diff is too big to show here.
pkgs/development/compilers/vala/default.nix+14−11
This diff is too big to show here.
pkgs/development/compilers/yosys/default.nix+4−4
This diff is too big to show here.
pkgs/development/compilers/zig/default.nix+3−2
This diff is too big to show here.
pkgs/development/coq-modules/ITree/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/LibHyps/default.nix+21
This diff is too big to show here.
pkgs/development/coq-modules/QuickChick/default.nix+2−2
This diff is too big to show here.
pkgs/development/coq-modules/VST/default.nix+10−2
This diff is too big to show here.
pkgs/development/coq-modules/addition-chains/default.nix+4−3
This diff is too big to show here.
pkgs/development/coq-modules/compcert/default.nix+13−2
This diff is too big to show here.
pkgs/development/coq-modules/coq-bits/default.nix+1
This diff is too big to show here.
pkgs/development/coq-modules/coq-elpi/default.nix+5−2
This diff is too big to show here.
pkgs/development/coq-modules/coq-ext-lib/default.nix+3−1
This diff is too big to show here.
pkgs/development/coq-modules/coq-record-update/default.nix+2−1
This diff is too big to show here.
pkgs/development/coq-modules/coqeal/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/coqhammer/default.nix+3
This diff is too big to show here.
pkgs/development/coq-modules/coqtail-math/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/coquelicot/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/corn/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/deriving/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/dpdgraph/default.nix+3−1
This diff is too big to show here.
pkgs/development/coq-modules/equations/default.nix+9−6
This diff is too big to show here.
pkgs/development/coq-modules/extructures/default.nix+2
This diff is too big to show here.
pkgs/development/coq-modules/flocq/default.nix+2−1
This diff is too big to show here.
pkgs/development/coq-modules/fourcolor/default.nix+4−1
This diff is too big to show here.
pkgs/development/coq-modules/gaia-hydras/default.nix+2
This diff is too big to show here.
pkgs/development/coq-modules/gaia/default.nix+2−2
This diff is too big to show here.
pkgs/development/coq-modules/gappalib/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/graph-theory/default.nix+2−2
This diff is too big to show here.
pkgs/development/coq-modules/hierarchy-builder/default.nix+3−1
This diff is too big to show here.
pkgs/development/coq-modules/hydra-battles/default.nix+8−6
This diff is too big to show here.
pkgs/development/coq-modules/interval/default.nix+5−4
This diff is too big to show here.
pkgs/development/coq-modules/iris/default.nix+3−1
This diff is too big to show here.
pkgs/development/coq-modules/itauto/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/math-classes/default.nix+2−2
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp-abel/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp-analysis/default.nix+2
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp-finmap/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp-real-closed/default.nix+8−1
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp-word/default.nix+2−2
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp-zify/default.nix+3−3
This diff is too big to show here.
pkgs/development/coq-modules/mathcomp/default.nix+5−4
This diff is too big to show here.
pkgs/development/coq-modules/multinomials/default.nix+3−2
This diff is too big to show here.
pkgs/development/coq-modules/odd-order/default.nix+12−1
This diff is too big to show here.
pkgs/development/coq-modules/paramcoq/default.nix+2−1
This diff is too big to show here.
pkgs/development/coq-modules/reglang/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/semantics/default.nix+2−1
This diff is too big to show here.
pkgs/development/coq-modules/serapi/default.nix+4−21
This diff is too big to show here.
pkgs/development/coq-modules/simple-io/default.nix+1−1
This diff is too big to show here.
pkgs/development/coq-modules/stdpp/default.nix+3−1
This diff is too big to show here.
pkgs/development/dotnet-modules/python-language-server/default.nix+3−3
This diff is too big to show here.
pkgs/development/embedded/arduino/arduino-cli/default.nix+3−3
This diff is too big to show here.
pkgs/development/embedded/arduino/arduino-core/default.nix+11−11
This diff is too big to show here.
pkgs/development/embedded/bossa/default.nix+7−6
This diff is too big to show here.
pkgs/development/embedded/gputils/default.nix+2−2
This diff is too big to show here.
pkgs/development/embedded/platformio/core.nix+13−34
This diff is too big to show here.
pkgs/development/embedded/platformio/default.nix+2−2
This diff is too big to show here.
pkgs/development/embedded/platformio/fix-searchpath.patch+1−1
This diff is too big to show here.
pkgs/development/embedded/platformio/use-local-spdx-license-list.patch+1−1
This diff is too big to show here.
pkgs/development/embedded/stm32/stm32cubemx/default.nix+3−3
This diff is too big to show here.
pkgs/development/embedded/tytools/default.nix+2−2
This diff is too big to show here.
pkgs/development/guile-modules/guile-gnome/default.nix−70
This diff is too big to show here.
pkgs/development/guile-modules/guile-json/default.nix+2−2
This diff is too big to show here.
pkgs/development/guile-modules/guile-ssh/default.nix+2−2
This diff is too big to show here.
pkgs/development/guile-modules/guile-xcb/default.nix+7−5
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-arm.nix+3
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-common.nix+27−33
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix+8−20
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix+36−7
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-hackage2nix/broken.yaml+26−6
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-hackage2nix/main.yaml+7−7
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-hackage2nix/stackage.yaml+81−75
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-hackage2nix/transitive-broken.yaml+28−30
This diff is too big to show here.
pkgs/development/haskell-modules/configuration-nix.nix+44−120
This diff is too big to show here.
pkgs/development/haskell-modules/hackage-packages.nix+3553−1670
This diff is too big to show here.
pkgs/development/haskell-modules/hoogle.nix+7
This diff is too big to show here.
pkgs/development/haskell-modules/make-package-set.nix+20−11
This diff is too big to show here.
pkgs/development/haskell-modules/non-hackage-packages.nix−2
This diff is too big to show here.
pkgs/development/haskell-modules/package-list.nix+7−1
This diff is too big to show here.
pkgs/development/haskell-modules/with-packages-wrapper.nix+15
This diff is too big to show here.
pkgs/development/idris-modules/array.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/bi.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/bifunctors.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/build-builtin-package.nix+5−5
This diff is too big to show here.
pkgs/development/idris-modules/build-idris-package.nix+5−4
This diff is too big to show here.
pkgs/development/idris-modules/bytes.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/canvas.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/categories.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/coda.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/comonad.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/composition.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/config.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/console.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/containers.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/cube.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/default.nix+5−4
This diff is too big to show here.
pkgs/development/idris-modules/derive.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/descncrunch.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/dict.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/dom.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/electron.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/eternal.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/farrp.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/free.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/fsm.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/glfw.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/graphviz.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/hamt.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/hezarfen.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/hrtime.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/html.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/http.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/http4idris.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/iaia.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/idrishighlighter.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/idrisscript.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/ipkgparser.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/jheiling-extras.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/jheiling-js.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/js.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/lens.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/lightyear.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/logic.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/mapping.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/mhd.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/pacman.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/patricia.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/permutations.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/pfds.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/pipes.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/posix.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/protobuf.nix−25
This diff is too big to show here.
pkgs/development/idris-modules/quantities.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/rationals.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/recursion_schemes.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/refined.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/sdl.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/sdl2.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/semidirect.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/setoids.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/smproc.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/snippets.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/software_foundations.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/specdris.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/tap.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/test.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/tfrandom.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/tlhydra.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/tomladris.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/tp.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/tparsec.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/transducers.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/trees.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/union_type.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/vdom.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/vecspace.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/webgl.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/wl-pprint.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/wyvern.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/xhr.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/yaml.nix+1−1
This diff is too big to show here.
pkgs/development/idris-modules/yampa.nix+1−1
This diff is too big to show here.
pkgs/development/interpreters/alda/default.nix+3−3
This diff is too big to show here.
pkgs/development/interpreters/bats/default.nix+34−10
This diff is too big to show here.
pkgs/development/interpreters/ceptre/default.nix+6−4
This diff is too big to show here.
pkgs/development/interpreters/chibi/default.nix+11−13
This diff is too big to show here.
pkgs/development/interpreters/clisp/default.nix+3−3
This diff is too big to show here.
pkgs/development/interpreters/clisp/hg.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/clojure/babashka.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/clojure/default.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/clojure/obb.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/dart/default.nix+6−6
This diff is too big to show here.
pkgs/development/interpreters/dhall/build-dhall-directory-package.nix+1−2
This diff is too big to show here.
pkgs/development/interpreters/duktape/default.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/elixir/1.13.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/elixir/generic-builder.nix+1−1
This diff is too big to show here.
pkgs/development/interpreters/erlang/generic-builder.nix+1−1
This diff is too big to show here.
pkgs/development/interpreters/guile/2.2.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/guile/3.0.nix+23−5
This diff is too big to show here.
pkgs/development/interpreters/janet/darwin-remove-net-test.patch+20
This diff is too big to show here.
pkgs/development/interpreters/janet/default.nix+9−10
This diff is too big to show here.
pkgs/development/interpreters/janet/jpm.nix+59
This diff is too big to show here.
pkgs/development/interpreters/jruby/default.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/love/0.10.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/lunatic/default.nix+3−3
This diff is too big to show here.
pkgs/development/interpreters/micropython/default.nix+3−3
This diff is too big to show here.
pkgs/development/interpreters/nextflow/default.nix+56
This diff is too big to show here.
pkgs/development/interpreters/php/7.4.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/php/8.0.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/php/8.1.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/pixie/default.nix+5−4
This diff is too big to show here.
pkgs/development/interpreters/python/cpython/default.nix+4−8
This diff is too big to show here.
pkgs/development/interpreters/python/default.nix+26−25
This diff is too big to show here.
pkgs/development/interpreters/python/pypy/prebuilt_2_7.nix−2
This diff is too big to show here.
pkgs/development/interpreters/python/update-python-libraries/update-python-libraries.py+9−3
This diff is too big to show here.
pkgs/development/interpreters/quickjs/default.nix+1
This diff is too big to show here.
pkgs/development/interpreters/racket/default.nix+38−6
This diff is too big to show here.
pkgs/development/interpreters/racket/force-remove-codesign-then-add.patch+11
This diff is too big to show here.
pkgs/development/interpreters/racket/minimal.nix+5−4
This diff is too big to show here.
pkgs/development/interpreters/rakudo/default.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/rakudo/moarvm.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/rakudo/nqp.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/rakudo/zef.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/regina/default.upstream−5
This diff is too big to show here.
pkgs/development/interpreters/ruby/default.nix+5−4
This diff is too big to show here.
pkgs/development/interpreters/ruby/patchsets.nix+1−1
This diff is too big to show here.
pkgs/development/interpreters/spidermonkey/68.nix−104
This diff is too big to show here.
pkgs/development/interpreters/spidermonkey/78.nix+14−2
This diff is too big to show here.
pkgs/development/interpreters/spidermonkey/91.nix+3−4
This diff is too big to show here.
pkgs/development/interpreters/spidermonkey/add-riscv64-support.patch+123
This diff is too big to show here.
pkgs/development/interpreters/trealla/default.nix+2−2
This diff is too big to show here.
pkgs/development/interpreters/wasmtime/default.nix+2−2
This diff is too big to show here.
pkgs/development/java-modules/m2install.nix+3−3
This diff is too big to show here.
pkgs/development/java-modules/maven-fod.nix+56
This diff is too big to show here.
pkgs/development/libraries/CGAL/4.nix+5−9
This diff is too big to show here.
pkgs/development/libraries/CGAL/default.nix+2−2
This diff is too big to show here.
pkgs/development/libraries/LAStools/default.nix+3−3
This diff is too big to show here.