git.iko.soy/typeable/nixpkgs
on master help sign in
.editorconfig+5
since splitsnapshots
unifiedsplit
@@ -55,6 +55,11 @@ trim_trailing_whitespace = unset
55[*.lock]
55[*.lock]
56indent_size = unset
56indent_size = unset
57
57
58+# trailing whitespace is an actual syntax element of classic Markdown/
59+# CommonMark to enforce a line break
60+[*.md]
61+trim_trailing_whitespace = unset
62+
58[eggs.nix]
63[eggs.nix]
59trim_trailing_whitespace = unset
64trim_trailing_whitespace = unset
60
65
.github/CODEOWNERS+8−4
@@ -41,7 +41,8 @@
41/pkgs/build-support/cc-wrapper @Ericson2314
41/pkgs/build-support/cc-wrapper @Ericson2314
42/pkgs/build-support/bintools-wrapper @Ericson2314
42/pkgs/build-support/bintools-wrapper @Ericson2314
43/pkgs/build-support/setup-hooks @Ericson2314
43/pkgs/build-support/setup-hooks @Ericson2314
44−/pkgs/build-support/setup-hooks/auto-patchelf.sh @aszlig
44+/pkgs/build-support/setup-hooks/auto-patchelf.sh @layus
45+/pkgs/build-support/setup-hooks/auto-patchelf.py @layus
45
46
46# Nixpkgs build-support
47# Nixpkgs build-support
47/pkgs/build-support/writers @lassulus @Profpatsch
48/pkgs/build-support/writers @lassulus @Profpatsch
@@ -242,9 +243,8 @@
242
243
243# Docker tools
244# Docker tools
244/pkgs/build-support/docker @roberth
245/pkgs/build-support/docker @roberth
245−/nixos/tests/docker-tools-overlay.nix @roberth
246+/nixos/tests/docker-tools* @roberth
246−/nixos/tests/docker-tools.nix @roberth
247−/doc/builders/images/dockertools.xml @roberth
247+/doc/builders/images/dockertools.section.md @roberth
248
248
249# Blockchains
249# Blockchains
250/pkgs/applications/blockchains @mmahut @RaghavSood
250/pkgs/applications/blockchains @mmahut @RaghavSood
@@ -285,3 +285,7 @@
285/nixos/modules/services/misc/matrix-conduit.nix @piegamesde
285/nixos/modules/services/misc/matrix-conduit.nix @piegamesde
286/nixos/tests/matrix-appservice-irc.nix @piegamesde
286/nixos/tests/matrix-appservice-irc.nix @piegamesde
287/nixos/tests/matrix-conduit.nix @piegamesde
287/nixos/tests/matrix-conduit.nix @piegamesde
288+
289+# Dotnet
290+/pkgs/build-support/dotnet @IvarWithoutBones
291+/pkgs/development/compilers/dotnet @IvarWithoutBones
.github/workflows/basic-eval.yml+1−1
@@ -16,7 +16,7 @@ jobs:
16 # we don't limit this action to only NixOS repo since the checks are cheap and useful developer feedback
16 # we don't limit this action to only NixOS repo since the checks are cheap and useful developer feedback
17 steps:
17 steps:
18 - uses: actions/checkout@v3
18 - uses: actions/checkout@v3
19− - uses: cachix/install-nix-action@v16
19+ - uses: cachix/install-nix-action@v17
20 - uses: cachix/cachix-action@v10
20 - uses: cachix/cachix-action@v10
21 with:
21 with:
22 # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
22 # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
.github/workflows/editorconfig.yml+1−1
@@ -28,7 +28,7 @@ jobs:
28 with:
28 with:
29 # pull_request_target checks out the base branch by default
29 # pull_request_target checks out the base branch by default
30 ref: refs/pull/${{ github.event.pull_request.number }}/merge
30 ref: refs/pull/${{ github.event.pull_request.number }}/merge
31− - uses: cachix/install-nix-action@v16
31+ - uses: cachix/install-nix-action@v17
32 with:
32 with:
33 # nixpkgs commit is pinned so that it doesn't break
33 # nixpkgs commit is pinned so that it doesn't break
34 # editorconfig-checker 2.4.0
34 # editorconfig-checker 2.4.0
.github/workflows/manual-nixos.yml+1−1
@@ -18,7 +18,7 @@ jobs:
18 with:
18 with:
19 # pull_request_target checks out the base branch by default
19 # pull_request_target checks out the base branch by default
20 ref: refs/pull/${{ github.event.pull_request.number }}/merge
20 ref: refs/pull/${{ github.event.pull_request.number }}/merge
21− - uses: cachix/install-nix-action@v16
21+ - uses: cachix/install-nix-action@v17
22 with:
22 with:
23 # explicitly enable sandbox
23 # explicitly enable sandbox
24 extra_nix_config: sandbox = true
24 extra_nix_config: sandbox = true
.github/workflows/manual-nixpkgs.yml+1−1
@@ -18,7 +18,7 @@ jobs:
18 with:
18 with:
19 # pull_request_target checks out the base branch by default
19 # pull_request_target checks out the base branch by default
20 ref: refs/pull/${{ github.event.pull_request.number }}/merge
20 ref: refs/pull/${{ github.event.pull_request.number }}/merge
21− - uses: cachix/install-nix-action@v16
21+ - uses: cachix/install-nix-action@v17
22 with:
22 with:
23 # explicitly enable sandbox
23 # explicitly enable sandbox
24 extra_nix_config: sandbox = true
24 extra_nix_config: sandbox = true
.github/workflows/nixos-manual.yml+1−1
@@ -19,7 +19,7 @@ jobs:
19 with:
19 with:
20 # pull_request_target checks out the base branch by default
20 # pull_request_target checks out the base branch by default
21 ref: refs/pull/${{ github.event.pull_request.number }}/merge
21 ref: refs/pull/${{ github.event.pull_request.number }}/merge
22− - uses: cachix/install-nix-action@v16
22+ - uses: cachix/install-nix-action@v17
23 - name: Check DocBook files generated from Markdown are consistent
23 - name: Check DocBook files generated from Markdown are consistent
24 run: |
24 run: |
25 nixos/doc/manual/md-to-db.sh
25 nixos/doc/manual/md-to-db.sh
.github/workflows/update-terraform-providers.yml+7−6
@@ -11,7 +11,7 @@ jobs:
11 runs-on: ubuntu-latest
11 runs-on: ubuntu-latest
12 steps:
12 steps:
13 - uses: actions/checkout@v3
13 - uses: actions/checkout@v3
14− - uses: cachix/install-nix-action@v16
14+ - uses: cachix/install-nix-action@v17
15 - name: setup
15 - name: setup
16 id: setup
16 id: setup
17 run: |
17 run: |
@@ -25,14 +25,15 @@ jobs:
25 git commit -m "${{ steps.setup.outputs.title }}" providers.json
25 git commit -m "${{ steps.setup.outputs.title }}" providers.json
26 popd
26 popd
27 - name: create PR
27 - name: create PR
28− uses: peter-evans/create-pull-request@v3
28+ uses: peter-evans/create-pull-request@v4
29 with:
29 with:
30 body: |
30 body: |
31− Automatic update of terraform providers.
31+ Automatic update by [update-terraform-providers](https://github.com/NixOS/nixpkgs/blob/master/.github/workflows/update-terraform-providers.yml) action.
32
32
33− Created by [update-terraform-providers](https://github.com/NixOS/nixpkgs/blob/master/.github/workflows/update-terraform-providers.yml) action.
34−
35− Check that all providers build with `@ofborg build terraform-full`
33+ Check that all providers build with:
34+ ```
35+ @ofborg build terraform-full
36+ ```
36 branch: terraform-providers-update
37 branch: terraform-providers-update
37 delete-branch: false
38 delete-branch: false
38 labels: "2.status: work-in-progress"
39 labels: "2.status: work-in-progress"
CONTRIBUTING.md+42−1
@@ -20,7 +20,7 @@ Below is a short excerpt of some points in there:
20 ```
20 ```
21 (pkg-name | nixos/<module>): (from -> to | init at version | refactor | etc)
21 (pkg-name | nixos/<module>): (from -> to | init at version | refactor | etc)
22
22
23− (Motivation for change. Additional information.)
23+ (Motivation for change. Link to release notes. Additional information.)
24 ```
24 ```
25
25
26 For consistency, there should not be a period at the end of the commit message's summary line (the first line of the commit message).
26 For consistency, there should not be a period at the end of the commit message's summary line (the first line of the commit message).
@@ -29,6 +29,7 @@ Below is a short excerpt of some points in there:
29
29
30 * nginx: init at 2.0.1
30 * nginx: init at 2.0.1
31 * firefox: 54.0.1 -> 55.0
31 * firefox: 54.0.1 -> 55.0
32+ https://www.mozilla.org/en-US/firefox/55.0/releasenotes/
32 * nixos/hydra: add bazBaz option
33 * nixos/hydra: add bazBaz option
33
34
34 Dual baz behavior is needed to do foo.
35 Dual baz behavior is needed to do foo.
@@ -52,6 +53,46 @@ In addition to writing properly formatted commit messages, it's important to inc
52
53
53For package version upgrades and such a one-line commit message is usually sufficient.
54For package version upgrades and such a one-line commit message is usually sufficient.
54
55
56+## Rebasing between branches (i.e. from master to staging)
57+
58+From time to time, changes between branches must be rebased, for example, if the
59+number of new rebuilds they would cause is too large for the target branch. When
60+rebasing, care must be taken to include only the intended changes, otherwise
61+many CODEOWNERS will be inadvertently requested for review. To achieve this,
62+rebasing should not be performed directly on the target branch, but on the merge
63+base between the current and target branch.
64+
65+In the following example, we see a rebase from `master` onto the merge base
66+between `master` and `staging`, so that a change can eventually be retargeted to
67+`staging`. The example uses `upstream` as the remote for `NixOS/nixpkgs.git`
68+while the `origin` remote is used for the remote you are pushing to.
69+
70+
71+```console
72+# Find the common base between two branches
73+common=$(git merge-base upstream/master upstream/staging)
74+# Find the common base between your feature branch and master
75+commits=$(git merge-base $(git branch --show-current) upstream/master)
76+# Rebase all commits onto the common base
77+git rebase --onto=$common $commits
78+# Force push your changes
79+git push origin $(git branch --show-current) --force-with-lease
80+```
81+
82+Then change the base branch in the GitHub PR using the *Edit* button in the upper
83+right corner, and switch from `master` to `staging`. After the PR has been
84+retargeted it might be necessary to do a final rebase onto the target branch, to
85+resolve any outstanding merge conflicts.
86+
87+```console
88+# Rebase onto target branch
89+git rebase upstream/staging
90+# Review and fixup possible conflicts
91+git status
92+# Force push your changes
93+git push origin $(git branch --show-current) --force-with-lease
94+```
95+
55## Backporting changes
96## Backporting changes
56
97
57Follow these steps to backport a change into a release branch in compliance with the [commit policy](https://nixos.org/nixpkgs/manual/#submitting-changes-stable-release-branches).
98Follow these steps to backport a change into a release branch in compliance with the [commit policy](https://nixos.org/nixpkgs/manual/#submitting-changes-stable-release-branches).
doc/builders/fetchers.chapter.md+12−12
@@ -6,11 +6,11 @@ When using Nix, you will frequently need to download source code and other files
6
6
7Because fixed output derivations are _identified_ by their hash, a common mistake is to update a fetcher's URL or a version parameter, without updating the hash. **This will cause the old contents to be used.** So remember to always invalidate the hash argument.
7Because fixed output derivations are _identified_ by their hash, a common mistake is to update a fetcher's URL or a version parameter, without updating the hash. **This will cause the old contents to be used.** So remember to always invalidate the hash argument.
8
8
9−For those who develop and maintain fetchers, a similar problem arises with changes to the implementation of a fetcher. These may cause a fixed output derivation to fail, but won't normally be caught by tests because the supposed output is already in the store or cache. For the purpose of testing, you can use a trick that is embodied by the [`invalidateFetcherByDrvHash`](#sec-pkgs-invalidateFetcherByDrvHash) function. It uses the derivation `name` to create a unique output path per fetcher implementation, defeating the caching precisely where it would be harmful.
9+For those who develop and maintain fetchers, a similar problem arises with changes to the implementation of a fetcher. These may cause a fixed output derivation to fail, but won't normally be caught by tests because the supposed output is already in the store or cache. For the purpose of testing, you can use a trick that is embodied by the [`invalidateFetcherByDrvHash`](#tester-invalidateFetcherByDrvHash) function. It uses the derivation `name` to create a unique output path per fetcher implementation, defeating the caching precisely where it would be harmful.
10
10
11## `fetchurl` and `fetchzip` {#fetchurl}
11## `fetchurl` and `fetchzip` {#fetchurl}
12
12
13−Two basic fetchers are `fetchurl` and `fetchzip`. Both of these have two required arguments, a URL and a hash. The hash is typically `sha256`, although many more hash algorithms are supported. Nixpkgs contributors are currently recommended to use `sha256`. This hash will be used by Nix to identify your source. A typical usage of fetchurl is provided below.
13+Two basic fetchers are `fetchurl` and `fetchzip`. Both of these have two required arguments, a URL and a hash. The hash is typically `sha256`, although many more hash algorithms are supported. Nixpkgs contributors are currently recommended to use `sha256`. This hash will be used by Nix to identify your source. A typical usage of `fetchurl` is provided below.
14
14
15```nix
15```nix
16{ stdenv, fetchurl }:
16{ stdenv, fetchurl }:
@@ -24,9 +24,9 @@ stdenv.mkDerivation {
24}
24}
25```
25```
26
26
27−The main difference between `fetchurl` and `fetchzip` is in how they store the contents. `fetchurl` will store the unaltered contents of the URL within the Nix store. `fetchzip` on the other hand will decompress the archive for you, making files and directories directly accessible in the future. `fetchzip` can only be used with archives. Despite the name, `fetchzip` is not limited to .zip files and can also be used with any tarball.
27+The main difference between `fetchurl` and `fetchzip` is in how they store the contents. `fetchurl` will store the unaltered contents of the URL within the Nix store. `fetchzip` on the other hand, will decompress the archive for you, making files and directories directly accessible in the future. `fetchzip` can only be used with archives. Despite the name, `fetchzip` is not limited to .zip files and can also be used with any tarball.
28
28
29−`fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
29+`fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example, it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
30
30
31Most other fetchers return a directory rather than a single file.
31Most other fetchers return a directory rather than a single file.
32
32
@@ -38,9 +38,9 @@ Used with Subversion. Expects `url` to a Subversion directory, `rev`, and `sha25
38
38
39Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
39Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
40
40
41−Additionally 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.
41+Additionally, 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.
42
42
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:
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 information:
44
44
45```nix
45```nix
46{ stdenv, fetchgit }:
46{ stdenv, fetchgit }:
@@ -78,17 +78,17 @@ A number of fetcher functions wrap part of `fetchurl` and `fetchzip`. They are m
78
78
79## `fetchFromGitHub` {#fetchfromgithub}
79## `fetchFromGitHub` {#fetchfromgithub}
80
80
81−`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.
81+`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.
82
82
83`fetchFromGitHub` uses `fetchzip` to download the source archive generated by GitHub for the specified revision. If `leaveDotGit`, `deepClone` or `fetchSubmodules` are set to `true`, `fetchFromGitHub` will use `fetchgit` instead. Refer to its section for documentation of these options.
83`fetchFromGitHub` uses `fetchzip` to download the source archive generated by GitHub for the specified revision. If `leaveDotGit`, `deepClone` or `fetchSubmodules` are set to `true`, `fetchFromGitHub` will use `fetchgit` instead. Refer to its section for documentation of these options.
84
84
85## `fetchFromGitLab` {#fetchfromgitlab}
85## `fetchFromGitLab` {#fetchfromgitlab}
86
86
87−This is used with GitLab repositories. The arguments expected are very similar to fetchFromGitHub above.
87+This is used with GitLab repositories. The arguments expected are very similar to `fetchFromGitHub` above.
88
88
89## `fetchFromGitiles` {#fetchfromgitiles}
89## `fetchFromGitiles` {#fetchfromgitiles}
90
90
91−This is used with Gitiles repositories. The arguments expected are similar to fetchgit.
91+This is used with Gitiles repositories. The arguments expected are similar to `fetchgit`.
92
92
93## `fetchFromBitbucket` {#fetchfrombitbucket}
93## `fetchFromBitbucket` {#fetchfrombitbucket}
94
94
@@ -96,11 +96,11 @@ This is used with BitBucket repositories. The arguments expected are very simila
96
96
97## `fetchFromSavannah` {#fetchfromsavannah}
97## `fetchFromSavannah` {#fetchfromsavannah}
98
98
99−This is used with Savannah repositories. The arguments expected are very similar to fetchFromGitHub above.
99+This is used with Savannah repositories. The arguments expected are very similar to `fetchFromGitHub` above.
100
100
101## `fetchFromRepoOrCz` {#fetchfromrepoorcz}
101## `fetchFromRepoOrCz` {#fetchfromrepoorcz}
102
102
103−This is used with repo.or.cz repositories. The arguments expected are very similar to fetchFromGitHub above.
103+This is used with repo.or.cz repositories. The arguments expected are very similar to `fetchFromGitHub` above.
104
104
105## `fetchFromSourcehut` {#fetchfromsourcehut}
105## `fetchFromSourcehut` {#fetchfromsourcehut}
106
106
@@ -111,4 +111,4 @@ or "hg"), `domain` and `fetchSubmodules`.
111
111
112If `fetchSubmodules` is `true`, `fetchFromSourcehut` uses `fetchgit`
112If `fetchSubmodules` is `true`, `fetchFromSourcehut` uses `fetchgit`
113or `fetchhg` with `fetchSubmodules` or `fetchSubrepos` set to `true`,
113or `fetchhg` with `fetchSubmodules` or `fetchSubrepos` set to `true`,
114−respectively. Otherwise the fetcher uses `fetchzip`.
114+respectively. Otherwise, the fetcher uses `fetchzip`.
doc/builders/images/dockertools.section.md+8−8
@@ -58,7 +58,7 @@ After the new layer has been created, its closure (to which `contents`, `config`
58
58
59At the end of the process, only one new single layer will be produced and added to the resulting image.
59At the end of the process, only one new single layer will be produced and added to the resulting image.
60
60
61−The resulting repository will only list the single image `image/tag`. In the case of [the `buildImage` example](#ex-dockerTools-buildImage) it would be `redis/latest`.
61+The resulting repository will only list the single image `image/tag`. In the case of [the `buildImage` example](#ex-dockerTools-buildImage), it would be `redis/latest`.
62
62
63It is possible to inspect the arguments with which an image was built using its `buildArgs` attribute.
63It is possible to inspect the arguments with which an image was built using its `buildArgs` attribute.
64
64
@@ -87,7 +87,7 @@ pkgs.dockerTools.buildImage {
87}
87}
88```
88```
89
89
90−and now the Docker CLI will display a reasonable date and sort the images as expected:
90+Now the Docker CLI will display a reasonable date and sort the images as expected:
91
91
92```ShellSession
92```ShellSession
93$ docker images
93$ docker images
@@ -95,7 +95,7 @@ REPOSITORY TAG IMAGE ID CREATED SIZE
95hello latest de2bf4786de6 About a minute ago 25.2MB
95hello latest de2bf4786de6 About a minute ago 25.2MB
96```
96```
97
97
98−however, the produced images will not be binary reproducible.
98+However, the produced images will not be binary reproducible.
99
99
100## buildLayeredImage {#ssec-pkgs-dockerTools-buildLayeredImage}
100## buildLayeredImage {#ssec-pkgs-dockerTools-buildLayeredImage}
101
101
@@ -119,13 +119,13 @@ Create a Docker image with many of the store paths being on their own layer to i
119
119
120`contents` _optional_
120`contents` _optional_
121
121
122−: Top level paths in the container. Either a single derivation, or a list of derivations.
122+: Top-level paths in the container. Either a single derivation, or a list of derivations.
123
123
124 *Default:* `[]`
124 *Default:* `[]`
125
125
126`config` _optional_
126`config` _optional_
127
127
128−: Run-time configuration of the container. A full list of the options are available at in the [ Docker Image Specification v1.2.0 ](https://github.com/moby/moby/blob/master/image/spec/v1.2.md#image-json-field-descriptions).
128+: Run-time configuration of the container. A full list of the options are available at in the [Docker Image Specification v1.2.0](https://github.com/moby/moby/blob/master/image/spec/v1.2.md#image-json-field-descriptions).
129
129
130 *Default:* `{}`
130 *Default:* `{}`
131
131
@@ -195,9 +195,9 @@ pkgs.dockerTools.buildLayeredImage {
195
195
196Increasing the `maxLayers` increases the number of layers which have a chance to be shared between different images.
196Increasing the `maxLayers` increases the number of layers which have a chance to be shared between different images.
197
197
198−Modern Docker installations support up to 128 layers, however older versions support as few as 42.
198+Modern Docker installations support up to 128 layers, but older versions support as few as 42.
199
199
200−If the produced image will not be extended by other Docker builds, it is safe to set `maxLayers` to `128`. However it will be impossible to extend the image further.
200+If the produced image will not be extended by other Docker builds, it is safe to set `maxLayers` to `128`. However, it will be impossible to extend the image further.
201
201
202The first (`maxLayers-2`) most "popular" paths will have their own individual layers, then layer \#`maxLayers-1` will contain all the remaining "unpopular" paths, and finally layer \#`maxLayers` will contain the Image configuration.
202The first (`maxLayers-2`) most "popular" paths will have their own individual layers, then layer \#`maxLayers-1` will contain all the remaining "unpopular" paths, and finally layer \#`maxLayers` will contain the Image configuration.
203
203
@@ -213,7 +213,7 @@ The image produced by running the output script can be piped directly into `dock
213$(nix-build) | docker load
213$(nix-build) | docker load
214```
214```
215
215
216−Alternatively, the image be piped via `gzip` into `skopeo`, e.g. to copy it into a registry:
216+Alternatively, the image be piped via `gzip` into `skopeo`, e.g., to copy it into a registry:
217
217
218```ShellSession
218```ShellSession
219$(nix-build) | gzip --fast | skopeo copy docker-archive:/dev/stdin docker://some_docker_registry/myimage:tag
219$(nix-build) | gzip --fast | skopeo copy docker-archive:/dev/stdin docker://some_docker_registry/myimage:tag
doc/builders/images/ocitools.section.md+3−3
@@ -1,10 +1,10 @@
1# pkgs.ociTools {#sec-pkgs-ociTools}
1# pkgs.ociTools {#sec-pkgs-ociTools}
2
2
3−`pkgs.ociTools` is a set of functions for creating containers according to the [OCI container specification v1.0.0](https://github.com/opencontainers/runtime-spec). Beyond that it makes no assumptions about the container runner you choose to use to run the created container.
3+`pkgs.ociTools` is a set of functions for creating containers according to the [OCI container specification v1.0.0](https://github.com/opencontainers/runtime-spec). Beyond that, it makes no assumptions about the container runner you choose to use to run the created container.
4
4
5## buildContainer {#ssec-pkgs-ociTools-buildContainer}
5## buildContainer {#ssec-pkgs-ociTools-buildContainer}
6
6
7−This function creates a simple OCI container that runs a single command inside of it. An OCI container consists of a `config.json` and a rootfs directory.The nix store of the container will contain all referenced dependencies of the given command.
7+This function creates a simple OCI container that runs a single command inside of it. An OCI container consists of a `config.json` and a rootfs directory. The nix store of the container will contain all referenced dependencies of the given command.
8
8
9The parameters of `buildContainer` with an example value are described below:
9The parameters of `buildContainer` with an example value are described below:
10
10
@@ -30,7 +30,7 @@ buildContainer {
30}
30}
31```
31```
32
32
33−- `args` specifies a set of arguments to run inside the container. This is the only required argument for `buildContainer`. All referenced packages inside the derivation will be made available inside the container
33+- `args` specifies a set of arguments to run inside the container. This is the only required argument for `buildContainer`. All referenced packages inside the derivation will be made available inside the container.
34
34
35- `mounts` specifies additional mount points chosen by the user. By default only a minimal set of necessary filesystems are mounted into the container (e.g procfs, cgroupfs)
35- `mounts` specifies additional mount points chosen by the user. By default only a minimal set of necessary filesystems are mounted into the container (e.g procfs, cgroupfs)
36
36
doc/builders/images/snaptools.section.md+1−1
@@ -33,7 +33,7 @@ in snapTools.makeSnap {
33
33
34## Build a Graphical Snap {#ssec-pkgs-snapTools-build-a-snap-firefox}
34## Build a Graphical Snap {#ssec-pkgs-snapTools-build-a-snap-firefox}
35
35
36−Graphical programs require many more integrations with the host. This example uses Firefox as an example, because it is one of the most complicated programs we could package.
36+Graphical programs require many more integrations with the host. This example uses Firefox as an example because it is one of the most complicated programs we could package.
37
37
38``` {#ex-snapTools-buildSnap-firefox .nix}
38``` {#ex-snapTools-buildSnap-firefox .nix}
39let
39let
doc/builders/packages/citrix.section.md+5−5
@@ -4,13 +4,13 @@ The [Citrix Workspace App](https://www.citrix.com/products/workspace-app/) is a
4
4
5## Basic usage {#sec-citrix-base}
5## Basic usage {#sec-citrix-base}
6
6
7−The tarball archive needs to be downloaded manually as the license agreements of the vendor for [Citrix Workspace](https://www.citrix.de/downloads/workspace-app/linux/workspace-app-for-linux-latest.html) needs to be accepted first. Then run `nix-prefetch-url file://$PWD/linuxx64-$version.tar.gz`. With the archive available in the store the package can be built and installed with Nix.
7+The tarball archive needs to be downloaded manually, as the license agreements of the vendor for [Citrix Workspace](https://www.citrix.de/downloads/workspace-app/linux/workspace-app-for-linux-latest.html) needs to be accepted first. Then run `nix-prefetch-url file://$PWD/linuxx64-$version.tar.gz`. With the archive available in the store, the package can be built and installed with Nix.
8
8
9−## Citrix Selfservice {#sec-citrix-selfservice}
9+## Citrix Self-service {#sec-citrix-selfservice}
10
10
11−The [selfservice](https://support.citrix.com/article/CTX200337) is an application managing Citrix desktops and applications. Please note that this feature only works with at least citrix_workspace_20_06_0 and later versions.
11+The [self-service](https://support.citrix.com/article/CTX200337) is an application managing Citrix desktops and applications. Please note that this feature only works with at least citrix_workspace_20_06_0 and later versions.
12
12
13−In order to set this up, you first have to [download the `.cr` file from the Netscaler Gateway](https://its.uiowa.edu/support/article/102186). After that you can configure the `selfservice` like this:
13+In order to set this up, you first have to [download the `.cr` file from the Netscaler Gateway](https://its.uiowa.edu/support/article/102186). After that, you can configure the `selfservice` like this:
14
14
15```ShellSession
15```ShellSession
16$ storebrowse -C ~/Downloads/receiverconfig.cr
16$ storebrowse -C ~/Downloads/receiverconfig.cr
@@ -19,7 +19,7 @@ $ selfservice
19
19
20## Custom certificates {#sec-citrix-custom-certs}
20## Custom certificates {#sec-citrix-custom-certs}
21
21
22−The `Citrix Workspace App` in `nixpkgs` trusts several certificates [from the Mozilla database](https://curl.haxx.se/docs/caextract.html) by default. However several companies using Citrix might require their own corporate certificate. On distros with imperative packaging these certs can be stored easily in [`$ICAROOT`](https://developer-docs.citrix.com/projects/receiver-for-linux-command-reference/en/13.7/), however this directory is a store path in `nixpkgs`. In order to work around this issue the package provides a simple mechanism to add custom certificates without rebuilding the entire package using `symlinkJoin`:
22+The `Citrix Workspace App` in `nixpkgs` trusts several certificates [from the Mozilla database](https://curl.haxx.se/docs/caextract.html) by default. However, several companies using Citrix might require their own corporate certificate. On distros with imperative packaging, these certs can be stored easily in [`$ICAROOT`](https://developer-docs.citrix.com/projects/receiver-for-linux-command-reference/en/13.7/), however this directory is a store path in `nixpkgs`. In order to work around this issue, the package provides a simple mechanism to add custom certificates without rebuilding the entire package using `symlinkJoin`:
23
23
24```nix
24```nix
25with import <nixpkgs> { config.allowUnfree = true; };
25with import <nixpkgs> { config.allowUnfree = true; };
doc/builders/packages/eclipse.section.md+5−5
@@ -8,9 +8,9 @@ Nixpkgs provides a number of packages that will install Eclipse in its various f
8$ nix-env -f '<nixpkgs>' -qaP -A eclipses --description
8$ nix-env -f '<nixpkgs>' -qaP -A eclipses --description
9```
9```
10
10
11−Once an Eclipse variant is installed it can be run using the `eclipse` command, as expected. From within Eclipse it is then possible to install plugins in the usual manner by either manually specifying an Eclipse update site or by installing the Marketplace Client plugin and using it to discover and install other plugins. This installation method provides an Eclipse installation that closely resemble a manually installed Eclipse.
11+Once an Eclipse variant is installed, it can be run using the `eclipse` command, as expected. From within Eclipse, it is then possible to install plugins in the usual manner by either manually specifying an Eclipse update site or by installing the Marketplace Client plugin and using it to discover and install other plugins. This installation method provides an Eclipse installation that closely resemble a manually installed Eclipse.
12
12
13−If you prefer to install plugins in a more declarative manner then Nixpkgs also offer a number of Eclipse plugins that can be installed in an _Eclipse environment_. This type of environment is created using the function `eclipseWithPlugins` found inside the `nixpkgs.eclipses` attribute set. This function takes as argument `{ eclipse, plugins ? [], jvmArgs ? [] }` where `eclipse` is a one of the Eclipse packages described above, `plugins` is a list of plugin derivations, and `jvmArgs` is a list of arguments given to the JVM running the Eclipse. For example, say you wish to install the latest Eclipse Platform with the popular Eclipse Color Theme plugin and also allow Eclipse to use more RAM. You could then add
13+If you prefer to install plugins in a more declarative manner, then Nixpkgs also offer a number of Eclipse plugins that can be installed in an _Eclipse environment_. This type of environment is created using the function `eclipseWithPlugins` found inside the `nixpkgs.eclipses` attribute set. This function takes as argument `{ eclipse, plugins ? [], jvmArgs ? [] }` where `eclipse` is a one of the Eclipse packages described above, `plugins` is a list of plugin derivations, and `jvmArgs` is a list of arguments given to the JVM running the Eclipse. For example, say you wish to install the latest Eclipse Platform with the popular Eclipse Color Theme plugin and also allow Eclipse to use more RAM. You could then add:
14
14
15```nix
15```nix
16packageOverrides = pkgs: {
16packageOverrides = pkgs: {
@@ -22,15 +22,15 @@ packageOverrides = pkgs: {
22}
22}
23```
23```
24
24
25−to your Nixpkgs configuration (`~/.config/nixpkgs/config.nix`) and install it by running `nix-env -f '<nixpkgs>' -iA myEclipse` and afterward run Eclipse as usual. It is possible to find out which plugins are available for installation using `eclipseWithPlugins` by running
25+to your Nixpkgs configuration (`~/.config/nixpkgs/config.nix`) and install it by running `nix-env -f '<nixpkgs>' -iA myEclipse` and afterward run Eclipse as usual. It is possible to find out which plugins are available for installation using `eclipseWithPlugins` by running:
26
26
27```ShellSession
27```ShellSession
28$ nix-env -f '<nixpkgs>' -qaP -A eclipses.plugins --description
28$ nix-env -f '<nixpkgs>' -qaP -A eclipses.plugins --description
29```
29```
30
30
31−If there is a need to install plugins that are not available in Nixpkgs then it may be possible to define these plugins outside Nixpkgs using the `buildEclipseUpdateSite` and `buildEclipsePlugin` functions found in the `nixpkgs.eclipses.plugins` attribute set. Use the `buildEclipseUpdateSite` function to install a plugin distributed as an Eclipse update site. This function takes `{ name, src }` as argument where `src` indicates the Eclipse update site archive. All Eclipse features and plugins within the downloaded update site will be installed. When an update site archive is not available then the `buildEclipsePlugin` function can be used to install a plugin that consists of a pair of feature and plugin JARs. This function takes an argument `{ name, srcFeature, srcPlugin }` where `srcFeature` and `srcPlugin` are the feature and plugin JARs, respectively.
31+If there is a need to install plugins that are not available in Nixpkgs then it may be possible to define these plugins outside Nixpkgs using the `buildEclipseUpdateSite` and `buildEclipsePlugin` functions found in the `nixpkgs.eclipses.plugins` attribute set. Use the `buildEclipseUpdateSite` function to install a plugin distributed as an Eclipse update site. This function takes `{ name, src }` as argument, where `src` indicates the Eclipse update site archive. All Eclipse features and plugins within the downloaded update site will be installed. When an update site archive is not available, then the `buildEclipsePlugin` function can be used to install a plugin that consists of a pair of feature and plugin JARs. This function takes an argument `{ name, srcFeature, srcPlugin }` where `srcFeature` and `srcPlugin` are the feature and plugin JARs, respectively.
32
32
33−Expanding the previous example with two plugins using the above functions we have
33+Expanding the previous example with two plugins using the above functions, we have:
34
34
35```nix
35```nix
36packageOverrides = pkgs: {
36packageOverrides = pkgs: {
doc/builders/packages/elm.section.md+1−1
@@ -1,6 +1,6 @@
1# Elm {#sec-elm}
1# Elm {#sec-elm}
2
2
3−To start a development environment do
3+To start a development environment, run:
4
4
5```ShellSession
5```ShellSession
6nix-shell -p elmPackages.elm elmPackages.elm-format
6nix-shell -p elmPackages.elm elmPackages.elm-format
doc/builders/packages/emacs.section.md+3−3
@@ -20,7 +20,7 @@ The Emacs package comes with some extra helpers to make it easier to configure.
20}
20}
21```
21```
22
22
23−You can install it like any other packages via `nix-env -iA myEmacs`. However, this will only install those packages. It will not `configure` them for us. To do this, we need to provide a configuration file. Luckily, it is possible to do this from within Nix! By modifying the above example, we can make Emacs load a custom config file. The key is to create a package that provide a `default.el` file in `/share/emacs/site-start/`. Emacs knows to load this file automatically when it starts.
23+You can install it like any other packages via `nix-env -iA myEmacs`. However, this will only install those packages. It will not `configure` them for us. To do this, we need to provide a configuration file. Luckily, it is possible to do this from within Nix! By modifying the above example, we can make Emacs load a custom config file. The key is to create a package that provides a `default.el` file in `/share/emacs/site-start/`. Emacs knows to load this file automatically when it starts.
24
24
25```nix
25```nix
26{
26{
@@ -101,9 +101,9 @@ You can install it like any other packages via `nix-env -iA myEmacs`. However, t
101}
101}
102```
102```
103
103
104−This provides a fairly full Emacs start file. It will load in addition to the user's presonal config. You can always disable it by passing `-q` to the Emacs command.
104+This provides a fairly full Emacs start file. It will load in addition to the user's personal config. You can always disable it by passing `-q` to the Emacs command.
105
105
106−Sometimes `emacs.pkgs.withPackages` is not enough, as this package set has some priorities imposed on packages (with the lowest priority assigned to Melpa Unstable, and the highest for packages manually defined in `pkgs/top-level/emacs-packages.nix`). But you can't control this priorities when some package is installed as a dependency. You can override it on per-package-basis, providing all the required dependencies manually - but it's tedious and there is always a possibility that an unwanted dependency will sneak in through some other package. To completely override such a package you can use `overrideScope'`.
106+Sometimes `emacs.pkgs.withPackages` is not enough, as this package set has some priorities imposed on packages (with the lowest priority assigned to Melpa Unstable, and the highest for packages manually defined in `pkgs/top-level/emacs-packages.nix`). But you can't control these priorities when some package is installed as a dependency. You can override it on a per-package-basis, providing all the required dependencies manually, but it's tedious and there is always a possibility that an unwanted dependency will sneak in through some other package. To completely override such a package, you can use `overrideScope'`.
107
107
108```nix
108```nix
109overrides = self: super: rec {
109overrides = self: super: rec {
doc/builders/packages/etc-files.section.md+4−4
@@ -1,10 +1,10 @@
1# /etc files {#etc}
1# /etc files {#etc}
2
2
3−Certain calls in glibc require access to runtime files found in /etc such as `/etc/protocols` or `/etc/services` -- [getprotobyname](https://linux.die.net/man/3/getprotobyname) is one such function.
3+Certain calls in glibc require access to runtime files found in `/etc` such as `/etc/protocols` or `/etc/services` -- [getprotobyname](https://linux.die.net/man/3/getprotobyname) is one such function.
4
4
5−On non-NixOS distributions these files are typically provided by packages (i.e. [netbase](https://packages.debian.org/sid/netbase)) if not already pre-installed in your distribution. This can cause non-reproducibility for code if they rely on these files being present.
5+On non-NixOS distributions these files are typically provided by packages (i.e., [netbase](https://packages.debian.org/sid/netbase)) if not already pre-installed in your distribution. This can cause non-reproducibility for code if they rely on these files being present.
6
6
7−If [iana-etc](https://hydra.nixos.org/job/nixos/trunk-combined/nixpkgs.iana-etc.x86_64-linux) is part of your _buildInputs_ then it will set the environment varaibles `NIX_ETC_PROTOCOLS` and `NIX_ETC_SERVICES` to the corresponding files in the package through a _setup-hook_.
7+If [iana-etc](https://hydra.nixos.org/job/nixos/trunk-combined/nixpkgs.iana-etc.x86_64-linux) is part of your `buildInputs`, then it will set the environment variables `NIX_ETC_PROTOCOLS` and `NIX_ETC_SERVICES` to the corresponding files in the package through a setup hook.
8
8
9
9
10```bash
10```bash
@@ -15,4 +15,4 @@ NIX_ETC_SERVICES=/nix/store/aj866hr8fad8flnggwdhrldm0g799ccz-iana-etc-20210225/e
15NIX_ETC_PROTOCOLS=/nix/store/aj866hr8fad8flnggwdhrldm0g799ccz-iana-etc-20210225/etc/protocols
15NIX_ETC_PROTOCOLS=/nix/store/aj866hr8fad8flnggwdhrldm0g799ccz-iana-etc-20210225/etc/protocols
16```
16```
17
17
18−Nixpkg's version of [glibc](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/glibc/default.nix) has been patched to check for the existence of these environment variables. If the environment variable are *not set*, then it will attempt to find the files at the default location within _/etc_.
18+Nixpkg's version of [glibc](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/glibc/default.nix) has been patched to check for the existence of these environment variables. If the environment variables are *not* set, then it will attempt to find the files at the default location within `/etc`.
doc/builders/packages/firefox.section.md+7−8
@@ -2,7 +2,7 @@
2
2
3## Build wrapped Firefox with extensions and policies {#build-wrapped-firefox-with-extensions-and-policies}
3## Build wrapped Firefox with extensions and policies {#build-wrapped-firefox-with-extensions-and-policies}
4
4
5−The `wrapFirefox` function allows to pass policies, preferences and extension that are available to Firefox. With the help of `fetchFirefoxAddon` this allows build a Firefox version that already comes with addons pre-installed:
5+The `wrapFirefox` function allows to pass policies, preferences and extensions that are available to Firefox. With the help of `fetchFirefoxAddon` this allows to build a Firefox version that already comes with add-ons pre-installed:
6
6
7```nix
7```nix
8{
8{
@@ -40,13 +40,12 @@ The `wrapFirefox` function allows to pass policies, preferences and extension th
40}
40}
41```
41```
42
42
43−If `nixExtensions != null` then all manually installed addons will be uninstalled from your browser profile.
43+If `nixExtensions != null`, then all manually installed add-ons will be uninstalled from your browser profile.
44−To view available enterprise policies visit [enterprise policies](https://github.com/mozilla/policy-templates#enterprisepoliciesenabled)
44+To view available enterprise policies, visit [enterprise policies](https://github.com/mozilla/policy-templates#enterprisepoliciesenabled)
45−or type into the Firefox url bar: `about:policies#documentation`.
45+or type into the Firefox URL bar: `about:policies#documentation`.
46−Nix installed addons do not have a valid signature, which is why signature verification is disabled. This does not compromise security because downloaded addons are checksumed and manual addons can't be installed. Also make sure that the `name` field of fetchFirefoxAddon is unique. If you remove an addon from the nixExtensions array, rebuild and start Firefox the removed addon will be completly removed with all of its settings.
46+Nix installed add-ons do not have a valid signature, which is why signature verification is disabled. This does not compromise security because downloaded add-ons are checksummed and manual add-ons can't be installed. Also, make sure that the `name` field of `fetchFirefoxAddon` is unique. If you remove an add-on from the `nixExtensions` array, rebuild and start Firefox: the removed add-on will be completely removed with all of its settings.
47
47
48## Troubleshooting {#sec-firefox-troubleshooting}
48## Troubleshooting {#sec-firefox-troubleshooting}
49−If addons are marked as broken or the signature is invalid, make sure you have Firefox ESR installed. Normal Firefox does not provide the ability anymore to disable signature verification for addons thus nix addons get disabled by the normal Firefox binary.
49+If add-ons are marked as broken or the signature is invalid, make sure you have Firefox ESR installed. Normal Firefox does not provide the ability anymore to disable signature verification for add-ons thus nix add-ons get disabled by the normal Firefox binary.
50−
51−If addons do not appear installed although they have been defined in your nix configuration file reset the local addon state of your Firefox profile by clicking `help -> restart with addons disabled -> restart -> refresh firefox`. This can happen if you switch from manual addon mode to nix addon mode and then back to manual mode and then again to nix addon mode.
52
50
51+If add-ons do not appear installed despite being defined in your nix configuration file, reset the local add-on state of your Firefox profile by clicking `Help -> More Troubleshooting Information -> Refresh Firefox`. This can happen if you switch from manual add-on mode to nix add-on mode and then back to manual mode and then again to nix add-on mode.
doc/builders/packages/fish.section.md+1−1
@@ -36,7 +36,7 @@ using `buildFishPlugin` and running unit tests with the `fishtape` test runner.
36## Fish wrapper {#sec-fish-wrapper}
36## Fish wrapper {#sec-fish-wrapper}
37
37
38The `wrapFish` package is a wrapper around Fish which can be used to create
38The `wrapFish` package is a wrapper around Fish which can be used to create
39−Fish shells initialised with some plugins as well as completions, configuration
39+Fish shells initialized with some plugins as well as completions, configuration
40snippets and functions sourced from the given paths. This provides a convenient
40snippets and functions sourced from the given paths. This provides a convenient
41way to test Fish plugins and scripts without having to alter the environment.
41way to test Fish plugins and scripts without having to alter the environment.
42
42
doc/builders/packages/fuse.section.md+2−2
@@ -24,10 +24,10 @@ packages on macOS:
24 checking for fuse.h... no
24 checking for fuse.h... no
25 configure: error: No fuse.h found.
25 configure: error: No fuse.h found.
26
26
27−This happens on autoconf based projects that uses `AC_CHECK_HEADERS` or
27+This happens on autoconf based projects that use `AC_CHECK_HEADERS` or
28`AC_CHECK_LIBS` to detect libfuse, and will occur even when the `fuse` package
28`AC_CHECK_LIBS` to detect libfuse, and will occur even when the `fuse` package
29is included in `buildInputs`. It happens because libfuse headers throw an error
29is included in `buildInputs`. It happens because libfuse headers throw an error
30−on macOS if the `FUSE_USE_VERSION` macro is undefined. Many proejcts do define
30+on macOS if the `FUSE_USE_VERSION` macro is undefined. Many projects do define
31`FUSE_USE_VERSION`, but only inside C source files. This results in the above
31`FUSE_USE_VERSION`, but only inside C source files. This results in the above
32error at configure time because the configure script would attempt to compile
32error at configure time because the configure script would attempt to compile
33sample FUSE programs without defining `FUSE_USE_VERSION`.
33sample FUSE programs without defining `FUSE_USE_VERSION`.
doc/builders/packages/ibus.section.md+3−3
@@ -6,7 +6,7 @@ This package is an ibus-based completion method to speed up typing.
6
6
7IBus needs to be configured accordingly to activate `typing-booster`. The configuration depends on the desktop manager in use. For detailed instructions, please refer to the [upstream docs](https://mike-fabian.github.io/ibus-typing-booster/documentation.html).
7IBus needs to be configured accordingly to activate `typing-booster`. The configuration depends on the desktop manager in use. For detailed instructions, please refer to the [upstream docs](https://mike-fabian.github.io/ibus-typing-booster/documentation.html).
8
8
9−On NixOS you need to explicitly enable `ibus` with given engines before customizing your desktop to use `typing-booster`. This can be achieved using the `ibus` module:
9+On NixOS, you need to explicitly enable `ibus` with given engines before customizing your desktop to use `typing-booster`. This can be achieved using the `ibus` module:
10
10
11```nix
11```nix
12{ pkgs, ... }: {
12{ pkgs, ... }: {
@@ -19,7 +19,7 @@ On NixOS you need to explicitly enable `ibus` with given engines before customiz
19
19
20## Using custom hunspell dictionaries {#sec-ibus-typing-booster-customize-hunspell}
20## Using custom hunspell dictionaries {#sec-ibus-typing-booster-customize-hunspell}
21
21
22−The IBus engine is based on `hunspell` to support completion in many languages. By default the dictionaries `de-de`, `en-us`, `fr-moderne` `es-es`, `it-it`, `sv-se` and `sv-fi` are in use. To add another dictionary, the package can be overridden like this:
22+The IBus engine is based on `hunspell` to support completion in many languages. By default, the dictionaries `de-de`, `en-us`, `fr-moderne` `es-es`, `it-it`, `sv-se` and `sv-fi` are in use. To add another dictionary, the package can be overridden like this:
23
23
24```nix
24```nix
25ibus-engines.typing-booster.override { langs = [ "de-at" "en-gb" ]; }
25ibus-engines.typing-booster.override { langs = [ "de-at" "en-gb" ]; }
@@ -31,7 +31,7 @@ _Note: each language passed to `langs` must be an attribute name in `pkgs.hunspe
31
31
32The `ibus-engines.typing-booster` package contains a program named `emoji-picker`. To display all emojis correctly, a special font such as `noto-fonts-emoji` is needed:
32The `ibus-engines.typing-booster` package contains a program named `emoji-picker`. To display all emojis correctly, a special font such as `noto-fonts-emoji` is needed:
33
33
34−On NixOS it can be installed using the following expression:
34+On NixOS, it can be installed using the following expression:
35
35
36```nix
36```nix
37{ pkgs, ... }: { fonts.fonts = with pkgs; [ noto-fonts-emoji ]; }
37{ pkgs, ... }: { fonts.fonts = with pkgs; [ noto-fonts-emoji ]; }
doc/builders/packages/linux.section.md+7−7
@@ -4,7 +4,7 @@ The Nix expressions to build the Linux kernel are in [`pkgs/os-specific/linux/ke
4
4
5The function that builds the kernel has an argument `kernelPatches` which should be a list of `{name, patch, extraConfig}` attribute sets, where `name` is the name of the patch (which is included in the kernel’s `meta.description` attribute), `patch` is the patch itself (possibly compressed), and `extraConfig` (optional) is a string specifying extra options to be concatenated to the kernel configuration file (`.config`).
5The function that builds the kernel has an argument `kernelPatches` which should be a list of `{name, patch, extraConfig}` attribute sets, where `name` is the name of the patch (which is included in the kernel’s `meta.description` attribute), `patch` is the patch itself (possibly compressed), and `extraConfig` (optional) is a string specifying extra options to be concatenated to the kernel configuration file (`.config`).
6
6
7−The kernel derivation exports an attribute `features` specifying whether optional functionality is or isn’t enabled. This is used in NixOS to implement kernel-specific behaviour. For instance, if the kernel has the `iwlwifi` feature (i.e. has built-in support for Intel wireless chipsets), then NixOS doesn’t have to build the external `iwlwifi` package:
7+The kernel derivation exports an attribute `features` specifying whether optional functionality is or isn’t enabled. This is used in NixOS to implement kernel-specific behaviour. For instance, if the kernel has the `iwlwifi` feature (i.e., has built-in support for Intel wireless chipsets), then NixOS doesn’t have to build the external `iwlwifi` package:
8
8
9```nix
9```nix
10modulesTree = [kernel]
10modulesTree = [kernel]
@@ -14,19 +14,19 @@ modulesTree = [kernel]
14
14
15How to add a new (major) version of the Linux kernel to Nixpkgs:
15How to add a new (major) version of the Linux kernel to Nixpkgs:
16
16
17−1. Copy the old Nix expression (e.g. `linux-2.6.21.nix`) to the new one (e.g. `linux-2.6.22.nix`) and update it.
17+1. Copy the old Nix expression (e.g., `linux-2.6.21.nix`) to the new one (e.g., `linux-2.6.22.nix`) and update it.
18
18
192. Add the new kernel to the `kernels` attribute set in `linux-kernels.nix` (e.g., create an attribute `kernel_2_6_22`).
192. Add the new kernel to the `kernels` attribute set in `linux-kernels.nix` (e.g., create an attribute `kernel_2_6_22`).
20
20
213. Now we’re going to update the kernel configuration. First unpack the kernel. Then for each supported platform (`i686`, `x86_64`, `uml`) do the following:
213. Now we’re going to update the kernel configuration. First unpack the kernel. Then for each supported platform (`i686`, `x86_64`, `uml`) do the following:
22
22
23− 1. Make an copy from the old config (e.g. `config-2.6.21-i686-smp`) to the new one (e.g. `config-2.6.22-i686-smp`).
23+ 1. Make a copy from the old config (e.g., `config-2.6.21-i686-smp`) to the new one (e.g., `config-2.6.22-i686-smp`).
24
24
25− 2. Copy the config file for this platform (e.g. `config-2.6.22-i686-smp`) to `.config` in the kernel source tree.
25+ 2. Copy the config file for this platform (e.g., `config-2.6.22-i686-smp`) to `.config` in the kernel source tree.
26
26
27− 3. Run `make oldconfig ARCH={i386,x86_64,um}` and answer all questions. (For the uml configuration, also add `SHELL=bash`.) Make sure to keep the configuration consistent between platforms (i.e. don’t enable some feature on `i686` and disable it on `x86_64`).
27+ 3. Run `make oldconfig ARCH={i386,x86_64,um}` and answer all questions. (For the uml configuration, also add `SHELL=bash`.) Make sure to keep the configuration consistent between platforms (i.e., don’t enable some feature on `i686` and disable it on `x86_64`).
28
28
29− 4. If needed you can also run `make menuconfig`:
29+ 4. If needed, you can also run `make menuconfig`:
30
30
31 ```ShellSession
31 ```ShellSession
32 $ nix-env -f "<nixpkgs>" -iA ncurses
32 $ nix-env -f "<nixpkgs>" -iA ncurses
@@ -34,7 +34,7 @@ How to add a new (major) version of the Linux kernel to Nixpkgs:
34 $ make menuconfig ARCH=arch
34 $ make menuconfig ARCH=arch
35 ```
35 ```
36
36
37− 5. Copy `.config` over the new config file (e.g. `config-2.6.22-i686-smp`).
37+ 5. Copy `.config` over the new config file (e.g., `config-2.6.22-i686-smp`).
38
38
394. Test building the kernel: `nix-build -A linuxKernel.kernels.kernel_2_6_22`. If it compiles, ship it! For extra credit, try booting NixOS with it.
394. Test building the kernel: `nix-build -A linuxKernel.kernels.kernel_2_6_22`. If it compiles, ship it! For extra credit, try booting NixOS with it.
40
40
doc/builders/packages/locales.section.md+2−2
@@ -1,5 +1,5 @@
1# Locales {#locales}
1# Locales {#locales}
2
2
3−To allow simultaneous use of packages linked against different versions of `glibc` with different locale archive formats Nixpkgs patches `glibc` to rely on `LOCALE_ARCHIVE` environment variable.
3+To allow simultaneous use of packages linked against different versions of `glibc` with different locale archive formats, Nixpkgs patches `glibc` to rely on `LOCALE_ARCHIVE` environment variable.
4
4
5−On non-NixOS distributions this variable is obviously not set. This can cause regressions in language support or even crashes in some Nixpkgs-provided programs. The simplest way to mitigate this problem is exporting the `LOCALE_ARCHIVE` variable pointing to `${glibcLocales}/lib/locale/locale-archive`. The drawback (and the reason this is not the default) is the relatively large (a hundred MiB) size of the full set of locales. It is possible to build a custom set of locales by overriding parameters `allLocales` and `locales` of the package.
5+On non-NixOS distributions, this variable is obviously not set. This can cause regressions in language support or even crashes in some Nixpkgs-provided programs. The simplest way to mitigate this problem is exporting the `LOCALE_ARCHIVE` variable pointing to `${glibcLocales}/lib/locale/locale-archive`. The drawback (and the reason this is not the default) is the relatively large (a hundred MiB) size of the full set of locales. It is possible to build a custom set of locales by overriding parameters `allLocales` and `locales` of the package.
doc/builders/packages/nginx.section.md+2−2
@@ -4,8 +4,8 @@
4
4
5## ETags on static files served from the Nix store {#sec-nginx-etag}
5## ETags on static files served from the Nix store {#sec-nginx-etag}
6
6
7−HTTP has a couple different mechanisms for caching to prevent clients from having to download the same content repeatedly if a resource has not changed since the last time it was requested. When nginx is used as a server for static files, it implements the caching mechanism based on the [`Last-Modified`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified) response header automatically; unfortunately, it works by using filesystem timestamps to determine the value of the `Last-Modified` header. This doesn't give the desired behavior when the file is in the Nix store, because all file timestamps are set to 0 (for reasons related to build reproducibility).
7+HTTP has a couple of different mechanisms for caching to prevent clients from having to download the same content repeatedly if a resource has not changed since the last time it was requested. When nginx is used as a server for static files, it implements the caching mechanism based on the [`Last-Modified`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified) response header automatically; unfortunately, it works by using filesystem timestamps to determine the value of the `Last-Modified` header. This doesn't give the desired behavior when the file is in the Nix store because all file timestamps are set to 0 (for reasons related to build reproducibility).
8
8
9−Fortunately, HTTP supports an alternative (and more effective) caching mechanism: the [`ETag`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) response header. The value of the `ETag` header specifies some identifier for the particular content that the server is sending (e.g. a hash). When a client makes a second request for the same resource, it sends that value back in an `If-None-Match` header. If the ETag value is unchanged, then the server does not need to resend the content.
9+Fortunately, HTTP supports an alternative (and more effective) caching mechanism: the [`ETag`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) response header. The value of the `ETag` header specifies some identifier for the particular content that the server is sending (e.g., a hash). When a client makes a second request for the same resource, it sends that value back in an `If-None-Match` header. If the ETag value is unchanged, then the server does not need to resend the content.
10
10
11As of NixOS 19.09, the nginx package in Nixpkgs is patched such that when nginx serves a file out of `/nix/store`, the hash in the store path is used as the `ETag` header in the HTTP response, thus providing proper caching functionality. This happens automatically; you do not need to do modify any configuration to get this behavior.
11As of NixOS 19.09, the nginx package in Nixpkgs is patched such that when nginx serves a file out of `/nix/store`, the hash in the store path is used as the `ETag` header in the HTTP response, thus providing proper caching functionality. This happens automatically; you do not need to do modify any configuration to get this behavior.
doc/builders/packages/opengl.section.md+1−1
@@ -12,4 +12,4 @@ The NixOS desktop or other non-headless configurations are the primary target fo
12
12
13If you are using a non-NixOS GNU/Linux/X11 desktop with free software video drivers, consider launching OpenGL-dependent programs from Nixpkgs with Nixpkgs versions of `libglvnd` and `mesa.drivers` in `LD_LIBRARY_PATH`. For Mesa drivers, the Linux kernel version doesn't have to match nixpkgs.
13If you are using a non-NixOS GNU/Linux/X11 desktop with free software video drivers, consider launching OpenGL-dependent programs from Nixpkgs with Nixpkgs versions of `libglvnd` and `mesa.drivers` in `LD_LIBRARY_PATH`. For Mesa drivers, the Linux kernel version doesn't have to match nixpkgs.
14
14
15−For proprietary video drivers you might have luck with also adding the corresponding video driver package.
15+For proprietary video drivers, you might have luck with also adding the corresponding video driver package.
doc/builders/packages/shell-helpers.section.md+1−1
@@ -4,7 +4,7 @@ Some packages provide the shell integration to be more useful. But unlike other
4
4
5- `fzf` : `fzf-share`
5- `fzf` : `fzf-share`
6
6
7−E.g. `fzf` can then used in the `.bashrc` like this:
7+E.g. `fzf` can then be used in the `.bashrc` like this:
8
8
9```bash
9```bash
10source "$(fzf-share)/completion.bash"
10source "$(fzf-share)/completion.bash"
doc/builders/packages/steam.section.md+8−8
@@ -2,20 +2,20 @@
2
2
3## Steam in Nix {#sec-steam-nix}
3## Steam in Nix {#sec-steam-nix}
4
4
5−Steam is distributed as a `.deb` file, for now only as an i686 package (the amd64 package only has documentation). When unpacked, it has a script called `steam` that in Ubuntu (their target distro) would go to `/usr/bin`. When run for the first time, this script copies some files to the user's home, which include another script that is the ultimate responsible for launching the steam binary, which is also in \$HOME.
5+Steam is distributed as a `.deb` file, for now only as an i686 package (the amd64 package only has documentation). When unpacked, it has a script called `steam` that in Ubuntu (their target distro) would go to `/usr/bin`. When run for the first time, this script copies some files to the user's home, which include another script that is the ultimate responsible for launching the steam binary, which is also in `$HOME`.
6
6
7Nix problems and constraints:
7Nix problems and constraints:
8
8
9−- We don't have `/bin/bash` and many scripts point there. Similarly for `/usr/bin/python`.
9+- We don't have `/bin/bash` and many scripts point there. Same thing for `/usr/bin/python`.
10- We don't have the dynamic loader in `/lib`.
10- We don't have the dynamic loader in `/lib`.
11−- The `steam.sh` script in \$HOME can not be patched, as it is checked and rewritten by steam.
11+- The `steam.sh` script in `$HOME` cannot be patched, as it is checked and rewritten by steam.
12- The steam binary cannot be patched, it's also checked.
12- The steam binary cannot be patched, it's also checked.
13
13
14The current approach to deploy Steam in NixOS is composing a FHS-compatible chroot environment, as documented [here](http://sandervanderburg.blogspot.nl/2013/09/composing-fhs-compatible-chroot.html). This allows us to have binaries in the expected paths without disrupting the system, and to avoid patching them to work in a non FHS environment.
14The current approach to deploy Steam in NixOS is composing a FHS-compatible chroot environment, as documented [here](http://sandervanderburg.blogspot.nl/2013/09/composing-fhs-compatible-chroot.html). This allows us to have binaries in the expected paths without disrupting the system, and to avoid patching them to work in a non FHS environment.
15
15
16## How to play {#sec-steam-play}
16## How to play {#sec-steam-play}
17
17
18−Use `programs.steam.enable = true;` if you want to add steam to systemPackages and also enable a few workarrounds aswell as Steam controller support or other Steam supported controllers such as the DualShock 4 or Nintendo Switch Pr.
18+Use `programs.steam.enable = true;` if you want to add steam to `systemPackages` and also enable a few workarounds as well as Steam controller support or other Steam supported controllers such as the DualShock 4 or Nintendo Switch Pro Controller.
19
19
20## Troubleshooting {#sec-steam-troub}
20## Troubleshooting {#sec-steam-troub}
21
21
@@ -32,7 +32,7 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
32- **Using the FOSS Radeon or nouveau (nvidia) drivers**
32- **Using the FOSS Radeon or nouveau (nvidia) drivers**
33
33
34 - The `newStdcpp` parameter was removed since NixOS 17.09 and should not be needed anymore.
34 - The `newStdcpp` parameter was removed since NixOS 17.09 and should not be needed anymore.
35− - Steam ships statically linked with a version of libcrypto that conflics with the one dynamically loaded by radeonsi_dri.so. If you get the error
35+ - Steam ships statically linked with a version of `libcrypto` that conflicts with the one dynamically loaded by radeonsi_dri.so. If you get the error:
36
36
37 ```
37 ```
38 steam.sh: line 713: 7842 Segmentation fault (core dumped)
38 steam.sh: line 713: 7842 Segmentation fault (core dumped)
@@ -42,13 +42,13 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
42
42
43- **Java**
43- **Java**
44
44
45− 1. There is no java in steam chrootenv by default. If you get a message like
45+ 1. There is no java in steam chrootenv by default. If you get a message like:
46
46
47 ```
47 ```
48 /home/foo/.local/share/Steam/SteamApps/common/towns/towns.sh: line 1: java: command not found
48 /home/foo/.local/share/Steam/SteamApps/common/towns/towns.sh: line 1: java: command not found
49 ```
49 ```
50
50
51− you need to add
51+ you need to add:
52
52
53 ```nix
53 ```nix
54 steam.override { withJava = true; };
54 steam.override { withJava = true; };
@@ -56,7 +56,7 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
56
56
57## steam-run {#sec-steam-run}
57## steam-run {#sec-steam-run}
58
58
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
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:
60
60
61```
61```
62steam-run ./foo
62steam-run ./foo
doc/builders/packages/urxvt.section.md+4−4
@@ -4,7 +4,7 @@ Urxvt, also known as rxvt-unicode, is a highly customizable terminal emulator.
4
4
5## Configuring urxvt {#sec-urxvt-conf}
5## Configuring urxvt {#sec-urxvt-conf}
6
6
7−In `nixpkgs`, urxvt is provided by the package `rxvt-unicode`. It can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, use an overlay or directly install an expression that overrides its configuration, such as
7+In `nixpkgs`, urxvt is provided by the package `rxvt-unicode`. It can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, use an overlay or directly install an expression that overrides its configuration, such as:
8
8
9```nix
9```nix
10rxvt-unicode.override {
10rxvt-unicode.override {
@@ -58,14 +58,14 @@ rxvt-unicode.override {
58
58
59## Packaging urxvt plugins {#sec-urxvt-pkg}
59## Packaging urxvt plugins {#sec-urxvt-pkg}
60
60
61−Urxvt plugins resides in `pkgs/applications/misc/rxvt-unicode-plugins`. To add a new plugin create an expression in a subdirectory and add the package to the set in `pkgs/applications/misc/rxvt-unicode-plugins/default.nix`.
61+Urxvt plugins resides in `pkgs/applications/misc/rxvt-unicode-plugins`. To add a new plugin, create an expression in a subdirectory and add the package to the set in `pkgs/applications/misc/rxvt-unicode-plugins/default.nix`.
62
62
63A plugin can be any kind of derivation, the only requirement is that it should always install perl scripts in `$out/lib/urxvt/perl`. Look for existing plugins for examples.
63A plugin can be any kind of derivation, the only requirement is that it should always install perl scripts in `$out/lib/urxvt/perl`. Look for existing plugins for examples.
64
64
65−If the plugin is itself a perl package that needs to be imported from other plugins or scripts, add the following passthrough:
65+If the plugin is itself a Perl package that needs to be imported from other plugins or scripts, add the following passthrough:
66
66
67```nix
67```nix
68passthru.perlPackages = [ "self" ];
68passthru.perlPackages = [ "self" ];
69```
69```
70
70
71−This will make the urxvt wrapper pick up the dependency and set up the perl path accordingly.
71+This will make the urxvt wrapper pick up the dependency and set up the Perl path accordingly.
doc/builders/packages/weechat.section.md+5−5
@@ -1,6 +1,6 @@
1−# Weechat {#sec-weechat}
1+# WeeChat {#sec-weechat}
2
2
3−Weechat can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, install an expression that overrides its configuration such as
3+WeeChat can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, install an expression that overrides its configuration, such as:
4
4
5```nix
5```nix
6weechat.override {configure = {availablePlugins, ...}: {
6weechat.override {configure = {availablePlugins, ...}: {
@@ -13,7 +13,7 @@ If the `configure` function returns an attrset without the `plugins` attribute,
13
13
14The plugins currently available are `python`, `perl`, `ruby`, `guile`, `tcl` and `lua`.
14The plugins currently available are `python`, `perl`, `ruby`, `guile`, `tcl` and `lua`.
15
15
16−The python and perl plugins allows the addition of extra libraries. For instance, the `inotify.py` script in `weechat-scripts` requires D-Bus or libnotify, and the `fish.py` script requires `pycrypto`. To use these scripts, use the plugin's `withPackages` attribute:
16+The Python and Perl plugins allows the addition of extra libraries. For instance, the `inotify.py` script in `weechat-scripts` requires D-Bus or libnotify, and the `fish.py` script requires `pycrypto`. To use these scripts, use the plugin's `withPackages` attribute:
17
17
18```nix
18```nix
19weechat.override { configure = {availablePlugins, ...}: {
19weechat.override { configure = {availablePlugins, ...}: {
@@ -49,7 +49,7 @@ weechat.override {
49
49
50Further values can be added to the list of commands when running `weechat --run-command "your-commands"`.
50Further values can be added to the list of commands when running `weechat --run-command "your-commands"`.
51
51
52−Additionally it's possible to specify scripts to be loaded when starting `weechat`. These will be loaded before the commands from `init`:
52+Additionally, it's possible to specify scripts to be loaded when starting `weechat`. These will be loaded before the commands from `init`:
53
53
54```nix
54```nix
55weechat.override {
55weechat.override {
@@ -64,7 +64,7 @@ weechat.override {
64}
64}
65```
65```
66
66
67−In `nixpkgs` there's a subpackage which contains derivations for WeeChat scripts. Such derivations expect a `passthru.scripts` attribute which contains a list of all scripts inside the store path. Furthermore all scripts have to live in `$out/share`. An exemplary derivation looks like this:
67+In `nixpkgs` there's a subpackage which contains derivations for WeeChat scripts. Such derivations expect a `passthru.scripts` attribute, which contains a list of all scripts inside the store path. Furthermore, all scripts have to live in `$out/share`. An exemplary derivation looks like this:
68
68
69```nix
69```nix
70{ stdenv, fetchurl }:
70{ stdenv, fetchurl }:
doc/builders/special.xml−1
@@ -7,5 +7,4 @@
7 </para>
7 </para>
8 <xi:include href="special/fhs-environments.section.xml" />
8 <xi:include href="special/fhs-environments.section.xml" />
9 <xi:include href="special/mkshell.section.xml" />
9 <xi:include href="special/mkshell.section.xml" />
10− <xi:include href="special/invalidateFetcherByDrvHash.section.xml" />
11</chapter>
10</chapter>
doc/builders/special/invalidateFetcherByDrvHash.section.mddeleted−31
@@ -1,31 +0,0 @@
1−
2−## `invalidateFetcherByDrvHash` {#sec-pkgs-invalidateFetcherByDrvHash}
3−
4−Use the derivation hash to invalidate the output via name, for testing.
5−
6−Type: `(a@{ name, ... } -> Derivation) -> a -> Derivation`
7−
8−Normally, fixed output derivations can and should be cached by their output
9−hash only, but for testing we want to re-fetch everytime the fetcher changes.
10−
11−Changes to the fetcher become apparent in the drvPath, which is a hash of
12−how to fetch, rather than a fixed store path.
13−By inserting this hash into the name, we can make sure to re-run the fetcher
14−every time the fetcher changes.
15−
16−This relies on the assumption that Nix isn't clever enough to reuse its
17−database of local store contents to optimize fetching.
18−
19−You might notice that the "salted" name derives from the normal invocation,
20−not the final derivation. `invalidateFetcherByDrvHash` has to invoke the fetcher
21−function twice: once to get a derivation hash, and again to produce the final
22−fixed output derivation.
23−
24−Example:
25−
26− tests.fetchgit = invalidateFetcherByDrvHash fetchgit {
27− name = "nix-source";
28− url = "https://github.com/NixOS/nix";
29− rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a";
30− sha256 = "sha256-7DszvbCNTjpzGRmpIVAWXk20P0/XTrWZ79KSOGLrUWY=";
31− };
doc/builders/testers.chapter.mdnew file+82
@@ -0,0 +1,82 @@
1+# Testers {#chap-testers}
2+This chapter describes several testing builders which are available in the <literal>testers</literal> namespace.
3+
4+## `testVersion` {#tester-testVersion}
5+
6+Checks the command output contains the specified version
7+
8+Although simplistic, this test assures that the main program
9+can run. While there's no substitute for a real test case,
10+it does catch dynamic linking errors and such. It also provides
11+some protection against accidentally building the wrong version,
12+for example when using an 'old' hash in a fixed-output derivation.
13+
14+Examples:
15+
16+```nix
17+passthru.tests.version = testVersion { package = hello; };
18+
19+passthru.tests.version = testVersion {
20+ package = seaweedfs;
21+ command = "weed version";
22+};
23+
24+passthru.tests.version = testVersion {
25+ package = key;
26+ command = "KeY --help";
27+ # Wrong '2.5' version in the code. Drop on next version.
28+ version = "2.5";
29+};
30+```
31+
32+## `testEqualDerivation` {#tester-testEqualDerivation}
33+
34+Checks that two packages produce the exact same build instructions.
35+
36+This can be used to make sure that a certain difference of configuration,
37+such as the presence of an overlay does not cause a cache miss.
38+
39+When the derivations are equal, the return value is an empty file.
40+Otherwise, the build log explains the difference via `nix-diff`.
41+
42+Example:
43+
44+```nix
45+testEqualDerivation
46+ "The hello package must stay the same when enabling checks."
47+ hello
48+ (hello.overrideAttrs(o: { doCheck = true; }))
49+```
50+
51+## `invalidateFetcherByDrvHash` {#tester-invalidateFetcherByDrvHash}
52+
53+Use the derivation hash to invalidate the output via name, for testing.
54+
55+Type: `(a@{ name, ... } -> Derivation) -> a -> Derivation`
56+
57+Normally, fixed output derivations can and should be cached by their output
58+hash only, but for testing we want to re-fetch everytime the fetcher changes.
59+
60+Changes to the fetcher become apparent in the drvPath, which is a hash of
61+how to fetch, rather than a fixed store path.
62+By inserting this hash into the name, we can make sure to re-run the fetcher
63+every time the fetcher changes.
64+
65+This relies on the assumption that Nix isn't clever enough to reuse its
66+database of local store contents to optimize fetching.
67+
68+You might notice that the "salted" name derives from the normal invocation,
69+not the final derivation. `invalidateFetcherByDrvHash` has to invoke the fetcher
70+function twice: once to get a derivation hash, and again to produce the final
71+fixed output derivation.
72+
73+Example:
74+
75+```nix
76+tests.fetchgit = invalidateFetcherByDrvHash fetchgit {
77+ name = "nix-source";
78+ url = "https://github.com/NixOS/nix";
79+ rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a";
80+ sha256 = "sha256-7DszvbCNTjpzGRmpIVAWXk20P0/XTrWZ79KSOGLrUWY=";
81+};
82+```
doc/builders/trivial-builders.chapter.md+3−3
@@ -35,10 +35,10 @@ This works just like `runCommand`. The only difference is that it also provides
35
35
36## `runCommandLocal` {#trivial-builder-runCommandLocal}
36## `runCommandLocal` {#trivial-builder-runCommandLocal}
37
37
38−Variant of `runCommand` that forces the derivation to be built locally, it is not substituted. This is intended for very cheap commands (<1s execution time). It saves on the network roundrip and can speed up a build.
38+Variant of `runCommand` that forces the derivation to be built locally, it is not substituted. This is intended for very cheap commands (<1s execution time). It saves on the network round-trip and can speed up a build.
39
39
40::: {.note}
40::: {.note}
41−This sets [`allowSubstitutes` to `false`](https://nixos.org/nix/manual/#adv-attr-allowSubstitutes), so only use `runCommandLocal` if you are certain the user will always have a builder for the `system` of the derivation. This should be true for most trivial use cases (e.g. just copying some files to a different location or adding symlinks), because there the `system` is usually the same as `builtins.currentSystem`.
41+This sets [`allowSubstitutes` to `false`](https://nixos.org/nix/manual/#adv-attr-allowSubstitutes), so only use `runCommandLocal` if you are certain the user will always have a builder for the `system` of the derivation. This should be true for most trivial use cases (e.g., just copying some files to a different location or adding symlinks) because there the `system` is usually the same as `builtins.currentSystem`.
42:::
42:::
43
43
44## `writeTextFile`, `writeText`, `writeTextDir`, `writeScript`, `writeScriptBin` {#trivial-builder-writeText}
44## `writeTextFile`, `writeText`, `writeTextDir`, `writeScript`, `writeScriptBin` {#trivial-builder-writeText}
@@ -219,5 +219,5 @@ produces an output path `/nix/store/<hash>-runtime-references` containing
219/nix/store/<hash>-hello-2.10
219/nix/store/<hash>-hello-2.10
220```
220```
221
221
222−but none of `hello`'s dependencies, because those are not referenced directly
222+but none of `hello`'s dependencies because those are not referenced directly
223by `hi`'s output.
223by `hi`'s output.
doc/contributing/coding-conventions.chapter.md+5−5
@@ -214,15 +214,15 @@ Most of the time, these are the same. For instance, the package `e2fsprogs` has
214
214
215There are a few naming guidelines:
215There are a few naming guidelines:
216
216
217−- The `name` attribute _should_ be identical to the upstream package name.
217+- The `pname` attribute _should_ be identical to the upstream package name.
218
218
219−- The `name` attribute _must not_ contain uppercase letters — e.g., `"mplayer-1.0rc2"` instead of `"MPlayer-1.0rc2"`.
219+- The `pname` and the `version` attribute _must not_ contain uppercase letters — e.g., `"mplayer" instead of `"MPlayer"`.
220
220
221−- The version part of the `name` attribute _must_ start with a digit (following a dash) — e.g., `"hello-0.3.1rc2"`.
221+- The `version` attribute _must_ start with a digit e.g`"0.3.1rc2".
222
222
223−- If a package is not a release but a commit from a repository, then the version part of the name _must_ be the date of that (fetched) commit. The date _must_ be in `"YYYY-MM-DD"` format. Also append `"unstable"` to the name - e.g., `"pkgname-unstable-2014-09-23"`.
223+- If a package is not a release but a commit from a repository, then the `version` attribute _must_ be the date of that (fetched) commit. The date _must_ be in `"unstable-YYYY-MM-DD"` format.
224
224
225−- 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.
225+- Dashes in the package `pname` _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.
226
226
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)
228
228
doc/contributing/submitting-changes.chapter.md+1−1
@@ -96,7 +96,7 @@ We use jbidwatcher as an example for a discontinued project here.
96
96
971. Have Nixpkgs checked out locally and up to date.
971. Have Nixpkgs checked out locally and up to date.
981. Create a new branch for your change, e.g. `git checkout -b jbidwatcher`
981. Create a new branch for your change, e.g. `git checkout -b jbidwatcher`
99−1. Remove the actual package including its directory, e.g. `rm -rf pkgs/applications/misc/jbidwatcher`
99+1. Remove the actual package including its directory, e.g. `git rm -rf pkgs/applications/misc/jbidwatcher`
1001. Remove the package from the list of all packages (`pkgs/top-level/all-packages.nix`).
1001. Remove the package from the list of all packages (`pkgs/top-level/all-packages.nix`).
1011. 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.)
1011. 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.)
102
102
doc/hooks/index.xmlnew file+10
@@ -0,0 +1,10 @@
1+<chapter xmlns="http://docbook.org/ns/docbook"
2+ xmlns:xlink="http://www.w3.org/1999/xlink"
3+ xmlns:xi="http://www.w3.org/2001/XInclude"
4+ xml:id="chap-hooks">
5+ <title>Hooks reference</title>
6+ <para>
7+ Nixpkgs has several hook packages that augment the stdenv phases.
8+ </para>
9+ <xi:include href="./postgresql-test-hook.section.xml" />
10+</chapter>
doc/hooks/postgresql-test-hook.section.mdnew file+59
@@ -0,0 +1,59 @@
1+
2+# `postgresqlTestHook` {#sec-postgresqlTestHook}
3+
4+This hook starts a PostgreSQL server during the `checkPhase`. Example:
5+
6+```nix
7+{ stdenv, postgresql, postgresqlTestHook }:
8+stdenv.mkDerivation {
9+
10+ # ...
11+
12+ checkInputs = [
13+ postgresql
14+ postgresqlTestHook
15+ ];
16+}
17+```
18+
19+If you use a custom `checkPhase`, remember to add the `runHook` calls:
20+```nix
21+ checkPhase ''
22+ runHook preCheck
23+
24+ # ... your tests
25+
26+ runHook postCheck
27+ ''
28+```
29+
30+## Variables {#sec-postgresqlTestHook-variables}
31+
32+The hook logic will read a number of variables and set them to a default value if unset or empty.
33+
34+Exported variables:
35+
36+ - `PGDATA`: location of server files.
37+ - `PGHOST`: location of UNIX domain socket directory; the default `host` in a connection string.
38+ - `PGUSER`: user to create / log in with, default: `test_user`.
39+ - `PGDATABASE`: database name, default: `test_db`.
40+
41+Bash-only variables:
42+
43+ - `postgresqlTestUserOptions`: SQL options to use when creating the `$PGUSER` role, default: `LOGIN`.
44+ - `postgresqlTestSetupSQL`: SQL commands to run as database administrator after startup, default: statements that create `$PGUSER` and `$PGDATABASE`.
45+ - `postgresqlTestSetupCommands`: bash commands to run after database start, defaults to running `$postgresqlTestSetupSQL` as database administrator.
46+ - `postgresqlEnableTCP`: set to `1` to enable TCP listening. Flaky; not recommended.
47+ - `postgresqlStartCommands`: defaults to `pg_ctl start`.
48+
49+## TCP and the Nix sandbox {#sec-postgresqlTestHook-tcp}
50+
51+`postgresqlEnableTCP` relies on network sandboxing, which is not available on macOS and some custom Nix installations, resulting in flaky tests.
52+For this reason, it is disabled by default.
53+
54+The preferred solution is to make the test suite use a UNIX domain socket connection. This is the default behavior when no `host` connection parameter is provided.
55+Some test suites hardcode a value for `host` though, so a patch may be required. If you can upstream the patch, you can make `host` default to the `PGHOST` environment variable when set. Otherwise, you can patch it locally to omit the `host` connection string parameter altogether.
56+
57+::: {.note}
58+The error `libpq: failed (could not receive data from server: Connection refused` is generally an indication that the test suite is trying to connect through TCP.
59+:::
doc/languages-frameworks/chicken.section.mdnew file+49
@@ -0,0 +1,49 @@
1+# CHICKEN {#sec-chicken}
2+
3+[CHICKEN](https://call-cc.org/) is a
4+[R⁵RS](https://schemers.org/Documents/Standards/R5RS/HTML/)-compliant Scheme
5+compiler. It includes an interactive mode and a custom package format, "eggs".
6+
7+## Using Eggs
8+
9+Eggs described in nixpkgs are available inside the
10+`chickenPackages.chickenEggs` attrset. Including an egg as a build input is
11+done in the typical Nix fashion. For example, to include support for [SRFI
12+189](https://srfi.schemers.org/srfi-189/srfi-189.html) in a derivation, one
13+might write:
14+
15+```nix
16+ buildInputs = [
17+ chicken
18+ chickenPackages.chickenEggs.srfi-189
19+ ];
20+```
21+
22+Both `chicken` and its eggs have a setup hook which configures the environment
23+variables `CHICKEN_INCLUDE_PATH` and `CHICKEN_REPOSITORY_PATH`.
24+
25+## Updating Eggs
26+
27+nixpkgs only knows about a subset of all published eggs. It uses
28+[egg2nix](https://github.com/the-kenny/egg2nix) to generate a
29+package set from a list of eggs to include.
30+
31+The package set is regenerated by running the following shell commands:
32+
33+```
34+$ nix-shell -p chickenPackages.egg2nix
35+$ cd pkgs/development/compilers/chicken/5/
36+$ egg2nix eggs.scm > eggs.nix
37+```
38+
39+## Adding Eggs
40+
41+When we run `egg2nix`, we obtain one collection of eggs with
42+mutually-compatible versions. This means that when we add new eggs, we may
43+need to update existing eggs. To keep those separate, follow the procedure for
44+updating eggs before including more eggs.
45+
46+To include more eggs, edit `pkgs/development/compilers/chicken/5/eggs.scm`.
47+The first section of this file lists eggs which are required by `egg2nix`
48+itself; all other eggs go into the second section. After editing, follow the
49+procedure for updating eggs.
doc/languages-frameworks/cuda.section.mdnew file+34
@@ -0,0 +1,34 @@
1+# CUDA {#cuda}
2+
3+CUDA-only packages are stored in the `cudaPackages` packages set. This set
4+includes the `cudatoolkit`, portions of the toolkit in separate derivations,
5+`cudnn`, `cutensor` and `nccl`.
6+
7+A package set is available for each CUDA version, so for example
8+`cudaPackages_11_6`. Within each set is a matching version of the above listed
9+packages. Additionally, other versions of the packages that are packaged and
10+compatible are available as well. For example, there can be a
11+`cudaPackages.cudnn_8_3_2` package.
12+
13+To use one or more CUDA packages in an expression, give the expression a `cudaPackages` parameter, and in case CUDA is optional
14+```nix
15+cudaSupport ? false
16+cudaPackages ? {}
17+```
18+
19+When using `callPackage`, you can choose to pass in a different variant, e.g.
20+when a different version of the toolkit suffices
21+```nix
22+mypkg = callPackage { cudaPackages = cudaPackages_11_5; }
23+```
24+
25+If another version of say `cudnn` or `cutensor` is needed, you can override the
26+package set to make it the default. This guarantees you get a consistent package
27+set.
28+```nix
29+mypkg = let
30+ cudaPackages = cudaPackages_11_5.overrideScope' (final: prev {
31+ cudnn = prev.cudnn_8_3_2;
32+ }});
33+in callPackage { inherit cudaPackages; };
34+```
doc/languages-frameworks/gnome.section.md+16−2
@@ -42,7 +42,21 @@ Unlike other libraries mentioned in this section, GdkPixbuf only supports a sing
42
42
43### Icons {#ssec-gnome-icons}
43### Icons {#ssec-gnome-icons}
44
44
45−When an application uses icons, an icon theme should be available in `XDG_DATA_DIRS` during runtime. The package for the default, icon-less [hicolor-icon-theme](https://www.freedesktop.org/wiki/Software/icon-theme/) (should be propagated by every icon theme) contains [a setup hook](#ssec-gnome-hooks-hicolor-icon-theme) that will pick up icon themes from `buildInputs` and pass it to our wrapper. Unfortunately, relying on that would mean every user has to download the theme included in the package expression no matter their preference. For that reason, we leave the installation of icon theme on the user. If you use one of the desktop environments, you probably already have an icon theme installed.
45+When an application uses icons, an icon theme should be available in `XDG_DATA_DIRS` during runtime. The package for the default, icon-less [hicolor-icon-theme](https://www.freedesktop.org/wiki/Software/icon-theme/) (should be propagated by every icon theme) contains [a setup hook](#ssec-gnome-hooks-hicolor-icon-theme) that will pick up icon themes from `buildInputs` and add their datadirs to `XDG_ICON_DIRS` environment variable (this is Nixpkgs specific, not actually a XDG standard variable). Unfortunately, relying on that would mean every user has to download the theme included in the package expression no matter their preference. For that reason, we leave the installation of icon theme on the user. If you use one of the desktop environments, you probably already have an icon theme installed.
46+
47+In the rare case you need to use icons from dependencies (e.g. when an app forces an icon theme), you can use the following to pick them up:
48+
49+```nix
50+ buildInputs = [
51+ pantheon.elementary-icon-theme
52+ ];
53+ preFixup = ''
54+ gappsWrapperArgs+=(
55+ # The icon theme is hardcoded.
56+ --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS"
57+ )
58+ '';
59+```
46
60
47To avoid costly file system access when locating icons, GTK, [as well as Qt](https://woboq.com/blog/qicon-reads-gtk-icon-cache-in-qt57.html), can rely on `icon-theme.cache` files from the themes' top-level directories. These files are generated using `gtk-update-icon-cache`, which is expected to be run whenever an icon is added or removed to an icon theme (typically an application icon into `hicolor` theme) and some programs do indeed run this after icon installation. However, since packages are installed into their own prefix by Nix, this would lead to conflicts. For that reason, `gtk3` provides a [setup hook](#ssec-gnome-hooks-gtk-drop-icon-theme-cache) that will clean the file from installation. Since most applications only ship their own icon that will be loaded on start-up, it should not affect them too much. On the other hand, icon themes are much larger and more widely used so we need to cache them. Because we recommend installing icon themes globally, we will generate the cache files from all packages in a profile using a NixOS module. You can enable the cache generation using `gtk.iconCache.enable` option if your desktop environment does not already do that.
61To avoid costly file system access when locating icons, GTK, [as well as Qt](https://woboq.com/blog/qicon-reads-gtk-icon-cache-in-qt57.html), can rely on `icon-theme.cache` files from the themes' top-level directories. These files are generated using `gtk-update-icon-cache`, which is expected to be run whenever an icon is added or removed to an icon theme (typically an application icon into `hicolor` theme) and some programs do indeed run this after icon installation. However, since packages are installed into their own prefix by Nix, this would lead to conflicts. For that reason, `gtk3` provides a [setup hook](#ssec-gnome-hooks-gtk-drop-icon-theme-cache) that will clean the file from installation. Since most applications only ship their own icon that will be loaded on start-up, it should not affect them too much. On the other hand, icon themes are much larger and more widely used so we need to cache them. Because we recommend installing icon themes globally, we will generate the cache files from all packages in a profile using a NixOS module. You can enable the cache generation using `gtk.iconCache.enable` option if your desktop environment does not already do that.
48
62
@@ -98,7 +112,7 @@ For convenience, it also adds `dconf.lib` for a GIO module implementing a GSetti
98
112
99- []{#ssec-gnome-hooks-dconf} `dconf.lib` is a dependency of `wrapGAppsHook`, which then also adds it to the `GIO_EXTRA_MODULES` variable.
113- []{#ssec-gnome-hooks-dconf} `dconf.lib` is a dependency of `wrapGAppsHook`, which then also adds it to the `GIO_EXTRA_MODULES` variable.
100
114
101−- []{#ssec-gnome-hooks-hicolor-icon-theme} `hicolor-icon-theme`’s setup hook will add icon themes to `XDG_ICON_DIRS` which is prepended to `XDG_DATA_DIRS` by `wrapGAppsHook`.
115+- []{#ssec-gnome-hooks-hicolor-icon-theme} `hicolor-icon-theme`’s setup hook will add icon themes to `XDG_ICON_DIRS`.
102
116
103- []{#ssec-gnome-hooks-gobject-introspection} `gobject-introspection` setup hook populates `GI_TYPELIB_PATH` variable with `lib/girepository-1.0` directories of dependencies, which is then added to wrapper by `wrapGAppsHook`. It also adds `share` directories of dependencies to `XDG_DATA_DIRS`, which is intended to promote GIR files but it also [pollutes the closures](https://github.com/NixOS/nixpkgs/issues/32790) of packages using `wrapGAppsHook`.
117- []{#ssec-gnome-hooks-gobject-introspection} `gobject-introspection` setup hook populates `GI_TYPELIB_PATH` variable with `lib/girepository-1.0` directories of dependencies, which is then added to wrapper by `wrapGAppsHook`. It also adds `share` directories of dependencies to `XDG_DATA_DIRS`, which is intended to promote GIR files but it also [pollutes the closures](https://github.com/NixOS/nixpkgs/issues/32790) of packages using `wrapGAppsHook`.
104
118
doc/languages-frameworks/go.section.md+5−1
@@ -142,4 +142,8 @@ Removes the pre-existing vendor directory. This should only be used if the depen
142
142
143### `subPackages` {#var-go-subPackages}
143### `subPackages` {#var-go-subPackages}
144
144
145−Limits the builder from building child packages that have not been listed. If `subPackages` is not specified, all child packages will be built.
145+Specified as a string or list of strings. Limits the builder from building child packages that have not been listed. If `subPackages` is not specified, all child packages will be built.
146+
147+### `excludedPackages` {#var-go-excludedPackages}
148+
149+Specified as a string or list of strings. Causes the builder to skip building child packages that match any of the provided values. If `excludedPackages` is not specified, all child packages will be built.
doc/languages-frameworks/index.xml+2
@@ -9,8 +9,10 @@
9 <xi:include href="android.section.xml" />
9 <xi:include href="android.section.xml" />
10 <xi:include href="beam.section.xml" />
10 <xi:include href="beam.section.xml" />
11 <xi:include href="bower.section.xml" />
11 <xi:include href="bower.section.xml" />
12+ <xi:include href="chicken.section.xml" />
12 <xi:include href="coq.section.xml" />
13 <xi:include href="coq.section.xml" />
13 <xi:include href="crystal.section.xml" />
14 <xi:include href="crystal.section.xml" />
15+ <xi:include href="cuda.section.xml" />
14 <xi:include href="dhall.section.xml" />
16 <xi:include href="dhall.section.xml" />
15 <xi:include href="dotnet.section.xml" />
17 <xi:include href="dotnet.section.xml" />
16 <xi:include href="emscripten.section.xml" />
18 <xi:include href="emscripten.section.xml" />
doc/manual.xml+2
@@ -25,8 +25,10 @@
25 <title>Builders</title>
25 <title>Builders</title>
26 <xi:include href="builders/fetchers.chapter.xml" />
26 <xi:include href="builders/fetchers.chapter.xml" />
27 <xi:include href="builders/trivial-builders.chapter.xml" />
27 <xi:include href="builders/trivial-builders.chapter.xml" />
28+ <xi:include href="builders/testers.chapter.xml" />
28 <xi:include href="builders/special.xml" />
29 <xi:include href="builders/special.xml" />
29 <xi:include href="builders/images.xml" />
30 <xi:include href="builders/images.xml" />
31+ <xi:include href="hooks/index.xml" />
30 <xi:include href="languages-frameworks/index.xml" />
32 <xi:include href="languages-frameworks/index.xml" />
31 <xi:include href="builders/packages/index.xml" />
33 <xi:include href="builders/packages/index.xml" />
32 </part>
34 </part>
doc/stdenv/cross-compilation.chapter.md+35−10
@@ -78,21 +78,46 @@ If both the dependency and depending packages aren't compilers or other machine-
78
78
79Finally, if the depending package is a compiler or other machine-code-producing tool, it might need dependencies that run at "emit time". This is for compilers that (regrettably) insist on being built together with their source languages' standard libraries. Assuming build != host != target, a run-time dependency of the standard library cannot be run at the compiler's build time or run time, but only at the run time of code emitted by the compiler.
79Finally, if the depending package is a compiler or other machine-code-producing tool, it might need dependencies that run at "emit time". This is for compilers that (regrettably) insist on being built together with their source languages' standard libraries. Assuming build != host != target, a run-time dependency of the standard library cannot be run at the compiler's build time or run time, but only at the run time of code emitted by the compiler.
80
80
81−Putting this all together, that means we have dependencies in the form "host → target", in at most the following six combinations:
81+Putting this all together, that means that we have dependency types of the form "X→ E", which means that the dependency executes on X and emits code for E; each of X and E can be `build`, `host`, or `target`, and E can be `*` to indicate that the dependency is not a compiler-like package.
82+
83+Dependency types describe the relationships that a package has with each of its transitive dependencies. You could think of attaching one or more dependency types to each of the formal parameters at the top of a package's `.nix` file, as well as to all of *their* formal parameters, and so on. Triples like `(foo, bar, baz)`, on the other hand, are a property of an instantiated derivation -- you could would attach a triple `(mips-linux, mips-linux, sparc-solaris)` to a `.drv` file in `/nix/store`.
84+
85+Only nine dependency types matter in practice:
82
86
83#### Possible dependency types {#possible-dependency-types}
87#### Possible dependency types {#possible-dependency-types}
84
88
85−| Dependency’s host platform | Dependency’s target platform |
89+| Dependency type | Dependency’s host platform | Dependency’s target platform |
86−|----------------------------|------------------------------|
90+|-----------------|----------------------------|------------------------------|
91+| build → * | build | (none) |
87−| build | build |
92+| build → build | build | build |
88−| build | host |
93+| build → host | build | host |
89−| build | target |
94+| build → target | build | target |
90−| host | host |
95+| host → * | host | (none) |
96+| host → host | host | host |
91−| host | target |
97+| host → target | host | target |
92−| target | target |
98+| target → * | target | (none) |
99+| target → target | target | target |
100+
101+Let's use `g++` as an example to make this table clearer. `g++` is a C++ compiler written in C. Suppose we are building `g++` with a `(build, host, target)` platform triple of `(foo, bar, baz)`. This means we are using a `foo`-machine to build a copy of `g++` which will run on a `bar`-machine and emit binaries for the `baz`-machine.
102+
103+* `g++` links against the host platform's `glibc` C library, which is a "host→ *" dependency with a triple of `(bar, bar, *)`. Since it is a library, not a compiler, it has no "target".
104+
105+* Since `g++` is written in C, the `gcc` compiler used to compile it is a "build→ host" dependency of `g++` with a triple of `(foo, foo, bar)`. This compiler runs on the build platform and emits code for the host platform.
106+
107+* `gcc` links against the build platform's `glibc` C library, which is a "build→ *" dependency with a triple of `(foo, foo, *)`. Since it is a library, not a compiler, it has no "target".
108+
109+* This `gcc` is itself compiled by an *earlier* copy of `gcc`. This earlier copy of `gcc` is a "build→ build" dependency of `g++` with a triple of `(foo, foo, foo)`. This "early `gcc`" runs on the build platform and emits code for the build platform.
110+
111+* `g++` is bundled with `libgcc`, which includes a collection of target-machine routines for exception handling and
112+software floating point emulation. `libgcc` would be a "target→ *" dependency with triple `(foo, baz, *)`, because it consists of machine code which gets linked against the output of the compiler that we are building. It is a library, not a compiler, so it has no target of its own.
113+
114+* `libgcc` is written in C and compiled with `gcc`. The `gcc` that compiles it will be a "build→ target" dependency with triple `(foo, foo, baz)`. It gets compiled *and run* at `g++`-build-time (on platform `foo`), but must emit code for the `baz`-platform.
115+
116+* `g++` allows inline assembler code, so it depends on access to a copy of the `gas` assembler. This would be a "host→ target" dependency with triple `(foo, bar, baz)`.
93
117
118+* `g++` (and `gcc`) include a library `libgccjit.so`, which wrap the compiler in a library to create a just-in-time compiler. In nixpkgs, this library is in the `libgccjit` package; if C++ required that programs have access to a JIT, `g++` would need to add a "target→ target" dependency for `libgccjit` with triple `(foo, baz, baz)`. This would ensure that the compiler ships with a copy of `libgccjit` which both executes on and generates code for the `baz`-platform.
94
119
95−Some examples will make this table clearer. Suppose there's some package that is being built with a `(build, host, target)` platform triple of `(foo, bar, baz)`. If it has a build-time library dependency, that would be a "host → build" dependency with a triple of `(foo, foo, *)` (the target platform is irrelevant). If it needs a compiler to be built, that would be a "build → host" dependency with a triple of `(foo, foo, *)` (the target platform is irrelevant). That compiler, would be built with another compiler, also "build → host" dependency, with a triple of `(foo, foo, foo)`.
120+* If `g++` itself linked against `libgccjit.so` (for example, to allow compile-time-evaluated C++ expressions), then the `libgccjit` package used to provide this functionality would be a "host→ host" dependency of `g++`: it is code which runs on the `host` and emits code for execution on the `host`.
96
121
97### Cross packaging cookbook {#ssec-cross-cookbook}
122### Cross packaging cookbook {#ssec-cross-cookbook}
98
123
doc/stdenv/meta.chapter.md+34
@@ -175,6 +175,40 @@ The NixOS tests are available as `nixosTests` in parameters of derivations. For
175
175
176NixOS tests run in a VM, so they are slower than regular package tests. For more information see [NixOS module tests](https://nixos.org/manual/nixos/stable/#sec-nixos-tests).
176NixOS tests run in a VM, so they are slower than regular package tests. For more information see [NixOS module tests](https://nixos.org/manual/nixos/stable/#sec-nixos-tests).
177
177
178+Alternatively, you can specify other derivations as tests. You can make use of
179+the optional parameter to inject the correct package without
180+relying on non-local definitions, even in the presence of `overrideAttrs`.
181+Here that's `finalAttrs.finalPackage`, but you could choose a different name if
182+`finalAttrs` already exists in your scope.
183+
184+`(mypkg.overrideAttrs f).passthru.tests` will be as expected, as long as the
185+definition of `tests` does not rely on the original `mypkg` or overrides it in
186+all places.
187+
188+```nix
189+# my-package/default.nix
190+{ stdenv, callPackage }:
191+stdenv.mkDerivation (finalAttrs: {
192+ # ...
193+ passthru.tests.example = callPackage ./example.nix { my-package = finalAttrs.finalPackage; };
194+})
195+```
196+
197+```nix
198+# my-package/example.nix
199+{ runCommand, lib, my-package, ... }:
200+runCommand "my-package-test" {
201+ nativeBuildInputs = [ my-package ];
202+ src = lib.sources.sourcesByRegex ./. [ ".*.in" ".*.expected" ];
203+} ''
204+ my-package --help
205+ my-package <example.in >example.actual
206+ diff -U3 --color=auto example.expected example.actual
207+ mkdir $out
208+''
209+```
210+
211+
178### `timeout` {#var-meta-timeout}
212### `timeout` {#var-meta-timeout}
179
213
180A timeout (in seconds) for building the derivation. If the derivation takes longer than this time to build, it can fail due to breaking the timeout. However, all computers do not have the same computing power, hence some builders may decide to apply a multiplicative factor to this value. When filling this value in, try to keep it approximately consistent with other values already present in `nixpkgs`.
214A timeout (in seconds) for building the derivation. If the derivation takes longer than this time to build, it can fail due to breaking the timeout. However, all computers do not have the same computing power, hence some builders may decide to apply a multiplicative factor to this value. When filling this value in, try to keep it approximately consistent with other values already present in `nixpkgs`.
doc/stdenv/stdenv.chapter.md+56−2
@@ -125,7 +125,7 @@ The extension of `PATH` with dependencies, alluded to above, proceeds according
125A dependency is said to be **propagated** when some of its other-transitive (non-immediate) downstream dependencies also need it as an immediate dependency.
125A dependency is said to be **propagated** when some of its other-transitive (non-immediate) downstream dependencies also need it as an immediate dependency.
126[^footnote-stdenv-propagated-dependencies]
126[^footnote-stdenv-propagated-dependencies]
127
127
128−It is important to note that dependencies are not necessarily propagated as the same sort of dependency that they were before, but rather as the corresponding sort so that the platform rules still line up. To determine the exact rules for dependency propagation, we start by assigning to each dependency a couple of ternary numbers (`-1` for `build`, `0` for `host`, and `1` for `target`), representing how respectively its host and target platforms are "offset" from the depending derivation’s platforms. The following table summarize the different combinations that can be obtained:
128+It is important to note that dependencies are not necessarily propagated as the same sort of dependency that they were before, but rather as the corresponding sort so that the platform rules still line up. To determine the exact rules for dependency propagation, we start by assigning to each dependency a couple of ternary numbers (`-1` for `build`, `0` for `host`, and `1` for `target`) representing its [dependency type](#possible-dependency-types), which captures how its host and target platforms are each "offset" from the depending derivation’s host and target platforms. The following table summarize the different combinations that can be obtained:
129
129
130| `host → target` | attribute name | offset |
130| `host → target` | attribute name | offset |
131| ------------------- | ------------------- | -------- |
131| ------------------- | ------------------- | -------- |
@@ -317,6 +317,60 @@ The script will be usually run from the root of the Nixpkgs repository but you s
317
317
318For information about how to run the updates, execute `nix-shell maintainers/scripts/update.nix`.
318For information about how to run the updates, execute `nix-shell maintainers/scripts/update.nix`.
319
319
320+### Recursive attributes in `mkDerivation`
321+
322+If you pass a function to `mkDerivation`, it will receive as its argument the final arguments, including the overrides when reinvoked via `overrideAttrs`. For example:
323+
324+```nix
325+mkDerivation (finalAttrs: {
326+ pname = "hello";
327+ withFeature = true;
328+ configureFlags =
329+ lib.optionals finalAttrs.withFeature ["--with-feature"];
330+})
331+```
332+
333+Note that this does not use the `rec` keyword to reuse `withFeature` in `configureFlags`.
334+The `rec` keyword works at the syntax level and is unaware of overriding.
335+
336+Instead, the definition references `finalAttrs`, allowing users to change `withFeature`
337+consistently with `overrideAttrs`.
338+
339+`finalAttrs` also contains the attribute `finalPackage`, which includes the output paths, etc.
340+
341+Let's look at a more elaborate example to understand the differences between
342+various bindings:
343+
344+```nix
345+# `pkg` is the _original_ definition (for illustration purposes)
346+let pkg =
347+ mkDerivation (finalAttrs: {
348+ # ...
349+
350+ # An example attribute
351+ packages = [];
352+
353+ # `passthru.tests` is a commonly defined attribute.
354+ passthru.tests.simple = f finalAttrs.finalPackage;
355+
356+ # An example of an attribute containing a function
357+ passthru.appendPackages = packages':
358+ finalAttrs.finalPackage.overrideAttrs (newSelf: super: {
359+ packages = super.packages ++ packages';
360+ });
361+
362+ # For illustration purposes; referenced as
363+ # `(pkg.overrideAttrs(x)).finalAttrs` etc in the text below.
364+ passthru.finalAttrs = finalAttrs;
365+ passthru.original = pkg;
366+ });
367+in pkg
368+```
369+
370+Unlike the `pkg` binding in the above example, the `finalAttrs` parameter always references the final attributes. For instance `(pkg.overrideAttrs(x)).finalAttrs.finalPackage` is identical to `pkg.overrideAttrs(x)`, whereas `(pkg.overrideAttrs(x)).original` is the same as the original `pkg`.
371+
372+See also the section about [`passthru.tests`](#var-meta-tests).
373+
320## Phases {#sec-stdenv-phases}
374## Phases {#sec-stdenv-phases}
321
375
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.
376`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.
@@ -1043,7 +1097,7 @@ You can also specify a `runtimeDependencies` variable which lists dependencies t
1043
1097
1044In certain situations you may want to run the main command (`autoPatchelf`) of the setup hook on a file or a set of directories instead of unconditionally patching all outputs. This can be done by setting the `dontAutoPatchelf` environment variable to a non-empty value.
1098In certain situations you may want to run the main command (`autoPatchelf`) of the setup hook on a file or a set of directories instead of unconditionally patching all outputs. This can be done by setting the `dontAutoPatchelf` environment variable to a non-empty value.
1045
1099
1046−By default `autoPatchelf` will fail as soon as any ELF file requires a dependency which cannot be resolved via the given build inputs. In some situations you might prefer to just leave missing dependencies unpatched and continue to patch the rest. This can be achieved by setting the `autoPatchelfIgnoreMissingDeps` environment variable to a non-empty value.
1100+By default `autoPatchelf` will fail as soon as any ELF file requires a dependency which cannot be resolved via the given build inputs. In some situations you might prefer to just leave missing dependencies unpatched and continue to patch the rest. This can be achieved by setting the `autoPatchelfIgnoreMissingDeps` environment variable to a non-empty value. `autoPatchelfIgnoreMissingDeps` can be set to a list like `autoPatchelfIgnoreMissingDeps = [ "libcuda.so.1" "libcudart.so.1" ];` or to simply `[ "*" ]` to ignore all missing dependencies.
1047
1101
1048The `autoPatchelf` command also recognizes a `--no-recurse` command line flag, which prevents it from recursing into subdirectories.
1102The `autoPatchelf` command also recognizes a `--no-recurse` command line flag, which prevents it from recursing into subdirectories.
1049
1103
doc/using/overrides.chapter.md+6−2
@@ -39,14 +39,18 @@ The function `overrideAttrs` allows overriding the attribute set passed to a `st
39Example usage:
39Example usage:
40
40
41```nix
41```nix
42−helloWithDebug = pkgs.hello.overrideAttrs (oldAttrs: rec {
42+helloWithDebug = pkgs.hello.overrideAttrs (finalAttrs: previousAttrs: {
43 separateDebugInfo = true;
43 separateDebugInfo = true;
44});
44});
45```
45```
46
46
47In the above example, the `separateDebugInfo` attribute is overridden to be true, thus building debug info for `helloWithDebug`, while all other attributes will be retained from the original `hello` package.
47In the above example, the `separateDebugInfo` attribute is overridden to be true, thus building debug info for `helloWithDebug`, while all other attributes will be retained from the original `hello` package.
48
48
49−The argument `oldAttrs` is conventionally used to refer to the attr set originally passed to `stdenv.mkDerivation`.
49+The argument `previousAttrs` is conventionally used to refer to the attr set originally passed to `stdenv.mkDerivation`.
50+
51+The argument `finalAttrs` refers to the final attributes passed to `mkDerivation`, plus the `finalPackage` attribute which is equal to the result of `mkDerivation` or subsequent `overrideAttrs` calls.
52+
53+If only a one-argument function is written, the argument has the meaning of `previousAttrs`.
50
54
51::: {.note}
55::: {.note}
52Note that `separateDebugInfo` is processed only by the `stdenv.mkDerivation` function, not the generated, raw Nix derivation. Thus, using `overrideDerivation` will not work in this case, as it overrides only the attributes of the final derivation. It is for this reason that `overrideAttrs` should be preferred in (almost) all cases to `overrideDerivation`, i.e. to allow using `stdenv.mkDerivation` to process input arguments, as well as the fact that it is easier to use (you can use the same attribute names you see in your Nix code, instead of the ones generated (e.g. `buildInputs` vs `nativeBuildInputs`), and it involves less typing).
56Note that `separateDebugInfo` is processed only by the `stdenv.mkDerivation` function, not the generated, raw Nix derivation. Thus, using `overrideDerivation` will not work in this case, as it overrides only the attributes of the final derivation. It is for this reason that `overrideAttrs` should be preferred in (almost) all cases to `overrideDerivation`, i.e. to allow using `stdenv.mkDerivation` to process input arguments, as well as the fact that it is easier to use (you can use the same attribute names you see in your Nix code, instead of the ones generated (e.g. `buildInputs` vs `nativeBuildInputs`), and it involves less typing).
lib/default.nix+7−2
@@ -11,6 +11,9 @@ let
11 callLibs = file: import file { lib = self; };
11 callLibs = file: import file { lib = self; };
12 in {
12 in {
13
13
14+ # interacting with flakes
15+ flakes = callLibs ./flakes.nix;
16+
14 # often used, or depending on very little
17 # often used, or depending on very little
15 trivial = callLibs ./trivial.nix;
18 trivial = callLibs ./trivial.nix;
16 fixedPoints = callLibs ./fixed-points.nix;
19 fixedPoints = callLibs ./fixed-points.nix;
@@ -59,6 +62,7 @@ let
59 # linux kernel configuration
62 # linux kernel configuration
60 kernel = callLibs ./kernel.nix;
63 kernel = callLibs ./kernel.nix;
61
64
65+ inherit (self.flakes) callLocklessFlake;
62 inherit (builtins) add addErrorContext attrNames concatLists
66 inherit (builtins) add addErrorContext attrNames concatLists
63 deepSeq elem elemAt filter genericClosure genList getAttr
67 deepSeq elem elemAt filter genericClosure genList getAttr
64 hasAttr head isAttrs isBool isInt isList isString length
68 hasAttr head isAttrs isBool isInt isList isString length
@@ -94,7 +98,8 @@ let
94 concatImapStringsSep makeSearchPath makeSearchPathOutput
98 concatImapStringsSep makeSearchPath makeSearchPathOutput
95 makeLibraryPath makeBinPath optionalString
99 makeLibraryPath makeBinPath optionalString
96 hasInfix hasPrefix hasSuffix stringToCharacters stringAsChars escape
100 hasInfix hasPrefix hasSuffix stringToCharacters stringAsChars escape
101+ escapeShellArg escapeShellArgs isValidPosixName toShellVar toShellVars
97− escapeShellArg escapeShellArgs escapeRegex escapeXML replaceChars lowerChars
102+ escapeRegex escapeXML replaceChars lowerChars
98 upperChars toLower toUpper addContextFrom splitString
103 upperChars toLower toUpper addContextFrom splitString
99 removePrefix removeSuffix versionOlder versionAtLeast
104 removePrefix removeSuffix versionOlder versionAtLeast
100 getName getVersion
105 getName getVersion
@@ -108,7 +113,7 @@ let
108 makeScope makeScopeWithSplicing;
113 makeScope makeScopeWithSplicing;
109 inherit (self.meta) addMetaAttrs dontDistribute setName updateName
114 inherit (self.meta) addMetaAttrs dontDistribute setName updateName
110 appendToName mapDerivationAttrset setPrio lowPrio lowPrioSet hiPrio
115 appendToName mapDerivationAttrset setPrio lowPrio lowPrioSet hiPrio
111− hiPrioSet getLicenseFromSpdxId;
116+ hiPrioSet getLicenseFromSpdxId getExe;
112 inherit (self.sources) pathType pathIsDirectory cleanSourceFilter
117 inherit (self.sources) pathType pathIsDirectory cleanSourceFilter
113 cleanSource sourceByRegex sourceFilesBySuffices
118 cleanSource sourceByRegex sourceFilesBySuffices
114 commitIdFromGitRepo cleanSourceWith pathHasContext
119 commitIdFromGitRepo cleanSourceWith pathHasContext
lib/flakes.nixnew file+22
@@ -0,0 +1,22 @@
1+{ lib }:
2+
3+rec {
4+
5+ /* imports a flake.nix without acknowledging its lock file, useful for
6+ referencing subflakes from a parent flake. The second argument allows
7+ specifying the inputs of this flake.
8+
9+ Example:
10+ callLocklessFlake {
11+ path = ./directoryContainingFlake;
12+ inputs = { inherit nixpkgs; };
13+ }
14+ */
15+ callLocklessFlake = { path, inputs ? { } }:
16+ let
17+ self = { outPath = path; } //
18+ ((import (path + "/flake.nix")).outputs (inputs // { self = self; }));
19+ in
20+ self;
21+
22+}
lib/generators.nix+47−2
@@ -10,7 +10,7 @@
10 * are mostly generators themselves, called with
10 * are mostly generators themselves, called with
11 * their respective default values; they can be reused.
11 * their respective default values; they can be reused.
12 *
12 *
13− * Tests can be found in ./tests.nix
13+ * Tests can be found in ./tests/misc.nix
14 * Documentation in the manual, #sec-generators
14 * Documentation in the manual, #sec-generators
15 */
15 */
16{ lib }:
16{ lib }:
@@ -108,7 +108,7 @@ rec {
108 * The mk* configuration attributes can generically change
108 * The mk* configuration attributes can generically change
109 * the way sections and key-value strings are generated.
109 * the way sections and key-value strings are generated.
110 *
110 *
111− * For more examples see the test cases in ./tests.nix.
111+ * For more examples see the test cases in ./tests/misc.nix.
112 */
112 */
113 toINI = {
113 toINI = {
114 # apply transformations (e.g. escapes) to section names
114 # apply transformations (e.g. escapes) to section names
@@ -130,6 +130,51 @@ rec {
130 # map input to ini sections
130 # map input to ini sections
131 mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;
131 mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;
132
132
133+ /* Generate an INI-style config file from an attrset
134+ * specifying the global section (no header), and an
135+ * attrset of sections to an attrset of key-value pairs.
136+ *
137+ * generators.toINIWithGlobalSection {} {
138+ * globalSection = {
139+ * someGlobalKey = "hi";
140+ * };
141+ * sections = {
142+ * foo = { hi = "${pkgs.hello}"; ciao = "bar"; };
143+ * baz = { "also, integers" = 42; };
144+ * }
145+ *
146+ *> someGlobalKey=hi
147+ *>
148+ *> [baz]
149+ *> also, integers=42
150+ *>
151+ *> [foo]
152+ *> ciao=bar
153+ *> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10
154+ *
155+ * The mk* configuration attributes can generically change
156+ * the way sections and key-value strings are generated.
157+ *
158+ * For more examples see the test cases in ./tests/misc.nix.
159+ *
160+ * If you don’t need a global section, you can also use
161+ * `generators.toINI` directly, which only takes
162+ * the part in `sections`.
163+ */
164+ toINIWithGlobalSection = {
165+ # apply transformations (e.g. escapes) to section names
166+ mkSectionName ? (name: libStr.escape [ "[" "]" ] name),
167+ # format a setting line from key and value
168+ mkKeyValue ? mkKeyValueDefault {} "=",
169+ # allow lists as values for duplicate keys
170+ listsAsDuplicateKeys ? false
171+ }: { globalSection, sections }:
172+ ( if globalSection == {}
173+ then ""
174+ else (toKeyValue { inherit mkKeyValue listsAsDuplicateKeys; } globalSection)
175+ + "\n")
176+ + (toINI { inherit mkSectionName mkKeyValue listsAsDuplicateKeys; } sections);
177+
133 /* Generate a git-config file from an attrset.
178 /* Generate a git-config file from an attrset.
134 *
179 *
135 * It has two major differences from the regular INI format:
180 * It has two major differences from the regular INI format:
lib/meta.nix+14
@@ -126,4 +126,18 @@ rec {
126 lib.warn "getLicenseFromSpdxId: No license matches the given SPDX ID: ${licstr}"
126 lib.warn "getLicenseFromSpdxId: No license matches the given SPDX ID: ${licstr}"
127 { shortName = licstr; }
127 { shortName = licstr; }
128 );
128 );
129+
130+ /* Get the path to the main program of a derivation with either
131+ meta.mainProgram or pname or name
132+
133+ Type: getExe :: derivation -> string
134+
135+ Example:
136+ getExe pkgs.hello
137+ => "/nix/store/g124820p9hlv4lj8qplzxw1c44dxaw1k-hello-2.12/bin/hello"
138+ getExe pkgs.mustache-go
139+ => "/nix/store/am9ml4f4ywvivxnkiaqwr0hyxka1xjsf-mustache-go-1.3.0/bin/mustache"
140+ */
141+ getExe = x:
142+ "${lib.getBin x}/bin/${x.meta.mainProgram or (lib.getName x)}";
129}
143}
lib/modules.nix+97−4
@@ -46,6 +46,7 @@ let
46 showFiles
46 showFiles
47 showOption
47 showOption
48 unknownModule
48 unknownModule
49+ literalExpression
49 ;
50 ;
50
51
51 showDeclPrefix = loc: decl: prefix:
52 showDeclPrefix = loc: decl: prefix:
@@ -112,6 +113,10 @@ rec {
112 args ? {}
113 args ? {}
113 , # This would be remove in the future, Prefer _module.check option instead.
114 , # This would be remove in the future, Prefer _module.check option instead.
114 check ? true
115 check ? true
116+ # Internal variable to avoid `_key` collisions regardless
117+ # of `extendModules`. Used in `submoduleWith`.
118+ # Test case: lib/tests/modules, "168767"
119+ , extensionOffset ? 0
115 }:
120 }:
116 let
121 let
117 withWarnings = x:
122 withWarnings = x:
@@ -140,7 +145,7 @@ rec {
140 # this module is used, to avoid conflicts and allow chaining of
145 # this module is used, to avoid conflicts and allow chaining of
141 # extendModules.
146 # extendModules.
142 internalModule = rec {
147 internalModule = rec {
143− _file = ./modules.nix;
148+ _file = "lib/modules.nix";
144
149
145 key = _file;
150 key = _file;
146
151
@@ -153,8 +158,94 @@ rec {
153 # a `_module.args.pkgs = import (fetchTarball { ... }) {}` won't
158 # a `_module.args.pkgs = import (fetchTarball { ... }) {}` won't
154 # start a download when `pkgs` wasn't evaluated.
159 # start a download when `pkgs` wasn't evaluated.
155 type = types.lazyAttrsOf types.raw;
160 type = types.lazyAttrsOf types.raw;
161+ # Only render documentation once at the root of the option tree,
162+ # not for all individual submodules.
163+ # Allow merging option decls to make this internal regardless.
164+ ${if prefix == []
165+ then null # unset => visible
156− internal = true;
166+ else "internal"} = true;
167+ # TODO: Change the type of this option to a submodule with a
168+ # freeformType, so that individual arguments can be documented
169+ # separately
157− description = "Arguments passed to each module.";
170+ description = ''
171+ Additional arguments passed to each module in addition to ones
172+ like <literal>lib</literal>, <literal>config</literal>,
173+ and <literal>pkgs</literal>, <literal>modulesPath</literal>.
174+ </para>
175+ <para>
176+ This option is also available to all submodules. Submodules do not
177+ inherit args from their parent module, nor do they provide args to
178+ their parent module or sibling submodules. The sole exception to
179+ this is the argument <literal>name</literal> which is provided by
180+ parent modules to a submodule and contains the attribute name
181+ the submodule is bound to, or a unique generated name if it is
182+ not bound to an attribute.
183+ </para>
184+ <para>
185+ Some arguments are already passed by default, of which the
186+ following <emphasis>cannot</emphasis> be changed with this option:
187+ <itemizedlist>
188+ <listitem>
189+ <para>
190+ <varname>lib</varname>: The nixpkgs library.
191+ </para>
192+ </listitem>
193+ <listitem>
194+ <para>
195+ <varname>config</varname>: The results of all options after merging the values from all modules together.
196+ </para>
197+ </listitem>
198+ <listitem>
199+ <para>
200+ <varname>options</varname>: The options declared in all modules.
201+ </para>
202+ </listitem>
203+ <listitem>
204+ <para>
205+ <varname>specialArgs</varname>: The <literal>specialArgs</literal> argument passed to <literal>evalModules</literal>.
206+ </para>
207+ </listitem>
208+ <listitem>
209+ <para>
210+ All attributes of <varname>specialArgs</varname>
211+ </para>
212+ <para>
213+ Whereas option values can generally depend on other option values
214+ thanks to laziness, this does not apply to <literal>imports</literal>, which
215+ must be computed statically before anything else.
216+ </para>
217+ <para>
218+ For this reason, callers of the module system can provide <literal>specialArgs</literal>
219+ which are available during import resolution.
220+ </para>
221+ <para>
222+ For NixOS, <literal>specialArgs</literal> includes
223+ <varname>modulesPath</varname>, which allows you to import
224+ extra modules from the nixpkgs package tree without having to
225+ somehow make the module aware of the location of the
226+ <literal>nixpkgs</literal> or NixOS directories.
227+ <programlisting>
228+ { modulesPath, ... }: {
229+ imports = [
230+ (modulesPath + "/profiles/minimal.nix")
231+ ];
232+ }
233+ </programlisting>
234+ </para>
235+ </listitem>
236+ </itemizedlist>
237+ </para>
238+ <para>
239+ For NixOS, the default value for this option includes at least this argument:
240+ <itemizedlist>
241+ <listitem>
242+ <para>
243+ <varname>pkgs</varname>: The nixpkgs package set according to
244+ the <option>nixpkgs.pkgs</option> option.
245+ </para>
246+ </listitem>
247+ </itemizedlist>
248+ '';
158 };
249 };
159
250
160 _module.check = mkOption {
251 _module.check = mkOption {
@@ -254,15 +345,17 @@ rec {
254 modules ? [],
345 modules ? [],
255 specialArgs ? {},
346 specialArgs ? {},
256 prefix ? [],
347 prefix ? [],
348+ extensionOffset ? length modules,
257 }:
349 }:
258 evalModules (evalModulesArgs // {
350 evalModules (evalModulesArgs // {
259 modules = regularModules ++ modules;
351 modules = regularModules ++ modules;
260 specialArgs = evalModulesArgs.specialArgs or {} // specialArgs;
352 specialArgs = evalModulesArgs.specialArgs or {} // specialArgs;
261 prefix = extendArgs.prefix or evalModulesArgs.prefix;
353 prefix = extendArgs.prefix or evalModulesArgs.prefix;
354+ inherit extensionOffset;
262 });
355 });
263
356
264 type = lib.types.submoduleWith {
357 type = lib.types.submoduleWith {
265− inherit modules specialArgs;
358+ inherit modules specialArgs extensionOffset;
266 };
359 };
267
360
268 result = withWarnings {
361 result = withWarnings {
lib/strings.nix+69−5
@@ -17,6 +17,7 @@ rec {
17 head
17 head
18 isInt
18 isInt
19 isList
19 isList
20+ isAttrs
20 isString
21 isString
21 match
22 match
22 parseDrvName
23 parseDrvName
@@ -253,10 +254,7 @@ rec {
253 => false
254 => false
254 */
255 */
255 hasInfix = infix: content:
256 hasInfix = infix: content:
256− let
257+ builtins.match ".*${escapeRegex infix}.*" "${content}" != null;
257− drop = x: substring 1 (stringLength x) x;
258− in hasPrefix infix content
259− || content != "" && hasInfix infix (drop content);
260
258
261 /* Convert a string to a list of characters (i.e. singleton strings).
259 /* Convert a string to a list of characters (i.e. singleton strings).
262 This allows you to, e.g., map a function over each character. However,
260 This allows you to, e.g., map a function over each character. However,
@@ -327,6 +325,65 @@ rec {
327 */
325 */
328 escapeShellArgs = concatMapStringsSep " " escapeShellArg;
326 escapeShellArgs = concatMapStringsSep " " escapeShellArg;
329
327
328+ /* Test whether the given name is a valid POSIX shell variable name.
329+
330+ Type: string -> bool
331+
332+ Example:
333+ isValidPosixName "foo_bar000"
334+ => true
335+ isValidPosixName "0-bad.jpg"
336+ => false
337+ */
338+ isValidPosixName = name: match "[a-zA-Z_][a-zA-Z0-9_]*" name != null;
339+
340+ /* Translate a Nix value into a shell variable declaration, with proper escaping.
341+
342+ Supported value types are strings (mapped to regular variables), lists of strings
343+ (mapped to Bash-style arrays) and attribute sets of strings (mapped to Bash-style
344+ associative arrays). Note that "strings" include string-coercible values like paths.
345+
346+ Strings are translated into POSIX sh-compatible code; lists and attribute sets
347+ assume a shell that understands Bash syntax (e.g. Bash or ZSH).
348+
349+ Type: string -> (string | listOf string | attrsOf string) -> string
350+
351+ Example:
352+ ''
353+ ${toShellVar "foo" "some string"}
354+ [[ "$foo" == "some string" ]]
355+ ''
356+ */
357+ toShellVar = name: value:
358+ lib.throwIfNot (isValidPosixName name) "toShellVar: ${name} is not a valid shell variable name" (
359+ if isAttrs value then
360+ "declare -A ${name}=(${
361+ concatStringsSep " " (lib.mapAttrsToList (n: v:
362+ "[${escapeShellArg n}]=${escapeShellArg v}"
363+ ) value)
364+ })"
365+ else if isList value then
366+ "declare -a ${name}=(${escapeShellArgs value})"
367+ else
368+ "${name}=${escapeShellArg value}"
369+ );
370+
371+ /* Translate an attribute set into corresponding shell variable declarations
372+ using `toShellVar`.
373+
374+ Type: attrsOf (string | listOf string | attrsOf string) -> string
375+
376+ Example:
377+ let
378+ foo = "value";
379+ bar = foo;
380+ in ''
381+ ${toShellVars { inherit foo bar; }}
382+ [[ "$foo" == "$bar" ]]
383+ ''
384+ */
385+ toShellVars = vars: concatStringsSep "\n" (lib.mapAttrsToList toShellVar vars);
386+
330 /* Turn a string into a Nix expression representing that string
387 /* Turn a string into a Nix expression representing that string
331
388
332 Type: string -> string
389 Type: string -> string
@@ -756,7 +813,14 @@ rec {
756 sanitizeDerivationName pkgs.hello
813 sanitizeDerivationName pkgs.hello
757 => "-nix-store-2g75chlbpxlrqn15zlby2dfh8hr9qwbk-hello-2.10"
814 => "-nix-store-2g75chlbpxlrqn15zlby2dfh8hr9qwbk-hello-2.10"
758 */
815 */
759− sanitizeDerivationName = string: lib.pipe string [
816+ sanitizeDerivationName =
817+ let okRegex = match "[[:alnum:]+_?=-][[:alnum:]+._?=-]*";
818+ in
819+ string:
820+ # First detect the common case of already valid strings, to speed those up
821+ if stringLength string <= 207 && okRegex string != null
822+ then unsafeDiscardStringContext string
823+ else lib.pipe string [
760 # Get rid of string context. This is safe under the assumption that the
824 # Get rid of string context. This is safe under the assumption that the
761 # resulting string is only used as a derivation name
825 # resulting string is only used as a derivation name
762 unsafeDiscardStringContext
826 unsafeDiscardStringContext
lib/systems/doubles.nix+2
@@ -74,6 +74,8 @@ in {
74 mips = filterDoubles predicates.isMips;
74 mips = filterDoubles predicates.isMips;
75 mmix = filterDoubles predicates.isMmix;
75 mmix = filterDoubles predicates.isMmix;
76 riscv = filterDoubles predicates.isRiscV;
76 riscv = filterDoubles predicates.isRiscV;
77+ riscv32 = filterDoubles predicates.isRiscV32;
78+ riscv64 = filterDoubles predicates.isRiscV64;
77 vc4 = filterDoubles predicates.isVc4;
79 vc4 = filterDoubles predicates.isVc4;
78 or1k = filterDoubles predicates.isOr1k;
80 or1k = filterDoubles predicates.isOr1k;
79 m68k = filterDoubles predicates.isM68k;
81 m68k = filterDoubles predicates.isM68k;
lib/systems/inspect.nix+3
@@ -13,6 +13,7 @@ rec {
13 isx86_64 = { cpu = { family = "x86"; bits = 64; }; };
13 isx86_64 = { cpu = { family = "x86"; bits = 64; }; };
14 isPowerPC = { cpu = cpuTypes.powerpc; };
14 isPowerPC = { cpu = cpuTypes.powerpc; };
15 isPower = { cpu = { family = "power"; }; };
15 isPower = { cpu = { family = "power"; }; };
16+ isPower64 = { cpu = { family = "power"; bits = 64; }; };
16 isx86 = { cpu = { family = "x86"; }; };
17 isx86 = { cpu = { family = "x86"; }; };
17 isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
18 isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
18 isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
19 isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
@@ -23,6 +24,8 @@ rec {
23 isMips64n64 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "64"; }; };
24 isMips64n64 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "64"; }; };
24 isMmix = { cpu = { family = "mmix"; }; };
25 isMmix = { cpu = { family = "mmix"; }; };
25 isRiscV = { cpu = { family = "riscv"; }; };
26 isRiscV = { cpu = { family = "riscv"; }; };
27+ isRiscV32 = { cpu = { family = "riscv"; bits = 32; }; };
28+ isRiscV64 = { cpu = { family = "riscv"; bits = 64; }; };
26 isSparc = { cpu = { family = "sparc"; }; };
29 isSparc = { cpu = { family = "sparc"; }; };
27 isWasm = { cpu = { family = "wasm"; }; };
30 isWasm = { cpu = { family = "wasm"; }; };
28 isMsp430 = { cpu = { family = "msp430"; }; };
31 isMsp430 = { cpu = { family = "msp430"; }; };
lib/systems/platforms.nix+3−3
@@ -3,7 +3,7 @@
3# targetPlatform, etc) containing at least the minimal set of attrs
3# targetPlatform, etc) containing at least the minimal set of attrs
4# required (see types.parsedPlatform in lib/systems/parse.nix). This
4# required (see types.parsedPlatform in lib/systems/parse.nix). This
5# file takes an already-valid platform and further elaborates it with
5# file takes an already-valid platform and further elaborates it with
6−# optional fields such as linux-kernel, gcc, etc.
6+# optional fields; currently these are: linux-kernel, gcc, and rustc.
7
7
8{ lib }:
8{ lib }:
9rec {
9rec {
@@ -500,7 +500,7 @@ rec {
500 # based on:
500 # based on:
501 # https://www.mail-archive.com/qemu-discuss@nongnu.org/msg05179.html
501 # https://www.mail-archive.com/qemu-discuss@nongnu.org/msg05179.html
502 # https://gmplib.org/~tege/qemu.html#mips64-debian
502 # https://gmplib.org/~tege/qemu.html#mips64-debian
503− mips64el-qemu-linux-gnuabi64 = (import ./examples).mips64el-linux-gnuabi64 // {
503+ mips64el-qemu-linux-gnuabi64 = {
504 linux-kernel = {
504 linux-kernel = {
505 name = "mips64el";
505 name = "mips64el";
506 baseConfig = "64r2el_defconfig";
506 baseConfig = "64r2el_defconfig";
@@ -568,5 +568,5 @@ rec {
568
568
569 else if platform.parsed.cpu == lib.systems.parse.cpuTypes.powerpc64le then powernv
569 else if platform.parsed.cpu == lib.systems.parse.cpuTypes.powerpc64le then powernv
570
570
571− else pc;
571+ else { };
572}
572}
lib/tests/flakes/subflakeTest/flake.nixnew file+8
@@ -0,0 +1,8 @@
1+{
2+ outputs = { self, subflake, callLocklessFlake }: rec {
3+ x = (callLocklessFlake {
4+ path = subflake;
5+ inputs = {};
6+ }).subflakeOutput;
7+ };
8+}
lib/tests/flakes/subflakeTest/subflake/flake.nixnew file+5
@@ -0,0 +1,5 @@
1+{
2+ outputs = { self }: {
3+ subflakeOutput = 1;
4+ };
5+}
lib/tests/misc.nix+125−1
@@ -22,6 +22,15 @@ in
22
22
23runTests {
23runTests {
24
24
25+# FLAKES
26+
27+ testCallLocklessFlake = {
28+ expr = callLocklessFlake {
29+ path = ./flakes/subflakeTest;
30+ inputs = { subflake = ./flakes/subflakeTest/subflake; inherit callLocklessFlake; };
31+ };
32+ expected = { x = 1; outPath = ./flakes/subflakeTest; };
33+ };
25
34
26# TRIVIAL
35# TRIVIAL
27
36
@@ -251,6 +260,56 @@ runTests {
251 expected = "&quot;test&quot; &apos;test&apos; &lt; &amp; &gt;";
260 expected = "&quot;test&quot; &apos;test&apos; &lt; &amp; &gt;";
252 };
261 };
253
262
263+ testToShellVars = {
264+ expr = ''
265+ ${toShellVars {
266+ STRing01 = "just a 'string'";
267+ _array_ = [ "with" "more strings" ];
268+ assoc."with some" = ''
269+ strings
270+ possibly newlines
271+ '';
272+ }}
273+ '';
274+ expected = ''
275+ STRing01='just a '\'''string'\''''
276+ declare -a _array_=('with' 'more strings')
277+ declare -A assoc=(['with some']='strings
278+ possibly newlines
279+ ')
280+ '';
281+ };
282+
283+ testHasInfixFalse = {
284+ expr = hasInfix "c" "abde";
285+ expected = false;
286+ };
287+
288+ testHasInfixTrue = {
289+ expr = hasInfix "c" "abcde";
290+ expected = true;
291+ };
292+
293+ testHasInfixDerivation = {
294+ expr = hasInfix "hello" (import ../.. { system = "x86_64-linux"; }).hello;
295+ expected = true;
296+ };
297+
298+ testHasInfixPath = {
299+ expr = hasInfix "tests" ./.;
300+ expected = true;
301+ };
302+
303+ testHasInfixPathStoreDir = {
304+ expr = hasInfix builtins.storeDir ./.;
305+ expected = true;
306+ };
307+
308+ testHasInfixToString = {
309+ expr = hasInfix "a" { __toString = _: "a"; };
310+ expected = true;
311+ };
312+
254# LISTS
313# LISTS
255
314
256 testFilter = {
315 testFilter = {
@@ -471,6 +530,66 @@ runTests {
471 '';
530 '';
472 };
531 };
473
532
533+ testToINIWithGlobalSectionEmpty = {
534+ expr = generators.toINIWithGlobalSection {} {
535+ globalSection = {
536+ };
537+ sections = {
538+ };
539+ };
540+ expected = ''
541+ '';
542+ };
543+
544+ testToINIWithGlobalSectionGlobalEmptyIsTheSameAsToINI =
545+ let
546+ sections = {
547+ "section 1" = {
548+ attribute1 = 5;
549+ x = "Me-se JarJar Binx";
550+ };
551+ "foo" = {
552+ "he\\h=he" = "this is okay";
553+ };
554+ };
555+ in {
556+ expr =
557+ generators.toINIWithGlobalSection {} {
558+ globalSection = {};
559+ sections = sections;
560+ };
561+ expected = generators.toINI {} sections;
562+ };
563+
564+ testToINIWithGlobalSectionFull = {
565+ expr = generators.toINIWithGlobalSection {} {
566+ globalSection = {
567+ foo = "bar";
568+ test = false;
569+ };
570+ sections = {
571+ "section 1" = {
572+ attribute1 = 5;
573+ x = "Me-se JarJar Binx";
574+ };
575+ "foo" = {
576+ "he\\h=he" = "this is okay";
577+ };
578+ };
579+ };
580+ expected = ''
581+ foo=bar
582+ test=false
583+
584+ [foo]
585+ he\h\=he=this is okay
586+
587+ [section 1]
588+ attribute1=5
589+ x=Me-se JarJar Binx
590+ '';
591+ };
592+
474 /* right now only invocation check */
593 /* right now only invocation check */
475 testToJSONSimple =
594 testToJSONSimple =
476 let val = {
595 let val = {
@@ -649,6 +768,11 @@ runTests {
649 expected = "foo";
768 expected = "foo";
650 };
769 };
651
770
771+ testSanitizeDerivationNameUnicode = testSanitizeDerivationName {
772+ name = "fö";
773+ expected = "f-";
774+ };
775+
652 testSanitizeDerivationNameAscii = testSanitizeDerivationName {
776 testSanitizeDerivationNameAscii = testSanitizeDerivationName {
653 name = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
777 name = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
654 expected = "-+--.-0123456789-=-?-ABCDEFGHIJKLMNOPQRSTUVWXYZ-_-abcdefghijklmnopqrstuvwxyz-";
778 expected = "-+--.-0123456789-=-?-ABCDEFGHIJKLMNOPQRSTUVWXYZ-_-abcdefghijklmnopqrstuvwxyz-";
@@ -691,7 +815,7 @@ runTests {
691
815
692 locs = filter (o: ! o.internal) (optionAttrSetToDocList options);
816 locs = filter (o: ! o.internal) (optionAttrSetToDocList options);
693 in map (o: o.loc) locs;
817 in map (o: o.loc) locs;
694− expected = [ [ "foo" ] [ "foo" "<name>" "bar" ] [ "foo" "bar" ] ];
818+ expected = [ [ "_module" "args" ] [ "foo" ] [ "foo" "<name>" "bar" ] [ "foo" "bar" ] ];
695 };
819 };
696
820
697 testCartesianProductOfEmptySet = {
821 testCartesianProductOfEmptySet = {
lib/tests/modules.sh+5−1
@@ -293,7 +293,7 @@ checkConfigOutput '^"a c"$' config.result ./functionTo/merging-attrs.nix
293
293
294# moduleType
294# moduleType
295checkConfigOutput '^"a b"$' config.resultFoo ./declare-variants.nix ./define-variant.nix
295checkConfigOutput '^"a b"$' config.resultFoo ./declare-variants.nix ./define-variant.nix
296−checkConfigOutput '^"a y z"$' config.resultFooBar ./declare-variants.nix ./define-variant.nix
296+checkConfigOutput '^"a b y z"$' config.resultFooBar ./declare-variants.nix ./define-variant.nix
297checkConfigOutput '^"a b c"$' config.resultFooFoo ./declare-variants.nix ./define-variant.nix
297checkConfigOutput '^"a b c"$' config.resultFooFoo ./declare-variants.nix ./define-variant.nix
298
298
299## emptyValue's
299## emptyValue's
@@ -327,6 +327,10 @@ checkConfigError 'The option .theOption.nested. in .other.nix. is already declar
327# Test that types.optionType leaves types untouched as long as they don't need to be merged
327# Test that types.optionType leaves types untouched as long as they don't need to be merged
328checkConfigOutput 'ok' config.freeformItems.foo.bar ./adhoc-freeformType-survives-type-merge.nix
328checkConfigOutput 'ok' config.freeformItems.foo.bar ./adhoc-freeformType-survives-type-merge.nix
329
329
330+# Anonymous submodules don't get nixed by import resolution/deduplication
331+# because of an `extendModules` bug, issue 168767.
332+checkConfigOutput '^1$' config.sub.specialisation.value ./extendModules-168767-imports.nix
333+
330cat <<EOF
334cat <<EOF
331====== module tests ======
335====== module tests ======
332$pass Pass
336$pass Pass
lib/tests/modules/extendModules-168767-imports.nixnew file+41
@@ -0,0 +1,41 @@
1+{ lib
2+, extendModules
3+, ...
4+}:
5+with lib;
6+{
7+ imports = [
8+
9+ {
10+ options.sub = mkOption {
11+ default = { };
12+ type = types.submodule (
13+ { config
14+ , extendModules
15+ , ...
16+ }:
17+ {
18+ options.value = mkOption {
19+ type = types.int;
20+ };
21+
22+ options.specialisation = mkOption {
23+ default = { };
24+ inherit
25+ (extendModules {
26+ modules = [{
27+ specialisation = mkOverride 0 { };
28+ }];
29+ })
30+ type;
31+ };
32+ }
33+ );
34+ };
35+ }
36+
37+ { config.sub.value = 1; }
38+
39+
40+ ];
41+}
lib/tests/systems.nix+3
@@ -19,6 +19,9 @@ with lib.systems.doubles; lib.runTests {
19 testi686 = mseteq i686 [ "i686-linux" "i686-freebsd" "i686-genode" "i686-netbsd" "i686-openbsd" "i686-cygwin" "i686-windows" "i686-none" "i686-darwin" ];
19 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 [ "mips64el-linux" "mipsel-linux" "mipsel-netbsd" ];
20 testmips = mseteq mips [ "mips64el-linux" "mipsel-linux" "mipsel-netbsd" ];
21 testmmix = mseteq mmix [ "mmix-mmixware" ];
21 testmmix = mseteq mmix [ "mmix-mmixware" ];
22+ testriscv = mseteq riscv [ "riscv32-linux" "riscv64-linux" "riscv32-netbsd" "riscv64-netbsd" "riscv32-none" "riscv64-none" ];
23+ testriscv32 = mseteq riscv32 [ "riscv32-linux" "riscv32-netbsd" "riscv32-none" ];
24+ testriscv64 = mseteq riscv64 [ "riscv64-linux" "riscv64-netbsd" "riscv64-none" ];
22 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" ];
25 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" ];
23
26
24 testcygwin = mseteq cygwin [ "i686-cygwin" "x86_64-cygwin" ];
27 testcygwin = mseteq cygwin [ "i686-cygwin" "x86_64-cygwin" ];
lib/types.nix+8−2
@@ -568,6 +568,11 @@ rec {
568 { modules
568 { modules
569 , specialArgs ? {}
569 , specialArgs ? {}
570 , shorthandOnlyDefinesConfig ? false
570 , shorthandOnlyDefinesConfig ? false
571+
572+ # Internal variable to avoid `_key` collisions regardless
573+ # of `extendModules`. Wired through by `evalModules`.
574+ # Test case: lib/tests/modules, "168767"
575+ , extensionOffset ? 0
571 }@attrs:
576 }@attrs:
572 let
577 let
573 inherit (lib.modules) evalModules;
578 inherit (lib.modules) evalModules;
@@ -579,11 +584,11 @@ rec {
579 allModules = defs: imap1 (n: { value, file }:
584 allModules = defs: imap1 (n: { value, file }:
580 if isFunction value
585 if isFunction value
581 then setFunctionArgs
586 then setFunctionArgs
582− (args: lib.modules.unifyModuleSyntax file "${toString file}-${toString n}" (value args))
587+ (args: lib.modules.unifyModuleSyntax file "${toString file}-${toString (n + extensionOffset)}" (value args))
583 (functionArgs value)
588 (functionArgs value)
584 else if isAttrs value
589 else if isAttrs value
585 then
590 then
586− lib.modules.unifyModuleSyntax file "${toString file}-${toString n}" (shorthandToModule value)
591+ lib.modules.unifyModuleSyntax file "${toString file}-${toString (n + extensionOffset)}" (shorthandToModule value)
587 else value
592 else value
588 ) defs;
593 ) defs;
589
594
@@ -620,6 +625,7 @@ rec {
620 (base.extendModules {
625 (base.extendModules {
621 modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
626 modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
622 prefix = loc;
627 prefix = loc;
628+ extensionOffset = extensionOffset + length defs;
623 }).config;
629 }).config;
624 emptyValue = { value = {}; };
630 emptyValue = { value = {}; };
625 getSubOptions = prefix: (base.extendModules
631 getSubOptions = prefix: (base.extendModules
maintainers/maintainer-list.nix+252−37
@@ -380,6 +380,12 @@
380 githubId = 209175;
380 githubId = 209175;
381 name = "Alesya Huzik";
381 name = "Alesya Huzik";
382 };
382 };
383+ aidalgol = {
384+ email = "aidalgol+nixpkgs@fastmail.net";
385+ github = "aidalgol";
386+ githubId = 2313201;
387+ name = "Aidan Gauland";
388+ };
383 aij = {
389 aij = {
384 email = "aij+git@mrph.org";
390 email = "aij+git@mrph.org";
385 github = "aij";
391 github = "aij";
@@ -519,6 +525,12 @@
519 githubId = 38869148;
525 githubId = 38869148;
520 name = "Alex Eyre";
526 name = "Alex Eyre";
521 };
527 };
528+ algram = {
529+ email = "aliasgram@gmail.com";
530+ github = "Algram";
531+ githubId = 5053729;
532+ name = "Alias Gram";
533+ };
522 alibabzo = {
534 alibabzo = {
523 email = "alistair.bill@gmail.com";
535 email = "alistair.bill@gmail.com";
524 github = "alibabzo";
536 github = "alibabzo";
@@ -669,6 +681,18 @@
669 githubId = 858965;
681 githubId = 858965;
670 name = "Andrew Morsillo";
682 name = "Andrew Morsillo";
671 };
683 };
684+ an-empty-string = {
685+ name = "Tris Emmy Wilson";
686+ email = "tris@tris.fyi";
687+ github = "an-empty-string";
688+ githubId = 681716;
689+ };
690+ AnatolyPopov = {
691+ email = "aipopov@live.ru";
692+ github = "AnatolyPopov";
693+ githubId = 2312534;
694+ name = "Anatolii Popov";
695+ };
672 andehen = {
696 andehen = {
673 email = "git@andehen.net";
697 email = "git@andehen.net";
674 github = "andehen";
698 github = "andehen";
@@ -817,6 +841,13 @@
817 githubId = 5327697;
841 githubId = 5327697;
818 name = "Anatolii Prylutskyi";
842 name = "Anatolii Prylutskyi";
819 };
843 };
844+ anselmschueler = {
845+ email = "mail@anselmschueler.com";
846+ github = "schuelermine";
847+ githubId = 48802534;
848+ name = "Anselm Schüler";
849+ matrix = "@schuelermine:matrix.org";
850+ };
820 antoinerg = {
851 antoinerg = {
821 email = "roygobeil.antoine@gmail.com";
852 email = "roygobeil.antoine@gmail.com";
822 github = "antoinerg";
853 github = "antoinerg";
@@ -1037,8 +1068,8 @@
1037 name = "Kirill Boltaev";
1068 name = "Kirill Boltaev";
1038 };
1069 };
1039 ashley = {
1070 ashley = {
1040− email = "personavinny@protonmail.com";
1071+ email = "ashley@kira64.xyz";
1041− github = "paranoidcat";
1072+ github = "kira64xyz";
1042 githubId = 84152630;
1073 githubId = 84152630;
1043 name = "Ashley Chiara";
1074 name = "Ashley Chiara";
1044 };
1075 };
@@ -1378,6 +1409,12 @@
1378 githubId = 164148;
1409 githubId = 164148;
1379 name = "Ben Darwin";
1410 name = "Ben Darwin";
1380 };
1411 };
1412+ bdd = {
1413+ email = "bdd@mindcast.org";
1414+ github = "bdd";
1415+ githubId = 11135;
1416+ name = "Berk D. Demir";
1417+ };
1381 bdesham = {
1418 bdesham = {
1382 email = "benjamin@esham.io";
1419 email = "benjamin@esham.io";
1383 github = "bdesham";
1420 github = "bdesham";
@@ -1794,6 +1831,12 @@
1794 githubId = 7214361;
1831 githubId = 7214361;
1795 name = "Roman Gerasimenko";
1832 name = "Roman Gerasimenko";
1796 };
1833 };
1834+ builditluc = {
1835+ email = "builditluc@icloud.com";
1836+ github = "builditluc";
1837+ githubId = 37375448;
1838+ name = "Buildit";
1839+ };
1797 bburdette = {
1840 bburdette = {
1798 email = "bburdette@protonmail.com";
1841 email = "bburdette@protonmail.com";
1799 github = "bburdette";
1842 github = "bburdette";
@@ -2043,6 +2086,12 @@
2043 githubId = 8228888;
2086 githubId = 8228888;
2044 name = "Charlie Hanley";
2087 name = "Charlie Hanley";
2045 };
2088 };
2089+ charlesbaynham = {
2090+ email = "charlesbaynham@gmail.com";
2091+ github = "charlesbaynham";
2092+ githubId = 4397637;
2093+ name = "Charles Baynham";
2094+ };
2046 CharlesHD = {
2095 CharlesHD = {
2047 email = "charleshdespointes@gmail.com";
2096 email = "charleshdespointes@gmail.com";
2048 github = "CharlesHD";
2097 github = "CharlesHD";
@@ -2083,12 +2132,6 @@
2083 githubId = 18648043;
2132 githubId = 18648043;
2084 name = "Daniel Cartwright";
2133 name = "Daniel Cartwright";
2085 };
2134 };
2086− chiiruno = {
2087− email = "okinan@protonmail.com";
2088− github = "chiiruno";
2089− githubId = 30435868;
2090− name = "Okina Matara";
2091− };
2092 Chili-Man = {
2135 Chili-Man = {
2093 email = "dr.elhombrechile@gmail.com";
2136 email = "dr.elhombrechile@gmail.com";
2094 name = "Diego Rodriguez";
2137 name = "Diego Rodriguez";
@@ -2260,6 +2303,7 @@
2260 fingerprint = "539F 0655 4D35 38A5 429A E253 13E7 9449 C052 5215";
2303 fingerprint = "539F 0655 4D35 38A5 429A E253 13E7 9449 C052 5215";
2261 }];
2304 }];
2262 name = "ckie";
2305 name = "ckie";
2306+ matrix = "@ckie:ckie.dev";
2263 };
2307 };
2264 clkamp = {
2308 clkamp = {
2265 email = "c@lkamp.de";
2309 email = "c@lkamp.de";
@@ -3837,6 +3881,13 @@
3837 githubId = 222467;
3881 githubId = 222467;
3838 name = "Dmitry Ivanov";
3882 name = "Dmitry Ivanov";
3839 };
3883 };
3884+ ethindp = {
3885+ name = "Ethin Probst";
3886+ email = "harlydavidsen@gmail.com";
3887+ matrix = "@ethindp:the-gdn.net";
3888+ github = "ethindp";
3889+ githubId = 8030501;
3890+ };
3840 Etjean = {
3891 Etjean = {
3841 email = "et.jean@outlook.fr";
3892 email = "et.jean@outlook.fr";
3842 github = "Etjean";
3893 github = "Etjean";
@@ -4073,11 +4124,18 @@
4073 matrix = "@felschr:matrix.org";
4124 matrix = "@felschr:matrix.org";
4074 github = "felschr";
4125 github = "felschr";
4075 githubId = 3314323;
4126 githubId = 3314323;
4076− name = "Felix Tenley";
4127+ name = "Felix Schröter";
4077− keys = [{
4128+ keys = [
4129+ {
4130+ # historical
4078− longkeyid = "ed25519/0x910ACB9F6BD26F58";
4131+ longkeyid = "ed25519/0x910ACB9F6BD26F58";
4079− fingerprint = "6AB3 7A28 5420 9A41 82D9 0068 910A CB9F 6BD2 6F58";
4132+ fingerprint = "6AB3 7A28 5420 9A41 82D9 0068 910A CB9F 6BD2 6F58";
4133+ }
4134+ {
4135+ longkeyid = "ed25519/0x671E39E6744C807D";
4136+ fingerprint = "7E08 6842 0934 AA1D 6821 1F2A 671E 39E6 744C 807D";
4137+ }
4080− }];
4138+ ];
4081 };
4139 };
4082 ffinkdevs = {
4140 ffinkdevs = {
4083 email = "fink@h0st.space";
4141 email = "fink@h0st.space";
@@ -4502,6 +4560,12 @@
4502 githubId = 3217744;
4560 githubId = 3217744;
4503 name = "Peter Ferenczy";
4561 name = "Peter Ferenczy";
4504 };
4562 };
4563+ ghostbuster91 = {
4564+ name = "Kasper Kondzielski";
4565+ email = "kghost0@gmail.com";
4566+ github = "ghostbuster91";
4567+ githubId = 5662622;
4568+ };
4505 ghuntley = {
4569 ghuntley = {
4506 email = "ghuntley@ghuntley.com";
4570 email = "ghuntley@ghuntley.com";
4507 github = "ghuntley";
4571 github = "ghuntley";
@@ -4656,6 +4720,12 @@
4656 githubId = 4656860;
4720 githubId = 4656860;
4657 name = "Gaute Ravndal";
4721 name = "Gaute Ravndal";
4658 };
4722 };
4723+ graysonhead = {
4724+ email = "grayson@graysonhead.net";
4725+ github = "graysonhead";
4726+ githubId = 6179496;
4727+ name = "Grayson Head";
4728+ };
4659 grburst = {
4729 grburst = {
4660 email = "GRBurst@protonmail.com";
4730 email = "GRBurst@protonmail.com";
4661 github = "GRBurst";
4731 github = "GRBurst";
@@ -4684,6 +4754,12 @@
4684 githubId = 201997;
4754 githubId = 201997;
4685 name = "Eric Seidel";
4755 name = "Eric Seidel";
4686 };
4756 };
4757+ grindhold = {
4758+ name = "grindhold";
4759+ email = "grindhold+nix@skarphed.org";
4760+ github = "grindhold";
4761+ githubId = 2592640;
4762+ };
4687 gspia = {
4763 gspia = {
4688 email = "iahogsp@gmail.com";
4764 email = "iahogsp@gmail.com";
4689 github = "gspia";
4765 github = "gspia";
@@ -4702,6 +4778,12 @@
4702 githubId = 343415;
4778 githubId = 343415;
4703 name = "Greg Roodt";
4779 name = "Greg Roodt";
4704 };
4780 };
4781+ grnnja = {
4782+ email = "grnnja@gmail.com";
4783+ github = "grnnja";
4784+ githubId = 31556469;
4785+ name = "Prem Netsuwan";
4786+ };
4705 gruve-p = {
4787 gruve-p = {
4706 email = "groestlcoin@gmail.com";
4788 email = "groestlcoin@gmail.com";
4707 github = "gruve-p";
4789 github = "gruve-p";
@@ -5417,6 +5499,12 @@
5417 githubId = 41924494;
5499 githubId = 41924494;
5418 name = "Ivar";
5500 name = "Ivar";
5419 };
5501 };
5502+ iwanb = {
5503+ email = "tracnar@gmail.com";
5504+ github = "iwanb";
5505+ githubId = 4035835;
5506+ name = "Iwan";
5507+ };
5420 ixmatus = {
5508 ixmatus = {
5421 email = "parnell@digitalmentat.com";
5509 email = "parnell@digitalmentat.com";
5422 github = "ixmatus";
5510 github = "ixmatus";
@@ -5561,6 +5649,12 @@
5561 githubId = 488556;
5649 githubId = 488556;
5562 name = "Javier Aguirre";
5650 name = "Javier Aguirre";
5563 };
5651 };
5652+ jayesh-bhoot = {
5653+ name = "Jayesh Bhoot";
5654+ email = "jayesh@bhoot.sh";
5655+ github = "jayesh-bhoot";
5656+ githubId = 1915507;
5657+ };
5564 jb55 = {
5658 jb55 = {
5565 email = "jb55@jb55.com";
5659 email = "jb55@jb55.com";
5566 github = "jb55";
5660 github = "jb55";
@@ -6791,12 +6885,6 @@
6791 githubId = 99639;
6885 githubId = 99639;
6792 name = "Pawel Kruszewski";
6886 name = "Pawel Kruszewski";
6793 };
6887 };
6794− ktosiek = {
6795− email = "tomasz.kontusz@gmail.com";
6796− github = "ktosiek";
6797− githubId = 278013;
6798− name = "Tomasz Kontusz";
6799− };
6800 kubukoz = {
6888 kubukoz = {
6801 email = "kubukoz@gmail.com";
6889 email = "kubukoz@gmail.com";
6802 github = "kubukoz";
6890 github = "kubukoz";
@@ -7130,6 +7218,13 @@
7130 githubId = 1769386;
7218 githubId = 1769386;
7131 name = "Liam Diprose";
7219 name = "Liam Diprose";
7132 };
7220 };
7221+ libjared = {
7222+ email = "jared@perrycode.com";
7223+ github = "libjared";
7224+ githubId = 3746656;
7225+ matrix = "@libjared:matrix.org";
7226+ name = "Jared Perry";
7227+ };
7133 liff = {
7228 liff = {
7134 email = "liff@iki.fi";
7229 email = "liff@iki.fi";
7135 github = "liff";
7230 github = "liff";
@@ -7160,6 +7255,13 @@
7160 githubId = 714;
7255 githubId = 714;
7161 name = "Lily Ballard";
7256 name = "Lily Ballard";
7162 };
7257 };
7258+ lilyinstarlight = {
7259+ email = "lily@lily.flowers";
7260+ matrix = "@lily:lily.flowers";
7261+ github = "lilyinstarlight";
7262+ githubId = 298109;
7263+ name = "Lily Foster";
7264+ };
7163 limeytexan = {
7265 limeytexan = {
7164 email = "limeytexan@gmail.com";
7266 email = "limeytexan@gmail.com";
7165 github = "limeytexan";
7267 github = "limeytexan";
@@ -7288,7 +7390,7 @@
7288 name = "Anthony Lodi";
7390 name = "Anthony Lodi";
7289 };
7391 };
7290 loicreynier = {
7392 loicreynier = {
7291− email = "loic@loireynier.fr";
7393+ email = "loic@loicreynier.fr";
7292 github = "loicreynier";
7394 github = "loicreynier";
7293 githubId = 88983487;
7395 githubId = 88983487;
7294 name = "Loïc Reynier";
7396 name = "Loïc Reynier";
@@ -8079,6 +8181,12 @@
8079 githubId = 20536514;
8181 githubId = 20536514;
8080 name = "Magdalena Haselsteiner";
8182 name = "Magdalena Haselsteiner";
8081 };
8183 };
8184+ mh182 = {
8185+ email = "mh182@chello.at";
8186+ github = "mh182";
8187+ githubId = 9980864;
8188+ name = "Max Hofer";
8189+ };
8082 mic92 = {
8190 mic92 = {
8083 email = "joerg@thalheim.io";
8191 email = "joerg@thalheim.io";
8084 matrix = "@mic92:nixos.dev";
8192 matrix = "@mic92:nixos.dev";
@@ -8252,6 +8360,17 @@
8252 githubId = 1776903;
8360 githubId = 1776903;
8253 name = "Andrew Abbott";
8361 name = "Andrew Abbott";
8254 };
8362 };
8363+ misterio77 = {
8364+ email = "eu@misterio.me";
8365+ github = "misterio77";
8366+ githubId = 5727578;
8367+ matrix = "@misterio:matrix.org";
8368+ name = "Gabriel Fontes";
8369+ keys = [{
8370+ longkeyid = "rsa3072/0x245CAB70B4C225E9";
8371+ fingerprint = "7088 C742 1873 E0DB 97FF 17C2 245C AB70 B4C2 25E9";
8372+ }];
8373+ };
8255 mitchmindtree = {
8374 mitchmindtree = {
8256 email = "mail@mitchellnordine.com";
8375 email = "mail@mitchellnordine.com";
8257 github = "mitchmindtree";
8376 github = "mitchmindtree";
@@ -8803,6 +8922,12 @@
8803 githubId = 3747396;
8922 githubId = 3747396;
8804 name = "Nathan Isom";
8923 name = "Nathan Isom";
8805 };
8924 };
8925+ neilmayhew = {
8926+ email = "nix@neil.mayhew.name";
8927+ github = "neilmayhew";
8928+ githubId = 166791;
8929+ name = "Neil Mayhew";
8930+ };
8806 nelsonjeppesen = {
8931 nelsonjeppesen = {
8807 email = "nix@jeppesen.io";
8932 email = "nix@jeppesen.io";
8808 github = "NelsonJeppesen";
8933 github = "NelsonJeppesen";
@@ -9910,6 +10035,12 @@
9910 fingerprint = "2CD2 B030 BD22 32EF DF5A 008A 3618 20A4 5DB4 1E9A";
10035 fingerprint = "2CD2 B030 BD22 32EF DF5A 008A 3618 20A4 5DB4 1E9A";
9911 }];
10036 }];
9912 };
10037 };
10038+ podocarp = {
10039+ email = "xdjiaxd@gmail.com";
10040+ github = "podocarp";
10041+ githubId = 10473184;
10042+ name = "Jia Xiaodong";
10043+ };
9913 polendri = {
10044 polendri = {
9914 email = "paul@ijj.li";
10045 email = "paul@ijj.li";
9915 github = "polendri";
10046 github = "polendri";
@@ -10169,6 +10300,12 @@
10169 githubId = 115877;
10300 githubId = 115877;
10170 name = "Kenny Shen";
10301 name = "Kenny Shen";
10171 };
10302 };
10303+ quag = {
10304+ email = "quaggy@gmail.com";
10305+ github = "quag";
10306+ githubId = 35086;
10307+ name = "Jonathan Wright";
10308+ };
10172 queezle = {
10309 queezle = {
10173 email = "git@queezle.net";
10310 email = "git@queezle.net";
10174 github = "qzle";
10311 github = "qzle";
@@ -10989,28 +11126,22 @@
10989 githubId = 132835;
11126 githubId = 132835;
10990 name = "Samuel Dionne-Riel";
11127 name = "Samuel Dionne-Riel";
10991 };
11128 };
10992− samuelgrf = {
10993− email = "s@muel.gr";
10994− github = "samuelgrf";
10995− githubId = 67663538;
10996− name = "Samuel Gräfenstein";
10997− keys = [
10998− {
10999− longkeyid = "rsa4096/0xDE75F92E318123F0";
11000− fingerprint = "6F2E 2A90 423C 8111 BFF2 895E DE75 F92E 3181 23F0";
11001− }
11002− {
11003− longkeyid = "rsa4096/0xEF76A063F15C63C8";
11004− fingerprint = "FF24 5832 8FAF 4660 18C6 186E EF76 A063 F15C 63C8";
11005− }
11006− ];
11007− };
11008 samuelrivas = {
11129 samuelrivas = {
11009 email = "samuelrivas@gmail.com";
11130 email = "samuelrivas@gmail.com";
11010 github = "samuelrivas";
11131 github = "samuelrivas";
11011 githubId = 107703;
11132 githubId = 107703;
11012 name = "Samuel Rivas";
11133 name = "Samuel Rivas";
11013 };
11134 };
11135+ samyak = {
11136+ name = "Samyak Sarnayak";
11137+ email = "samyak201@gmail.com";
11138+ github = "Samyak2";
11139+ githubId = 34161949;
11140+ keys = [{
11141+ longkeyid = "rsa4096/0x365873F2F0C6153B";
11142+ fingerprint = "155C F413 0129 C058 9A5F 5524 3658 73F2 F0C6 153B";
11143+ }];
11144+ };
11014 sander = {
11145 sander = {
11015 email = "s.vanderburg@tudelft.nl";
11146 email = "s.vanderburg@tudelft.nl";
11016 github = "svanderburg";
11147 github = "svanderburg";
@@ -11117,6 +11248,16 @@
11117 email = "schristopher@konputa.com";
11248 email = "schristopher@konputa.com";
11118 name = "Scott Christopher";
11249 name = "Scott Christopher";
11119 };
11250 };
11251+ sciencentistguy = {
11252+ email = "jamie@quigley.xyz";
11253+ name = "Jamie Quigley";
11254+ github = "Sciencentistguy";
11255+ githubId = 4983935;
11256+ keys = [{
11257+ longkeyid = "rsa2048/0x8E8FF66E2AE8D970";
11258+ fingerprint = "30BB FF3F AB0B BB3E 0435 F83C 8E8F F66E 2AE8 D970";
11259+ }];
11260+};
11120 scode = {
11261 scode = {
11121 email = "peter.schuller@infidyne.com";
11262 email = "peter.schuller@infidyne.com";
11122 github = "scode";
11263 github = "scode";
@@ -11227,6 +11368,12 @@
11227 githubId = 307899;
11368 githubId = 307899;
11228 name = "Gurkan Gur";
11369 name = "Gurkan Gur";
11229 };
11370 };
11371+ serge = {
11372+ email = "sb@canva.com";
11373+ github = "serge-belov";
11374+ githubId = 38824235;
11375+ name = "Serge Belov";
11376+ };
11230 sersorrel = {
11377 sersorrel = {
11231 email = "ash@sorrel.sh";
11378 email = "ash@sorrel.sh";
11232 github = "sersorrel";
11379 github = "sersorrel";
@@ -11271,6 +11418,12 @@
11271 githubId = 1151264;
11418 githubId = 1151264;
11272 name = "Sebastian Graf";
11419 name = "Sebastian Graf";
11273 };
11420 };
11421+ shadaj = {
11422+ email = "shadaj@users.noreply.github.com";
11423+ github = "shadaj";
11424+ githubId = 543055;
11425+ name = "Shadaj Laddad";
11426+ };
11274 shahrukh330 = {
11427 shahrukh330 = {
11275 email = "shahrukh330@gmail.com";
11428 email = "shahrukh330@gmail.com";
11276 github = "shahrukh330";
11429 github = "shahrukh330";
@@ -11467,6 +11620,12 @@
11467 githubId = 2770647;
11620 githubId = 2770647;
11468 name = "Simon Vandel Sillesen";
11621 name = "Simon Vandel Sillesen";
11469 };
11622 };
11623+ sir4ur0n = {
11624+ email = "sir4ur0n@users.noreply.github.com";
11625+ github = "sir4ur0n";
11626+ githubId = 1204125;
11627+ name = "sir4ur0n";
11628+ };
11470 siraben = {
11629 siraben = {
11471 email = "bensiraphob@gmail.com";
11630 email = "bensiraphob@gmail.com";
11472 matrix = "@siraben:matrix.org";
11631 matrix = "@siraben:matrix.org";
@@ -11904,6 +12063,12 @@
11904 githubId = 1694705;
12063 githubId = 1694705;
11905 name = "Sam Stites";
12064 name = "Sam Stites";
11906 };
12065 };
12066+ strager = {
12067+ email = "strager.nds@gmail.com";
12068+ github = "strager";
12069+ githubId = 48666;
12070+ name = "Matthew \"strager\" Glazar";
12071+ };
11907 stumoss = {
12072 stumoss = {
11908 email = "samoss@gmail.com";
12073 email = "samoss@gmail.com";
11909 github = "stumoss";
12074 github = "stumoss";
@@ -12396,6 +12561,12 @@
12396 githubId = 844343;
12561 githubId = 844343;
12397 name = "Thiago K. Okada";
12562 name = "Thiago K. Okada";
12398 };
12563 };
12564+ thibaultlemaire = {
12565+ email = "thibault.lemaire@protonmail.com";
12566+ github = "ThibaultLemaire";
12567+ githubId = 21345269;
12568+ name = "Thibault Lemaire";
12569+ };
12399 thibautmarty = {
12570 thibautmarty = {
12400 email = "github@thibautmarty.fr";
12571 email = "github@thibautmarty.fr";
12401 matrix = "@thibaut:thibautmarty.fr";
12572 matrix = "@thibaut:thibautmarty.fr";
@@ -12642,6 +12813,13 @@
12642 githubId = 90456;
12813 githubId = 90456;
12643 name = "Rebecca (Bex) Kelly";
12814 name = "Rebecca (Bex) Kelly";
12644 };
12815 };
12816+ tpw_rules = {
12817+ name = "Thomas Watson";
12818+ email = "twatson52@icloud.com";
12819+ matrix = "@tpw_rules:matrix.org";
12820+ github = "tpwrules";
12821+ githubId = 208010;
12822+ };
12645 travisbhartwell = {
12823 travisbhartwell = {
12646 email = "nafai@travishartwell.net";
12824 email = "nafai@travishartwell.net";
12647 github = "travisbhartwell";
12825 github = "travisbhartwell";
@@ -13116,6 +13294,12 @@
13116 githubId = 1771332;
13294 githubId = 1771332;
13117 name = "László Vaskó";
13295 name = "László Vaskó";
13118 };
13296 };
13297+ vlinkz = {
13298+ email = "vmfuentes64@gmail.com";
13299+ github = "vlinkz";
13300+ githubId = 20145996;
13301+ name = "Victor Fuentes";
13302+ };
13119 vlstill = {
13303 vlstill = {
13120 email = "xstill@fi.muni.cz";
13304 email = "xstill@fi.muni.cz";
13121 github = "vlstill";
13305 github = "vlstill";
@@ -13408,7 +13592,7 @@
13408 name = "Andrei Pampu";
13592 name = "Andrei Pampu";
13409 };
13593 };
13410 wolfangaukang = {
13594 wolfangaukang = {
13411− email = "liquid.query960@4wrd.cc";
13595+ email = "clone.gleeful135+nixpkgs@anonaddy.me";
13412 github = "wolfangaukang";
13596 github = "wolfangaukang";
13413 githubId = 8378365;
13597 githubId = 8378365;
13414 name = "P. R. d. O.";
13598 name = "P. R. d. O.";
@@ -13461,6 +13645,13 @@
13461 github = "wunderbrick";
13645 github = "wunderbrick";
13462 githubId = 52174714;
13646 githubId = 52174714;
13463 };
13647 };
13648+ wyndon = {
13649+ email = "72203260+wyndon@users.noreply.github.com";
13650+ matrix = "@wyndon:envs.net";
13651+ github = "wyndon";
13652+ githubId = 72203260;
13653+ name = "wyndon";
13654+ };
13464 wyvie = {
13655 wyvie = {
13465 email = "elijahrum@gmail.com";
13656 email = "elijahrum@gmail.com";
13466 github = "wyvie";
13657 github = "wyvie";
@@ -14020,6 +14211,12 @@
14020 github = "deifactor";
14211 github = "deifactor";
14021 githubId = 30192992;
14212 githubId = 30192992;
14022 };
14213 };
14214+ deinferno = {
14215+ name = "deinferno";
14216+ email = "14363193+deinferno@users.noreply.github.com";
14217+ github = "deinferno";
14218+ githubId = 14363193;
14219+ };
14023 fzakaria = {
14220 fzakaria = {
14024 name = "Farid Zakaria";
14221 name = "Farid Zakaria";
14025 email = "farid.m.zakaria@gmail.com";
14222 email = "farid.m.zakaria@gmail.com";
@@ -14143,6 +14340,12 @@
14143 github = "zbioe";
14340 github = "zbioe";
14144 githubId = 7332055;
14341 githubId = 7332055;
14145 };
14342 };
14343+ zendo = {
14344+ name = "zendo";
14345+ email = "linzway@qq.com";
14346+ github = "zendo";
14347+ githubId = 348013;
14348+ };
14146 zenithal = {
14349 zenithal = {
14147 name = "zenithal";
14350 name = "zenithal";
14148 email = "i@zenithal.me";
14351 email = "i@zenithal.me";
@@ -14263,4 +14466,16 @@
14263 github = "kuwii";
14466 github = "kuwii";
14264 githubId = 10705175;
14467 githubId = 10705175;
14265 };
14468 };
14469+ melias122 = {
14470+ name = "Martin Elias";
14471+ email = "martin+nixpkgs@elias.sx";
14472+ github = "melias122";
14473+ githubId = 1027766;
14474+ };
14475+ bryanhonof = {
14476+ name = "Bryan Honof";
14477+ email = "bryanhonof@gmail.com";
14478+ github = "bryanhonof";
14479+ githubId = 5932804;
14480+ };
14266}
14481}
maintainers/scripts/dep-licenses.sh+1−1
@@ -9,7 +9,7 @@ tmp=$(mktemp --tmpdir -d nixpkgs-dep-license.XXXXXX)
9exitHandler() {
9exitHandler() {
10 exitCode=$?
10 exitCode=$?
11 rm -rf "$tmp"
11 rm -rf "$tmp"
12− exit $exitCode
12+ return $exitCode
13}
13}
14
14
15trap "exitHandler" EXIT
15trap "exitHandler" EXIT
maintainers/scripts/haskell/merge-and-open-pr.sh+1−1
@@ -99,7 +99,7 @@ This PR is the regular merge of the \`haskell-updates\` branch into \`master\`.
99
99
100This branch is being continually built and tested by hydra at https://hydra.nixos.org/jobset/nixpkgs/haskell-updates. You may be able to find an up-to-date Hydra build report at [cdepillabout/nix-haskell-updates-status](https://github.com/cdepillabout/nix-haskell-updates-status).
100This branch is being continually built and tested by hydra at https://hydra.nixos.org/jobset/nixpkgs/haskell-updates. You may be able to find an up-to-date Hydra build report at [cdepillabout/nix-haskell-updates-status](https://github.com/cdepillabout/nix-haskell-updates-status).
101
101
102−We roughly aim to merge these \`haskell-updates\` PRs at least once every two weeks. See the @NixOS/haskell [team calendar](https://cloud.maralorn.de/apps/calendar/p/Mw5WLnzsP7fC4Zky) for who is currently in charge of this branch.
102+We roughly aim to merge these \`haskell-updates\` PRs at least once every two weeks. See the @NixOS/haskell [team calendar](https://cloud.maralorn.de/apps/calendar/p/H6migHmKX7xHoTFa) for who is currently in charge of this branch.
103
103
104### haskellPackages Workflow Summary
104### haskellPackages Workflow Summary
105
105
maintainers/scripts/luarocks-packages.csv+2−1
@@ -52,7 +52,7 @@ luadbi-postgresql,,,,,,
52luadbi-sqlite3,,,,,,
52luadbi-sqlite3,,,,,,
53luaepnf,,,,,,
53luaepnf,,,,,,
54luaevent,,,,,,
54luaevent,,,,,,
55−luaexpat,,,,1.3.0-1,,arobyn flosse
55+luaexpat,,,,1.4.1-1,,arobyn flosse
56luaffi,,,http://luarocks.org/dev,,,
56luaffi,,,http://luarocks.org/dev,,,
57luafilesystem,,,,1.7.0-2,,flosse
57luafilesystem,,,,1.7.0-2,,flosse
58lualogging,,,,,,
58lualogging,,,,,,
@@ -64,6 +64,7 @@ luasocket,,,,,,
64luasql-sqlite3,,,,,,vyp
64luasql-sqlite3,,,,,,vyp
65luassert,,,,,,
65luassert,,,,,,
66luasystem,,,,,,
66luasystem,,,,,,
67+luaunbound,,,,,
67luautf8,,,,,,pstn
68luautf8,,,,,,pstn
68luazip,,,,,,
69luazip,,,,,,
69lua-yajl,,,,,,pstn
70lua-yajl,,,,,,pstn
maintainers/scripts/pluginupdate.py+135−108
@@ -8,6 +8,7 @@
8# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265 update.py
8# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265 update.py
9
9
10import argparse
10import argparse
11+import csv
11import functools
12import functools
12import http
13import http
13import json
14import json
@@ -28,7 +29,7 @@ from pathlib import Path
28from typing import Dict, List, Optional, Tuple, Union, Any, Callable
29from typing import Dict, List, Optional, Tuple, Union, Any, Callable
29from urllib.parse import urljoin, urlparse
30from urllib.parse import urljoin, urlparse
30from tempfile import NamedTemporaryFile
31from tempfile import NamedTemporaryFile
31−from dataclasses import dataclass
32+from dataclasses import dataclass, asdict
32
33
33import git
34import git
34
35
@@ -85,21 +86,31 @@ def make_request(url: str, token=None) -> urllib.request.Request:
85 headers["Authorization"] = f"token {token}"
86 headers["Authorization"] = f"token {token}"
86 return urllib.request.Request(url, headers=headers)
87 return urllib.request.Request(url, headers=headers)
87
88
89+
90+# a dictionary of plugins and their new repositories
91+Redirects = Dict['PluginDesc', 'Repo']
92+
88class Repo:
93class Repo:
89 def __init__(
94 def __init__(
90− self, uri: str, branch: str, alias: Optional[str]
95+ self, uri: str, branch: str
91 ) -> None:
96 ) -> None:
92 self.uri = uri
97 self.uri = uri
93 '''Url to the repo'''
98 '''Url to the repo'''
94− self.branch = branch
99+ self._branch = branch
95− self.alias = alias
100+ # Redirect is the new Repo to use
96− self.redirect: Dict[str, str] = {}
101+ self.redirect: Optional['Repo'] = None
97 self.token = "dummy_token"
102 self.token = "dummy_token"
98
103
99 @property
104 @property
100 def name(self):
105 def name(self):
101 return self.uri.split('/')[-1]
106 return self.uri.split('/')[-1]
102
107
108+ @property
109+ def branch(self):
110+ return self._branch or "HEAD"
111+
112+ def __str__(self) -> str:
113+ return f"{self.uri}"
103 def __repr__(self) -> str:
114 def __repr__(self) -> str:
104 return f"Repo({self.name}, {self.uri})"
115 return f"Repo({self.name}, {self.uri})"
105
116
@@ -109,6 +120,7 @@ class Repo:
109
120
110 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
121 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
111 def latest_commit(self) -> Tuple[str, datetime]:
122 def latest_commit(self) -> Tuple[str, datetime]:
123+ log.debug("Latest commit")
112 loaded = self._prefetch(None)
124 loaded = self._prefetch(None)
113 updated = datetime.strptime(loaded['date'], "%Y-%m-%dT%H:%M:%S%z")
125 updated = datetime.strptime(loaded['date'], "%Y-%m-%dT%H:%M:%S%z")
114
126
@@ -124,6 +136,7 @@ class Repo:
124 return loaded
136 return loaded
125
137
126 def prefetch(self, ref: Optional[str]) -> str:
138 def prefetch(self, ref: Optional[str]) -> str:
139+ print("Prefetching")
127 loaded = self._prefetch(ref)
140 loaded = self._prefetch(ref)
128 return loaded["sha256"]
141 return loaded["sha256"]
129
142
@@ -137,21 +150,22 @@ class Repo:
137
150
138class RepoGitHub(Repo):
151class RepoGitHub(Repo):
139 def __init__(
152 def __init__(
140− self, owner: str, repo: str, branch: str, alias: Optional[str]
153+ self, owner: str, repo: str, branch: str
141 ) -> None:
154 ) -> None:
142 self.owner = owner
155 self.owner = owner
143 self.repo = repo
156 self.repo = repo
144 self.token = None
157 self.token = None
145 '''Url to the repo'''
158 '''Url to the repo'''
146− super().__init__(self.url(""), branch, alias)
159+ super().__init__(self.url(""), branch)
147− log.debug("Instantiating github repo %s/%s", self.owner, self.repo)
160+ log.debug("Instantiating github repo owner=%s and repo=%s", self.owner, self.repo)
148
161
149 @property
162 @property
150 def name(self):
163 def name(self):
151 return self.repo
164 return self.repo
152
165
153 def url(self, path: str) -> str:
166 def url(self, path: str) -> str:
154− return urljoin(f"https://github.com/{self.owner}/{self.name}/", path)
167+ res = urljoin(f"https://github.com/{self.owner}/{self.repo}/", path)
168+ return res
155
169
156 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
170 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
157 def has_submodules(self) -> bool:
171 def has_submodules(self) -> bool:
@@ -168,6 +182,7 @@ class RepoGitHub(Repo):
168 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
182 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
169 def latest_commit(self) -> Tuple[str, datetime]:
183 def latest_commit(self) -> Tuple[str, datetime]:
170 commit_url = self.url(f"commits/{self.branch}.atom")
184 commit_url = self.url(f"commits/{self.branch}.atom")
185+ log.debug("Sending request to %s", commit_url)
171 commit_req = make_request(commit_url, self.token)
186 commit_req = make_request(commit_url, self.token)
172 with urllib.request.urlopen(commit_req, timeout=10) as req:
187 with urllib.request.urlopen(commit_req, timeout=10) as req:
173 self._check_for_redirect(commit_url, req)
188 self._check_for_redirect(commit_url, req)
@@ -191,12 +206,9 @@ class RepoGitHub(Repo):
191 new_owner, new_name = (
206 new_owner, new_name = (
192 urllib.parse.urlsplit(response_url).path.strip("/").split("/")[:2]
207 urllib.parse.urlsplit(response_url).path.strip("/").split("/")[:2]
193 )
208 )
194− end_line = "\n" if self.alias is None else f" as {self.alias}\n"
195− plugin_line = "{owner}/{name}" + end_line
196
209
197− old_plugin = plugin_line.format(owner=self.owner, name=self.name)
210+ new_repo = RepoGitHub(owner=new_owner, repo=new_name, branch=self.branch)
198− new_plugin = plugin_line.format(owner=new_owner, name=new_name)
199− self.redirect[old_plugin] = new_plugin
211+ self.redirect = new_repo
200
212
201
213
202 def prefetch(self, commit: str) -> str:
214 def prefetch(self, commit: str) -> str:
@@ -207,9 +219,9 @@ class RepoGitHub(Repo):
207 return sha256
219 return sha256
208
220
209 def prefetch_github(self, ref: str) -> str:
221 def prefetch_github(self, ref: str) -> str:
210− data = subprocess.check_output(
211− ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")]
222+ cmd = ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")]
212− )
223+ log.debug("Running %s", cmd)
224+ data = subprocess.check_output(cmd)
213 return data.strip().decode("utf-8")
225 return data.strip().decode("utf-8")
214
226
215 def as_nix(self, plugin: "Plugin") -> str:
227 def as_nix(self, plugin: "Plugin") -> str:
@@ -226,7 +238,7 @@ class RepoGitHub(Repo):
226 }}'''
238 }}'''
227
239
228
240
229−@dataclass
241+@dataclass(frozen=True)
230class PluginDesc:
242class PluginDesc:
231 repo: Repo
243 repo: Repo
232 branch: str
244 branch: str
@@ -239,21 +251,38 @@ class PluginDesc:
239 else:
251 else:
240 return self.alias
252 return self.alias
241
253
254+ def __lt__(self, other):
255+ return self.repo.name < other.repo.name
256+
257+ @staticmethod
258+ def load_from_csv(config: FetchConfig, row: Dict[str, str]) -> 'PluginDesc':
259+ branch = row["branch"]
260+ repo = make_repo(row['repo'], branch.strip())
261+ repo.token = config.github_token
262+ return PluginDesc(repo, branch.strip(), row["alias"])
263+
264+
265+ @staticmethod
266+ def load_from_string(config: FetchConfig, line: str) -> 'PluginDesc':
267+ branch = "HEAD"
268+ alias = None
269+ uri = line
270+ if " as " in uri:
271+ uri, alias = uri.split(" as ")
272+ alias = alias.strip()
273+ if "@" in uri:
274+ uri, branch = uri.split("@")
275+ repo = make_repo(uri.strip(), branch.strip())
276+ repo.token = config.github_token
277+ return PluginDesc(repo, branch.strip(), alias)
242
278
279+@dataclass
243class Plugin:
280class Plugin:
244− def __init__(
245− self,
246− name: str,
281+ name: str
247− commit: str,
282+ commit: str
248− has_submodules: bool,
283+ has_submodules: bool
249− sha256: str,
284+ sha256: str
250− date: Optional[datetime] = None,
285+ date: Optional[datetime] = None
251− ) -> None:
252− self.name = name
253− self.commit = commit
254− self.has_submodules = has_submodules
255− self.sha256 = sha256
256− self.date = date
257
286
258 @property
287 @property
259 def normalized_name(self) -> str:
288 def normalized_name(self) -> str:
@@ -270,6 +299,27 @@ class Plugin:
270 return copy
299 return copy
271
300
272
301
302+def load_plugins_from_csv(config: FetchConfig, input_file: Path,) -> List[PluginDesc]:
303+ log.debug("Load plugins from csv %s", input_file)
304+ plugins = []
305+ with open(input_file, newline='') as csvfile:
306+ log.debug("Writing into %s", input_file)
307+ reader = csv.DictReader(csvfile,)
308+ for line in reader:
309+ plugin = PluginDesc.load_from_csv(config, line)
310+ plugins.append(plugin)
311+
312+ return plugins
313+
314+def run_nix_expr(expr):
315+ with CleanEnvironment():
316+ cmd = ["nix", "eval", "--extra-experimental-features",
317+ "nix-command", "--impure", "--json", "--expr", expr]
318+ log.debug("Running command %s", cmd)
319+ out = subprocess.check_output(cmd)
320+ data = json.loads(out)
321+ return data
322+
273
323
274class Editor:
324class Editor:
275 """The configuration of the update script."""
325 """The configuration of the update script."""
@@ -293,20 +343,20 @@ class Editor:
293 self.deprecated = deprecated or root.joinpath("deprecated.json")
343 self.deprecated = deprecated or root.joinpath("deprecated.json")
294 self.cache_file = cache_file or f"{name}-plugin-cache.json"
344 self.cache_file = cache_file or f"{name}-plugin-cache.json"
295
345
296− def get_current_plugins(self):
346+ def get_current_plugins(self) -> List[Plugin]:
297 """To fill the cache"""
347 """To fill the cache"""
298− return get_current_plugins(self)
348+ data = run_nix_expr(self.get_plugins)
299−
300− def load_plugin_spec(self, config: FetchConfig, plugin_file) -> List[PluginDesc]:
301 plugins = []
349 plugins = []
302− with open(plugin_file) as f:
350+ for name, attr in data.items():
303− for line in f:
351+ print("get_current_plugins: name %s" % name)
304− if line.startswith("#"):
352+ p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"])
305− continue
306− plugin = parse_plugin_line(config, line)
307− plugins.append(plugin)
353+ plugins.append(p)
308 return plugins
354 return plugins
309
355
356+ def load_plugin_spec(self, config: FetchConfig, plugin_file) -> List[PluginDesc]:
357+ '''CSV spec'''
358+ return load_plugins_from_csv(config, plugin_file)
359+
310 def generate_nix(self, plugins, outfile: str):
360 def generate_nix(self, plugins, outfile: str):
311 '''Returns nothing for now, writes directly to outfile'''
361 '''Returns nothing for now, writes directly to outfile'''
312 raise NotImplementedError()
362 raise NotImplementedError()
@@ -316,11 +366,11 @@ class Editor:
316 _prefetch = functools.partial(prefetch, cache=cache)
366 _prefetch = functools.partial(prefetch, cache=cache)
317
367
318 def update() -> dict:
368 def update() -> dict:
319− plugin_names = self.load_plugin_spec(config, input_file)
369+ plugins = self.load_plugin_spec(config, input_file)
320
370
321 try:
371 try:
322 pool = Pool(processes=config.proc)
372 pool = Pool(processes=config.proc)
323− results = pool.map(_prefetch, plugin_names)
373+ results = pool.map(_prefetch, plugins)
324 finally:
374 finally:
325 cache.store()
375 cache.store()
326
376
@@ -415,23 +465,10 @@ class CleanEnvironment(object):
415 self.empty_config.close()
465 self.empty_config.close()
416
466
417
467
418−def get_current_plugins(editor: Editor) -> List[Plugin]:
419− with CleanEnvironment():
420− cmd = ["nix", "eval", "--extra-experimental-features", "nix-command", "--impure", "--json", "--expr", editor.get_plugins]
421− log.debug("Running command %s", cmd)
422− out = subprocess.check_output(cmd)
423− data = json.loads(out)
424− plugins = []
425− for name, attr in data.items():
426− p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"])
427− plugins.append(p)
428− return plugins
429−
430−
431def prefetch_plugin(
468def prefetch_plugin(
432 p: PluginDesc,
469 p: PluginDesc,
433 cache: "Optional[Cache]" = None,
470 cache: "Optional[Cache]" = None,
434−) -> Tuple[Plugin, Dict[str, str]]:
471+) -> Tuple[Plugin, Optional[Repo]]:
435 repo, branch, alias = p.repo, p.branch, p.alias
472 repo, branch, alias = p.repo, p.branch, p.alias
436 name = alias or p.repo.name
473 name = alias or p.repo.name
437 commit = None
474 commit = None
@@ -445,7 +482,7 @@ def prefetch_plugin(
445 return cached_plugin, repo.redirect
482 return cached_plugin, repo.redirect
446
483
447 has_submodules = repo.has_submodules()
484 has_submodules = repo.has_submodules()
448− print(f"prefetch {name}")
485+ log.debug(f"prefetch {name}")
449 sha256 = repo.prefetch(commit)
486 sha256 = repo.prefetch(commit)
450
487
451 return (
488 return (
@@ -454,12 +491,7 @@ def prefetch_plugin(
454 )
491 )
455
492
456
493
457−def fetch_plugin_from_pluginline(config: FetchConfig, plugin_line: str) -> Plugin:
458− plugin, _ = prefetch_plugin(parse_plugin_line(config, plugin_line))
459− return plugin
460−
461−
462−def print_download_error(plugin: str, ex: Exception):
494+def print_download_error(plugin: PluginDesc, ex: Exception):
463 print(f"{plugin}: {ex}", file=sys.stderr)
495 print(f"{plugin}: {ex}", file=sys.stderr)
464 ex_traceback = ex.__traceback__
496 ex_traceback = ex.__traceback__
465 tb_lines = [
497 tb_lines = [
@@ -468,20 +500,22 @@ def print_download_error(plugin: str, ex: Exception):
468 ]
500 ]
469 print("\n".join(tb_lines))
501 print("\n".join(tb_lines))
470
502
471−
472def check_results(
503def check_results(
473− results: List[Tuple[PluginDesc, Union[Exception, Plugin], Dict[str, str]]]
504+ results: List[Tuple[PluginDesc, Union[Exception, Plugin], Optional[Repo]]]
474−) -> Tuple[List[Tuple[PluginDesc, Plugin]], Dict[str, str]]:
505+) -> Tuple[List[Tuple[PluginDesc, Plugin]], Redirects]:
475 ''' '''
506 ''' '''
476− failures: List[Tuple[str, Exception]] = []
507+ failures: List[Tuple[PluginDesc, Exception]] = []
477 plugins = []
508 plugins = []
478− redirects: Dict[str, str] = {}
509+ redirects: Redirects = {}
479 for (pdesc, result, redirect) in results:
510 for (pdesc, result, redirect) in results:
480 if isinstance(result, Exception):
511 if isinstance(result, Exception):
481− failures.append((pdesc.name, result))
512+ failures.append((pdesc, result))
482 else:
513 else:
514+ new_pdesc = pdesc
515+ if redirect is not None:
516+ redirects.update({pdesc: redirect})
517+ new_pdesc = PluginDesc(redirect, pdesc.branch, pdesc.alias)
483− plugins.append((pdesc, result))
518+ plugins.append((new_pdesc, result))
484− redirects.update(redirect)
485
519
486 print(f"{len(results) - len(failures)} plugins were checked", end="")
520 print(f"{len(results) - len(failures)} plugins were checked", end="")
487 if len(failures) == 0:
521 if len(failures) == 0:
@@ -495,31 +529,17 @@ def check_results(
495
529
496 sys.exit(1)
530 sys.exit(1)
497
531
498−def make_repo(uri, branch, alias) -> Repo:
532+def make_repo(uri: str, branch) -> Repo:
499 '''Instantiate a Repo with the correct specialization depending on server (gitub spec)'''
533 '''Instantiate a Repo with the correct specialization depending on server (gitub spec)'''
500 # dumb check to see if it's of the form owner/repo (=> github) or https://...
534 # dumb check to see if it's of the form owner/repo (=> github) or https://...
501− res = uri.split('/')
535+ res = urlparse(uri)
502− if len(res) <= 2:
536+ if res.netloc in [ "github.com", ""]:
537+ res = res.path.strip('/').split('/')
503− repo = RepoGitHub(res[0], res[1], branch, alias)
538+ repo = RepoGitHub(res[0], res[1], branch)
504 else:
539 else:
505− repo = Repo(uri.strip(), branch, alias)
540+ repo = Repo(uri.strip(), branch)
506 return repo
541 return repo
507
542
508−def parse_plugin_line(config: FetchConfig, line: str) -> PluginDesc:
509− branch = "HEAD"
510− alias = None
511− uri = line
512− if " as " in uri:
513− uri, alias = uri.split(" as ")
514− alias = alias.strip()
515− if "@" in uri:
516− uri, branch = uri.split("@")
517−
518− repo = make_repo(uri.strip(), branch.strip(), alias)
519− repo.token = config.github_token
520−
521− return PluginDesc(repo, branch.strip(), alias)
522−
523
543
524def get_cache_path(cache_file_name: str) -> Optional[Path]:
544def get_cache_path(cache_file_name: str) -> Optional[Path]:
525 xdg_cache = os.environ.get("XDG_CACHE_HOME", None)
545 xdg_cache = os.environ.get("XDG_CACHE_HOME", None)
@@ -576,36 +596,37 @@ class Cache:
576
596
577def prefetch(
597def prefetch(
578 pluginDesc: PluginDesc, cache: Cache
598 pluginDesc: PluginDesc, cache: Cache
579−) -> Tuple[PluginDesc, Union[Exception, Plugin], dict]:
599+) -> Tuple[PluginDesc, Union[Exception, Plugin], Optional[Repo]]:
580 try:
600 try:
581 plugin, redirect = prefetch_plugin(pluginDesc, cache)
601 plugin, redirect = prefetch_plugin(pluginDesc, cache)
582 cache[plugin.commit] = plugin
602 cache[plugin.commit] = plugin
583 return (pluginDesc, plugin, redirect)
603 return (pluginDesc, plugin, redirect)
584 except Exception as e:
604 except Exception as e:
585− return (pluginDesc, e, {})
605+ return (pluginDesc, e, None)
606+
586
607
587
608
588def rewrite_input(
609def rewrite_input(
589 config: FetchConfig,
610 config: FetchConfig,
590 input_file: Path,
611 input_file: Path,
591 deprecated: Path,
612 deprecated: Path,
613+ # old pluginDesc and the new
592− redirects: Dict[str, str] = None,
614+ redirects: Redirects = {},
593− append: Tuple = (),
615+ append: List[PluginDesc] = [],
594):
616):
595− with open(input_file, "r") as f:
617+ plugins = load_plugins_from_csv(config, input_file,)
596− lines = f.readlines()
597
618
598− lines.extend(append)
619+ plugins.extend(append)
599
620
600 if redirects:
621 if redirects:
601− lines = [redirects.get(line, line) for line in lines]
602
622
603 cur_date_iso = datetime.now().strftime("%Y-%m-%d")
623 cur_date_iso = datetime.now().strftime("%Y-%m-%d")
604 with open(deprecated, "r") as f:
624 with open(deprecated, "r") as f:
605 deprecations = json.load(f)
625 deprecations = json.load(f)
606− for old, new in redirects.items():
626+ for pdesc, new_repo in redirects.items():
607− old_plugin = fetch_plugin_from_pluginline(config, old)
627+ new_pdesc = PluginDesc(new_repo, pdesc.branch, pdesc.alias)
608− new_plugin = fetch_plugin_from_pluginline(config, new)
628+ old_plugin, _ = prefetch_plugin(pdesc)
629+ new_plugin, _ = prefetch_plugin(new_pdesc)
609 if old_plugin.normalized_name != new_plugin.normalized_name:
630 if old_plugin.normalized_name != new_plugin.normalized_name:
610 deprecations[old_plugin.normalized_name] = {
631 deprecations[old_plugin.normalized_name] = {
611 "new": new_plugin.normalized_name,
632 "new": new_plugin.normalized_name,
@@ -615,10 +636,14 @@ def rewrite_input(
615 json.dump(deprecations, f, indent=4, sort_keys=True)
636 json.dump(deprecations, f, indent=4, sort_keys=True)
616 f.write("\n")
637 f.write("\n")
617
638
618− lines = sorted(lines, key=str.casefold)
619−
620 with open(input_file, "w") as f:
639 with open(input_file, "w") as f:
621− f.writelines(lines)
640+ log.debug("Writing into %s", input_file)
641+ # fields = dataclasses.fields(PluginDesc)
642+ fieldnames = ['repo', 'branch', 'alias']
643+ writer = csv.DictWriter(f, fieldnames, dialect='unix', quoting=csv.QUOTE_NONE)
644+ writer.writeheader()
645+ for plugin in sorted(plugins):
646+ writer.writerow(asdict(plugin))
622
647
623
648
624def commit(repo: git.Repo, message: str, files: List[Path]) -> None:
649def commit(repo: git.Repo, message: str, files: List[Path]) -> None:
@@ -660,9 +685,11 @@ def update_plugins(editor: Editor, args):
660 )
685 )
661
686
662 for plugin_line in args.add_plugins:
687 for plugin_line in args.add_plugins:
688+ pdesc = PluginDesc.load_from_string(fetch_config, plugin_line)
689+ append = [ pdesc ]
663− editor.rewrite_input(fetch_config, args.input_file, editor.deprecated, append=(plugin_line + "\n",))
690+ editor.rewrite_input(fetch_config, args.input_file, editor.deprecated, append=append)
664 update()
691 update()
665− plugin = fetch_plugin_from_pluginline(fetch_config, plugin_line)
692+ plugin, _ = prefetch_plugin(pdesc, )
666 if autocommit:
693 if autocommit:
667 commit(
694 commit(
668 nixpkgs_repo,
695 nixpkgs_repo,
maintainers/team-list.nix+36
@@ -198,6 +198,18 @@ with lib.maintainers; {
198 enableFeatureFreezePing = true;
198 enableFeatureFreezePing = true;
199 };
199 };
200
200
201+ enlightenment = {
202+ members = [
203+ romildo
204+ ];
205+ githubTeams = [
206+ "enlightenment"
207+ ];
208+ scope = "Maintain Enlightenment desktop environment and related packages.";
209+ shortName = "Enlightenment";
210+ enableFeatureFreezePing = true;
211+ };
212+
201 # Dummy group for the "everyone else" section
213 # Dummy group for the "everyone else" section
202 feature-freeze-everyone-else = {
214 feature-freeze-everyone-else = {
203 members = [ ];
215 members = [ ];
@@ -343,6 +355,30 @@ with lib.maintainers; {
343 shortName = "Linux Kernel";
355 shortName = "Linux Kernel";
344 };
356 };
345
357
358+ lumina = {
359+ members = [
360+ romildo
361+ ];
362+ githubTeams = [
363+ "lumina"
364+ ];
365+ scope = "Maintain lumina desktop environment and related packages.";
366+ shortName = "Lumina";
367+ enableFeatureFreezePing = true;
368+ };
369+
370+ lxqt = {
371+ members = [
372+ romildo
373+ ];
374+ githubTeams = [
375+ "lxqt"
376+ ];
377+ scope = "Maintain LXQt desktop environment and related packages.";
378+ shortName = "LXQt";
379+ enableFeatureFreezePing = true;
380+ };
381+
346 marketing = {
382 marketing = {
347 members = [
383 members = [
348 garbas
384 garbas
nixos/doc/manual/administration/declarative-containers.section.md+1−1
@@ -40,7 +40,7 @@ section for details on container networking.)
40To disable the container, just remove it from `configuration.nix` and
40To disable the container, just remove it from `configuration.nix` and
41run `nixos-rebuild
41run `nixos-rebuild
42 switch`. Note that this will not delete the root directory of the
42 switch`. Note that this will not delete the root directory of the
43−container in `/var/lib/containers`. Containers can be destroyed using
43+container in `/var/lib/nixos-containers`. Containers can be destroyed using
44the imperative method: `nixos-container destroy foo`.
44the imperative method: `nixos-container destroy foo`.
45
45
46Declarative containers can be started and stopped using the
46Declarative containers can be started and stopped using the
nixos/doc/manual/administration/imperative-containers.section.md+2−2
@@ -10,8 +10,8 @@ You create a container with identifier `foo` as follows:
10# nixos-container create foo
10# nixos-container create foo
11```
11```
12
12
13−This creates the container's root directory in `/var/lib/containers/foo`
13+This creates the container's root directory in `/var/lib/nixos-containers/foo`
14−and a small configuration file in `/etc/containers/foo.conf`. It also
14+and a small configuration file in `/etc/nixos-containers/foo.conf`. It also
15builds the container's initial system configuration and stores it in
15builds the container's initial system configuration and stores it in
16`/nix/var/nix/profiles/per-container/foo/system`. You can modify the
16`/nix/var/nix/profiles/per-container/foo/system`. You can modify the
17initial configuration of the container on the command line. For
17initial configuration of the container on the command line. For
nixos/doc/manual/default.nix+4
@@ -14,6 +14,10 @@ with pkgs;
14let
14let
15 lib = pkgs.lib;
15 lib = pkgs.lib;
16
16
17+ docbook_xsl_ns = pkgs.docbook-xsl-ns.override {
18+ withManOptDedupPatch = true;
19+ };
20+
17 # We need to strip references to /nix/store/* from options,
21 # We need to strip references to /nix/store/* from options,
18 # including any `extraSources` if some modules came from elsewhere,
22 # including any `extraSources` if some modules came from elsewhere,
19 # or else the build will fail.
23 # or else the build will fail.
nixos/doc/manual/development/development.xml−1
@@ -14,7 +14,6 @@
14 <xi:include href="../from_md/development/building-parts.chapter.xml" />
14 <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" />
15 <xi:include href="../from_md/development/what-happens-during-a-system-switch.chapter.xml" />
16 <xi:include href="../from_md/development/writing-documentation.chapter.xml" />
16 <xi:include href="../from_md/development/writing-documentation.chapter.xml" />
17− <xi:include href="../from_md/development/building-nixos.chapter.xml" />
18 <xi:include href="../from_md/development/nixos-tests.chapter.xml" />
17 <xi:include href="../from_md/development/nixos-tests.chapter.xml" />
19 <xi:include href="../from_md/development/testing-installer.chapter.xml" />
18 <xi:include href="../from_md/development/testing-installer.chapter.xml" />
20</part>
19</part>
nixos/doc/manual/development/writing-nixos-tests.section.md+25−14
@@ -159,34 +159,42 @@ The following methods are available on machine objects:
159`execute`
159`execute`
160
160
161: Execute a shell command, returning a list `(status, stdout)`.
161: Execute a shell command, returning a list `(status, stdout)`.
162+
163+ Commands are run with `set -euo pipefail` set:
164+
165+ - If several commands are separated by `;` and one fails, the
166+ command as a whole will fail.
167+
168+ - For pipelines, the last non-zero exit status will be returned
169+ (if there is one; otherwise zero will be returned).
170+
171+ - Dereferencing unset variables fails the command.
172+
173+ - It will wait for stdout to be closed.
174+
162 If the command detaches, it must close stdout, as `execute` will wait
175 If the command detaches, it must close stdout, as `execute` will wait
163 for this to consume all output reliably. This can be achieved by
176 for this to consume all output reliably. This can be achieved by
164 redirecting stdout to stderr `>&2`, to `/dev/console`, `/dev/null` or
177 redirecting stdout to stderr `>&2`, to `/dev/console`, `/dev/null` or
165 a file. Examples of detaching commands are `sleep 365d &`, where the
178 a file. Examples of detaching commands are `sleep 365d &`, where the
166 shell forks a new process that can write to stdout and `xclip -i`, where
179 shell forks a new process that can write to stdout and `xclip -i`, where
167 the `xclip` command itself forks without closing stdout.
180 the `xclip` command itself forks without closing stdout.
181+
168 Takes an optional parameter `check_return` that defaults to `True`.
182 Takes an optional parameter `check_return` that defaults to `True`.
169 Setting this parameter to `False` will not check for the return code
183 Setting this parameter to `False` will not check for the return code
170 and return -1 instead. This can be used for commands that shut down
184 and return -1 instead. This can be used for commands that shut down
171 the VM and would therefore break the pipe that would be used for
185 the VM and would therefore break the pipe that would be used for
172 retrieving the return code.
186 retrieving the return code.
173
187
188+ A timeout for the command can be specified (in seconds) using the optional
189+ `timeout` parameter, e.g., `execute(cmd, timeout=10)` or
190+ `execute(cmd, timeout=None)`. The default is 900 seconds.
191+
174`succeed`
192`succeed`
175
193
176: Execute a shell command, raising an exception if the exit status is
194: Execute a shell command, raising an exception if the exit status is
177− not zero, otherwise returning the standard output. Commands are run
195+ not zero, otherwise returning the standard output. Similar to `execute`,
178− with `set -euo pipefail` set:
196+ except that the timeout is `None` by default. See `execute` for details on
179−
197+ command execution.
180− - If several commands are separated by `;` and one fails, the
181− command as a whole will fail.
182−
183− - For pipelines, the last non-zero exit status will be returned
184− (if there is one, zero will be returned otherwise).
185−
186− - Dereferencing unset variables fail the command.
187−
188− - It will wait for stdout to be closed. See `execute` for the
189− implications.
190
198
191`fail`
199`fail`
192
200
@@ -196,10 +204,13 @@ The following methods are available on machine objects:
196`wait_until_succeeds`
204`wait_until_succeeds`
197
205
198: Repeat a shell command with 1-second intervals until it succeeds.
206: Repeat a shell command with 1-second intervals until it succeeds.
207+ Has a default timeout of 900 seconds which can be modified, e.g.
208+ `wait_until_succeeds(cmd, timeout=10)`. See `execute` for details on
209+ command execution.
199
210
200`wait_until_fails`
211`wait_until_fails`
201
212
202−: Repeat a shell command with 1-second intervals until it fails.
213+: Like `wait_until_succeeds`, but repeating the command until it fails.
203
214
204`wait_for_unit`
215`wait_for_unit`
205
216
nixos/doc/manual/from_md/administration/declarative-containers.section.xml+2−2
@@ -48,8 +48,8 @@ containers.database = {
48 <literal>configuration.nix</literal> and run
48 <literal>configuration.nix</literal> and run
49 <literal>nixos-rebuild switch</literal>. Note that this will not
49 <literal>nixos-rebuild switch</literal>. Note that this will not
50 delete the root directory of the container in
50 delete the root directory of the container in
51− <literal>/var/lib/containers</literal>. Containers can be destroyed
51+ <literal>/var/lib/nixos-containers</literal>. Containers can be
52− using the imperative method:
52+ destroyed using the imperative method:
53 <literal>nixos-container destroy foo</literal>.
53 <literal>nixos-container destroy foo</literal>.
54 </para>
54 </para>
55 <para>
55 <para>
nixos/doc/manual/from_md/administration/imperative-containers.section.xml+3−2
@@ -14,8 +14,9 @@
14</programlisting>
14</programlisting>
15 <para>
15 <para>
16 This creates the container’s root directory in
16 This creates the container’s root directory in
17− <literal>/var/lib/containers/foo</literal> and a small configuration
17+ <literal>/var/lib/nixos-containers/foo</literal> and a small
18+ configuration file in
18− file in <literal>/etc/containers/foo.conf</literal>. It also builds
19+ <literal>/etc/nixos-containers/foo.conf</literal>. It also builds
19 the container’s initial system configuration and stores it in
20 the container’s initial system configuration and stores it in
20 <literal>/nix/var/nix/profiles/per-container/foo/system</literal>.
21 <literal>/nix/var/nix/profiles/per-container/foo/system</literal>.
21 You can modify the initial configuration of the container on the
22 You can modify the initial configuration of the container on the
nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml+53−35
@@ -274,35 +274,9 @@ start_all()
274 <listitem>
274 <listitem>
275 <para>
275 <para>
276 Execute a shell command, returning a list
276 Execute a shell command, returning a list
277− <literal>(status, stdout)</literal>. If the command
277+ <literal>(status, stdout)</literal>.
278− detaches, it must close stdout, as
279− <literal>execute</literal> will wait for this to consume all
280− output reliably. This can be achieved by redirecting stdout
281− to stderr <literal>&gt;&amp;2</literal>, to
282− <literal>/dev/console</literal>,
283− <literal>/dev/null</literal> or a file. Examples of
284− detaching commands are <literal>sleep 365d &amp;</literal>,
285− where the shell forks a new process that can write to stdout
286− and <literal>xclip -i</literal>, where the
287− <literal>xclip</literal> command itself forks without
288− closing stdout. Takes an optional parameter
289− <literal>check_return</literal> that defaults to
290− <literal>True</literal>. Setting this parameter to
291− <literal>False</literal> will not check for the return code
292− and return -1 instead. This can be used for commands that
293− shut down the VM and would therefore break the pipe that
294− would be used for retrieving the return code.
295 </para>
278 </para>
296− </listitem>
297− </varlistentry>
298− <varlistentry>
299− <term>
300− <literal>succeed</literal>
301− </term>
302− <listitem>
303 <para>
279 <para>
304− Execute a shell command, raising an exception if the exit
305− status is not zero, otherwise returning the standard output.
306 Commands are run with <literal>set -euo pipefail</literal>
280 Commands are run with <literal>set -euo pipefail</literal>
307 set:
281 set:
308 </para>
282 </para>
@@ -317,22 +291,63 @@ start_all()
317 <listitem>
291 <listitem>
318 <para>
292 <para>
319 For pipelines, the last non-zero exit status will be
293 For pipelines, the last non-zero exit status will be
320− returned (if there is one, zero will be returned
294+ returned (if there is one; otherwise zero will be
321− otherwise).
295+ returned).
322 </para>
296 </para>
323 </listitem>
297 </listitem>
324 <listitem>
298 <listitem>
325 <para>
299 <para>
326− Dereferencing unset variables fail the command.
300+ Dereferencing unset variables fails the command.
327 </para>
301 </para>
328 </listitem>
302 </listitem>
329 <listitem>
303 <listitem>
330 <para>
304 <para>
331− It will wait for stdout to be closed. See
305+ It will wait for stdout to be closed.
332− <literal>execute</literal> for the implications.
333 </para>
306 </para>
334 </listitem>
307 </listitem>
335 </itemizedlist>
308 </itemizedlist>
309+ <para>
310+ If the command detaches, it must close stdout, as
311+ <literal>execute</literal> will wait for this to consume all
312+ output reliably. This can be achieved by redirecting stdout
313+ to stderr <literal>&gt;&amp;2</literal>, to
314+ <literal>/dev/console</literal>,
315+ <literal>/dev/null</literal> or a file. Examples of
316+ detaching commands are <literal>sleep 365d &amp;</literal>,
317+ where the shell forks a new process that can write to stdout
318+ and <literal>xclip -i</literal>, where the
319+ <literal>xclip</literal> command itself forks without
320+ closing stdout.
321+ </para>
322+ <para>
323+ Takes an optional parameter <literal>check_return</literal>
324+ that defaults to <literal>True</literal>. Setting this
325+ parameter to <literal>False</literal> will not check for the
326+ return code and return -1 instead. This can be used for
327+ commands that shut down the VM and would therefore break the
328+ pipe that would be used for retrieving the return code.
329+ </para>
330+ <para>
331+ A timeout for the command can be specified (in seconds)
332+ using the optional <literal>timeout</literal> parameter,
333+ e.g., <literal>execute(cmd, timeout=10)</literal> or
334+ <literal>execute(cmd, timeout=None)</literal>. The default
335+ is 900 seconds.
336+ </para>
337+ </listitem>
338+ </varlistentry>
339+ <varlistentry>
340+ <term>
341+ <literal>succeed</literal>
342+ </term>
343+ <listitem>
344+ <para>
345+ Execute a shell command, raising an exception if the exit
346+ status is not zero, otherwise returning the standard output.
347+ Similar to <literal>execute</literal>, except that the
348+ timeout is <literal>None</literal> by default. See
349+ <literal>execute</literal> for details on command execution.
350+ </para>
336 </listitem>
351 </listitem>
337 </varlistentry>
352 </varlistentry>
338 <varlistentry>
353 <varlistentry>
@@ -353,7 +368,10 @@ start_all()
353 <listitem>
368 <listitem>
354 <para>
369 <para>
355 Repeat a shell command with 1-second intervals until it
370 Repeat a shell command with 1-second intervals until it
356− succeeds.
371+ succeeds. Has a default timeout of 900 seconds which can be
372+ modified, e.g.
373+ <literal>wait_until_succeeds(cmd, timeout=10)</literal>. See
374+ <literal>execute</literal> for details on command execution.
357 </para>
375 </para>
358 </listitem>
376 </listitem>
359 </varlistentry>
377 </varlistentry>
@@ -363,8 +381,8 @@ start_all()
363 </term>
381 </term>
364 <listitem>
382 <listitem>
365 <para>
383 <para>
384+ Like <literal>wait_until_succeeds</literal>, but repeating
366− Repeat a shell command with 1-second intervals until it
385+ the command until it fails.
367− fails.
368 </para>
386 </para>
369 </listitem>
387 </listitem>
370 </varlistentry>
388 </varlistentry>
nixos/doc/manual/from_md/development/building-nixos.chapter.xml → nixos/doc/manual/from_md/installation/building-nixos.chapter.xmlrenamed+34
@@ -43,6 +43,40 @@ $ nix-build -A config.system.build.isoImage -I nixos-config=modules/installer/cd
43 </para>
43 </para>
44 <programlisting>
44 <programlisting>
45# mount -o loop -t iso9660 ./result/iso/cd.iso /mnt/iso
45# mount -o loop -t iso9660 ./result/iso/cd.iso /mnt/iso
46+</programlisting>
47+ </section>
48+ <section xml:id="sec-building-image-drivers">
49+ <title>Additional drivers or firmware</title>
50+ <para>
51+ If you need additional (non-distributable) drivers or firmware in
52+ the installer, you might want to extend these configurations.
53+ </para>
54+ <para>
55+ For example, to build the GNOME graphical installer ISO, but with
56+ support for certain WiFi adapters present in some MacBooks, you
57+ can create the following file at
58+ <literal>modules/installer/cd-dvd/installation-cd-graphical-gnome-macbook.nix</literal>:
59+ </para>
60+ <programlisting language="bash">
61+{ config, ... }:
62+
63+{
64+ imports = [ ./installation-cd-graphical-gnome.nix ];
65+
66+ boot.initrd.kernelModules = [ &quot;wl&quot; ];
67+
68+ boot.kernelModules = [ &quot;kvm-intel&quot; &quot;wl&quot; ];
69+ boot.extraModulePackages = [ config.boot.kernelPackages.broadcom_sta ];
70+}
71+</programlisting>
72+ <para>
73+ Then build it like in the example above:
74+ </para>
75+ <programlisting>
76+$ git clone https://github.com/NixOS/nixpkgs.git
77+$ cd nixpkgs/nixos
78+$ export NIXPKGS_ALLOW_UNFREE=1
79+$ nix-build -A config.system.build.isoImage -I nixos-config=modules/installer/cd-dvd/installation-cd-graphical-gnome-macbook.nix default.nix
46</programlisting>
80</programlisting>
47 </section>
81 </section>
48 <section xml:id="sec-building-image-tech-notes">
82 <section xml:id="sec-building-image-tech-notes">
nixos/doc/manual/from_md/installation/installing.chapter.xml+7−7
@@ -411,6 +411,13 @@ OK
411 specify on which disk the GRUB boot loader is to be
411 specify on which disk the GRUB boot loader is to be
412 installed. Without it, NixOS cannot boot.
412 installed. Without it, NixOS cannot boot.
413 </para>
413 </para>
414+ <para>
415+ If there are other operating systems running on the
416+ machine before installing NixOS, the
417+ <xref linkend="opt-boot.loader.grub.useOSProber" />
418+ option can be set to <literal>true</literal> to
419+ automatically add them to the grub menu.
420+ </para>
414 </listitem>
421 </listitem>
415 </varlistentry>
422 </varlistentry>
416 <varlistentry>
423 <varlistentry>
@@ -436,13 +443,6 @@ OK
436 </listitem>
443 </listitem>
437 </varlistentry>
444 </varlistentry>
438 </variablelist>
445 </variablelist>
439− <para>
440− If there are other operating systems running on the machine
441− before installing NixOS, the
442− <xref linkend="opt-boot.loader.grub.useOSProber" /> option can
443− be set to <literal>true</literal> to automatically add them to
444− the grub menu.
445− </para>
446 <para>
446 <para>
447 If you need to configure networking for your machine the
447 If you need to configure networking for your machine the
448 configuration options are described in
448 configuration options are described in
nixos/doc/manual/from_md/release-notes/rl-1803.section.xml+8
@@ -866,6 +866,14 @@
866 package.
866 package.
867 </para>
867 </para>
868 </listitem>
868 </listitem>
869+ <listitem>
870+ <para>
871+ The vim/kakoune plugin updater now reads from a CSV file:
872+ check
873+ <literal>pkgs/applications/editors/vim/plugins/vim-plugin-names</literal>
874+ out to see the new format
875+ </para>
876+ </listitem>
869 </itemizedlist>
877 </itemizedlist>
870 </section>
878 </section>
871</section>
879</section>
nixos/doc/manual/from_md/release-notes/rl-2205.section.xml+643−4
@@ -43,6 +43,33 @@
43 Shell.
43 Shell.
44 </para>
44 </para>
45 </listitem>
45 </listitem>
46+ <listitem>
47+ <para>
48+ <literal>stdenv.mkDerivation</literal> now supports a
49+ self-referencing <literal>finalAttrs:</literal> parameter
50+ containing the final <literal>mkDerivation</literal> arguments
51+ including overrides. <literal>drv.overrideAttrs</literal> now
52+ supports two parameters
53+ <literal>finalAttrs: previousAttrs:</literal>. This allows
54+ packaging configuration to be overridden in a consistent
55+ manner by providing an alternative to
56+ <literal>rec {}</literal> syntax.
57+ </para>
58+ <para>
59+ Additionally, <literal>passthru</literal> can now reference
60+ <literal>finalAttrs.finalPackage</literal> containing the
61+ final package, including attributes such as the output paths
62+ and <literal>overrideAttrs</literal>.
63+ </para>
64+ <para>
65+ New language integrations can be simplified by overriding a
66+ <quote>prototype</quote> package containing the
67+ language-specific logic. This removes the need for a extra
68+ layer of overriding for the <quote>generic builder</quote>
69+ arguments, thus removing a usability problem and source of
70+ error.
71+ </para>
72+ </listitem>
46 <listitem>
73 <listitem>
47 <para>
74 <para>
48 PHP 8.1 is now available
75 PHP 8.1 is now available
@@ -68,6 +95,34 @@
68 granular distinction between reloads and restarts.
95 granular distinction between reloads and restarts.
69 </para>
96 </para>
70 </listitem>
97 </listitem>
98+ <listitem>
99+ <para>
100+ Systemd has been upgraded to the version 250.
101+ </para>
102+ </listitem>
103+ <listitem>
104+ <para>
105+ Pulseaudio has been upgraded to version 15.0 and now
106+ optionally
107+ <link xlink:href="https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/15.0/#supportforldacandaptxbluetoothcodecsplussbcxqsbcwithhigher-qualityparameters">supports
108+ additional Bluetooth audio codecs</link> like aptX or LDAC,
109+ with codec switching support being available in
110+ <literal>pavucontrol</literal>. This feature is disabled by
111+ default but can be enabled by using
112+ <literal>hardware.pulseaudio.package = pkgs.pulseaudioFull;</literal>.
113+ Existing 3rd party modules that provided similar
114+ functionality, like <literal>pulseaudio-modules-bt</literal>
115+ or <literal>pulseaudio-hsphfpd</literal> are deprecated and
116+ have been removed.
117+ </para>
118+ </listitem>
119+ <listitem>
120+ <para>
121+ The new
122+ <link xlink:href="https://nixos.org/manual/nixpkgs/stable/#sec-postgresqlTestHook"><literal>postgresqlTestHook</literal></link>
123+ runs a PostgreSQL server for the duration of package checks.
124+ </para>
125+ </listitem>
71 <listitem>
126 <listitem>
72 <para>
127 <para>
73 <link xlink:href="https://kops.sigs.k8s.io"><literal>kops</literal></link>
128 <link xlink:href="https://kops.sigs.k8s.io"><literal>kops</literal></link>
@@ -96,6 +151,14 @@
96 default.
151 default.
97 </para>
152 </para>
98 </listitem>
153 </listitem>
154+ <listitem>
155+ <para>
156+ The GNOME and Plasma installation CDs now use
157+ <literal>pkgs.calamares</literal> and
158+ <literal>pkgs.calamares-nixos-extensions</literal> to allow
159+ users to easily install and set up NixOS with a GUI.
160+ </para>
161+ </listitem>
99 </itemizedlist>
162 </itemizedlist>
100 </section>
163 </section>
101 <section xml:id="sec-release-22.05-new-services">
164 <section xml:id="sec-release-22.05-new-services">
@@ -125,6 +188,13 @@
125 <link xlink:href="option.html#opt-services.matrix-conduit.enable">services.matrix-conduit</link>.
188 <link xlink:href="option.html#opt-services.matrix-conduit.enable">services.matrix-conduit</link>.
126 </para>
189 </para>
127 </listitem>
190 </listitem>
191+ <listitem>
192+ <para>
193+ <link xlink:href="https://github.com/vvilhonen/nethoscope">nethoscope</link>,
194+ listen to your network traffic. Available as
195+ <link linkend="opt-programs.nethoscope.enable">programs.nethoscope</link>.
196+ </para>
197+ </listitem>
128 <listitem>
198 <listitem>
129 <para>
199 <para>
130 <link xlink:href="https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html">filebeat</link>,
200 <link xlink:href="https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html">filebeat</link>,
@@ -214,6 +284,15 @@
214 to be able to access the device.
284 to be able to access the device.
215 </para>
285 </para>
216 </listitem>
286 </listitem>
287+ <listitem>
288+ <para>
289+ <link xlink:href="https://github.com/mozilla-mobile/mozilla-vpn-client">mozillavpn</link>,
290+ the client for the
291+ <link xlink:href="https://vpn.mozilla.org/">Mozilla VPN</link>
292+ service. Available as
293+ <link xlink:href="options.html#opt-services.mozillavpn">services.mozillavpn</link>.
294+ </para>
295+ </listitem>
217 <listitem>
296 <listitem>
218 <para>
297 <para>
219 <link xlink:href="https://github.com/mgumz/mtr-exporter">mtr-exporter</link>,
298 <link xlink:href="https://github.com/mgumz/mtr-exporter">mtr-exporter</link>,
@@ -347,6 +426,14 @@
347 <link xlink:href="options.html#opt-services.headscale.enable">services.headscale</link>
426 <link xlink:href="options.html#opt-services.headscale.enable">services.headscale</link>
348 </para>
427 </para>
349 </listitem>
428 </listitem>
429+ <listitem>
430+ <para>
431+ <link xlink:href="https://github.com/lakinduakash/linux-wifi-hotspot">create_ap</link>,
432+ a module for creating wifi hotspots using the program
433+ linux-wifi-hotspot. Available as
434+ <link xlink:href="options.html#opt-services.create_ap.enable">services.create_ap</link>.
435+ </para>
436+ </listitem>
350 <listitem>
437 <listitem>
351 <para>
438 <para>
352 <link xlink:href="https://0xerr0r.github.io/blocky/">blocky</link>,
439 <link xlink:href="https://0xerr0r.github.io/blocky/">blocky</link>,
@@ -360,6 +447,14 @@
360 cluster resource manager
447 cluster resource manager
361 </para>
448 </para>
362 </listitem>
449 </listitem>
450+ <listitem>
451+ <para>
452+ <link xlink:href="https://nifi.apache.org">nifi</link>, an
453+ easy to use, powerful, and reliable system to process and
454+ distribute data. Available as
455+ <link xlink:href="options.html#opt-services.nifi.enable">services.nifi</link>.
456+ </para>
457+ </listitem>
363 </itemizedlist>
458 </itemizedlist>
364 </section>
459 </section>
365 <section xml:id="sec-release-22.05-incompatibilities">
460 <section xml:id="sec-release-22.05-incompatibilities">
@@ -427,6 +522,85 @@
427 new versions will release.
522 new versions will release.
428 </para>
523 </para>
429 </listitem>
524 </listitem>
525+ <listitem>
526+ <para>
527+ The configuration and state directories used by
528+ <literal>nixos-containers</literal> have been moved from
529+ <literal>/etc/containers</literal> and
530+ <literal>/var/lib/containers</literal> to
531+ <literal>/etc/nixos-containers</literal> and
532+ <literal>/var/lib/nixos-containers</literal>.
533+ </para>
534+ <para>
535+ If you are changing <literal>system.stateVersion</literal> to
536+ <literal>&quot;22.05&quot;</literal> manually on an existing
537+ system you are responsible for migrating these directories
538+ yourself.
539+ </para>
540+ <para>
541+ This is to improve compatibility with
542+ <literal>libcontainer</literal> based software such as Podman
543+ and Skopeo which assumes they have ownership over
544+ <literal>/etc/containers</literal>.
545+ </para>
546+ </listitem>
547+ <listitem>
548+ <para>
549+ For new installations
550+ <literal>virtualisation.oci-containers.backend</literal> is
551+ now set to <literal>podman</literal> by default. If you still
552+ want to use Docker on systems where
553+ <literal>system.stateVersion</literal> is set to to
554+ <literal>&quot;22.05&quot;</literal> set
555+ <literal>virtualisation.oci-containers.backend = &quot;docker&quot;;</literal>.Old
556+ systems with older <literal>stateVersion</literal>s stay with
557+ <quote>docker</quote>.
558+ </para>
559+ </listitem>
560+ <listitem>
561+ <para>
562+ <literal>security.klogd</literal> was removed. Logging of
563+ kernel messages is handled by systemd since Linux 3.5.
564+ </para>
565+ </listitem>
566+ <listitem>
567+ <para>
568+ <literal>pkgs.ssmtp</literal> has been dropped due to the
569+ program being unmaintained. <literal>pkgs.msmtp</literal> can
570+ be used instead as a substitute <literal>sendmail</literal>
571+ implementation. The corresponding options
572+ <literal>services.ssmtp.*</literal> have been removed as well.
573+ <literal>programs.msmtp.*</literal> can be used instead for an
574+ equivalent setup. For example:
575+ </para>
576+ <programlisting language="bash">
577+{
578+ # Original ssmtp configuration:
579+ services.ssmtp = {
580+ enable = true;
581+ useTLS = true;
582+ useSTARTTLS = true;
583+ hostName = &quot;smtp.example:587&quot;;
584+ authUser = &quot;someone&quot;;
585+ authPassFile = &quot;/secrets/password.txt&quot;;
586+ };
587+
588+ # Equivalent msmtp configuration:
589+ programs.msmtp = {
590+ enable = true;
591+ accounts.default = {
592+ tls = true;
593+ tls_starttls = true;
594+ auth = true;
595+ host = &quot;smtp.example&quot;;
596+ port = 587;
597+ user = &quot;someone&quot;;
598+ passwordeval = &quot;cat /secrets/password.txt&quot;;
599+ };
600+ };
601+}
602+</programlisting>
603+ </listitem>
430 <listitem>
604 <listitem>
431 <para>
605 <para>
432 <literal>services.kubernetes.addons.dashboard</literal> was
606 <literal>services.kubernetes.addons.dashboard</literal> was
@@ -444,6 +618,53 @@
444 relying on the insecure behaviour before upgrading.
618 relying on the insecure behaviour before upgrading.
445 </para>
619 </para>
446 </listitem>
620 </listitem>
621+ <listitem>
622+ <para>
623+ In the PowerDNS Recursor module
624+ (<literal>services.pdns-recursor</literal>), default values of
625+ several IP address-related NixOS options have been updated to
626+ match the default upstream behavior. In particular, Recursor
627+ by default will:
628+ </para>
629+ <itemizedlist spacing="compact">
630+ <listitem>
631+ <para>
632+ listen on (and allows connections from) both IPv4 and IPv6
633+ addresses
634+ (<literal>services.pdns-recursor.dns.address</literal>,
635+ <literal>services.pdns-recursor.dns.allowFrom</literal>);
636+ </para>
637+ </listitem>
638+ <listitem>
639+ <para>
640+ allow only local connections to the REST API server
641+ (<literal>services.pdns-recursor.api.allowFrom</literal>).
642+ </para>
643+ </listitem>
644+ </itemizedlist>
645+ </listitem>
646+ <listitem>
647+ <para>
648+ In the ncdns module, the default value of
649+ <literal>services.ncdns.address</literal> has been changed to
650+ the IPv6 loopback address (<literal>::1</literal>).
651+ </para>
652+ </listitem>
653+ <listitem>
654+ <para>
655+ <literal>openssh</literal> has been update to 8.9p1, changing
656+ the FIDO security key middleware interface.
657+ </para>
658+ </listitem>
659+ <listitem>
660+ <para>
661+ <literal>git</literal> no longer hardcodes the path to
662+ openssh’ ssh binary to reduce the amount of rebuilds. If you
663+ are using git with ssh remotes and do not have a ssh binary in
664+ your enviroment consider adding <literal>openssh</literal> to
665+ it or switching to <literal>gitFull</literal>.
666+ </para>
667+ </listitem>
447 <listitem>
668 <listitem>
448 <para>
669 <para>
449 <literal>services.k3s.enable</literal> no longer implies
670 <literal>services.k3s.enable</literal> no longer implies
@@ -476,6 +697,13 @@
476}
697}
477</programlisting>
698</programlisting>
478 </listitem>
699 </listitem>
700+ <listitem>
701+ <para>
702+ <literal>services.prometheus.alertManagerTimeout</literal> has
703+ been removed as it has been deprecated upstream and has no
704+ effect.
705+ </para>
706+ </listitem>
479 <listitem>
707 <listitem>
480 <para>
708 <para>
481 The DHCP server (<literal>services.dhcpd4</literal>,
709 The DHCP server (<literal>services.dhcpd4</literal>,
@@ -509,6 +737,24 @@
509 work.
737 work.
510 </para>
738 </para>
511 </listitem>
739 </listitem>
740+ <listitem>
741+ <para>
742+ <literal>hbase</literal> version 0.98.24 has been removed. The
743+ package now defaults to version 2.4.11. Versions 1.7.1 and
744+ 3.0.0-alpha-2 are also available.
745+ </para>
746+ </listitem>
747+ <listitem>
748+ <para>
749+ <literal>services.paperless-ng</literal> was renamed to
750+ <literal>services.paperless</literal>. Accordingly, the
751+ <literal>paperless-ng-manage</literal> script (located in
752+ <literal>dataDir</literal>) was renamed to
753+ <literal>paperless-manage</literal>.
754+ <literal>services.paperless</literal> now uses
755+ <literal>paperless-ngx</literal>.
756+ </para>
757+ </listitem>
512 <listitem>
758 <listitem>
513 <para>
759 <para>
514 The <literal>matrix-synapse</literal> service
760 The <literal>matrix-synapse</literal> service
@@ -631,6 +877,136 @@
631 to the new location if the <literal>stateVersion</literal> is
877 to the new location if the <literal>stateVersion</literal> is
632 updated.
878 updated.
633 </para>
879 </para>
880+ <para>
881+ As of Synapse 1.58.0, the old groups/communities feature has
882+ been disabled by default. It will be completely removed with
883+ Synapse 1.61.0.
884+ </para>
885+ </listitem>
886+ <listitem>
887+ <para>
888+ The Keycloak package (<literal>pkgs.keycloak</literal>) has
889+ been switched from the Wildfly version, which will soon be
890+ deprecated, to the Quarkus based version. The Keycloak service
891+ (<literal>services.keycloak</literal>) has been updated to
892+ accommodate the change and now differs from the previous
893+ version in a few ways:
894+ </para>
895+ <itemizedlist>
896+ <listitem>
897+ <para>
898+ <literal>services.keycloak.extraConfig</literal> has been
899+ removed in favor of the new
900+ <link xlink:href="https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md">settings-style</link>
901+ <link linkend="opt-services.keycloak.settings"><literal>services.keycloak.settings</literal></link>
902+ option. The available options correspond directly to
903+ parameters in <literal>conf/keycloak.conf</literal>. Some
904+ of the most important parameters are documented as
905+ suboptions, the rest can be found in the
906+ <link xlink:href="https://www.keycloak.org/server/all-config">All
907+ configuration section of the Keycloak Server Installation
908+ and Configuration Guide</link>. While the new
909+ configuration is much simpler and cleaner than the old
910+ JBoss CLI one, this unfortunately mean that there’s no
911+ straightforward way to convert an old configuration to the
912+ new format and some settings may not even be available
913+ anymore.
914+ </para>
915+ </listitem>
916+ <listitem>
917+ <para>
918+ <literal>services.keycloak.frontendUrl</literal> was
919+ removed and the frontend URL is now configured through the
920+ <literal>hostname</literal> family of settings in
921+ <link linkend="opt-services.keycloak.settings"><literal>services.keycloak.settings</literal></link>
922+ instead. See the
923+ <link xlink:href="https://www.keycloak.org/server/hostname">Hostname
924+ section of the Keycloak Server Installation and
925+ Configuration Guide</link> for more details. Additionally,
926+ <literal>/auth</literal> was removed from the default
927+ context path and needs to be added back in
928+ <link linkend="opt-services.keycloak.settings.http-relative-path"><literal>services.keycloak.settings.http-relative-path</literal></link>
929+ if you want to keep compatibility with your current
930+ clients.
931+ </para>
932+ </listitem>
933+ <listitem>
934+ <para>
935+ <literal>services.keycloak.bindAddress</literal>,
936+ <literal>services.keycloak.forceBackendUrlToFrontendUrl</literal>,
937+ <literal>services.keycloak.httpPort</literal> and
938+ <literal>services.keycloak.httpsPort</literal> have been
939+ removed in favor of their equivalent options in
940+ <link linkend="opt-services.keycloak.settings"><literal>services.keycloak.settings</literal></link>.
941+ <literal>httpPort</literal> and
942+ <literal>httpsPort</literal> have additionally had their
943+ types changed from <literal>str</literal> to
944+ <literal>port</literal>.
945+ </para>
946+ <para>
947+ The new names are as follows:
948+ </para>
949+ <itemizedlist spacing="compact">
950+ <listitem>
951+ <para>
952+ <literal>bindAddress</literal>:
953+ <link linkend="opt-services.keycloak.settings.http-host"><literal>services.keycloak.settings.http-host</literal></link>
954+ </para>
955+ </listitem>
956+ <listitem>
957+ <para>
958+ <literal>forceBackendUrlToFrontendUrl</literal>:
959+ <link linkend="opt-services.keycloak.settings.hostname-strict-backchannel"><literal>services.keycloak.settings.hostname-strict-backchannel</literal></link>
960+ </para>
961+ </listitem>
962+ <listitem>
963+ <para>
964+ <literal>httpPort</literal>:
965+ <link linkend="opt-services.keycloak.settings.http-port"><literal>services.keycloak.settings.http-port</literal></link>
966+ </para>
967+ </listitem>
968+ <listitem>
969+ <para>
970+ <literal>httpsPort</literal>:
971+ <link linkend="opt-services.keycloak.settings.https-port"><literal>services.keycloak.settings.https-port</literal></link>
972+ </para>
973+ </listitem>
974+ </itemizedlist>
975+ </listitem>
976+ </itemizedlist>
977+ <para>
978+ For example, when using a reverse proxy the migration could
979+ look like this:
980+ </para>
981+ <para>
982+ Before:
983+ </para>
984+ <programlisting language="bash">
985+ services.keycloak = {
986+ enable = true;
987+ httpPort = &quot;8080&quot;;
988+ frontendUrl = &quot;https://keycloak.example.com/auth&quot;;
989+ database.passwordFile = &quot;/run/keys/db_password&quot;;
990+ extraConfig = {
991+ &quot;subsystem=undertow&quot;.&quot;server=default-server&quot;.&quot;http-listener=default&quot;.proxy-address-forwarding = true;
992+ };
993+ };
994+</programlisting>
995+ <para>
996+ After:
997+ </para>
998+ <programlisting language="bash">
999+ services.keycloak = {
1000+ enable = true;
1001+ settings = {
1002+ http-port = 8080;
1003+ hostname = &quot;keycloak.example.com&quot;;
1004+ http-relative-path = &quot;/auth&quot;;
1005+ proxy = &quot;edge&quot;;
1006+ };
1007+ database.passwordFile = &quot;/run/keys/db_password&quot;;
1008+ };
1009+</programlisting>
634 </listitem>
1010 </listitem>
635 <listitem>
1011 <listitem>
636 <para>
1012 <para>
@@ -766,6 +1142,14 @@
766 <literal>admin</literal> and <literal>password</literal>.
1142 <literal>admin</literal> and <literal>password</literal>.
767 </para>
1143 </para>
768 </listitem>
1144 </listitem>
1145+ <listitem>
1146+ <para>
1147+ The <literal>taskserver</literal> module no longer implicitly
1148+ opens ports in the firewall configuration. This is now
1149+ controlled through the option
1150+ <literal>services.taskserver.openFirewall</literal>.
1151+ </para>
1152+ </listitem>
769 <listitem>
1153 <listitem>
770 <para>
1154 <para>
771 The <literal>autorestic</literal> package has been upgraded
1155 The <literal>autorestic</literal> package has been upgraded
@@ -968,6 +1352,14 @@
968 <literal>systemd.nspawn.&lt;name&gt;.execConfig.PrivateUsers = false</literal>
1352 <literal>systemd.nspawn.&lt;name&gt;.execConfig.PrivateUsers = false</literal>
969 </para>
1353 </para>
970 </listitem>
1354 </listitem>
1355+ <listitem>
1356+ <para>
1357+ <literal>systemd-shutdown</literal> is now properly linked on
1358+ shutdown to unmount all filesystems and device mapper devices
1359+ cleanly. This can be disabled using
1360+ <literal>systemd.shutdownRamfs.enable</literal>.
1361+ </para>
1362+ </listitem>
971 <listitem>
1363 <listitem>
972 <para>
1364 <para>
973 The Tor SOCKS proxy is now actually disabled if
1365 The Tor SOCKS proxy is now actually disabled if
@@ -978,6 +1370,15 @@
978 <literal>true</literal>.
1370 <literal>true</literal>.
979 </para>
1371 </para>
980 </listitem>
1372 </listitem>
1373+ <listitem>
1374+ <para>
1375+ <literal>services.github-runner</literal> has been hardened.
1376+ Notably address families and system calls have been
1377+ restricted, which may adversely affect some kinds of testing,
1378+ e.g. using <literal>AF_BLUETOOTH</literal> to test bluetooth
1379+ devices.
1380+ </para>
1381+ </listitem>
981 <listitem>
1382 <listitem>
982 <para>
1383 <para>
983 The terraform 0.12 compatibility has been removed and the
1384 The terraform 0.12 compatibility has been removed and the
@@ -1022,6 +1423,16 @@
1022 <literal>otelcorecol</literal> and enjoy a 7x smaller binary.
1423 <literal>otelcorecol</literal> and enjoy a 7x smaller binary.
1023 </para>
1424 </para>
1024 </listitem>
1425 </listitem>
1426+ <listitem>
1427+ <para>
1428+ <literal>services.zookeeper</literal> has a new option
1429+ <literal>jre</literal> for specifying the JRE to start
1430+ zookeeper with. It defaults to the JRE that
1431+ <literal>pkgs.zookeeper</literal> was wrapped with, instead of
1432+ <literal>pkgs.jre</literal>. This changes the JRE to
1433+ <literal>pkgs.jdk11_headless</literal> by default.
1434+ </para>
1435+ </listitem>
1025 <listitem>
1436 <listitem>
1026 <para>
1437 <para>
1027 <literal>pkgs.pgadmin</literal> now refers to
1438 <literal>pkgs.pgadmin</literal> now refers to
@@ -1268,6 +1679,33 @@
1268 example.
1679 example.
1269 </para>
1680 </para>
1270 </listitem>
1681 </listitem>
1682+ <listitem>
1683+ <para>
1684+ Existing <literal>resholve*</literal> functions have been
1685+ renamed and nested under <literal>pkgs.resholve</literal>.
1686+ Update uses to:
1687+ </para>
1688+ <itemizedlist spacing="compact">
1689+ <listitem>
1690+ <para>
1691+ <literal>resholvePackage</literal> -&gt;
1692+ <literal>resholve.mkDerivation</literal>
1693+ </para>
1694+ </listitem>
1695+ <listitem>
1696+ <para>
1697+ <literal>resholveScript</literal> -&gt;
1698+ <literal>resholve.writeScript</literal>
1699+ </para>
1700+ </listitem>
1701+ <listitem>
1702+ <para>
1703+ <literal>resholveScriptBin</literal> -&gt;
1704+ <literal>resholve.writeScriptBin</literal>
1705+ </para>
1706+ </listitem>
1707+ </itemizedlist>
1708+ </listitem>
1271 <listitem>
1709 <listitem>
1272 <para>
1710 <para>
1273 <literal>pkgs.cosmopolitan</literal> no longer provides the
1711 <literal>pkgs.cosmopolitan</literal> no longer provides the
@@ -1275,6 +1713,17 @@
1275 <literal>pkgs.cosmoc</literal>.
1713 <literal>pkgs.cosmoc</literal>.
1276 </para>
1714 </para>
1277 </listitem>
1715 </listitem>
1716+ <listitem>
1717+ <para>
1718+ <literal>pkgs.graalvmXX-ce</literal> packages no longer
1719+ provide support for Python/Ruby/WASM, instead focusing only in
1720+ Java and Native Image Support. If you need to add support
1721+ back, please see the
1722+ <literal>pkgs.graalvmCEPackages.mkGraal</literal> function to
1723+ create your own customized version of GraalVM with support for
1724+ what you need.
1725+ </para>
1726+ </listitem>
1278 </itemizedlist>
1727 </itemizedlist>
1279 </section>
1728 </section>
1280 <section xml:id="sec-release-22.05-notable-changes">
1729 <section xml:id="sec-release-22.05-notable-changes">
@@ -1388,6 +1837,14 @@
1388 </listitem>
1837 </listitem>
1389 </itemizedlist>
1838 </itemizedlist>
1390 </listitem>
1839 </listitem>
1840+ <listitem>
1841+ <para>
1842+ The auto-upgrade service now accepts persistent (default:
1843+ true) parameter. By default auto-upgrade will now run
1844+ immediately if it would have been triggered at least once
1845+ during the time when the timer was inactive.
1846+ </para>
1847+ </listitem>
1391 <listitem>
1848 <listitem>
1392 <para>
1849 <para>
1393 If you are using Wayland you can choose to use the Ozone
1850 If you are using Wayland you can choose to use the Ozone
@@ -1454,6 +1911,15 @@
1454 takes a list of strings instead of a string.
1911 takes a list of strings instead of a string.
1455 </para>
1912 </para>
1456 </listitem>
1913 </listitem>
1914+ <listitem>
1915+ <para>
1916+ The <literal>asterisk</literal> and
1917+ <literal>asterisk-stable</literal> packages were switched from
1918+ <literal>asterisk_18</literal> to the newly-packaged
1919+ <literal>asterisk_19</literal>. Asterisk 13 and 17 have been
1920+ removed as they have reached their end of life.
1921+ </para>
1922+ </listitem>
1457 <listitem>
1923 <listitem>
1458 <para>
1924 <para>
1459 The <literal>services.unifi.openPorts</literal> option default
1925 The <literal>services.unifi.openPorts</literal> option default
@@ -1512,9 +1978,11 @@
1512 <para>
1978 <para>
1513 <link linkend="opt-programs.ssh.knownHosts">programs.ssh.knownHosts</link>
1979 <link linkend="opt-programs.ssh.knownHosts">programs.ssh.knownHosts</link>
1514 has gained an <literal>extraHostNames</literal> option to
1980 has gained an <literal>extraHostNames</literal> option to
1515− replace <literal>hostNames</literal>.
1981+ augment <literal>hostNames</literal>. It is now possible to
1516− <literal>hostNames</literal> is deprecated, but still
1982+ use the attribute name of a <literal>knownHosts</literal>
1517− available for now.
1983+ entry as the primary host name and specify secondary host
1984+ names using <literal>extraHostNames</literal> without having
1985+ to duplicate the primary host name.
1518 </para>
1986 </para>
1519 </listitem>
1987 </listitem>
1520 <listitem>
1988 <listitem>
@@ -1525,6 +1993,36 @@
1525 configuration.
1993 configuration.
1526 </para>
1994 </para>
1527 </listitem>
1995 </listitem>
1996+ <listitem>
1997+ <para>
1998+ The option
1999+ <link linkend="opt-services.xserver.desktopManager.runXdgAutostartIfNone">services.xserver.desktopManager.runXdgAutostartIfNone</link>
2000+ was added in order to automatically run XDG autostart files
2001+ for sessions without a desktop manager. This replaces helpers
2002+ like the <literal>dex</literal> package.
2003+ </para>
2004+ </listitem>
2005+ <listitem>
2006+ <para>
2007+ When setting
2008+ <link linkend="opt-i18n.inputMethod.enabled">i18n.inputMethod.enabled</link>
2009+ to <literal>fcitx5</literal>, it no longer creates
2010+ corresponding systemd user services. It now relies on XDG
2011+ autostart files to start and work properly in your desktop
2012+ sessions. If you are using only a window manager without a
2013+ desktop manager, you need to enable
2014+ <literal>services.xserver.desktopManager.runXdgAutostartIfNone</literal>
2015+ or using the <literal>dex</literal> package to make
2016+ <literal>fcitx5</literal> work.
2017+ </para>
2018+ </listitem>
2019+ <listitem>
2020+ <para>
2021+ A new module was added for the Envoy reverse proxy, providing
2022+ the options <literal>services.envoy.enable</literal> and
2023+ <literal>services.envoy.settings</literal>.
2024+ </para>
2025+ </listitem>
1528 <listitem>
2026 <listitem>
1529 <para>
2027 <para>
1530 The option <literal>services.duplicati.dataDir</literal> has
2028 The option <literal>services.duplicati.dataDir</literal> has
@@ -1549,10 +2047,51 @@
1549 </listitem>
2047 </listitem>
1550 <listitem>
2048 <listitem>
1551 <para>
2049 <para>
1552− ORY Kratos was updated to version 0.8.3-alpha.1.pre.0, which
2050+ ORY Kratos was updated to version 0.9.0-alpha.3, which
1553 introduces some breaking changes:
2051 introduces some breaking changes:
1554 </para>
2052 </para>
1555 <itemizedlist spacing="compact">
2053 <itemizedlist spacing="compact">
2054+ <listitem>
2055+ <para>
2056+ All endpoints at the Admin API are now exposed at
2057+ <literal>/admin/</literal>. For example, endpoint
2058+ <literal>https://kratos:4434/identities</literal> is now
2059+ exposed at
2060+ <literal>https://kratos:4434/admin/identities</literal>
2061+ </para>
2062+ </listitem>
2063+ <listitem>
2064+ <para>
2065+ Configuration key
2066+ <literal>selfservice.whitelisted_return_urls</literal> has
2067+ been renamed to <literal>allowed_return_urls</literal>
2068+ </para>
2069+ </listitem>
2070+ <listitem>
2071+ <para>
2072+ The <literal>password_identifier</literal> form field of
2073+ the password login strategy has been renamed to
2074+ <literal>identifier</literal> to make compatibility with
2075+ passwordless flows possible.
2076+ </para>
2077+ </listitem>
2078+ <listitem>
2079+ <para>
2080+ Instead of having a global
2081+ <literal>default_schema_url</literal> which developers
2082+ used to update their schema, you now need to define the
2083+ <literal>default_schema_id</literal> which must reference
2084+ schema ID in your config.
2085+ </para>
2086+ </listitem>
2087+ <listitem>
2088+ <para>
2089+ Calling <literal>/self-service/recovery</literal> without
2090+ flow ID or with an invalid flow ID while authenticated
2091+ will now respond with an error instead of redirecting to
2092+ the default page.
2093+ </para>
2094+ </listitem>
1556 <listitem>
2095 <listitem>
1557 <para>
2096 <para>
1558 If you are relying on the SQLite images, update your
2097 If you are relying on the SQLite images, update your
@@ -1589,6 +2128,18 @@
1589 Notes for v0.8.2-alpha-1</link>
2128 Notes for v0.8.2-alpha-1</link>
1590 </para>
2129 </para>
1591 </listitem>
2130 </listitem>
2131+ <listitem>
2132+ <para>
2133+ <link xlink:href="https://github.com/ory/kratos/releases/tag/v0.9.0-alpha.1">Release
2134+ Notes for v0.9.0-alpha-1</link>
2135+ </para>
2136+ </listitem>
2137+ <listitem>
2138+ <para>
2139+ <link xlink:href="https://github.com/ory/kratos/releases/tag/v0.9.0-alpha.3">Release
2140+ Notes for v0.9.0-alpha-3</link>
2141+ </para>
2142+ </listitem>
1592 </itemizedlist>
2143 </itemizedlist>
1593 </listitem>
2144 </listitem>
1594 </itemizedlist>
2145 </itemizedlist>
@@ -1602,6 +2153,13 @@
1602 <literal>true</literal>.
2153 <literal>true</literal>.
1603 </para>
2154 </para>
1604 </listitem>
2155 </listitem>
2156+ <listitem>
2157+ <para>
2158+ A module for declarative configuration of openconnect VPN
2159+ profiles was added under
2160+ <literal>networking.openconnect</literal>.
2161+ </para>
2162+ </listitem>
1605 <listitem>
2163 <listitem>
1606 <para>
2164 <para>
1607 The <literal>element-desktop</literal> package now has an
2165 The <literal>element-desktop</literal> package now has an
@@ -1700,6 +2258,21 @@
1700 should now be used instead.
2258 should now be used instead.
1701 </para>
2259 </para>
1702 </listitem>
2260 </listitem>
2261+ <listitem>
2262+ <para>
2263+ <literal>security.pam.ussh</literal> has been added, which
2264+ allows authorizing PAM sessions based on SSH
2265+ <emphasis>certificates</emphasis> held within an SSH agent,
2266+ using
2267+ <link xlink:href="https://github.com/uber/pam-ussh">pam-ussh</link>.
2268+ </para>
2269+ </listitem>
2270+ <listitem>
2271+ <para>
2272+ The <literal>vscode-extensions.ionide.ionide-fsharp</literal>
2273+ package has been updated to 6.0.0 and now requires .NET 6.0.
2274+ </para>
2275+ </listitem>
1703 <listitem>
2276 <listitem>
1704 <para>
2277 <para>
1705 The <literal>zrepl</literal> package has been updated from
2278 The <literal>zrepl</literal> package has been updated from
@@ -1725,6 +2298,24 @@
1725 </listitem>
2298 </listitem>
1726 </itemizedlist>
2299 </itemizedlist>
1727 </listitem>
2300 </listitem>
2301+ <listitem>
2302+ <para>
2303+ The <literal>polybar</literal> package has been updated from
2304+ 3.5.7 to 3.6.2. See
2305+ <link xlink:href="https://github.com/polybar/polybar/releases/tag/3.6.0">the
2306+ changelog</link> for more details.
2307+ </para>
2308+ <itemizedlist spacing="compact">
2309+ <listitem>
2310+ <para>
2311+ Breaking changes include changes to escaping rules in
2312+ configuration values, changes in behavior when
2313+ encountering invalid tag names, and changes to
2314+ inter-process-messaging (IPC).
2315+ </para>
2316+ </listitem>
2317+ </itemizedlist>
2318+ </listitem>
1728 <listitem>
2319 <listitem>
1729 <para>
2320 <para>
1730 Renamed option
2321 Renamed option
@@ -1780,6 +2371,27 @@
1780 desktop environments as needed.
2371 desktop environments as needed.
1781 </para>
2372 </para>
1782 </listitem>
2373 </listitem>
2374+ <listitem>
2375+ <para>
2376+ xfsprogs was update to version 5.15, which enables inobtcount
2377+ and bigtime by default on filesystem creation. Support for
2378+ these features was added in kernel 5.10 and deemed stable in
2379+ kernel 5.15. If you want to be able to mount XFS filesystems
2380+ created with this release of xfsprogs on kernel releases older
2381+ than 5.10, you need to format them with
2382+ <literal>mkfs.xfs -m bigtime=0 -m inobtcount=0</literal>.
2383+ </para>
2384+ </listitem>
2385+ <listitem>
2386+ <para>
2387+ <literal>services.xserver.desktopManager.xfce</literal> now
2388+ includes Xfce’s screen locker,
2389+ <literal>xfce4-screensaver</literal> that is enabled by
2390+ default. You can disable it by setting
2391+ <literal>false</literal> to
2392+ <link linkend="opt-services.xserver.desktopManager.xfce.enableScreensaver">services.xserver.desktopManager.xfce.enableScreensaver</link>.
2393+ </para>
2394+ </listitem>
1783 <listitem>
2395 <listitem>
1784 <para>
2396 <para>
1785 The <literal>hadoop</literal> package has added support for
2397 The <literal>hadoop</literal> package has added support for
@@ -1795,6 +2407,24 @@
1795 (<link xlink:href="https://github.com/NixOS/nixpkgs/pull/158992">#158992</link>).
2407 (<link xlink:href="https://github.com/NixOS/nixpkgs/pull/158992">#158992</link>).
1796 </para>
2408 </para>
1797 </listitem>
2409 </listitem>
2410+ <listitem>
2411+ <para>
2412+ The <literal>nss</literal> package was split into
2413+ <literal>nss_esr</literal> and <literal>nss_latest</literal>,
2414+ with <literal>nss</literal> being an alias for
2415+ <literal>nss_esr</literal>. This was done to ease maintenance
2416+ of <literal>nss</literal> and dependent high-profile packages
2417+ like <literal>firefox</literal>.
2418+ </para>
2419+ </listitem>
2420+ <listitem>
2421+ <para>
2422+ The Nextcloud module now supports to create a Mysql database
2423+ automatically with
2424+ <literal>services.nextcloud.database.createLocally</literal>
2425+ enabled.
2426+ </para>
2427+ </listitem>
1798 <listitem>
2428 <listitem>
1799 <para>
2429 <para>
1800 The <literal>spark3</literal> package has been updated from
2430 The <literal>spark3</literal> package has been updated from
@@ -1826,6 +2456,15 @@
1826 generating host-global NNCP configuration.
2456 generating host-global NNCP configuration.
1827 </para>
2457 </para>
1828 </listitem>
2458 </listitem>
2459+ <listitem>
2460+ <para>
2461+ The option <literal>services.snapserver.openFirewall</literal>
2462+ will no longer default to <literal>true</literal> starting
2463+ with NixOS 22.11. Enable it explicitly if you need to control
2464+ Snapserver remotely or connect streamig clients from other
2465+ hosts.
2466+ </para>
2467+ </listitem>
1829 </itemizedlist>
2468 </itemizedlist>
1830 </section>
2469 </section>
1831</section>
2470</section>
nixos/doc/manual/development/building-nixos.chapter.md → nixos/doc/manual/installation/building-nixos.chapter.mdrenamed+31
@@ -30,6 +30,37 @@ To check the content of an ISO image, mount it like so:
30# mount -o loop -t iso9660 ./result/iso/cd.iso /mnt/iso
30# mount -o loop -t iso9660 ./result/iso/cd.iso /mnt/iso
31```
31```
32
32
33+## Additional drivers or firmware {#sec-building-image-drivers}
34+
35+If you need additional (non-distributable) drivers or firmware in the
36+installer, you might want to extend these configurations.
37+
38+For example, to build the GNOME graphical installer ISO, but with support for
39+certain WiFi adapters present in some MacBooks, you can create the following
40+file at `modules/installer/cd-dvd/installation-cd-graphical-gnome-macbook.nix`:
41+
42+```nix
43+{ config, ... }:
44+
45+{
46+ imports = [ ./installation-cd-graphical-gnome.nix ];
47+
48+ boot.initrd.kernelModules = [ "wl" ];
49+
50+ boot.kernelModules = [ "kvm-intel" "wl" ];
51+ boot.extraModulePackages = [ config.boot.kernelPackages.broadcom_sta ];
52+}
53+```
54+
55+Then build it like in the example above:
56+
57+```ShellSession
58+$ git clone https://github.com/NixOS/nixpkgs.git
59+$ cd nixpkgs/nixos
60+$ export NIXPKGS_ALLOW_UNFREE=1
61+$ nix-build -A config.system.build.isoImage -I nixos-config=modules/installer/cd-dvd/installation-cd-graphical-gnome-macbook.nix default.nix
62+```
63+
33## Technical Notes {#sec-building-image-tech-notes}
64## Technical Notes {#sec-building-image-tech-notes}
34
65
35The config value enforcement is implemented via `mkImageMediaOverride = mkOverride 60;`
66The config value enforcement is implemented via `mkImageMediaOverride = mkOverride 60;`
nixos/doc/manual/installation/installation.xml+1
@@ -14,4 +14,5 @@
14 <xi:include href="../from_md/installation/installing.chapter.xml" />
14 <xi:include href="../from_md/installation/installing.chapter.xml" />
15 <xi:include href="../from_md/installation/changing-config.chapter.xml" />
15 <xi:include href="../from_md/installation/changing-config.chapter.xml" />
16 <xi:include href="../from_md/installation/upgrading.chapter.xml" />
16 <xi:include href="../from_md/installation/upgrading.chapter.xml" />
17+ <xi:include href="../from_md/installation/building-nixos.chapter.xml" />
17</part>
18</part>
nixos/doc/manual/installation/installing.chapter.md+5−5
@@ -296,6 +296,11 @@ Use the following commands:
296 specify on which disk the GRUB boot loader is to be installed.
296 specify on which disk the GRUB boot loader is to be installed.
297 Without it, NixOS cannot boot.
297 Without it, NixOS cannot boot.
298
298
299+ : If there are other operating systems running on the machine before
300+ installing NixOS, the [](#opt-boot.loader.grub.useOSProber)
301+ option can be set to `true` to automatically add them to the grub
302+ menu.
303+
299 UEFI systems
304 UEFI systems
300
305
301 : You *must* set the option [](#opt-boot.loader.systemd-boot.enable)
306 : You *must* set the option [](#opt-boot.loader.systemd-boot.enable)
@@ -307,11 +312,6 @@ Use the following commands:
307 [`boot.loader.systemd-boot`](#opt-boot.loader.systemd-boot.enable)
312 [`boot.loader.systemd-boot`](#opt-boot.loader.systemd-boot.enable)
308 as well.
313 as well.
309
314
310− If there are other operating systems running on the machine before
311− installing NixOS, the [](#opt-boot.loader.grub.useOSProber)
312− option can be set to `true` to automatically add them to the grub
313− menu.
314−
315 If you need to configure networking for your machine the
315 If you need to configure networking for your machine the
316 configuration options are described in [](#sec-networking). In
316 configuration options are described in [](#sec-networking). In
317 particular, while wifi is supported on the installation image, it is
317 particular, while wifi is supported on the installation image, it is
nixos/doc/manual/man-nixos-rebuild.xml+8
@@ -548,6 +548,14 @@
548 (<replaceable>user@host</replaceable>). You can also set ssh options by
548 (<replaceable>user@host</replaceable>). You can also set ssh options by
549 defining the <envar>NIX_SSHOPTS</envar> environment variable.
549 defining the <envar>NIX_SSHOPTS</envar> environment variable.
550 </para>
550 </para>
551+
552+ <para>
553+ Note that <command>nixos-rebuild</command> honors the
554+ <literal>nixpkgs.crossSystem</literal> setting of the given configuration
555+ but disregards the true architecture of the target host. Hence the
556+ <literal>nixpkgs.crossSystem</literal> setting has to match the target
557+ platform or else activation will fail.
558+ </para>
551 </listitem>
559 </listitem>
552 </varlistentry>
560 </varlistentry>
553
561
nixos/doc/manual/md-to-db.sh+1−1
@@ -1,5 +1,5 @@
1#! /usr/bin/env nix-shell
1#! /usr/bin/env nix-shell
2−#! nix-shell -I nixpkgs=channel:nixpkgs-unstable -i bash -p pandoc
2+#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/tarball/21.11 -i bash -p pandoc
3
3
4# This script is temporarily needed while we transition the manual to
4# This script is temporarily needed while we transition the manual to
5# CommonMark. It converts the .md files in the regular manual folder
5# CommonMark. It converts the .md files in the regular manual folder
nixos/doc/manual/release-notes/rl-1803.section.md+2
@@ -282,3 +282,5 @@ When upgrading from a previous release, please be aware of the following incompa
282- The NixOS test driver supports user services declared by `systemd.user.services`. The methods `waitForUnit`, `getUnitInfo`, `startJob` and `stopJob` provide an optional `$user` argument for that purpose.
282- The NixOS test driver supports user services declared by `systemd.user.services`. The methods `waitForUnit`, `getUnitInfo`, `startJob` and `stopJob` provide an optional `$user` argument for that purpose.
283
283
284- Enabling bash completion on NixOS, `programs.bash.enableCompletion`, will now also enable completion for the Nix command line tools by installing the [nix-bash-completions](https://github.com/hedning/nix-bash-completions) package.
284- Enabling bash completion on NixOS, `programs.bash.enableCompletion`, will now also enable completion for the Nix command line tools by installing the [nix-bash-completions](https://github.com/hedning/nix-bash-completions) package.
285+
286+- The vim/kakoune plugin updater now reads from a CSV file: check `pkgs/applications/editors/vim/plugins/vim-plugin-names` out to see the new format
nixos/doc/manual/release-notes/rl-2205.section.md+251−2
@@ -17,6 +17,21 @@ In addition to numerous new and upgraded packages, this release has the followin
17
17
18- 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.
18- 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.
19
19
20+- `stdenv.mkDerivation` now supports a self-referencing `finalAttrs:` parameter
21+ containing the final `mkDerivation` arguments including overrides.
22+ `drv.overrideAttrs` now supports two parameters `finalAttrs: previousAttrs:`.
23+ This allows packaging configuration to be overridden in a consistent manner by
24+ providing an alternative to `rec {}` syntax.
25+
26+ Additionally, `passthru` can now reference `finalAttrs.finalPackage` containing
27+ the final package, including attributes such as the output paths and
28+ `overrideAttrs`.
29+
30+ New language integrations can be simplified by overriding a "prototype"
31+ package containing the language-specific logic. This removes the need for a
32+ extra layer of overriding for the "generic builder" arguments, thus removing a
33+ usability problem and source of error.
34+
20- PHP 8.1 is now available
35- PHP 8.1 is now available
21
36
22- 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).
37- 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).
@@ -25,12 +40,21 @@ In addition to numerous new and upgraded packages, this release has the followin
25
40
26- systemd services can now set [systemd.services.\<name\>.reloadTriggers](#opt-systemd.services) instead of `reloadIfChanged` for a more granular distinction between reloads and restarts.
41- systemd services can now set [systemd.services.\<name\>.reloadTriggers](#opt-systemd.services) instead of `reloadIfChanged` for a more granular distinction between reloads and restarts.
27
42
43+- Systemd has been upgraded to the version 250.
44+
45+- Pulseaudio has been upgraded to version 15.0 and now optionally [supports additional Bluetooth audio codecs](https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/15.0/#supportforldacandaptxbluetoothcodecsplussbcxqsbcwithhigher-qualityparameters) like aptX or LDAC, with codec switching support being available in `pavucontrol`. This feature is disabled by default but can be enabled by using `hardware.pulseaudio.package = pkgs.pulseaudioFull;`.
46+ Existing 3rd party modules that provided similar functionality, like `pulseaudio-modules-bt` or `pulseaudio-hsphfpd` are deprecated and have been removed.
47+
48+- The new [`postgresqlTestHook`](https://nixos.org/manual/nixpkgs/stable/#sec-postgresqlTestHook) runs a PostgreSQL server for the duration of package checks.
49+
28- [`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.
50- [`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.
29
51
30- Module authors can use `mkRenamedOptionModuleWith` to automate the deprecation cycle without annoying out-of-tree module authors and their users.
52- Module authors can use `mkRenamedOptionModuleWith` to automate the deprecation cycle without annoying out-of-tree module authors and their users.
31
53
32- The default GHC version has been updated from 8.10.7 to 9.0.2. `pkgs.haskellPackages` and `pkgs.ghc` will now use this version by default.
54- The default GHC version has been updated from 8.10.7 to 9.0.2. `pkgs.haskellPackages` and `pkgs.ghc` will now use this version by default.
33
55
56+- The GNOME and Plasma installation CDs now use `pkgs.calamares` and `pkgs.calamares-nixos-extensions` to allow users to easily install and set up NixOS with a GUI.
57+
34## New Services {#sec-release-22.05-new-services}
58## New Services {#sec-release-22.05-new-services}
35
59
36- [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).
60- [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).
@@ -39,6 +63,8 @@ In addition to numerous new and upgraded packages, this release has the followin
39
63
40- [matrix-conduit](https://conduit.rs/), a simple, fast and reliable chat server powered by matrix. Available as [services.matrix-conduit](option.html#opt-services.matrix-conduit.enable).
64- [matrix-conduit](https://conduit.rs/), a simple, fast and reliable chat server powered by matrix. Available as [services.matrix-conduit](option.html#opt-services.matrix-conduit.enable).
41
65
66+- [nethoscope](https://github.com/vvilhonen/nethoscope), listen to your network traffic. Available as [programs.nethoscope](#opt-programs.nethoscope.enable).
67+
42- [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).
68- [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).
43
69
44- [apfs](https://github.com/linux-apfs/linux-apfs-rw), a kernel module for mounting the Apple File System (APFS).
70- [apfs](https://github.com/linux-apfs/linux-apfs-rw), a kernel module for mounting the Apple File System (APFS).
@@ -63,6 +89,8 @@ In addition to numerous new and upgraded packages, this release has the followin
63
89
64- [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.
90- [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.
65
91
92+- [mozillavpn](https://github.com/mozilla-mobile/mozilla-vpn-client), the client for the [Mozilla VPN](https://vpn.mozilla.org/) service. Available as [services.mozillavpn](options.html#opt-services.mozillavpn).
93+
66- [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).
94- [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).
67
95
68- [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).
96- [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).
@@ -99,10 +127,14 @@ In addition to numerous new and upgraded packages, this release has the followin
99
127
100- [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)
128- [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)
101
129
130+- [create_ap](https://github.com/lakinduakash/linux-wifi-hotspot), a module for creating wifi hotspots using the program linux-wifi-hotspot. Available as [services.create_ap](options.html#opt-services.create_ap.enable).
131+
102- [blocky](https://0xerr0r.github.io/blocky/), fast and lightweight DNS proxy as ad-blocker for local network with many features.
132- [blocky](https://0xerr0r.github.io/blocky/), fast and lightweight DNS proxy as ad-blocker for local network with many features.
103
133
104- [pacemaker](https://clusterlabs.org/pacemaker/) cluster resource manager
134- [pacemaker](https://clusterlabs.org/pacemaker/) cluster resource manager
105
135
136+- [nifi](https://nifi.apache.org), an easy to use, powerful, and reliable system to process and distribute data. Available as [services.nifi](options.html#opt-services.nifi.enable).
137+
106<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
138<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
107
139
108## Backward Incompatibilities {#sec-release-22.05-incompatibilities}
140## Backward Incompatibilities {#sec-release-22.05-incompatibilities}
@@ -139,10 +171,71 @@ In addition to numerous new and upgraded packages, this release has the followin
139 org-contrib, refer to the ones in `pkgs.emacsPackages.elpaPackages` and
171 org-contrib, refer to the ones in `pkgs.emacsPackages.elpaPackages` and
140 `pkgs.emacsPackages.nongnuPackages` where the new versions will release.
172 `pkgs.emacsPackages.nongnuPackages` where the new versions will release.
141
173
174+- The configuration and state directories used by `nixos-containers` have been
175+ moved from `/etc/containers` and `/var/lib/containers` to
176+ `/etc/nixos-containers` and `/var/lib/nixos-containers`.
177+
178+ If you are changing `system.stateVersion` to `"22.05"` manually on an existing
179+ system you are responsible for migrating these directories yourself.
180+
181+ This is to improve compatibility with `libcontainer` based software such as Podman and Skopeo
182+ which assumes they have ownership over `/etc/containers`.
183+
184+- For new installations `virtualisation.oci-containers.backend` is now set to `podman` by default.
185+ If you still want to use Docker on systems where `system.stateVersion` is set to to `"22.05"` set `virtualisation.oci-containers.backend = "docker";`.Old systems with older `stateVersion`s stay with "docker".
186+
187+- `security.klogd` was removed. Logging of kernel messages is handled
188+ by systemd since Linux 3.5.
189+
190+- `pkgs.ssmtp` has been dropped due to the program being unmaintained.
191+ `pkgs.msmtp` can be used instead as a substitute `sendmail` implementation.
192+ The corresponding options `services.ssmtp.*` have been removed as well.
193+ `programs.msmtp.*` can be used instead for an equivalent setup. For example:
194+
195+ ```nix
196+ {
197+ # Original ssmtp configuration:
198+ services.ssmtp = {
199+ enable = true;
200+ useTLS = true;
201+ useSTARTTLS = true;
202+ hostName = "smtp.example:587";
203+ authUser = "someone";
204+ authPassFile = "/secrets/password.txt";
205+ };
206+
207+ # Equivalent msmtp configuration:
208+ programs.msmtp = {
209+ enable = true;
210+ accounts.default = {
211+ tls = true;
212+ tls_starttls = true;
213+ auth = true;
214+ host = "smtp.example";
215+ port = 587;
216+ user = "someone";
217+ passwordeval = "cat /secrets/password.txt";
218+ };
219+ };
220+ }
221+ ```
222+
142- `services.kubernetes.addons.dashboard` was removed due to it being an outdated version.
223- `services.kubernetes.addons.dashboard` was removed due to it being an outdated version.
143
224
144- `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.
225- `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.
145
226
227+- In the PowerDNS Recursor module (`services.pdns-recursor`), default values of several IP address-related NixOS options have been updated to match the default upstream behavior.
228+ In particular, Recursor by default will:
229+ - listen on (and allows connections from) both IPv4 and IPv6 addresses
230+ (`services.pdns-recursor.dns.address`, `services.pdns-recursor.dns.allowFrom`);
231+ - allow only local connections to the REST API server (`services.pdns-recursor.api.allowFrom`).
232+
233+- In the ncdns module, the default value of `services.ncdns.address` has been changed to the IPv6 loopback address (`::1`).
234+
235+- `openssh` has been update to 8.9p1, changing the FIDO security key middleware interface.
236+
237+- `git` no longer hardcodes the path to openssh' ssh binary to reduce the amount of rebuilds. If you are using git with ssh remotes and do not have a ssh binary in your enviroment consider adding `openssh` to it or switching to `gitFull`.
238+
146- `services.k3s.enable` no longer implies `systemd.enableUnifiedCgroupHierarchy = false`, and will default to the 'systemd' cgroup driver when using `services.k3s.docker = true`.
239- `services.k3s.enable` no longer implies `systemd.enableUnifiedCgroupHierarchy = false`, and will default to the 'systemd' cgroup driver when using `services.k3s.docker = true`.
147 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.
240 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.
148 The previous behavior may be retained by explicitly setting `systemd.enableUnifiedCgroupHierarchy = false` in your configuration.
241 The previous behavior may be retained by explicitly setting `systemd.enableUnifiedCgroupHierarchy = false` in your configuration.
@@ -160,6 +253,8 @@ In addition to numerous new and upgraded packages, this release has the followin
160 }
253 }
161 ```
254 ```
162
255
256+- `services.prometheus.alertManagerTimeout` has been removed as it has been deprecated upstream and has no effect.
257+
163- The DHCP server (`services.dhcpd4`, `services.dhcpd6`) has been hardened.
258- The DHCP server (`services.dhcpd4`, `services.dhcpd6`) has been hardened.
164 The service is now using the systemd's `DynamicUser` mechanism to run as an unprivileged dynamically-allocated user with limited capabilities.
259 The service is now using the systemd's `DynamicUser` mechanism to run as an unprivileged dynamically-allocated user with limited capabilities.
165 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.
260 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.
@@ -169,6 +264,10 @@ In addition to numerous new and upgraded packages, this release has the followin
169
264
170- `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.
265- `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.
171
266
267+- `hbase` version 0.98.24 has been removed. The package now defaults to version 2.4.11. Versions 1.7.1 and 3.0.0-alpha-2 are also available.
268+
269+- `services.paperless-ng` was renamed to `services.paperless`. Accordingly, the `paperless-ng-manage` script (located in `dataDir`) was renamed to `paperless-manage`. `services.paperless` now uses `paperless-ngx`.
270+
172- The `matrix-synapse` service (`services.matrix-synapse`) has been converted to use the `settings` option defined in RFC42.
271- The `matrix-synapse` service (`services.matrix-synapse`) has been converted to use the `settings` option defined in RFC42.
173 This means that options that are part of your `homeserver.yaml` configuration, and that were specified at the top-level of the
272 This means that options that are part of your `homeserver.yaml` configuration, and that were specified at the top-level of the
174 module (`services.matrix-synapse`) now need to be moved into `services.matrix-synapse.settings`. And while not all options you
273 module (`services.matrix-synapse`) now need to be moved into `services.matrix-synapse.settings`. And while not all options you
@@ -263,6 +362,83 @@ In addition to numerous new and upgraded packages, this release has the followin
263 `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
362 `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
264 location if the `stateVersion` is updated.
363 location if the `stateVersion` is updated.
265
364
365+ As of Synapse 1.58.0, the old groups/communities feature has been disabled by default. It will be completely removed with Synapse 1.61.0.
366+
367+- The Keycloak package (`pkgs.keycloak`) has been switched from the
368+ Wildfly version, which will soon be deprecated, to the Quarkus based
369+ version. The Keycloak service (`services.keycloak`) has been updated
370+ to accommodate the change and now differs from the previous version
371+ in a few ways:
372+
373+ - `services.keycloak.extraConfig` has been removed in favor of the
374+ new [settings-style](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md)
375+ [`services.keycloak.settings`](#opt-services.keycloak.settings)
376+ option. The available options correspond directly to parameters in
377+ `conf/keycloak.conf`. Some of the most important parameters are
378+ documented as suboptions, the rest can be found in the [All
379+ configuration section of the Keycloak Server Installation and
380+ Configuration
381+ Guide](https://www.keycloak.org/server/all-config). While the new
382+ configuration is much simpler and cleaner than the old JBoss CLI
383+ one, this unfortunately mean that there's no straightforward way
384+ to convert an old configuration to the new format and some
385+ settings may not even be available anymore.
386+
387+ - `services.keycloak.frontendUrl` was removed and the frontend URL
388+ is now configured through the `hostname` family of settings in
389+ [`services.keycloak.settings`](#opt-services.keycloak.settings)
390+ instead. See the [Hostname section of the Keycloak Server
391+ Installation and Configuration
392+ Guide](https://www.keycloak.org/server/hostname) for more
393+ details. Additionally, `/auth` was removed from the default
394+ context path and needs to be added back in
395+ [`services.keycloak.settings.http-relative-path`](#opt-services.keycloak.settings.http-relative-path)
396+ if you want to keep compatibility with your current clients.
397+
398+ - `services.keycloak.bindAddress`,
399+ `services.keycloak.forceBackendUrlToFrontendUrl`,
400+ `services.keycloak.httpPort` and `services.keycloak.httpsPort`
401+ have been removed in favor of their equivalent options in
402+ [`services.keycloak.settings`](#opt-services.keycloak.settings). `httpPort`
403+ and `httpsPort` have additionally had their types changed from
404+ `str` to `port`.
405+
406+ The new names are as follows:
407+ - `bindAddress`: [`services.keycloak.settings.http-host`](#opt-services.keycloak.settings.http-host)
408+ - `forceBackendUrlToFrontendUrl`: [`services.keycloak.settings.hostname-strict-backchannel`](#opt-services.keycloak.settings.hostname-strict-backchannel)
409+ - `httpPort`: [`services.keycloak.settings.http-port`](#opt-services.keycloak.settings.http-port)
410+ - `httpsPort`: [`services.keycloak.settings.https-port`](#opt-services.keycloak.settings.https-port)
411+
412+ For example, when using a reverse proxy the migration could look
413+ like this:
414+
415+ Before:
416+ ```nix
417+ services.keycloak = {
418+ enable = true;
419+ httpPort = "8080";
420+ frontendUrl = "https://keycloak.example.com/auth";
421+ database.passwordFile = "/run/keys/db_password";
422+ extraConfig = {
423+ "subsystem=undertow"."server=default-server"."http-listener=default".proxy-address-forwarding = true;
424+ };
425+ };
426+ ```
427+
428+ After:
429+ ```nix
430+ services.keycloak = {
431+ enable = true;
432+ settings = {
433+ http-port = 8080;
434+ hostname = "keycloak.example.com";
435+ http-relative-path = "/auth";
436+ proxy = "edge";
437+ };
438+ database.passwordFile = "/run/keys/db_password";
439+ };
440+ ```
441+
266- The MoinMoin wiki engine (`services.moinmoin`) has been removed, because Python 2 is being retired from nixpkgs.
442- The MoinMoin wiki engine (`services.moinmoin`) has been removed, because Python 2 is being retired from nixpkgs.
267
443
268- Services in the `hadoop` module previously set `openFirewall` to true by default.
444- Services in the `hadoop` module previously set `openFirewall` to true by default.
@@ -304,6 +480,10 @@ In addition to numerous new and upgraded packages, this release has the followin
304
480
305- `services.miniflux.adminCredentialFiles` is now required, instead of defaulting to `admin` and `password`.
481- `services.miniflux.adminCredentialFiles` is now required, instead of defaulting to `admin` and `password`.
306
482
483+- The `taskserver` module no longer implicitly opens ports in the firewall
484+ configuration. This is now controlled through the option
485+ `services.taskserver.openFirewall`.
486+
307- 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.
487- 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.
308
488
309- For `pkgs.python3.pkgs.ipython`, its direct dependency `pkgs.python3.pkgs.matplotlib-inline`
489- For `pkgs.python3.pkgs.ipython`, its direct dependency `pkgs.python3.pkgs.matplotlib-inline`
@@ -355,8 +535,14 @@ In addition to numerous new and upgraded packages, this release has the followin
355
535
356- `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`
536- `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`
357
537
538+- `systemd-shutdown` is now properly linked on shutdown to unmount all filesystems and device mapper devices cleanly. This can be disabled using `systemd.shutdownRamfs.enable`.
539+
358- 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`.
540- 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`.
359
541
542+- `services.github-runner` has been hardened. Notably address families and
543+ system calls have been restricted, which may adversely affect some kinds of
544+ testing, e.g. using `AF_BLUETOOTH` to test bluetooth devices.
545+
360- 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
546- 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
361`$out/libexec/terraform-providers/<registry>/<owner>/<name>/<version>/<os>_<arch>/terraform-provider-<name>_v<version>` (which mkProvider does).
547`$out/libexec/terraform-providers/<registry>/<owner>/<name>/<version>/<os>_<arch>/terraform-provider-<name>_v<version>` (which mkProvider does).
362
548
@@ -377,6 +563,10 @@ In addition to numerous new and upgraded packages, this release has the followin
377 you should change the package you refer to. If you don't need them update your
563 you should change the package you refer to. If you don't need them update your
378 commands from `otelcontribcol` to `otelcorecol` and enjoy a 7x smaller binary.
564 commands from `otelcontribcol` to `otelcorecol` and enjoy a 7x smaller binary.
379
565
566+- `services.zookeeper` has a new option `jre` for specifying the JRE to start
567+ zookeeper with. It defaults to the JRE that `pkgs.zookeeper` was wrapped with,
568+ instead of `pkgs.jre`. This changes the JRE to `pkgs.jdk11_headless` by default.
569+
380- `pkgs.pgadmin` now refers to `pkgs.pgadmin4`. `pgadmin3` has been removed.
570- `pkgs.pgadmin` now refers to `pkgs.pgadmin4`. `pgadmin3` has been removed.
381
571
382- `pkgs.noto-fonts-cjk` is now deprecated in favor of `pkgs.noto-fonts-cjk-sans`
572- `pkgs.noto-fonts-cjk` is now deprecated in favor of `pkgs.noto-fonts-cjk-sans`
@@ -447,8 +637,15 @@ In addition to numerous new and upgraded packages, this release has the followin
447
637
448 See the `vscode` package for a more detailed example.
638 See the `vscode` package for a more detailed example.
449
639
640+- Existing `resholve*` functions have been renamed and nested under `pkgs.resholve`. Update uses to:
641+ - `resholvePackage` -> `resholve.mkDerivation`
642+ - `resholveScript` -> `resholve.writeScript`
643+ - `resholveScriptBin` -> `resholve.writeScriptBin`
644+
450- `pkgs.cosmopolitan` no longer provides the `cosmoc` command. It has been moved to `pkgs.cosmoc`.
645- `pkgs.cosmopolitan` no longer provides the `cosmoc` command. It has been moved to `pkgs.cosmoc`.
451
646
647+- `pkgs.graalvmXX-ce` packages no longer provide support for Python/Ruby/WASM, instead focusing only in Java and Native Image Support. If you need to add support back, please see the `pkgs.graalvmCEPackages.mkGraal` function to create your own customized version of GraalVM with support for what you need.
648+
452<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
649<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
453
650
454## Other Notable Changes {#sec-release-22.05-notable-changes}
651## Other Notable Changes {#sec-release-22.05-notable-changes}
@@ -490,6 +687,10 @@ In addition to numerous new and upgraded packages, this release has the followin
490 - Support for older versions of hadoop have been added to the module
687 - Support for older versions of hadoop have been added to the module
491 - Overriding and extending site XML files has been made easier
688 - Overriding and extending site XML files has been made easier
492
689
690+- The auto-upgrade service now accepts persistent (default: true) parameter.
691+ By default auto-upgrade will now run immediately if it would have been triggered at least
692+ once during the time when the timer was inactive.
693+
493- If you are using Wayland you can choose to use the Ozone Wayland support
694- If you are using Wayland you can choose to use the Ozone Wayland support
494 in Chrome and several Electron apps by setting the environment variable
695 in Chrome and several Electron apps by setting the environment variable
495 `NIXOS_OZONE_WL=1` (for example via
696 `NIXOS_OZONE_WL=1` (for example via
@@ -513,6 +714,8 @@ In addition to numerous new and upgraded packages, this release has the followin
513
714
514- `programs.zsh.autosuggestions.strategy` now takes a list of strings instead of a string.
715- `programs.zsh.autosuggestions.strategy` now takes a list of strings instead of a string.
515
716
717+- The `asterisk` and `asterisk-stable` packages were switched from `asterisk_18` to the newly-packaged `asterisk_19`. Asterisk 13 and 17 have been removed as they have reached their end of life.
718+
516- The `services.unifi.openPorts` option default value of `true` is now deprecated and will be changed to `false` in 22.11.
719- The `services.unifi.openPorts` option default value of `true` is now deprecated and will be changed to `false` in 22.11.
517 Configurations using this default will print a warning when rebuilt.
720 Configurations using this default will print a warning when rebuilt.
518
721
@@ -537,28 +740,53 @@ In addition to numerous new and upgraded packages, this release has the followin
537 e.g. Wayland.
740 e.g. Wayland.
538
741
539- [programs.ssh.knownHosts](#opt-programs.ssh.knownHosts) has gained an `extraHostNames`
742- [programs.ssh.knownHosts](#opt-programs.ssh.knownHosts) has gained an `extraHostNames`
540− option to replace `hostNames`. `hostNames` is deprecated, but still available for now.
743+ option to augment `hostNames`. It is now possible to use the attribute name of a `knownHosts`
744+ entry as the primary host name and specify secondary host names using `extraHostNames` without
745+ having to duplicate the primary host name.
541
746
542- The `services.stubby` module was converted to a [settings-style](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md) configuration.
747- The `services.stubby` module was converted to a [settings-style](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md) configuration.
543
748
749+- The option
750+ [services.xserver.desktopManager.runXdgAutostartIfNone](#opt-services.xserver.desktopManager.runXdgAutostartIfNone)
751+ was added in order to automatically run XDG autostart files for sessions without a desktop manager.
752+ This replaces helpers like the `dex` package.
753+
754+- When setting [i18n.inputMethod.enabled](#opt-i18n.inputMethod.enabled) to `fcitx5`,
755+ it no longer creates corresponding systemd user services.
756+ It now relies on XDG autostart files to start and work properly in your desktop sessions.
757+ If you are using only a window manager without a desktop manager, you need to enable
758+ `services.xserver.desktopManager.runXdgAutostartIfNone` or using the `dex` package to make `fcitx5` work.
759+
760+- A new module was added for the Envoy reverse proxy, providing the options `services.envoy.enable` and `services.envoy.settings`.
761+
544- The option `services.duplicati.dataDir` has been added to allow changing the location of duplicati's files.
762- The option `services.duplicati.dataDir` has been added to allow changing the location of duplicati's files.
545
763
546- 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.
764- 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.
547
765
548- `nixos-generate-config` now puts the dhcp configuration in `hardware-configuration.nix` instead of `configuration.nix`.
766- `nixos-generate-config` now puts the dhcp configuration in `hardware-configuration.nix` instead of `configuration.nix`.
549
767
550−- ORY Kratos was updated to version 0.8.3-alpha.1.pre.0, which introduces some breaking changes:
768+- ORY Kratos was updated to version 0.9.0-alpha.3, which introduces some breaking changes:
769+ - All endpoints at the Admin API are now exposed at `/admin/`. For example, endpoint `https://kratos:4434/identities` is now exposed at `https://kratos:4434/admin/identities`
770+ - Configuration key `selfservice.whitelisted_return_urls` has been renamed to `allowed_return_urls`
771+ - The `password_identifier` form field of the password login strategy has been renamed to `identifier` to make compatibility with passwordless flows possible.
772+ - Instead of having a global `default_schema_url` which developers used to update their schema, you now need to define the `default_schema_id` which must reference schema ID in your config.
773+ - Calling `/self-service/recovery` without flow ID or with an invalid flow ID while authenticated will now respond with an error instead of redirecting to the default page.
551 - If you are relying on the SQLite images, update your Docker Pull commands as follows:
774 - If you are relying on the SQLite images, update your Docker Pull commands as follows:
552 - `docker pull oryd/kratos:{version}`
775 - `docker pull oryd/kratos:{version}`
553 - Additionally, all passwords now have to be at least 8 characters long.
776 - Additionally, all passwords now have to be at least 8 characters long.
554 - For more details, see:
777 - For more details, see:
555 - [Release Notes for v0.8.1-alpha-1](https://github.com/ory/kratos/releases/tag/v0.8.1-alpha.1)
778 - [Release Notes for v0.8.1-alpha-1](https://github.com/ory/kratos/releases/tag/v0.8.1-alpha.1)
556 - [Release Notes for v0.8.2-alpha-1](https://github.com/ory/kratos/releases/tag/v0.8.2-alpha.1)
779 - [Release Notes for v0.8.2-alpha-1](https://github.com/ory/kratos/releases/tag/v0.8.2-alpha.1)
780+ - [Release Notes for v0.9.0-alpha-1](https://github.com/ory/kratos/releases/tag/v0.9.0-alpha.1)
781+ - [Release Notes for v0.9.0-alpha-3](https://github.com/ory/kratos/releases/tag/v0.9.0-alpha.3)
782+
557
783
558- `fetchFromSourcehut` now allows fetching repositories recursively
784- `fetchFromSourcehut` now allows fetching repositories recursively
559 using `fetchgit` or `fetchhg` if the argument `fetchSubmodules`
785 using `fetchgit` or `fetchhg` if the argument `fetchSubmodules`
560 is set to `true`.
786 is set to `true`.
561
787
788+- A module for declarative configuration of openconnect VPN profiles was added under `networking.openconnect`.
789+
562- The `element-desktop` package now has an `useKeytar` option (defaults to `true`),
790- The `element-desktop` package now has an `useKeytar` option (defaults to `true`),
563 which allows disabling `keytar` and in turn `libsecret` usage
791 which allows disabling `keytar` and in turn `libsecret` usage
564 (which binds to native credential managers / keychain libraries).
792 (which binds to native credential managers / keychain libraries).
@@ -589,11 +817,18 @@ In addition to numerous new and upgraded packages, this release has the followin
589 and [services.logrotate.extraConfig](#opt-services.logrotate.extraConfig) will work, but issue deprecation
817 and [services.logrotate.extraConfig](#opt-services.logrotate.extraConfig) will work, but issue deprecation
590 warnings and [services.logrotate.settings](#opt-services.logrotate.settings) should now be used instead.
818 warnings and [services.logrotate.settings](#opt-services.logrotate.settings) should now be used instead.
591
819
820+- `security.pam.ussh` has been added, which allows authorizing PAM sessions based on SSH _certificates_ held within an SSH agent, using [pam-ussh](https://github.com/uber/pam-ussh).
821+
822+- The `vscode-extensions.ionide.ionide-fsharp` package has been updated to 6.0.0 and now requires .NET 6.0.
823+
592- The `zrepl` package has been updated from 0.4.0 to 0.5:
824- The `zrepl` package has been updated from 0.4.0 to 0.5:
593
825
594 - The RPC protocol version was bumped; all zrepl daemons in a setup must be updated and restarted before replication can resume.
826 - The RPC protocol version was bumped; all zrepl daemons in a setup must be updated and restarted before replication can resume.
595 - 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.
827 - 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.
596
828
829+- The `polybar` package has been updated from 3.5.7 to 3.6.2. See [the changelog](https://github.com/polybar/polybar/releases/tag/3.6.0) for more details.
830+ - Breaking changes include changes to escaping rules in configuration values, changes in behavior when encountering invalid tag names, and changes to inter-process-messaging (IPC).
831+
597- Renamed option `services.openssh.challengeResponseAuthentication` to `services.openssh.kbdInteractiveAuthentication`.
832- Renamed option `services.openssh.challengeResponseAuthentication` to `services.openssh.kbdInteractiveAuthentication`.
598 Reason is that the old name has been deprecated upstream.
833 Reason is that the old name has been deprecated upstream.
599 Using the old option name will still work, but produce a warning.
834 Using the old option name will still work, but produce a warning.
@@ -615,10 +850,20 @@ In addition to numerous new and upgraded packages, this release has the followin
615
850
616- 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.
851- 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.
617
852
853+- xfsprogs was update to version 5.15, which enables inobtcount and bigtime by default on filesystem creation. Support for these features was added in kernel 5.10 and deemed stable in kernel 5.15.
854+ If you want to be able to mount XFS filesystems created with this release of xfsprogs on kernel releases older than 5.10, you need to format them with `mkfs.xfs -m bigtime=0 -m inobtcount=0`.
855+
856+- `services.xserver.desktopManager.xfce` now includes Xfce's screen locker, `xfce4-screensaver` that is enabled by default. You can disable it by setting `false` to [services.xserver.desktopManager.xfce.enableScreensaver](#opt-services.xserver.desktopManager.xfce.enableScreensaver).
857+
618- 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)).
858- 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)).
619
859
620- The `R` package now builds again on `aarch64-darwin` ([#158992](https://github.com/NixOS/nixpkgs/pull/158992)).
860- The `R` package now builds again on `aarch64-darwin` ([#158992](https://github.com/NixOS/nixpkgs/pull/158992)).
621
861
862+- The `nss` package was split into `nss_esr` and `nss_latest`, with `nss` being an alias for `nss_esr`. This was done to ease maintenance of `nss` and dependent high-profile packages like `firefox`.
863+
864+- The Nextcloud module now supports to create a Mysql database automatically
865+ with `services.nextcloud.database.createLocally` enabled.
866+
622- The `spark3` package has been updated from 3.1.2 to 3.2.1 ([#160075](https://github.com/NixOS/nixpkgs/pull/160075)):
867- The `spark3` package has been updated from 3.1.2 to 3.2.1 ([#160075](https://github.com/NixOS/nixpkgs/pull/160075)):
623
868
624 - Testing has been enabled for `aarch64-linux` in addition to `x86_64-linux`.
869 - Testing has been enabled for `aarch64-linux` in addition to `x86_64-linux`.
@@ -626,4 +871,8 @@ In addition to numerous new and upgraded packages, this release has the followin
626
871
627- The `programs.nncp` options were added for generating host-global NNCP configuration.
872- The `programs.nncp` options were added for generating host-global NNCP configuration.
628
873
874+- The option `services.snapserver.openFirewall` will no longer default to
875+ `true` starting with NixOS 22.11. Enable it explicitly if you need to control
876+ Snapserver remotely or connect streamig clients from other hosts.
877+
629<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
878<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
nixos/lib/make-disk-image.nix+1
@@ -170,6 +170,7 @@ let format' = format; in let
170 config.system.build.nixos-install
170 config.system.build.nixos-install
171 config.system.build.nixos-enter
171 config.system.build.nixos-enter
172 nix
172 nix
173+ systemdMinimal
173 ] ++ stdenv.initialPath);
174 ] ++ stdenv.initialPath);
174
175
175 # I'm preserving the line below because I'm going to search for it across nixpkgs to consolidate
176 # I'm preserving the line below because I'm going to search for it across nixpkgs to consolidate
nixos/lib/make-zfs-image.nix → nixos/lib/make-multi-disk-zfs-image.nixrenamed

The content is the same.

nixos/lib/make-options-doc/mergeJSON.py+3−1
@@ -48,7 +48,9 @@ overrides = pivot(json.load(open(sys.argv[2 + optOffset], 'r')))
48
48
49# fix up declaration paths in lazy options, since we don't eval them from a full nixpkgs dir
49# fix up declaration paths in lazy options, since we don't eval them from a full nixpkgs dir
50for (k, v) in options.items():
50for (k, v) in options.items():
51+ # The _module options are not declared in nixos/modules
52+ if v.value['loc'][0] != "_module":
51− v.value['declarations'] = list(map(lambda s: f'nixos/modules/{s}', v.value['declarations']))
53+ v.value['declarations'] = list(map(lambda s: f'nixos/modules/{s}', v.value['declarations']))
52
54
53# merge both descriptions
55# merge both descriptions
54for (k, v) in overrides.items():
56for (k, v) in overrides.items():
nixos/lib/make-single-disk-zfs-image.nixnew file+322
@@ -0,0 +1,322 @@
1+# Note: This is a private API, internal to NixOS. Its interface is subject
2+# to change without notice.
3+#
4+# The result of this builder is a single disk image, partitioned like this:
5+#
6+# * partition #1: a very small, 1MiB partition to leave room for Grub.
7+#
8+# * partition #2: boot, a partition formatted with FAT to be used for /boot.
9+# FAT is chosen to support EFI.
10+#
11+# * partition #3: nixos, a partition dedicated to a zpool.
12+#
13+# This single-disk approach does not satisfy ZFS's requirements for autoexpand,
14+# however automation can expand it anyway. For example, with
15+# `services.zfs.expandOnBoot`.
16+{ lib
17+, pkgs
18+, # The NixOS configuration to be installed onto the disk image.
19+ config
20+
21+, # size of the FAT partition, in megabytes.
22+ bootSize ? 1024
23+
24+, # The size of the root partition, in megabytes.
25+ rootSize ? 2048
26+
27+, # The name of the ZFS pool
28+ rootPoolName ? "tank"
29+
30+, # zpool properties
31+ rootPoolProperties ? {
32+ autoexpand = "on";
33+ }
34+, # pool-wide filesystem properties
35+ rootPoolFilesystemProperties ? {
36+ acltype = "posixacl";
37+ atime = "off";
38+ compression = "on";
39+ mountpoint = "legacy";
40+ xattr = "sa";
41+ }
42+
43+, # datasets, with per-attribute options:
44+ # mount: (optional) mount point in the VM
45+ # properties: (optional) ZFS properties on the dataset, like filesystemProperties
46+ # Notes:
47+ # 1. datasets will be created from shorter to longer names as a simple topo-sort
48+ # 2. you should define a root's dataset's mount for `/`
49+ datasets ? { }
50+
51+, # The files and directories to be placed in the target file system.
52+ # This is a list of attribute sets {source, target} where `source'
53+ # is the file system object (regular file or directory) to be
54+ # grafted in the file system at path `target'.
55+ contents ? [ ]
56+
57+, # The initial NixOS configuration file to be copied to
58+ # /etc/nixos/configuration.nix. This configuration will be embedded
59+ # inside a configuration which includes the described ZFS fileSystems.
60+ configFile ? null
61+
62+, # Shell code executed after the VM has finished.
63+ postVM ? ""
64+
65+, name ? "nixos-disk-image"
66+
67+, # Disk image format, one of qcow2, qcow2-compressed, vdi, vpc, raw.
68+ format ? "raw"
69+
70+, # Include a copy of Nixpkgs in the disk image
71+ includeChannel ? true
72+}:
73+let
74+ formatOpt = if format == "qcow2-compressed" then "qcow2" else format;
75+
76+ compress = lib.optionalString (format == "qcow2-compressed") "-c";
77+
78+ filenameSuffix = "." + {
79+ qcow2 = "qcow2";
80+ vdi = "vdi";
81+ vpc = "vhd";
82+ raw = "img";
83+ }.${formatOpt} or formatOpt;
84+ rootFilename = "nixos.root${filenameSuffix}";
85+
86+ # FIXME: merge with channel.nix / make-channel.nix.
87+ channelSources =
88+ let
89+ nixpkgs = lib.cleanSource pkgs.path;
90+ in
91+ pkgs.runCommand "nixos-${config.system.nixos.version}" { } ''
92+ mkdir -p $out
93+ cp -prd ${nixpkgs.outPath} $out/nixos
94+ chmod -R u+w $out/nixos
95+ if [ ! -e $out/nixos/nixpkgs ]; then
96+ ln -s . $out/nixos/nixpkgs
97+ fi
98+ rm -rf $out/nixos/.git
99+ echo -n ${config.system.nixos.versionSuffix} > $out/nixos/.version-suffix
100+ '';
101+
102+ closureInfo = pkgs.closureInfo {
103+ rootPaths = [ config.system.build.toplevel ]
104+ ++ (lib.optional includeChannel channelSources);
105+ };
106+
107+ modulesTree = pkgs.aggregateModules
108+ (with config.boot.kernelPackages; [ kernel zfs ]);
109+
110+ tools = lib.makeBinPath (
111+ with pkgs; [
112+ config.system.build.nixos-enter
113+ config.system.build.nixos-install
114+ dosfstools
115+ e2fsprogs
116+ gptfdisk
117+ nix
118+ parted
119+ utillinux
120+ zfs
121+ ]
122+ );
123+
124+ hasDefinedMount = disk: ((disk.mount or null) != null);
125+
126+ stringifyProperties = prefix: properties: lib.concatStringsSep " \\\n" (
127+ lib.mapAttrsToList
128+ (
129+ property: value: "${prefix} ${lib.escapeShellArg property}=${lib.escapeShellArg value}"
130+ )
131+ properties
132+ );
133+
134+ featuresToProperties = features:
135+ lib.listToAttrs
136+ (builtins.map
137+ (feature: {
138+ name = "feature@${feature}";
139+ value = "enabled";
140+ })
141+ features);
142+
143+ createDatasets =
144+ let
145+ datasetlist = lib.mapAttrsToList lib.nameValuePair datasets;
146+ sorted = lib.sort (left: right: (lib.stringLength left.name) < (lib.stringLength right.name)) datasetlist;
147+ cmd = { name, value }:
148+ let
149+ properties = stringifyProperties "-o" (value.properties or { });
150+ in
151+ "zfs create -p ${properties} ${name}";
152+ in
153+ lib.concatMapStringsSep "\n" cmd sorted;
154+
155+ mountDatasets =
156+ let
157+ datasetlist = lib.mapAttrsToList lib.nameValuePair datasets;
158+ mounts = lib.filter ({ value, ... }: hasDefinedMount value) datasetlist;
159+ sorted = lib.sort (left: right: (lib.stringLength left.value.mount) < (lib.stringLength right.value.mount)) mounts;
160+ cmd = { name, value }:
161+ ''
162+ mkdir -p /mnt${lib.escapeShellArg value.mount}
163+ mount -t zfs ${name} /mnt${lib.escapeShellArg value.mount}
164+ '';
165+ in
166+ lib.concatMapStringsSep "\n" cmd sorted;
167+
168+ unmountDatasets =
169+ let
170+ datasetlist = lib.mapAttrsToList lib.nameValuePair datasets;
171+ mounts = lib.filter ({ value, ... }: hasDefinedMount value) datasetlist;
172+ sorted = lib.sort (left: right: (lib.stringLength left.value.mount) > (lib.stringLength right.value.mount)) mounts;
173+ cmd = { name, value }:
174+ ''
175+ umount /mnt${lib.escapeShellArg value.mount}
176+ '';
177+ in
178+ lib.concatMapStringsSep "\n" cmd sorted;
179+
180+
181+ fileSystemsCfgFile =
182+ let
183+ mountable = lib.filterAttrs (_: value: hasDefinedMount value) datasets;
184+ in
185+ pkgs.runCommand "filesystem-config.nix"
186+ {
187+ buildInputs = with pkgs; [ jq nixpkgs-fmt ];
188+ filesystems = builtins.toJSON {
189+ fileSystems = lib.mapAttrs'
190+ (
191+ dataset: attrs:
192+ {
193+ name = attrs.mount;
194+ value = {
195+ fsType = "zfs";
196+ device = "${dataset}";
197+ };
198+ }
199+ )
200+ mountable;
201+ };
202+ passAsFile = [ "filesystems" ];
203+ } ''
204+ (
205+ echo "builtins.fromJSON '''"
206+ jq . < "$filesystemsPath"
207+ echo "'''"
208+ ) > $out
209+
210+ nixpkgs-fmt $out
211+ '';
212+
213+ mergedConfig =
214+ if configFile == null
215+ then fileSystemsCfgFile
216+ else
217+ pkgs.runCommand "configuration.nix"
218+ {
219+ buildInputs = with pkgs; [ nixpkgs-fmt ];
220+ }
221+ ''
222+ (
223+ echo '{ imports = ['
224+ printf "(%s)\n" "$(cat ${fileSystemsCfgFile})";
225+ printf "(%s)\n" "$(cat ${configFile})";
226+ echo ']; }'
227+ ) > $out
228+
229+ nixpkgs-fmt $out
230+ '';
231+
232+ image = (
233+ pkgs.vmTools.override {
234+ rootModules =
235+ [ "zfs" "9p" "9pnet_virtio" "virtio_pci" "virtio_blk" ] ++
236+ (pkgs.lib.optional pkgs.stdenv.hostPlatform.isx86 "rtc_cmos");
237+ kernel = modulesTree;
238+ }
239+ ).runInLinuxVM (
240+ pkgs.runCommand name
241+ {
242+ memSize = 1024;
243+ QEMU_OPTS = "-drive file=$rootDiskImage,if=virtio,cache=unsafe,werror=report";
244+ preVM = ''
245+ PATH=$PATH:${pkgs.qemu_kvm}/bin
246+ mkdir $out
247+
248+ rootDiskImage=root.raw
249+ qemu-img create -f raw $rootDiskImage ${toString (bootSize + rootSize)}M
250+ '';
251+
252+ postVM = ''
253+ ${if formatOpt == "raw" then ''
254+ mv $rootDiskImage $out/${rootFilename}
255+ '' else ''
256+ ${pkgs.qemu}/bin/qemu-img convert -f raw -O ${formatOpt} ${compress} $rootDiskImage $out/${rootFilename}
257+ ''}
258+ rootDiskImage=$out/${rootFilename}
259+ set -x
260+ ${postVM}
261+ '';
262+ } ''
263+ export PATH=${tools}:$PATH
264+ set -x
265+
266+ cp -sv /dev/vda /dev/sda
267+ cp -sv /dev/vda /dev/xvda
268+
269+ parted --script /dev/vda -- \
270+ mklabel gpt \
271+ mkpart no-fs 1MiB 2MiB \
272+ set 1 bios_grub on \
273+ align-check optimal 1 \
274+ mkpart primary fat32 2MiB ${toString bootSize}MiB \
275+ align-check optimal 2 \
276+ mkpart primary fat32 ${toString bootSize}MiB -1MiB \
277+ align-check optimal 3 \
278+ print
279+
280+ sfdisk --dump /dev/vda
281+
282+
283+ zpool create \
284+ ${stringifyProperties " -o" rootPoolProperties} \
285+ ${stringifyProperties " -O" rootPoolFilesystemProperties} \
286+ ${rootPoolName} /dev/vda3
287+ parted --script /dev/vda -- print
288+
289+ ${createDatasets}
290+ ${mountDatasets}
291+
292+ mkdir -p /mnt/boot
293+ mkfs.vfat -n ESP /dev/vda2
294+ mount /dev/vda2 /mnt/boot
295+
296+ mount
297+
298+ # Install a configuration.nix
299+ mkdir -p /mnt/etc/nixos
300+ # `cat` so it is mutable on the fs
301+ cat ${mergedConfig} > /mnt/etc/nixos/configuration.nix
302+
303+ export NIX_STATE_DIR=$TMPDIR/state
304+ nix-store --load-db < ${closureInfo}/registration
305+
306+ nixos-install \
307+ --root /mnt \
308+ --no-root-passwd \
309+ --system ${config.system.build.toplevel} \
310+ --substituters "" \
311+ ${lib.optionalString includeChannel ''--channel ${channelSources}''}
312+
313+ df -h
314+
315+ umount /mnt/boot
316+ ${unmountDatasets}
317+
318+ zpool export ${rootPoolName}
319+ ''
320+ );
321+in
322+image
nixos/lib/qemu-common.nix+2−2
@@ -23,8 +23,8 @@ rec {
23
23
24 qemuBinary = qemuPkg: {
24 qemuBinary = qemuPkg: {
25 x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu max";
25 x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu max";
26− armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -enable-kvm -machine virt -cpu host";
26+ armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -machine virt,accel=kvm:tcg -cpu max";
27− aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -enable-kvm -machine virt,gic-version=host -cpu host";
27+ aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -machine virt,gic-version=max,accel=kvm:tcg -cpu max";
28 powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
28 powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
29 powerpc64-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
29 powerpc64-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
30 x86_64-darwin = "${qemuPkg}/bin/qemu-kvm -cpu max";
30 x86_64-darwin = "${qemuPkg}/bin/qemu-kvm -cpu max";
nixos/lib/systemd-lib.nix+34−50
@@ -122,10 +122,15 @@ in rec {
122 (if isList value then value else [value]))
122 (if isList value then value else [value]))
123 as));
123 as));
124
124
125− generateUnits = generateUnits' true;
126−
127− generateUnits' = allowCollisions: type: units: upstreamUnits: upstreamWants:
125+ generateUnits = { allowCollisions ? true, type, units, upstreamUnits, upstreamWants, packages ? cfg.packages, package ? cfg.package }:
126+ let
127+ typeDir = ({
128+ system = "system";
129+ initrd = "system";
130+ user = "user";
131+ nspawn = "nspawn";
132+ }).${type};
128− pkgs.runCommand "${type}-units"
133+ in pkgs.runCommand "${type}-units"
129 { preferLocalBuild = true;
134 { preferLocalBuild = true;
130 allowSubstitutes = false;
135 allowSubstitutes = false;
131 } ''
136 } ''
@@ -133,7 +138,7 @@ in rec {
133
138
134 # Copy the upstream systemd units we're interested in.
139 # Copy the upstream systemd units we're interested in.
135 for i in ${toString upstreamUnits}; do
140 for i in ${toString upstreamUnits}; do
136− fn=${cfg.package}/example/systemd/${type}/$i
141+ fn=${package}/example/systemd/${typeDir}/$i
137 if ! [ -e $fn ]; then echo "missing $fn"; false; fi
142 if ! [ -e $fn ]; then echo "missing $fn"; false; fi
138 if [ -L $fn ]; then
143 if [ -L $fn ]; then
139 target="$(readlink "$fn")"
144 target="$(readlink "$fn")"
@@ -150,7 +155,7 @@ in rec {
150 # Copy .wants links, but only those that point to units that
155 # Copy .wants links, but only those that point to units that
151 # we're interested in.
156 # we're interested in.
152 for i in ${toString upstreamWants}; do
157 for i in ${toString upstreamWants}; do
153− fn=${cfg.package}/example/systemd/${type}/$i
158+ fn=${package}/example/systemd/${typeDir}/$i
154 if ! [ -e $fn ]; then echo "missing $fn"; false; fi
159 if ! [ -e $fn ]; then echo "missing $fn"; false; fi
155 x=$out/$(basename $fn)
160 x=$out/$(basename $fn)
156 mkdir $x
161 mkdir $x
@@ -162,14 +167,14 @@ in rec {
162 done
167 done
163
168
164 # Symlink all units provided listed in systemd.packages.
169 # Symlink all units provided listed in systemd.packages.
165− packages="${toString cfg.packages}"
170+ packages="${toString packages}"
166
171
167 # Filter duplicate directories
172 # Filter duplicate directories
168 declare -A unique_packages
173 declare -A unique_packages
169 for k in $packages ; do unique_packages[$k]=1 ; done
174 for k in $packages ; do unique_packages[$k]=1 ; done
170
175
171 for i in ''${!unique_packages[@]}; do
176 for i in ''${!unique_packages[@]}; do
172− for fn in $i/etc/systemd/${type}/* $i/lib/systemd/${type}/*; do
177+ for fn in $i/etc/systemd/${typeDir}/* $i/lib/systemd/${typeDir}/*; do
173 if ! [[ "$fn" =~ .wants$ ]]; then
178 if ! [[ "$fn" =~ .wants$ ]]; then
174 if [[ -d "$fn" ]]; then
179 if [[ -d "$fn" ]]; then
175 targetDir="$out/$(basename "$fn")"
180 targetDir="$out/$(basename "$fn")"
@@ -270,9 +275,9 @@ in rec {
270 { Conflicts = toString config.conflicts; }
275 { Conflicts = toString config.conflicts; }
271 // optionalAttrs (config.requisite != [])
276 // optionalAttrs (config.requisite != [])
272 { Requisite = toString config.requisite; }
277 { Requisite = toString config.requisite; }
273− // optionalAttrs (config.restartTriggers != [])
278+ // optionalAttrs (config ? restartTriggers && config.restartTriggers != [])
274 { X-Restart-Triggers = toString config.restartTriggers; }
279 { X-Restart-Triggers = toString config.restartTriggers; }
275− // optionalAttrs (config.reloadTriggers != [])
280+ // optionalAttrs (config ? reloadTriggers && config.reloadTriggers != [])
276 { X-Reload-Triggers = toString config.reloadTriggers; }
281 { X-Reload-Triggers = toString config.reloadTriggers; }
277 // optionalAttrs (config.description != "") {
282 // optionalAttrs (config.description != "") {
278 Description = config.description; }
283 Description = config.description; }
@@ -288,45 +293,24 @@ in rec {
288 };
293 };
289 };
294 };
290
295
291− serviceConfig = { name, config, ... }: {
296+ serviceConfig = { 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}";
297+ config.environment.PATH = mkIf (config.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 };
298 };
329
299
300+ stage2ServiceConfig = {
301+ imports = [ serviceConfig ];
302+ # Default path for systemd services. Should be quite minimal.
303+ config.path = mkAfter [
304+ pkgs.coreutils
305+ pkgs.findutils
306+ pkgs.gnugrep
307+ pkgs.gnused
308+ systemd
309+ ];
310+ };
311+
312+ stage1ServiceConfig = serviceConfig;
313+
330 mountConfig = { config, ... }: {
314 mountConfig = { config, ... }: {
331 config = {
315 config = {
332 mountConfig =
316 mountConfig =
@@ -374,12 +358,12 @@ in rec {
374 # systemd max line length is now 1MiB
358 # systemd max line length is now 1MiB
375 # https://github.com/systemd/systemd/commit/e6dde451a51dc5aaa7f4d98d39b8fe735f73d2af
359 # 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)}
360 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 ''
361+ ${if def ? reloadIfChanged && def.reloadIfChanged then ''
378 X-ReloadIfChanged=true
362 X-ReloadIfChanged=true
379− '' else if !def.restartIfChanged then ''
363+ '' else if (def ? restartIfChanged && !def.restartIfChanged) then ''
380 X-RestartIfChanged=false
364 X-RestartIfChanged=false
381 '' else ""}
365 '' else ""}
382− ${optionalString (!def.stopIfChanged) "X-StopIfChanged=false"}
366+ ${optionalString (def ? stopIfChanged && !def.stopIfChanged) "X-StopIfChanged=false"}
383 ${attrsToSection def.serviceConfig}
367 ${attrsToSection def.serviceConfig}
384 '';
368 '';
385 };
369 };
nixos/lib/systemd-types.nixnew file+69
@@ -0,0 +1,69 @@
1+{ lib, systemdUtils, pkgs }:
2+
3+with systemdUtils.lib;
4+with systemdUtils.unitOptions;
5+with lib;
6+
7+rec {
8+ units = with types;
9+ attrsOf (submodule ({ name, config, ... }: {
10+ options = concreteUnitOptions;
11+ config = { unit = mkDefault (systemdUtils.lib.makeUnit name config); };
12+ }));
13+
14+ services = with types; attrsOf (submodule [ stage2ServiceOptions unitConfig stage2ServiceConfig ]);
15+ initrdServices = with types; attrsOf (submodule [ stage1ServiceOptions unitConfig stage1ServiceConfig ]);
16+
17+ targets = with types; attrsOf (submodule [ stage2CommonUnitOptions unitConfig ]);
18+ initrdTargets = with types; attrsOf (submodule [ stage1CommonUnitOptions unitConfig ]);
19+
20+ sockets = with types; attrsOf (submodule [ stage2SocketOptions unitConfig ]);
21+ initrdSockets = with types; attrsOf (submodule [ stage1SocketOptions unitConfig ]);
22+
23+ timers = with types; attrsOf (submodule [ stage2TimerOptions unitConfig ]);
24+ initrdTimers = with types; attrsOf (submodule [ stage1TimerOptions unitConfig ]);
25+
26+ paths = with types; attrsOf (submodule [ stage2PathOptions unitConfig ]);
27+ initrdPaths = with types; attrsOf (submodule [ stage1PathOptions unitConfig ]);
28+
29+ slices = with types; attrsOf (submodule [ stage2SliceOptions unitConfig ]);
30+ initrdSlices = with types; attrsOf (submodule [ stage1SliceOptions unitConfig ]);
31+
32+ mounts = with types; listOf (submodule [ stage2MountOptions unitConfig mountConfig ]);
33+ initrdMounts = with types; listOf (submodule [ stage1MountOptions unitConfig mountConfig ]);
34+
35+ automounts = with types; listOf (submodule [ stage2AutomountOptions unitConfig automountConfig ]);
36+ initrdAutomounts = with types; attrsOf (submodule [ stage1AutomountOptions unitConfig automountConfig ]);
37+
38+ initrdContents = types.attrsOf (types.submodule ({ config, options, name, ... }: {
39+ options = {
40+ enable = mkEnableOption "copying of this file and symlinking it" // { default = true; };
41+
42+ target = mkOption {
43+ type = types.path;
44+ description = ''
45+ Path of the symlink.
46+ '';
47+ default = name;
48+ };
49+
50+ text = mkOption {
51+ default = null;
52+ type = types.nullOr types.lines;
53+ description = "Text of the file.";
54+ };
55+
56+ source = mkOption {
57+ type = types.path;
58+ description = "Path of the source file.";
59+ };
60+ };
61+
62+ config = {
63+ source = mkIf (config.text != null) (
64+ let name' = "initrd-" + baseNameOf name;
65+ in mkDerivedConfig options.text (pkgs.writeText name')
66+ );
67+ };
68+ }));
69+}
nixos/lib/systemd-unit-options.nix+560−401
@@ -94,459 +94,618 @@ in rec {
94
94
95 };
95 };
96
96
97− commonUnitOptions = sharedOptions // {
97+ commonUnitOptions = {
98+ options = sharedOptions // {
99+
100+ description = mkOption {
101+ default = "";
102+ type = types.singleLineStr;
103+ description = "Description of this unit used in systemd messages and progress indicators.";
104+ };
105+
106+ documentation = mkOption {
107+ default = [];
108+ type = types.listOf types.str;
109+ description = "A list of URIs referencing documentation for this unit or its configuration.";
110+ };
111+
112+ requires = mkOption {
113+ default = [];
114+ type = types.listOf unitNameType;
115+ description = ''
116+ Start the specified units when this unit is started, and stop
117+ this unit when the specified units are stopped or fail.
118+ '';
119+ };
120+
121+ wants = mkOption {
122+ default = [];
123+ type = types.listOf unitNameType;
124+ description = ''
125+ Start the specified units when this unit is started.
126+ '';
127+ };
128+
129+ after = mkOption {
130+ default = [];
131+ type = types.listOf unitNameType;
132+ description = ''
133+ If the specified units are started at the same time as
134+ this unit, delay this unit until they have started.
135+ '';
136+ };
137+
138+ before = mkOption {
139+ default = [];
140+ type = types.listOf unitNameType;
141+ description = ''
142+ If the specified units are started at the same time as
143+ this unit, delay them until this unit has started.
144+ '';
145+ };
146+
147+ bindsTo = mkOption {
148+ default = [];
149+ type = types.listOf unitNameType;
150+ description = ''
151+ Like ‘requires’, but in addition, if the specified units
152+ unexpectedly disappear, this unit will be stopped as well.
153+ '';
154+ };
155+
156+ partOf = mkOption {
157+ default = [];
158+ type = types.listOf unitNameType;
159+ description = ''
160+ If the specified units are stopped or restarted, then this
161+ unit is stopped or restarted as well.
162+ '';
163+ };
164+
165+ conflicts = mkOption {
166+ default = [];
167+ type = types.listOf unitNameType;
168+ description = ''
169+ If the specified units are started, then this unit is stopped
170+ and vice versa.
171+ '';
172+ };
173+
174+ requisite = mkOption {
175+ default = [];
176+ type = types.listOf unitNameType;
177+ description = ''
178+ Similar to requires. However if the units listed are not started,
179+ they will not be started and the transaction will fail.
180+ '';
181+ };
182+
183+ unitConfig = mkOption {
184+ default = {};
185+ example = { RequiresMountsFor = "/data"; };
186+ type = types.attrsOf unitOption;
187+ description = ''
188+ Each attribute in this set specifies an option in the
189+ <literal>[Unit]</literal> section of the unit. See
190+ <citerefentry><refentrytitle>systemd.unit</refentrytitle>
191+ <manvolnum>5</manvolnum></citerefentry> for details.
192+ '';
193+ };
194+
195+ onFailure = mkOption {
196+ default = [];
197+ type = types.listOf unitNameType;
198+ description = ''
199+ A list of one or more units that are activated when
200+ this unit enters the "failed" state.
201+ '';
202+ };
203+
204+ startLimitBurst = mkOption {
205+ type = types.int;
206+ description = ''
207+ Configure unit start rate limiting. Units which are started
208+ more than startLimitBurst times within an interval time
209+ interval are not permitted to start any more.
210+ '';
211+ };
212+
213+ startLimitIntervalSec = mkOption {
214+ type = types.int;
215+ description = ''
216+ Configure unit start rate limiting. Units which are started
217+ more than startLimitBurst times within an interval time
218+ interval are not permitted to start any more.
219+ '';
220+ };
98
221
99− description = mkOption {
100− default = "";
101− type = types.singleLineStr;
102− description = "Description of this unit used in systemd messages and progress indicators.";
103 };
222 };
104−
105− documentation = mkOption {
106− default = [];
107− type = types.listOf types.str;
108− description = "A list of URIs referencing documentation for this unit or its configuration.";
109− };
110−
111− requires = mkOption {
112− default = [];
113− type = types.listOf unitNameType;
114− description = ''
115− Start the specified units when this unit is started, and stop
116− this unit when the specified units are stopped or fail.
117− '';
118− };
119−
120− wants = mkOption {
121− default = [];
122− type = types.listOf unitNameType;
123− description = ''
124− Start the specified units when this unit is started.
125− '';
126− };
127−
128− after = mkOption {
129− default = [];
130− type = types.listOf unitNameType;
131− description = ''
132− If the specified units are started at the same time as
133− this unit, delay this unit until they have started.
134− '';
135− };
136−
137− before = mkOption {
138− default = [];
139− type = types.listOf unitNameType;
140− description = ''
141− If the specified units are started at the same time as
142− this unit, delay them until this unit has started.
143− '';
144− };
145−
146− bindsTo = mkOption {
147− default = [];
148− type = types.listOf unitNameType;
149− description = ''
150− Like ‘requires’, but in addition, if the specified units
151− unexpectedly disappear, this unit will be stopped as well.
152− '';
153− };
154−
155− partOf = mkOption {
156− default = [];
157− type = types.listOf unitNameType;
158− description = ''
159− If the specified units are stopped or restarted, then this
160− unit is stopped or restarted as well.
161− '';
162− };
163−
164− conflicts = mkOption {
165− default = [];
166− type = types.listOf unitNameType;
167− description = ''
168− If the specified units are started, then this unit is stopped
169− and vice versa.
170− '';
171− };
172−
173− requisite = mkOption {
174− default = [];
175− type = types.listOf unitNameType;
176− description = ''
177− Similar to requires. However if the units listed are not started,
178− they will not be started and the transaction will fail.
179− '';
180− };
181−
182− unitConfig = mkOption {
183− default = {};
184− example = { RequiresMountsFor = "/data"; };
185− type = types.attrsOf unitOption;
186− description = ''
187− Each attribute in this set specifies an option in the
188− <literal>[Unit]</literal> section of the unit. See
189− <citerefentry><refentrytitle>systemd.unit</refentrytitle>
190− <manvolnum>5</manvolnum></citerefentry> for details.
191− '';
192− };
193−
194− restartTriggers = mkOption {
195− default = [];
196− type = types.listOf types.unspecified;
197− description = ''
198− An arbitrary list of items such as derivations. If any item
199− in the list changes between reconfigurations, the service will
200− be restarted.
201− '';
202− };
203−
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−
215− onFailure = mkOption {
216− default = [];
217− type = types.listOf unitNameType;
218− description = ''
219− A list of one or more units that are activated when
220− this unit enters the "failed" state.
221− '';
222− };
223−
224− startLimitBurst = mkOption {
225− type = types.int;
226− description = ''
227− Configure unit start rate limiting. Units which are started
228− more than startLimitBurst times within an interval time
229− interval are not permitted to start any more.
230− '';
231− };
232−
233− startLimitIntervalSec = mkOption {
234− type = types.int;
235− description = ''
236− Configure unit start rate limiting. Units which are started
237− more than startLimitBurst times within an interval time
238− interval are not permitted to start any more.
239− '';
240− };
241−
242 };
223 };
243
224
244−
225+ stage2CommonUnitOptions = {
226+ imports = [
245− serviceOptions = commonUnitOptions // {
227+ commonUnitOptions
246−
228+ ];
247− environment = mkOption {
229+
230+ options = {
231+ restartTriggers = mkOption {
248− default = {};
232+ default = [];
249− type = with types; attrsOf (nullOr (oneOf [ str path package ]));
233+ type = types.listOf types.unspecified;
250− example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
234+ description = ''
251− description = "Environment variables passed to the service's processes.";
235+ An arbitrary list of items such as derivations. If any item
236+ in the list changes between reconfigurations, the service will
237+ be restarted.
238+ '';
252− };
239+ };
253−
240+
254− path = mkOption {
241+ reloadTriggers = mkOption {
255− default = [];
242+ default = [];
256− type = with types; listOf (oneOf [ package str ]);
243+ type = types.listOf unitOption;
257− description = ''
244+ description = ''
258− Packages added to the service's <envar>PATH</envar>
245+ An arbitrary list of items such as derivations. If any item
259− environment variable. Both the <filename>bin</filename>
246+ in the list changes between reconfigurations, the service will
260− and <filename>sbin</filename> subdirectories of each
247+ be reloaded. If anything but a reload trigger changes in the
261− package are added.
248+ unit file, the unit will be restarted instead.
262− '';
249+ '';
250+ };
263 };
251 };
252+ };
253+ stage1CommonUnitOptions = commonUnitOptions;
254+
255+ serviceOptions = { name, config, ... }: {
256+ options = {
257+
258+ environment = mkOption {
259+ default = {};
260+ type = with types; attrsOf (nullOr (oneOf [ str path package ]));
261+ example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
262+ description = "Environment variables passed to the service's processes.";
263+ };
264+
265+ path = mkOption {
266+ default = [];
267+ type = with types; listOf (oneOf [ package str ]);
268+ description = ''
269+ Packages added to the service's <envar>PATH</envar>
270+ environment variable. Both the <filename>bin</filename>
271+ and <filename>sbin</filename> subdirectories of each
272+ package are added.
273+ '';
274+ };
275+
276+ serviceConfig = mkOption {
277+ default = {};
278+ example =
279+ { RestartSec = 5;
280+ };
281+ type = types.addCheck (types.attrsOf unitOption) checkService;
282+ description = ''
283+ Each attribute in this set specifies an option in the
284+ <literal>[Service]</literal> section of the unit. See
285+ <citerefentry><refentrytitle>systemd.service</refentrytitle>
286+ <manvolnum>5</manvolnum></citerefentry> for details.
287+ '';
288+ };
289+
290+ script = mkOption {
291+ type = types.lines;
292+ default = "";
293+ description = "Shell commands executed as the service's main process.";
294+ };
295+
296+ scriptArgs = mkOption {
297+ type = types.str;
298+ default = "";
299+ description = "Arguments passed to the main process script.";
300+ };
301+
302+ preStart = mkOption {
303+ type = types.lines;
304+ default = "";
305+ description = ''
306+ Shell commands executed before the service's main process
307+ is started.
308+ '';
309+ };
310+
311+ postStart = mkOption {
312+ type = types.lines;
313+ default = "";
314+ description = ''
315+ Shell commands executed after the service's main process
316+ is started.
317+ '';
318+ };
319+
320+ reload = mkOption {
321+ type = types.lines;
322+ default = "";
323+ description = ''
324+ Shell commands executed when the service's main process
325+ is reloaded.
326+ '';
327+ };
328+
329+ preStop = mkOption {
330+ type = types.lines;
331+ default = "";
332+ description = ''
333+ Shell commands executed to stop the service.
334+ '';
335+ };
336+
337+ postStop = mkOption {
338+ type = types.lines;
339+ default = "";
340+ description = ''
341+ Shell commands executed after the service's main process
342+ has exited.
343+ '';
344+ };
345+
346+ jobScripts = mkOption {
347+ type = with types; coercedTo path singleton (listOf path);
348+ internal = true;
349+ description = "A list of all job script derivations of this unit.";
350+ default = [];
351+ };
352+
353+ };
354+
355+ config = mkMerge [
356+ (mkIf (config.preStart != "") rec {
357+ jobScripts = makeJobScript "${name}-pre-start" config.preStart;
358+ serviceConfig.ExecStartPre = [ jobScripts ];
359+ })
360+ (mkIf (config.script != "") rec {
361+ jobScripts = makeJobScript "${name}-start" config.script;
362+ serviceConfig.ExecStart = jobScripts + " " + config.scriptArgs;
363+ })
364+ (mkIf (config.postStart != "") rec {
365+ jobScripts = (makeJobScript "${name}-post-start" config.postStart);
366+ serviceConfig.ExecStartPost = [ jobScripts ];
367+ })
368+ (mkIf (config.reload != "") rec {
369+ jobScripts = makeJobScript "${name}-reload" config.reload;
370+ serviceConfig.ExecReload = jobScripts;
371+ })
372+ (mkIf (config.preStop != "") rec {
373+ jobScripts = makeJobScript "${name}-pre-stop" config.preStop;
374+ serviceConfig.ExecStop = jobScripts;
375+ })
376+ (mkIf (config.postStop != "") rec {
377+ jobScripts = makeJobScript "${name}-post-stop" config.postStop;
378+ serviceConfig.ExecStopPost = jobScripts;
379+ })
380+ ];
264
381
265− serviceConfig = mkOption {
266− default = {};
267− example =
268− { RestartSec = 5;
269− };
270− type = types.addCheck (types.attrsOf unitOption) checkService;
271− description = ''
272− Each attribute in this set specifies an option in the
273− <literal>[Service]</literal> section of the unit. See
274− <citerefentry><refentrytitle>systemd.service</refentrytitle>
275− <manvolnum>5</manvolnum></citerefentry> for details.
276− '';
277− };
382+ };
278
383
384+ stage2ServiceOptions = {
385+ imports = [
386+ stage2CommonUnitOptions
387+ serviceOptions
388+ ];
389+
390+ options = {
279− script = mkOption {
391+ restartIfChanged = mkOption {
280− type = types.lines;
392+ type = types.bool;
393+ default = true;
394+ description = ''
395+ Whether the service should be restarted during a NixOS
396+ configuration switch if its definition has changed.
397+ '';
398+ };
399+
400+ reloadIfChanged = mkOption {
401+ type = types.bool;
281− default = "";
402+ default = false;
282− description = "Shell commands executed as the service's main process.";
403+ description = ''
404+ Whether the service should be reloaded during a NixOS
405+ configuration switch if its definition has changed. If
406+ enabled, the value of <option>restartIfChanged</option> is
407+ ignored.
408+
409+ This option should not be used anymore in favor of
410+ <option>reloadTriggers</option> which allows more granular
411+ control of when a service is reloaded and when a service
412+ is restarted.
413+ '';
414+ };
415+
416+ stopIfChanged = mkOption {
417+ type = types.bool;
418+ default = true;
419+ description = ''
420+ If set, a changed unit is restarted by calling
421+ <command>systemctl stop</command> in the old configuration,
422+ then <command>systemctl start</command> in the new one.
423+ Otherwise, it is restarted in a single step using
424+ <command>systemctl restart</command> in the new configuration.
425+ The latter is less correct because it runs the
426+ <literal>ExecStop</literal> commands from the new
427+ configuration.
428+ '';
429+ };
430+
431+ startAt = mkOption {
432+ type = with types; either str (listOf str);
433+ default = [];
434+ example = "Sun 14:00:00";
435+ description = ''
436+ Automatically start this unit at the given date/time, which
437+ must be in the format described in
438+ <citerefentry><refentrytitle>systemd.time</refentrytitle>
439+ <manvolnum>7</manvolnum></citerefentry>. This is equivalent
440+ to adding a corresponding timer unit with
441+ <option>OnCalendar</option> set to the value given here.
442+ '';
443+ apply = v: if isList v then v else [ v ];
444+ };
283 };
445 };
446+ };
284
447
285− scriptArgs = mkOption {
448+ stage1ServiceOptions = {
286− type = types.str;
449+ imports = [
287− default = "";
450+ stage1CommonUnitOptions
288− description = "Arguments passed to the main process script.";
451+ serviceOptions
452+ ];
289− };
453+ };
290
454
291− preStart = mkOption {
292− type = types.lines;
293− default = "";
294− description = ''
295− Shell commands executed before the service's main process
296− is started.
297− '';
298− };
299
455
456+ socketOptions = {
457+ options = {
458+
300− postStart = mkOption {
459+ listenStreams = mkOption {
460+ default = [];
301− type = types.lines;
461+ type = types.listOf types.str;
462+ example = [ "0.0.0.0:993" "/run/my-socket" ];
463+ description = ''
464+ For each item in this list, a <literal>ListenStream</literal>
465+ option in the <literal>[Socket]</literal> section will be created.
466+ '';
467+ };
468+
469+ listenDatagrams = mkOption {
302− default = "";
470+ default = [];
471+ type = types.listOf types.str;
472+ example = [ "0.0.0.0:993" "/run/my-socket" ];
303− description = ''
473+ description = ''
304− Shell commands executed after the service's main process
474+ For each item in this list, a <literal>ListenDatagram</literal>
305− is started.
475+ option in the <literal>[Socket]</literal> section will be created.
476+ '';
477+ };
478+
479+ socketConfig = mkOption {
480+ default = {};
481+ example = { ListenStream = "/run/my-socket"; };
482+ type = types.attrsOf unitOption;
483+ description = ''
484+ Each attribute in this set specifies an option in the
485+ <literal>[Socket]</literal> section of the unit. See
486+ <citerefentry><refentrytitle>systemd.socket</refentrytitle>
487+ <manvolnum>5</manvolnum></citerefentry> for details.
306− '';
488+ '';
489+ };
307 };
490 };
308
491
309− reload = mkOption {
310− type = types.lines;
311− default = "";
312− description = ''
313− Shell commands executed when the service's main process
314− is reloaded.
315− '';
316− };
492+ };
317
493
318− preStop = mkOption {
494+ stage2SocketOptions = {
319− type = types.lines;
495+ imports = [
320− default = "";
496+ stage2CommonUnitOptions
321− description = ''
497+ socketOptions
322− Shell commands executed to stop the service.
323− '';
498+ ];
324− };
499+ };
325
500
326− postStop = mkOption {
501+ stage1SocketOptions = {
327− type = types.lines;
502+ imports = [
328− default = "";
503+ stage1CommonUnitOptions
329− description = ''
504+ socketOptions
330− Shell commands executed after the service's main process
331− has exited.
332− '';
505+ ];
333− };
506+ };
334
507
335− restartIfChanged = mkOption {
336− type = types.bool;
337− default = true;
338− description = ''
339− Whether the service should be restarted during a NixOS
340− configuration switch if its definition has changed.
341− '';
342− };
343
508
344− reloadIfChanged = mkOption {
509+ timerOptions = {
345− type = types.bool;
510+ options = {
346− default = false;
347− description = ''
348− Whether the service should be reloaded during a NixOS
349− configuration switch if its definition has changed. If
350− enabled, the value of <option>restartIfChanged</option> is
351− 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.
357− '';
358− };
359
511
360− stopIfChanged = mkOption {
512+ timerConfig = mkOption {
513+ default = {};
514+ example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; };
361− type = types.bool;
515+ type = types.attrsOf unitOption;
362− default = true;
363− description = ''
516+ description = ''
364− If set, a changed unit is restarted by calling
517+ Each attribute in this set specifies an option in the
365− <command>systemctl stop</command> in the old configuration,
518+ <literal>[Timer]</literal> section of the unit. See
366− then <command>systemctl start</command> in the new one.
519+ <citerefentry><refentrytitle>systemd.timer</refentrytitle>
367− Otherwise, it is restarted in a single step using
520+ <manvolnum>5</manvolnum></citerefentry> and
368− <command>systemctl restart</command> in the new configuration.
521+ <citerefentry><refentrytitle>systemd.time</refentrytitle>
369− The latter is less correct because it runs the
522+ <manvolnum>7</manvolnum></citerefentry> for details.
370− <literal>ExecStop</literal> commands from the new
371− configuration.
372− '';
523+ '';
373− };
524+ };
374
525
375− startAt = mkOption {
376− type = with types; either str (listOf str);
377− default = [];
378− example = "Sun 14:00:00";
379− description = ''
380− Automatically start this unit at the given date/time, which
381− must be in the format described in
382− <citerefentry><refentrytitle>systemd.time</refentrytitle>
383− <manvolnum>7</manvolnum></citerefentry>. This is equivalent
384− to adding a corresponding timer unit with
385− <option>OnCalendar</option> set to the value given here.
386− '';
387− apply = v: if isList v then v else [ v ];
388 };
526 };
527+ };
389
528
529+ stage2TimerOptions = {
530+ imports = [
531+ stage2CommonUnitOptions
532+ timerOptions
533+ ];
390 };
534 };
391
535
536+ stage1TimerOptions = {
537+ imports = [
538+ stage1CommonUnitOptions
539+ timerOptions
540+ ];
541+ };
392
542
393− socketOptions = commonUnitOptions // {
394
543
395− listenStreams = mkOption {
544+ pathOptions = {
396− default = [];
545+ options = {
397− type = types.listOf types.str;
398− example = [ "0.0.0.0:993" "/run/my-socket" ];
399− description = ''
400− For each item in this list, a <literal>ListenStream</literal>
401− option in the <literal>[Socket]</literal> section will be created.
402− '';
403− };
404
546
405− listenDatagrams = mkOption {
547+ pathConfig = mkOption {
406− default = [];
548+ default = {};
407− type = types.listOf types.str;
549+ example = { PathChanged = "/some/path"; Unit = "changedpath.service"; };
408− example = [ "0.0.0.0:993" "/run/my-socket" ];
550+ type = types.attrsOf unitOption;
409− description = ''
551+ description = ''
410− For each item in this list, a <literal>ListenDatagram</literal>
552+ Each attribute in this set specifies an option in the
411− option in the <literal>[Socket]</literal> section will be created.
553+ <literal>[Path]</literal> section of the unit. See
554+ <citerefentry><refentrytitle>systemd.path</refentrytitle>
555+ <manvolnum>5</manvolnum></citerefentry> for details.
412− '';
556+ '';
413− };
557+ };
414
558
415− socketConfig = mkOption {
416− default = {};
417− example = { ListenStream = "/run/my-socket"; };
418− type = types.attrsOf unitOption;
419− description = ''
420− Each attribute in this set specifies an option in the
421− <literal>[Socket]</literal> section of the unit. See
422− <citerefentry><refentrytitle>systemd.socket</refentrytitle>
423− <manvolnum>5</manvolnum></citerefentry> for details.
424− '';
425 };
559 };
426−
427 };
560 };
428
561
562+ stage2PathOptions = {
563+ imports = [
564+ stage2CommonUnitOptions
565+ pathOptions
566+ ];
567+ };
429
568
430− timerOptions = commonUnitOptions // {
569+ stage1PathOptions = {
431−
570+ imports = [
432− timerConfig = mkOption {
571+ stage1CommonUnitOptions
433− default = {};
572+ pathOptions
434− example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; };
435− type = types.attrsOf unitOption;
436− description = ''
437− Each attribute in this set specifies an option in the
438− <literal>[Timer]</literal> section of the unit. See
439− <citerefentry><refentrytitle>systemd.timer</refentrytitle>
440− <manvolnum>5</manvolnum></citerefentry> and
441− <citerefentry><refentrytitle>systemd.time</refentrytitle>
442− <manvolnum>7</manvolnum></citerefentry> for details.
443− '';
573+ ];
444− };
445−
446 };
574 };
447
575
448
576
449− pathOptions = commonUnitOptions // {
577+ mountOptions = {
578+ options = {
579+
580+ what = mkOption {
581+ example = "/dev/sda1";
582+ type = types.str;
583+ description = "Absolute path of device node, file or other resource. (Mandatory)";
584+ };
585+
586+ where = mkOption {
587+ example = "/mnt";
588+ type = types.str;
589+ description = ''
590+ Absolute path of a directory of the mount point.
591+ Will be created if it doesn't exist. (Mandatory)
592+ '';
593+ };
594+
595+ type = mkOption {
596+ default = "";
597+ example = "ext4";
598+ type = types.str;
599+ description = "File system type.";
600+ };
601+
602+ options = mkOption {
603+ default = "";
604+ example = "noatime";
605+ type = types.commas;
606+ description = "Options used to mount the file system.";
607+ };
608+
609+ mountConfig = mkOption {
610+ default = {};
611+ example = { DirectoryMode = "0775"; };
612+ type = types.attrsOf unitOption;
613+ description = ''
614+ Each attribute in this set specifies an option in the
615+ <literal>[Mount]</literal> section of the unit. See
616+ <citerefentry><refentrytitle>systemd.mount</refentrytitle>
617+ <manvolnum>5</manvolnum></citerefentry> for details.
618+ '';
619+ };
450
620
451− pathConfig = mkOption {
452− default = {};
453− example = { PathChanged = "/some/path"; Unit = "changedpath.service"; };
454− type = types.attrsOf unitOption;
455− description = ''
456− Each attribute in this set specifies an option in the
457− <literal>[Path]</literal> section of the unit. See
458− <citerefentry><refentrytitle>systemd.path</refentrytitle>
459− <manvolnum>5</manvolnum></citerefentry> for details.
460− '';
461 };
621 };
462−
463 };
622 };
464
623
624+ stage2MountOptions = {
625+ imports = [
626+ stage2CommonUnitOptions
627+ mountOptions
628+ ];
629+ };
465
630
631+ stage1MountOptions = {
632+ imports = [
633+ stage1CommonUnitOptions
466− mountOptions = commonUnitOptions // {
634+ mountOptions
467−
635+ ];
468− what = mkOption {
469− example = "/dev/sda1";
470− type = types.str;
471− description = "Absolute path of device node, file or other resource. (Mandatory)";
472− };
636+ };
473
637
638+ automountOptions = {
639+ options = {
640+
474− where = mkOption {
641+ where = mkOption {
475− example = "/mnt";
642+ example = "/mnt";
476− type = types.str;
643+ type = types.str;
477− description = ''
644+ description = ''
478− Absolute path of a directory of the mount point.
645+ Absolute path of a directory of the mount point.
479− Will be created if it doesn't exist. (Mandatory)
646+ Will be created if it doesn't exist. (Mandatory)
480− '';
647+ '';
648+ };
649+
650+ automountConfig = mkOption {
651+ default = {};
652+ example = { DirectoryMode = "0775"; };
653+ type = types.attrsOf unitOption;
654+ description = ''
655+ Each attribute in this set specifies an option in the
656+ <literal>[Automount]</literal> section of the unit. See
657+ <citerefentry><refentrytitle>systemd.automount</refentrytitle>
658+ <manvolnum>5</manvolnum></citerefentry> for details.
659+ '';
481− };
660+ };
482
661
483− type = mkOption {
484− default = "";
485− example = "ext4";
486− type = types.str;
487− description = "File system type.";
488 };
662 };
663+ };
489
664
490− options = mkOption {
665+ stage2AutomountOptions = {
491− default = "";
666+ imports = [
492− example = "noatime";
667+ stage2CommonUnitOptions
493− type = types.commas;
668+ automountOptions
494− description = "Options used to mount the file system.";
669+ ];
495− };
670+ };
496
671
497− mountConfig = mkOption {
672+ stage1AutomountOptions = {
498− default = {};
673+ imports = [
499− example = { DirectoryMode = "0775"; };
674+ stage1CommonUnitOptions
500− type = types.attrsOf unitOption;
675+ automountOptions
501− description = ''
502− Each attribute in this set specifies an option in the
503− <literal>[Mount]</literal> section of the unit. See
504− <citerefentry><refentrytitle>systemd.mount</refentrytitle>
505− <manvolnum>5</manvolnum></citerefentry> for details.
506− '';
507− };
676+ ];
508 };
677 };
509
678
510− automountOptions = commonUnitOptions // {
679+ sliceOptions = {
680+ options = {
511
681
512− where = mkOption {
682+ sliceConfig = mkOption {
683+ default = {};
513− example = "/mnt";
684+ example = { MemoryMax = "2G"; };
514− type = types.str;
685+ type = types.attrsOf unitOption;
515− description = ''
686+ description = ''
516− Absolute path of a directory of the mount point.
687+ Each attribute in this set specifies an option in the
517− Will be created if it doesn't exist. (Mandatory)
688+ <literal>[Slice]</literal> section of the unit. See
689+ <citerefentry><refentrytitle>systemd.slice</refentrytitle>
690+ <manvolnum>5</manvolnum></citerefentry> for details.
518− '';
691+ '';
519− };
692+ };
520
693
521− automountConfig = mkOption {
522− default = {};
523− example = { DirectoryMode = "0775"; };
524− type = types.attrsOf unitOption;
525− description = ''
526− Each attribute in this set specifies an option in the
527− <literal>[Automount]</literal> section of the unit. See
528− <citerefentry><refentrytitle>systemd.automount</refentrytitle>
529− <manvolnum>5</manvolnum></citerefentry> for details.
530− '';
531 };
694 };
532 };
695 };
533
696
534− targetOptions = commonUnitOptions;
697+ stage2SliceOptions = {
535−
698+ imports = [
536− sliceOptions = commonUnitOptions // {
699+ stage2CommonUnitOptions
537−
700+ sliceOptions
538− sliceConfig = mkOption {
539− default = {};
540− example = { MemoryMax = "2G"; };
541− type = types.attrsOf unitOption;
542− description = ''
543− Each attribute in this set specifies an option in the
544− <literal>[Slice]</literal> section of the unit. See
545− <citerefentry><refentrytitle>systemd.slice</refentrytitle>
546− <manvolnum>5</manvolnum></citerefentry> for details.
547− '';
701+ ];
548− };
702+ };
549
703
704+ stage1SliceOptions = {
705+ imports = [
706+ stage1CommonUnitOptions
707+ sliceOptions
708+ ];
550 };
709 };
551
710
552}
711}
nixos/lib/test-driver/test_driver/driver.py+1−1
@@ -86,7 +86,7 @@ class Driver:
86
86
87 def subtest(self, name: str) -> Iterator[None]:
87 def subtest(self, name: str) -> Iterator[None]:
88 """Group logs under a given test name"""
88 """Group logs under a given test name"""
89− with rootlog.nested(name):
89+ with rootlog.nested("subtest: " + name):
90 try:
90 try:
91 yield
91 yield
92 return True
92 return True
nixos/lib/test-driver/test_driver/logger.py+6−2
@@ -1,4 +1,4 @@
1−from colorama import Style
1+from colorama import Style, Fore
2from contextlib import contextmanager
2from contextlib import contextmanager
3from typing import Any, Dict, Iterator
3from typing import Any, Dict, Iterator
4from queue import Queue, Empty
4from queue import Queue, Empty
@@ -81,7 +81,11 @@ class Logger:
81
81
82 @contextmanager
82 @contextmanager
83 def nested(self, message: str, attributes: Dict[str, str] = {}) -> Iterator[None]:
83 def nested(self, message: str, attributes: Dict[str, str] = {}) -> Iterator[None]:
84+ self._eprint(
84− self._eprint(self.maybe_prefix(message, attributes))
85+ self.maybe_prefix(
86+ Style.BRIGHT + Fore.GREEN + message + Style.RESET_ALL, attributes
87+ )
88+ )
85
89
86 self.xml.startElement("nest", attrs={})
90 self.xml.startElement("nest", attrs={})
87 self.xml.startElement("head", attributes)
91 self.xml.startElement("head", attributes)
nixos/lib/test-driver/test_driver/machine.py+9−2
@@ -526,10 +526,17 @@ class Machine:
526 self.run_callbacks()
526 self.run_callbacks()
527 self.connect()
527 self.connect()
528
528
529+ # Always run command with shell opts
530+ command = f"set -euo pipefail; {command}"
531+
532+ timeout_str = ""
529 if timeout is not None:
533 if timeout is not None:
534+ timeout_str = f"timeout {timeout}"
535+
536+ out_command = (
530− command = "timeout {} sh -c {}".format(timeout, shlex.quote(command))
537+ f"{timeout_str} sh -c {shlex.quote(command)} | (base64 --wrap 0; echo)\n"
538+ )
531
539
532− out_command = f"( set -euo pipefail; {command} ) | (base64 --wrap 0; echo)\n"
533 assert self.shell
540 assert self.shell
534 self.shell.send(out_command.encode())
541 self.shell.send(out_command.encode())
535
542
nixos/lib/utils.nix+17
@@ -194,8 +194,25 @@ rec {
194 (( ! $inherit_errexit_enabled )) && shopt -u inherit_errexit
194 (( ! $inherit_errexit_enabled )) && shopt -u inherit_errexit
195 '';
195 '';
196
196
197+ /* Remove packages of packagesToRemove from packages, based on their names.
198+ Relies on package names and has quadratic complexity so use with caution!
199+
200+ Type:
201+ removePackagesByName :: [package] -> [package] -> [package]
202+
203+ Example:
204+ removePackagesByName [ nautilus file-roller ] [ file-roller totem ]
205+ => [ nautilus ]
206+ */
207+ removePackagesByName = packages: packagesToRemove:
208+ let
209+ namesToRemove = map lib.getName packagesToRemove;
210+ in
211+ lib.filter (x: !(builtins.elem (lib.getName x) namesToRemove)) packages;
212+
197 systemdUtils = {
213 systemdUtils = {
198 lib = import ./systemd-lib.nix { inherit lib config pkgs; };
214 lib = import ./systemd-lib.nix { inherit lib config pkgs; };
199 unitOptions = import ./systemd-unit-options.nix { inherit lib systemdUtils; };
215 unitOptions = import ./systemd-unit-options.nix { inherit lib systemdUtils; };
216+ types = import ./systemd-types.nix { inherit lib systemdUtils pkgs; };
200 };
217 };
201}
218}
nixos/maintainers/scripts/ec2/amazon-image.nix+1−1
@@ -73,7 +73,7 @@ in {
73 }
73 }
74 '';
74 '';
75
75
76− zfsBuilder = import ../../../lib/make-zfs-image.nix {
76+ zfsBuilder = import ../../../lib/make-multi-disk-zfs-image.nix {
77 inherit lib config configFile;
77 inherit lib config configFile;
78 inherit (cfg) contents format name;
78 inherit (cfg) contents format name;
79 pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
79 pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
nixos/maintainers/scripts/lxd/lxd-image.nix+1−1
@@ -27,7 +27,7 @@ with lib;
27 networking.useDHCP = false;
27 networking.useDHCP = false;
28 networking.interfaces.eth0.useDHCP = true;
28 networking.interfaces.eth0.useDHCP = true;
29
29
30− # As this is intended as a stadalone image, undo some of the minimal profile stuff
30+ # As this is intended as a standalone image, undo some of the minimal profile stuff
31 documentation.enable = true;
31 documentation.enable = true;
32 documentation.nixos.enable = true;
32 documentation.nixos.enable = true;
33 environment.noXlibs = false;
33 environment.noXlibs = false;
nixos/maintainers/scripts/openstack/openstack-image-zfs.nixnew file+101
@@ -0,0 +1,101 @@
1+# nix-build '<nixpkgs/nixos>' -A config.system.build.openstackImage --arg configuration "{ imports = [ ./nixos/maintainers/scripts/openstack/openstack-image.nix ]; }"
2+
3+{ config, lib, pkgs, ... }:
4+let
5+ inherit (lib) mkOption types;
6+ copyChannel = true;
7+ cfg = config.openstackImage;
8+ imageBootMode = if config.openstack.efi then "uefi" else "legacy-bios";
9+in
10+{
11+ imports = [
12+ ../../../modules/virtualisation/openstack-config.nix
13+ ] ++ (lib.optional copyChannel ../../../modules/installer/cd-dvd/channel.nix);
14+
15+
16+ options.openstackImage = {
17+ name = mkOption {
18+ type = types.str;
19+ description = "The name of the generated derivation";
20+ default = "nixos-openstack-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
21+ };
22+
23+ sizeMB = mkOption {
24+ type = types.int;
25+ default = 8192;
26+ description = "The size in MB of the image";
27+ };
28+
29+ format = mkOption {
30+ type = types.enum [ "raw" "qcow2" ];
31+ default = "qcow2";
32+ description = "The image format to output";
33+ };
34+ };
35+
36+ config = {
37+ documentation.enable = copyChannel;
38+ openstack = {
39+ efi = true;
40+ zfs = {
41+ enable = true;
42+ datasets = {
43+ "tank/system/root".mount = "/";
44+ "tank/system/var".mount = "/var";
45+ "tank/local/nix".mount = "/nix";
46+ "tank/user/home".mount = "/home";
47+ };
48+ };
49+ };
50+
51+ system.build.openstackImage = import ../../../lib/make-single-disk-zfs-image.nix {
52+ inherit lib config;
53+ inherit (cfg) contents format name;
54+ pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
55+
56+ configFile = pkgs.writeText "configuration.nix"
57+ ''
58+ { modulesPath, ... }: {
59+ imports = [ "''${modulesPath}/virtualisation/openstack-config.nix" ];
60+ openstack.zfs.enable = true;
61+ }
62+ '';
63+
64+ includeChannel = copyChannel;
65+
66+ bootSize = 1000;
67+
68+ rootSize = cfg.sizeMB;
69+ rootPoolProperties = {
70+ ashift = 12;
71+ autoexpand = "on";
72+ };
73+
74+ datasets = config.openstack.zfs.datasets;
75+
76+ postVM = ''
77+ extension=''${rootDiskImage##*.}
78+ friendlyName=$out/${cfg.name}
79+ rootDisk="$friendlyName.root.$extension"
80+ mv "$rootDiskImage" "$rootDisk"
81+
82+ mkdir -p $out/nix-support
83+ echo "file ${cfg.format} $rootDisk" >> $out/nix-support/hydra-build-products
84+
85+ ${pkgs.jq}/bin/jq -n \
86+ --arg system_label ${lib.escapeShellArg config.system.nixos.label} \
87+ --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
88+ --arg root_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$rootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
89+ --arg boot_mode "${imageBootMode}" \
90+ --arg root "$rootDisk" \
91+ '{}
92+ | .label = $system_label
93+ | .boot_mode = $boot_mode
94+ | .system = $system
95+ | .disks.root.logical_bytes = $root_logical_bytes
96+ | .disks.root.file = $root
97+ ' > $out/nix-support/image-info.json
98+ '';
99+ };
100+ };
101+}
nixos/maintainers/scripts/openstack/openstack-image.nix+9−8
@@ -1,17 +1,18 @@
1# nix-build '<nixpkgs/nixos>' -A config.system.build.openstackImage --arg configuration "{ imports = [ ./nixos/maintainers/scripts/openstack/openstack-image.nix ]; }"
1# nix-build '<nixpkgs/nixos>' -A config.system.build.openstackImage --arg configuration "{ imports = [ ./nixos/maintainers/scripts/openstack/openstack-image.nix ]; }"
2
2
3{ config, lib, pkgs, ... }:
3{ config, lib, pkgs, ... }:
4−
4+let
5−with lib;
5+ copyChannel = true;
6−
6+in
7{
7{
8− imports =
8+ imports = [
9+ ../../../modules/virtualisation/openstack-config.nix
9− [ ../../../modules/installer/cd-dvd/channel.nix
10+ ] ++ (lib.optional copyChannel ../../../modules/installer/cd-dvd/channel.nix);
10− ../../../modules/virtualisation/openstack-config.nix
11+
11− ];
12+ documentation.enable = copyChannel;
12
13
13 system.build.openstackImage = import ../../../lib/make-disk-image.nix {
14 system.build.openstackImage = import ../../../lib/make-disk-image.nix {
14− inherit lib config;
15+ inherit lib config copyChannel;
15 additionalSpace = "1024M";
16 additionalSpace = "1024M";
16 pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
17 pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
17 format = "qcow2";
18 format = "qcow2";
nixos/modules/config/console.nix+23−9
@@ -12,7 +12,7 @@ let
12
12
13 optimizedKeymap = pkgs.runCommand "keymap" {
13 optimizedKeymap = pkgs.runCommand "keymap" {
14 nativeBuildInputs = [ pkgs.buildPackages.kbd ];
14 nativeBuildInputs = [ pkgs.buildPackages.kbd ];
15− LOADKEYS_KEYMAP_PATH = "${consoleEnv}/share/keymaps/**";
15+ LOADKEYS_KEYMAP_PATH = "${consoleEnv pkgs.kbd}/share/keymaps/**";
16 preferLocalBuild = true;
16 preferLocalBuild = true;
17 } ''
17 } ''
18 loadkeys -b ${optionalString isUnicode "-u"} "${cfg.keyMap}" > $out
18 loadkeys -b ${optionalString isUnicode "-u"} "${cfg.keyMap}" > $out
@@ -24,9 +24,9 @@ let
24 FONT=${cfg.font}
24 FONT=${cfg.font}
25 '';
25 '';
26
26
27− consoleEnv = pkgs.buildEnv {
27+ consoleEnv = kbd: pkgs.buildEnv {
28 name = "console-env";
28 name = "console-env";
29− paths = [ pkgs.kbd ] ++ cfg.packages;
29+ paths = [ kbd ] ++ cfg.packages;
30 pathsToLink = [
30 pathsToLink = [
31 "/share/consolefonts"
31 "/share/consolefonts"
32 "/share/consoletrans"
32 "/share/consoletrans"
@@ -136,9 +136,9 @@ in
136 # virtual consoles.
136 # virtual consoles.
137 environment.etc."vconsole.conf".source = vconsoleConf;
137 environment.etc."vconsole.conf".source = vconsoleConf;
138 # Provide kbd with additional packages.
138 # Provide kbd with additional packages.
139− environment.etc.kbd.source = "${consoleEnv}/share";
139+ environment.etc.kbd.source = "${consoleEnv pkgs.kbd}/share";
140
140
141− boot.initrd.preLVMCommands = mkBefore ''
141+ boot.initrd.preLVMCommands = mkIf (!config.boot.initrd.systemd.enable) (mkBefore ''
142 kbd_mode ${if isUnicode then "-u" else "-a"} -C /dev/console
142 kbd_mode ${if isUnicode then "-u" else "-a"} -C /dev/console
143 printf "\033%%${if isUnicode then "G" else "@"}" >> /dev/console
143 printf "\033%%${if isUnicode then "G" else "@"}" >> /dev/console
144 loadkmap < ${optimizedKeymap}
144 loadkmap < ${optimizedKeymap}
@@ -146,12 +146,26 @@ in
146 ${optionalString cfg.earlySetup ''
146 ${optionalString cfg.earlySetup ''
147 setfont -C /dev/console $extraUtils/share/consolefonts/font.psf
147 setfont -C /dev/console $extraUtils/share/consolefonts/font.psf
148 ''}
148 ''}
149− '';
149+ '');
150+
151+ boot.initrd.systemd.contents = {
152+ "/etc/vconsole.conf".source = vconsoleConf;
153+ # Add everything if we want full console setup...
154+ "/etc/kbd" = lib.mkIf cfg.earlySetup { source = "${consoleEnv config.boot.initrd.systemd.package.kbd}/share"; };
155+ # ...but only the keymaps if we don't
156+ "/etc/kbd/keymaps" = lib.mkIf (!cfg.earlySetup) { source = "${consoleEnv config.boot.initrd.systemd.package.kbd}/share/keymaps"; };
157+ };
158+ boot.initrd.systemd.storePaths = [
159+ "${config.boot.initrd.systemd.package}/lib/systemd/systemd-vconsole-setup"
160+ "${config.boot.initrd.systemd.package.kbd}/bin/setfont"
161+ "${config.boot.initrd.systemd.package.kbd}/bin/loadkeys"
162+ "${config.boot.initrd.systemd.package.kbd.gzip}/bin/gzip" # keyboard layouts are compressed
163+ ];
150
164
151 systemd.services.reload-systemd-vconsole-setup =
165 systemd.services.reload-systemd-vconsole-setup =
152 { description = "Reset console on configuration changes";
166 { description = "Reset console on configuration changes";
153 wantedBy = [ "multi-user.target" ];
167 wantedBy = [ "multi-user.target" ];
154− restartTriggers = [ vconsoleConf consoleEnv ];
168+ restartTriggers = [ vconsoleConf (consoleEnv pkgs.kbd) ];
155 reloadIfChanged = true;
169 reloadIfChanged = true;
156 serviceConfig =
170 serviceConfig =
157 { RemainAfterExit = true;
171 { RemainAfterExit = true;
@@ -169,13 +183,13 @@ in
169 ];
183 ];
170 })
184 })
171
185
172− (mkIf cfg.earlySetup {
186+ (mkIf (cfg.earlySetup && !config.boot.initrd.systemd.enable) {
173 boot.initrd.extraUtilsCommands = ''
187 boot.initrd.extraUtilsCommands = ''
174 mkdir -p $out/share/consolefonts
188 mkdir -p $out/share/consolefonts
175 ${if substring 0 1 cfg.font == "/" then ''
189 ${if substring 0 1 cfg.font == "/" then ''
176 font="${cfg.font}"
190 font="${cfg.font}"
177 '' else ''
191 '' else ''
178− font="$(echo ${consoleEnv}/share/consolefonts/${cfg.font}.*)"
192+ font="$(echo ${consoleEnv pkgs.kbd}/share/consolefonts/${cfg.font}.*)"
179 ''}
193 ''}
180 if [[ $font == *.gz ]]; then
194 if [[ $font == *.gz ]]; then
181 gzip -cd $font > $out/share/consolefonts/font.psf
195 gzip -cd $font > $out/share/consolefonts/font.psf
nixos/modules/config/nsswitch.nix+7−4
@@ -95,11 +95,14 @@ with lib;
95 config = {
95 config = {
96 assertions = [
96 assertions = [
97 {
97 {
98− # Prevent users from disabling nscd, with nssModules being set.
99− # If disabling nscd is really necessary, it's still possible to opt out
100− # by forcing config.system.nssModules to [].
101 assertion = config.system.nssModules.path != "" -> config.services.nscd.enable;
98 assertion = config.system.nssModules.path != "" -> config.services.nscd.enable;
99+ message = ''
102− message = "Loading NSS modules from system.nssModules (${config.system.nssModules.path}), requires services.nscd.enable being set to true.";
100+ Loading NSS modules from system.nssModules (${config.system.nssModules.path}),
101+ requires services.nscd.enable being set to true.
102+
103+ If disabling nscd is really necessary, it is possible to disable loading NSS modules
104+ by setting `system.nssModules = lib.mkForce [];` in your configuration.nix.
105+ '';
103 }
106 }
104 ];
107 ];
105
108
nixos/modules/config/terminfo.nix+25−1
@@ -1,9 +1,33 @@
1# This module manages the terminfo database
1# This module manages the terminfo database
2# and its integration in the system.
2# and its integration in the system.
3−{ config, ... }:
3+{ config, lib, pkgs, ... }:
4+
5+with lib;
6+
4{
7{
8+
9+ options.environment.enableAllTerminfo = with lib; mkOption {
10+ default = false;
11+ type = types.bool;
12+ description = ''
13+ Whether to install all terminfo outputs
14+ '';
15+ };
16+
5 config = {
17 config = {
6
18
19+ # can be generated with: filter (drv: (builtins.tryEval (drv ? terminfo)).value) (attrValues pkgs)
20+ environment.systemPackages = mkIf config.environment.enableAllTerminfo (map (x: x.terminfo) (with pkgs; [
21+ alacritty
22+ foot
23+ kitty
24+ mtm
25+ rxvt-unicode-unwrapped
26+ rxvt-unicode-unwrapped-emoji
27+ termite
28+ wezterm
29+ ]));
30+
7 environment.pathsToLink = [
31 environment.pathsToLink = [
8 "/share/terminfo"
32 "/share/terminfo"
9 ];
33 ];
nixos/modules/hardware/all-firmware.nix+7−3
@@ -27,7 +27,8 @@ in {
27 };
27 };
28
28
29 hardware.enableRedistributableFirmware = mkOption {
29 hardware.enableRedistributableFirmware = mkOption {
30− default = false;
30+ default = config.hardware.enableAllFirmware;
31+ defaultText = lib.literalExpression "config.hardware.enableAllFirmware";
31 type = types.bool;
32 type = types.bool;
32 description = ''
33 description = ''
33 Turn on this option if you want to enable all the firmware with a license allowing redistribution.
34 Turn on this option if you want to enable all the firmware with a license allowing redistribution.
@@ -71,7 +72,7 @@ in {
71 })
72 })
72 (mkIf cfg.enableAllFirmware {
73 (mkIf cfg.enableAllFirmware {
73 assertions = [{
74 assertions = [{
74− assertion = !cfg.enableAllFirmware || (config.nixpkgs.config.allowUnfree or false);
75+ assertion = !cfg.enableAllFirmware || config.nixpkgs.config.allowUnfree;
75 message = ''
76 message = ''
76 the list of hardware.enableAllFirmware contains non-redistributable licensed firmware files.
77 the list of hardware.enableAllFirmware contains non-redistributable licensed firmware files.
77 This requires nixpkgs.config.allowUnfree to be true.
78 This requires nixpkgs.config.allowUnfree to be true.
@@ -84,7 +85,10 @@ in {
84 b43Firmware_6_30_163_46
85 b43Firmware_6_30_163_46
85 b43FirmwareCutter
86 b43FirmwareCutter
86 xow_dongle-firmware
87 xow_dongle-firmware
87− ] ++ optional pkgs.stdenv.hostPlatform.isx86 facetimehd-firmware;
88+ ] ++ optionals pkgs.stdenv.hostPlatform.isx86 [
89+ facetimehd-calibration
90+ facetimehd-firmware
91+ ];
88 })
92 })
89 (mkIf cfg.wirelessRegulatoryDatabase {
93 (mkIf cfg.wirelessRegulatoryDatabase {
90 hardware.firmware = [ pkgs.wireless-regdb ];
94 hardware.firmware = [ pkgs.wireless-regdb ];
nixos/modules/hardware/raid/hpsa.nix+4−1
@@ -8,7 +8,10 @@ let
8 version = "2.40-13.0";
8 version = "2.40-13.0";
9
9
10 src = pkgs.fetchurl {
10 src = pkgs.fetchurl {
11+ urls = [
11− url = "https://downloads.linux.hpe.com/SDR/downloads/MCP/Ubuntu/pool/non-free/${pname}-${version}_amd64.deb";
12+ "https://downloads.linux.hpe.com/SDR/downloads/MCP/Ubuntu/pool/non-free/${pname}-${version}_amd64.deb"
13+ "http://apt.netangels.net/pool/main/h/hpssacli/${pname}-${version}_amd64.deb"
14+ ];
12 sha256 = "11w7fwk93lmfw0yya4jpjwdmgjimqxx6412sqa166g1pz4jil4sw";
15 sha256 = "11w7fwk93lmfw0yya4jpjwdmgjimqxx6412sqa166g1pz4jil4sw";
13 };
16 };
14
17
nixos/modules/hardware/video/amdgpu-pro.nix+2−1
@@ -51,9 +51,10 @@ in
51 (isYes "KALLSYMS_ALL")
51 (isYes "KALLSYMS_ALL")
52 ];
52 ];
53
53
54− boot.initrd.extraUdevRulesCommands = ''
54+ boot.initrd.extraUdevRulesCommands = mkIf (!config.boot.initrd.systemd.enable) ''
55 cp -v ${package}/etc/udev/rules.d/*.rules $out/
55 cp -v ${package}/etc/udev/rules.d/*.rules $out/
56 '';
56 '';
57+ boot.initrd.services.udev.packages = [ package ];
57
58
58 environment.systemPackages =
59 environment.systemPackages =
59 [ package.vulkan ] ++
60 [ package.vulkan ] ++
nixos/modules/hardware/video/nvidia.nix+9−7
@@ -24,6 +24,7 @@ let
24 primeEnabled = syncCfg.enable || offloadCfg.enable;
24 primeEnabled = syncCfg.enable || offloadCfg.enable;
25 nvidiaPersistencedEnabled = cfg.nvidiaPersistenced;
25 nvidiaPersistencedEnabled = cfg.nvidiaPersistenced;
26 nvidiaSettings = cfg.nvidiaSettings;
26 nvidiaSettings = cfg.nvidiaSettings;
27+ busIDType = types.strMatching "([[:print:]]+\:[0-9]{1,3}\:[0-9]{1,2}\:[0-9])?";
27in
28in
28
29
29{
30{
@@ -68,7 +69,7 @@ in
68 };
69 };
69
70
70 hardware.nvidia.prime.nvidiaBusId = mkOption {
71 hardware.nvidia.prime.nvidiaBusId = mkOption {
71− type = types.str;
72+ type = busIDType;
72 default = "";
73 default = "";
73 example = "PCI:1:0:0";
74 example = "PCI:1:0:0";
74 description = ''
75 description = ''
@@ -78,7 +79,7 @@ in
78 };
79 };
79
80
80 hardware.nvidia.prime.intelBusId = mkOption {
81 hardware.nvidia.prime.intelBusId = mkOption {
81− type = types.str;
82+ type = busIDType;
82 default = "";
83 default = "";
83 example = "PCI:0:2:0";
84 example = "PCI:0:2:0";
84 description = ''
85 description = ''
@@ -88,7 +89,7 @@ in
88 };
89 };
89
90
90 hardware.nvidia.prime.amdgpuBusId = mkOption {
91 hardware.nvidia.prime.amdgpuBusId = mkOption {
91− type = types.str;
92+ type = busIDType;
92 default = "";
93 default = "";
93 example = "PCI:4:0:0";
94 example = "PCI:4:0:0";
94 description = ''
95 description = ''
@@ -360,11 +361,12 @@ in
360 services.udev.extraRules =
361 services.udev.extraRules =
361 ''
362 ''
362 # Create /dev/nvidia-uvm when the nvidia-uvm module is loaded.
363 # Create /dev/nvidia-uvm when the nvidia-uvm module is loaded.
363− KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidiactl c $$(grep nvidia-frontend /proc/devices | cut -d \ -f 1) 255'"
364+ KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidiactl c 195 255'"
364− KERNEL=="nvidia_modeset", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-modeset c $$(grep nvidia-frontend /proc/devices | cut -d \ -f 1) 254'"
365+ KERNEL=="nvidia_modeset", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-modeset c 195 254'"
366+ KERNEL=="card*", SUBSYSTEM=="drm", DRIVERS=="nvidia", PROGRAM="${pkgs.gnugrep}/bin/grep 'Device Minor:' /proc/driver/nvidia/gpus/%b/information", \
365− KERNEL=="card*", SUBSYSTEM=="drm", DRIVERS=="nvidia", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia%n c $$(grep nvidia-frontend /proc/devices | cut -d \ -f 1) %n'"
367+ RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia%c{3} c 195 %c{3}"
366 KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0'"
368 KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0'"
367− KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0'"
369+ KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 1'"
368 '' + optionalString cfg.powerManagement.finegrained ''
370 '' + optionalString cfg.powerManagement.finegrained ''
369 # Remove NVIDIA USB xHCI Host Controller devices, if present
371 # Remove NVIDIA USB xHCI Host Controller devices, if present
370 ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1"
372 ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1"
nixos/modules/hardware/video/webcam/facetimehd.nix+14−6
@@ -14,12 +14,19 @@ in
14
14
15 options.hardware.facetimehd.enable = mkEnableOption "facetimehd kernel module";
15 options.hardware.facetimehd.enable = mkEnableOption "facetimehd kernel module";
16
16
17− config = mkIf cfg.enable {
17+ options.hardware.facetimehd.withCalibration = mkOption {
18+ default = false;
19+ example = true;
20+ type = types.bool;
21+ description = ''
22+ Whether to include sensor calibration files for facetimehd.
23+ This makes colors look much better but is experimental, see
24+ <link xlink:href="https://github.com/patjak/facetimehd/wiki/Extracting-the-sensor-calibration-files"/>
25+ for details.
26+ '';
27+ };
18
28
19− assertions = singleton {
29+ config = mkIf cfg.enable {
20− assertion = versionAtLeast kernelPackages.kernel.version "3.19";
21− message = "facetimehd is not supported for kernels older than 3.19";
22− };
23
30
24 boot.kernelModules = [ "facetimehd" ];
31 boot.kernelModules = [ "facetimehd" ];
25
32
@@ -27,7 +34,8 @@ in
27
34
28 boot.extraModulePackages = [ kernelPackages.facetimehd ];
35 boot.extraModulePackages = [ kernelPackages.facetimehd ];
29
36
30− hardware.firmware = [ pkgs.facetimehd-firmware ];
37+ hardware.firmware = [ pkgs.facetimehd-firmware ]
38+ ++ optional cfg.withCalibration pkgs.facetimehd-calibration;
31
39
32 # unload module during suspend/hibernate as it crashes the whole system
40 # unload module during suspend/hibernate as it crashes the whole system
33 powerManagement.powerDownCommands = ''
41 powerManagement.powerDownCommands = ''
nixos/modules/i18n/input-method/fcitx5.nix+20−11
@@ -5,7 +5,9 @@ with lib;
5let
5let
6 im = config.i18n.inputMethod;
6 im = config.i18n.inputMethod;
7 cfg = im.fcitx5;
7 cfg = im.fcitx5;
8+ addons = cfg.addons ++ optional cfg.enableRimeData pkgs.rime-data;
8− fcitx5Package = pkgs.fcitx5-with-addons.override { inherit (cfg) addons; };
9+ fcitx5Package = pkgs.fcitx5-with-addons.override { inherit addons; };
10+ whetherRimeDataDir = any (p: p.pname == "fcitx5-rime") cfg.addons;
9in {
11in {
10 options = {
12 options = {
11 i18n.inputMethod.fcitx5 = {
13 i18n.inputMethod.fcitx5 = {
@@ -17,22 +19,29 @@ in {
17 Enabled Fcitx5 addons.
19 Enabled Fcitx5 addons.
18 '';
20 '';
19 };
21 };
22+
23+ enableRimeData = mkEnableOption "default rime-data with fcitx5-rime";
20 };
24 };
21 };
25 };
22
26
23 config = mkIf (im.enabled == "fcitx5") {
27 config = mkIf (im.enabled == "fcitx5") {
24 i18n.inputMethod.package = fcitx5Package;
28 i18n.inputMethod.package = fcitx5Package;
25
29
30+ environment = mkMerge [{
26− environment.variables = {
31+ variables = {
27− GTK_IM_MODULE = "fcitx";
32+ GTK_IM_MODULE = "fcitx";
28− QT_IM_MODULE = "fcitx";
33+ QT_IM_MODULE = "fcitx";
29− XMODIFIERS = "@im=fcitx";
34+ XMODIFIERS = "@im=fcitx";
35+ };
30− };
36+ }
37+ (mkIf whetherRimeDataDir {
38+ pathsToLink = [
39+ "/share/rime-data"
40+ ];
31
41
32− systemd.user.services.fcitx5-daemon = {
42+ variables = {
33− enable = true;
43+ NIX_RIME_DATA_DIR = "/run/current-system/sw/share/rime-data";
34− script = "${fcitx5Package}/bin/fcitx5";
44+ };
35− wantedBy = [ "graphical-session.target" ];
45+ })];
36− };
37 };
46 };
38}
47}
nixos/modules/installer/cd-dvd/channel.nix+2−1
@@ -39,7 +39,8 @@ in
39 echo "unpacking the NixOS/Nixpkgs sources..."
39 echo "unpacking the NixOS/Nixpkgs sources..."
40 mkdir -p /nix/var/nix/profiles/per-user/root
40 mkdir -p /nix/var/nix/profiles/per-user/root
41 ${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/per-user/root/channels \
41 ${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/per-user/root/channels \
42− -i ${channelSources} --quiet --option build-use-substitutes false
42+ -i ${channelSources} --quiet --option build-use-substitutes false \
43+ ${optionalString config.boot.initrd.systemd.enable "--option sandbox false"} # There's an issue with pivot_root
43 mkdir -m 0700 -p /root/.nix-defexpr
44 mkdir -m 0700 -p /root/.nix-defexpr
44 ln -s /nix/var/nix/profiles/per-user/root/channels /root/.nix-defexpr/channels
45 ln -s /nix/var/nix/profiles/per-user/root/channels /root/.nix-defexpr/channels
45 mkdir -m 0755 -p /var/lib/nixos
46 mkdir -m 0755 -p /var/lib/nixos
nixos/modules/installer/cd-dvd/installation-cd-graphical-base.nix+14−8
@@ -35,22 +35,28 @@ with lib;
35 # Enable sound in graphical iso's.
35 # Enable sound in graphical iso's.
36 hardware.pulseaudio.enable = true;
36 hardware.pulseaudio.enable = true;
37
37
38− environment.systemPackages = [
38+ # Spice guest additions
39+ services.spice-vdagentd.enable = true;
40+
41+ # Enable plymouth
42+ boot.plymouth.enable = true;
43+
44+ environment.defaultPackages = with pkgs; [
39 # Include gparted for partitioning disks.
45 # Include gparted for partitioning disks.
40− pkgs.gparted
46+ gparted
41
47
42 # Include some editors.
48 # Include some editors.
43− pkgs.vim
49+ vim
44− pkgs.bvi # binary editor
50+ nano
45− pkgs.joe
46
51
47 # Include some version control tools.
52 # Include some version control tools.
48− pkgs.git
53+ git
54+ rsync
49
55
50 # Firefox for reading the manual.
56 # Firefox for reading the manual.
51− pkgs.firefox
57+ firefox
52
58
53− pkgs.glxinfo
59+ glxinfo
54 ];
60 ];
55
61
56}
62}
nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nixnew file+59
@@ -0,0 +1,59 @@
1+# This module defines a NixOS installation CD that contains GNOME.
2+
3+{ pkgs, ... }:
4+
5+{
6+ imports = [ ./installation-cd-graphical-calamares.nix ];
7+
8+ isoImage.edition = "gnome";
9+
10+ services.xserver.desktopManager.gnome = {
11+ # Add Firefox and other tools useful for installation to the launcher
12+ favoriteAppsOverride = ''
13+ [org.gnome.shell]
14+ favorite-apps=[ 'firefox.desktop', 'nixos-manual.desktop', 'org.gnome.Console.desktop', 'org.gnome.Nautilus.desktop', 'gparted.desktop', 'io.calamares.calamares.desktop' ]
15+ '';
16+
17+ # Override GNOME defaults to disable GNOME tour and disable suspend
18+ extraGSettingsOverrides = ''
19+ [org.gnome.shell]
20+ welcome-dialog-last-shown-version='9999999999'
21+
22+ [org.gnome.settings-daemon.plugins.power]
23+ sleep-inactive-ac-type='nothing'
24+ sleep-inactive-battery-type='nothing'
25+ '';
26+
27+ extraGSettingsOverridePackages = [ pkgs.gnome.gnome-settings-daemon ];
28+
29+ enable = true;
30+ };
31+
32+ # Theme calamares with GNOME theme
33+ qt5 = {
34+ enable = true;
35+ platformTheme = "gnome";
36+ };
37+
38+ # Fix scaling for calamares on wayland
39+ environment.variables = {
40+ QT_QPA_PLATFORM = "$([[ $XDG_SESSION_TYPE = \"wayland\" ]] && echo \"wayland\")";
41+ };
42+
43+ services.xserver.displayManager = {
44+ gdm = {
45+ enable = true;
46+ # autoSuspend makes the machine automatically suspend after inactivity.
47+ # It's possible someone could/try to ssh'd into the machine and obviously
48+ # have issues because it's inactive.
49+ # See:
50+ # * https://github.com/NixOS/nixpkgs/pull/63790
51+ # * https://gitlab.gnome.org/GNOME/gnome-control-center/issues/22
52+ autoSuspend = false;
53+ };
54+ autoLogin = {
55+ enable = true;
56+ user = "nixos";
57+ };
58+ };
59+}
nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma5.nixnew file+49
@@ -0,0 +1,49 @@
1+# This module defines a NixOS installation CD that contains X11 and
2+# Plasma 5.
3+
4+{ pkgs, ... }:
5+
6+{
7+ imports = [ ./installation-cd-graphical-calamares.nix ];
8+
9+ isoImage.edition = "plasma5";
10+
11+ services.xserver = {
12+ desktopManager.plasma5 = {
13+ enable = true;
14+ };
15+
16+ # Automatically login as nixos.
17+ displayManager = {
18+ sddm.enable = true;
19+ autoLogin = {
20+ enable = true;
21+ user = "nixos";
22+ };
23+ };
24+ };
25+
26+ environment.systemPackages = with pkgs; [
27+ # Graphical text editor
28+ kate
29+ ];
30+
31+ system.activationScripts.installerDesktop = let
32+
33+ # Comes from documentation.nix when xserver and nixos.enable are true.
34+ manualDesktopFile = "/run/current-system/sw/share/applications/nixos-manual.desktop";
35+
36+ homeDir = "/home/nixos/";
37+ desktopDir = homeDir + "Desktop/";
38+
39+ in ''
40+ mkdir -p ${desktopDir}
41+ chown nixos ${homeDir} ${desktopDir}
42+
43+ ln -sfT ${manualDesktopFile} ${desktopDir + "nixos-manual.desktop"}
44+ ln -sfT ${pkgs.gparted}/share/applications/gparted.desktop ${desktopDir + "gparted.desktop"}
45+ ln -sfT ${pkgs.konsole}/share/applications/org.kde.konsole.desktop ${desktopDir + "org.kde.konsole.desktop"}
46+ ln -sfT ${pkgs.calamares-nixos}/share/applications/io.calamares.calamares.desktop ${desktopDir + "io.calamares.calamares.desktop"}
47+ '';
48+
49+}
nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares.nixnew file+20
@@ -0,0 +1,20 @@
1+# This module adds the calamares installer to the basic graphical NixOS
2+# installation CD.
3+
4+{ pkgs, ... }:
5+let
6+ calamares-nixos-autostart = pkgs.makeAutostartItem { name = "io.calamares.calamares"; package = pkgs.calamares-nixos; };
7+in
8+{
9+ imports = [ ./installation-cd-graphical-base.nix ];
10+
11+ environment.systemPackages = with pkgs; [
12+ # Calamares for graphical installation
13+ libsForQt5.kpmcore
14+ calamares-nixos
15+ calamares-nixos-autostart
16+ calamares-nixos-extensions
17+ # Needed for calamares QML module packagechooserq
18+ libsForQt5.full
19+ ];
20+}
nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix+1−3
@@ -1,8 +1,6 @@
1# This module defines a NixOS installation CD that contains GNOME.
1# This module defines a NixOS installation CD that contains GNOME.
2
2
3−{ lib, ... }:
3+{ ... }:
4−
5−with lib;
6
4
7{
5{
8 imports = [ ./installation-cd-graphical-base.nix ];
6 imports = [ ./installation-cd-graphical-base.nix ];
nixos/modules/installer/cd-dvd/installation-cd-graphical-plasma5.nix+1−3
@@ -1,9 +1,7 @@
1# This module defines a NixOS installation CD that contains X11 and
1# This module defines a NixOS installation CD that contains X11 and
2# Plasma 5.
2# Plasma 5.
3
3
4−{ config, lib, pkgs, ... }:
4+{ pkgs, ... }:
5−
6−with lib;
7
5
8{
6{
9 imports = [ ./installation-cd-graphical-base.nix ];
7 imports = [ ./installation-cd-graphical-base.nix ];
nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix+3−3
@@ -87,19 +87,19 @@ in
87 boot.initrd.availableKernelModules =
87 boot.initrd.availableKernelModules =
88 [ "mvsdio" "reiserfs" "ext3" "ums-cypress" "rtc_mv" "ext4" ];
88 [ "mvsdio" "reiserfs" "ext3" "ums-cypress" "rtc_mv" "ext4" ];
89
89
90− boot.postBootCommands =
90+ boot.postBootCommands = lib.mkIf (!boot.initrd.systemd.enable)
91 ''
91 ''
92 mkdir -p /mnt
92 mkdir -p /mnt
93
93
94 cp ${dummyConfiguration} /etc/nixos/configuration.nix
94 cp ${dummyConfiguration} /etc/nixos/configuration.nix
95 '';
95 '';
96
96
97− boot.initrd.extraUtilsCommands =
97+ boot.initrd.extraUtilsCommands = lib.mkIf (!boot.initrd.systemd.enable)
98 ''
98 ''
99 copy_bin_and_libs ${pkgs.util-linux}/sbin/hwclock
99 copy_bin_and_libs ${pkgs.util-linux}/sbin/hwclock
100 '';
100 '';
101
101
102− boot.initrd.postDeviceCommands =
102+ boot.initrd.postDeviceCommands = lib.mkIf (!boot.initrd.systemd.enable)
103 ''
103 ''
104 hwclock -s
104 hwclock -s
105 '';
105 '';
nixos/modules/installer/kexec/kexec-boot.nixnew file+51
@@ -0,0 +1,51 @@
1+# This module exposes a config.system.build.kexecBoot attribute,
2+# which returns a directory with kernel, initrd and a shell script
3+# running the necessary kexec commands.
4+
5+# It's meant to be scp'ed to a machine with working ssh and kexec binary
6+# installed.
7+
8+# This is useful for (cloud) providers where you can't boot a custom image, but
9+# get some Debian or Ubuntu installation.
10+
11+{ pkgs
12+, modulesPath
13+, config
14+, ...
15+}:
16+{
17+ imports = [
18+ (modulesPath + "/installer/netboot/netboot-minimal.nix")
19+ ];
20+
21+ config = {
22+ system.build.kexecBoot =
23+ let
24+ kexecScript = pkgs.writeScript "kexec-boot" ''
25+ #!/usr/bin/env bash
26+ if ! kexec -v >/dev/null 2>&1; then
27+ echo "kexec not found: please install kexec-tools" 2>&1
28+ exit 1
29+ fi
30+ SCRIPT_DIR=$( cd -- "$( dirname -- "''${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
31+ kexec --load ''${SCRIPT_DIR}/bzImage \
32+ --initrd=''${SCRIPT_DIR}/initrd.gz \
33+ --command-line "init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}"
34+ kexec -e
35+ ''; in
36+ pkgs.linkFarm "kexec-tree" [
37+ {
38+ name = "initrd.gz";
39+ path = "${config.system.build.netbootRamdisk}/initrd";
40+ }
41+ {
42+ name = "bzImage";
43+ path = "${config.system.build.kernel}/${config.system.boot.loader.kernelFile}";
44+ }
45+ {
46+ name = "kexec-boot";
47+ path = kexecScript;
48+ }
49+ ];
50+ };
51+}
nixos/modules/installer/sd-card/sd-image-aarch64.nix+9
@@ -39,6 +39,12 @@
39 # Supported in newer board revisions
39 # Supported in newer board revisions
40 arm_boost=1
40 arm_boost=1
41
41
42+ [cm4]
43+ # Enable host mode on the 2711 built-in XHCI USB controller.
44+ # This line should be removed if the legacy DWC2 controller is required
45+ # (e.g. for USB device mode) or if USB support is not required.
46+ otg_mode=1
47+
42 [all]
48 [all]
43 # Boot in 64-bit mode.
49 # Boot in 64-bit mode.
44 arm_64bit=1
50 arm_64bit=1
@@ -65,6 +71,9 @@
65 cp ${pkgs.ubootRaspberryPi4_64bit}/u-boot.bin firmware/u-boot-rpi4.bin
71 cp ${pkgs.ubootRaspberryPi4_64bit}/u-boot.bin firmware/u-boot-rpi4.bin
66 cp ${pkgs.raspberrypi-armstubs}/armstub8-gic.bin firmware/armstub8-gic.bin
72 cp ${pkgs.raspberrypi-armstubs}/armstub8-gic.bin firmware/armstub8-gic.bin
67 cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-4-b.dtb firmware/
73 cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-4-b.dtb firmware/
74+ cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-400.dtb firmware/
75+ cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-cm4.dtb firmware/
76+ cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-cm4s.dtb firmware/
68 '';
77 '';
69 populateRootCommands = ''
78 populateRootCommands = ''
70 mkdir -p ./files/boot
79 mkdir -p ./files/boot
nixos/modules/installer/tools/nix-fallback-paths.nix+5−5
@@ -1,7 +1,7 @@
1{
1{
2− x86_64-linux = "/nix/store/0n2wfvi1i3fg97cjc54wslvk0804y0sn-nix-2.7.0";
2+ x86_64-linux = "/nix/store/yx36yzxpw1hn4fz8iyf1rfyd56jg3yf4-nix-2.8.0";
3− i686-linux = "/nix/store/4p27c1k9z99pli6x8cxfph20yfyzn9nh-nix-2.7.0";
3+ i686-linux = "/nix/store/c0hg806zvwg800qbszzj8ff4a224kjgf-nix-2.8.0";
4− aarch64-linux = "/nix/store/r9yr8ijsb0gi9r7y92y3yzyld59yp0kj-nix-2.7.0";
4+ aarch64-linux = "/nix/store/wic2832ll53q392r2wks4xr2nrk7p8p5-nix-2.8.0";
5− x86_64-darwin = "/nix/store/hyfj5imsd0c4amlcjpf8l6w4q2draaj3-nix-2.7.0";
5+ x86_64-darwin = "/nix/store/5yqdvnkmkrhl36xh0qy31pymdphjimdd-nix-2.8.0";
6− aarch64-darwin = "/nix/store/9l96qllhbb6xrsjaai76dn74ap7rq92n-nix-2.7.0";
6+ aarch64-darwin = "/nix/store/izc9592szrnpv8n86hr88bhpyc9g6b4s-nix-2.8.0";
7}
7}
nixos/modules/installer/tools/tools.nix+5
@@ -206,6 +206,11 @@ in
206 # Or disable the firewall altogether.
206 # Or disable the firewall altogether.
207 # networking.firewall.enable = false;
207 # networking.firewall.enable = false;
208
208
209+ # Copy the NixOS configuration file and link it from the resulting system
210+ # (/run/current-system/configuration.nix). This is useful in case you
211+ # accidentally delete configuration.nix.
212+ # system.copySystemConfiguration = true;
213+
209 # This value determines the NixOS release from which the default
214 # This value determines the NixOS release from which the default
210 # settings for stateful data, like file locations and database versions
215 # settings for stateful data, like file locations and database versions
211 # on your system were taken. It‘s perfectly fine and recommended to leave
216 # on your system were taken. It‘s perfectly fine and recommended to leave
nixos/modules/misc/documentation.nix+2−1
@@ -64,7 +64,8 @@ let
64 filter =
64 filter =
65 builtins.filterSource
65 builtins.filterSource
66 (n: t:
66 (n: t:
67+ cleanSourceFilter n t
67− (t == "directory" -> baseNameOf n != "tests")
68+ && (t == "directory" -> baseNameOf n != "tests")
68 && (t == "file" -> hasSuffix ".nix" n)
69 && (t == "file" -> hasSuffix ".nix" n)
69 );
70 );
70 in
71 in
nixos/modules/misc/locate.nix+1−1
@@ -27,7 +27,7 @@ in
27
27
28 locate = mkOption {
28 locate = mkOption {
29 type = package;
29 type = package;
30− default = pkgs.findutils;
30+ default = pkgs.findutils.locate;
31 defaultText = literalExpression "pkgs.findutils";
31 defaultText = literalExpression "pkgs.findutils";
32 example = literalExpression "pkgs.mlocate";
32 example = literalExpression "pkgs.mlocate";
33 description = ''
33 description = ''
nixos/modules/misc/version.nix+26−14
@@ -15,6 +15,26 @@ let
15 mapAttrsToList (n: v: ''${n}=${escapeIfNeccessary (toString v)}'') attrs
15 mapAttrsToList (n: v: ''${n}=${escapeIfNeccessary (toString v)}'') attrs
16 );
16 );
17
17
18+ osReleaseContents = {
19+ NAME = "NixOS";
20+ ID = "nixos";
21+ VERSION = "${cfg.release} (${cfg.codeName})";
22+ VERSION_CODENAME = toLower cfg.codeName;
23+ VERSION_ID = cfg.release;
24+ BUILD_ID = cfg.version;
25+ PRETTY_NAME = "NixOS ${cfg.release} (${cfg.codeName})";
26+ LOGO = "nix-snowflake";
27+ HOME_URL = "https://nixos.org/";
28+ DOCUMENTATION_URL = "https://nixos.org/learn.html";
29+ SUPPORT_URL = "https://nixos.org/community.html";
30+ BUG_REPORT_URL = "https://github.com/NixOS/nixpkgs/issues";
31+ };
32+
33+ initrdReleaseContents = osReleaseContents // {
34+ PRETTY_NAME = "${osReleaseContents.PRETTY_NAME} (Initrd)";
35+ };
36+ initrdRelease = pkgs.writeText "initrd-release" (attrsToText initrdReleaseContents);
37+
18in
38in
19{
39{
20 imports = [
40 imports = [
@@ -119,20 +139,12 @@ in
119 DISTRIB_DESCRIPTION = "NixOS ${cfg.release} (${cfg.codeName})";
139 DISTRIB_DESCRIPTION = "NixOS ${cfg.release} (${cfg.codeName})";
120 };
140 };
121
141
122− "os-release".text = attrsToText {
142+ "os-release".text = attrsToText osReleaseContents;
123− NAME = "NixOS";
143+ };
124− ID = "nixos";
144+
125− VERSION = "${cfg.release} (${cfg.codeName})";
145+ boot.initrd.systemd.contents = {
126− VERSION_CODENAME = toLower cfg.codeName;
146+ "/etc/os-release".source = initrdRelease;
127− VERSION_ID = cfg.release;
147+ "/etc/initrd-release".source = initrdRelease;
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 };
148 };
137 };
149 };
138
150
nixos/modules/module-list.nix+17−3
@@ -172,6 +172,7 @@
172 ./programs/java.nix
172 ./programs/java.nix
173 ./programs/k40-whisperer.nix
173 ./programs/k40-whisperer.nix
174 ./programs/kclock.nix
174 ./programs/kclock.nix
175+ ./programs/k3b.nix
175 ./programs/kdeconnect.nix
176 ./programs/kdeconnect.nix
176 ./programs/kbdlight.nix
177 ./programs/kbdlight.nix
177 ./programs/less.nix
178 ./programs/less.nix
@@ -185,6 +186,7 @@
185 ./programs/nbd.nix
186 ./programs/nbd.nix
186 ./programs/nix-ld.nix
187 ./programs/nix-ld.nix
187 ./programs/neovim.nix
188 ./programs/neovim.nix
189+ ./programs/nethoscope.nix
188 ./programs/nm-applet.nix
190 ./programs/nm-applet.nix
189 ./programs/nncp.nix
191 ./programs/nncp.nix
190 ./programs/npm.nix
192 ./programs/npm.nix
@@ -204,7 +206,6 @@
204 ./programs/spacefm.nix
206 ./programs/spacefm.nix
205 ./programs/singularity.nix
207 ./programs/singularity.nix
206 ./programs/ssh.nix
208 ./programs/ssh.nix
207− ./programs/ssmtp.nix
208 ./programs/sysdig.nix
209 ./programs/sysdig.nix
209 ./programs/systemtap.nix
210 ./programs/systemtap.nix
210 ./programs/starship.nix
211 ./programs/starship.nix
@@ -409,6 +410,7 @@
409 ./services/display-managers/greetd.nix
410 ./services/display-managers/greetd.nix
410 ./services/editors/emacs.nix
411 ./services/editors/emacs.nix
411 ./services/editors/infinoted.nix
412 ./services/editors/infinoted.nix
413+ ./services/editors/haste.nix
412 ./services/finance/odoo.nix
414 ./services/finance/odoo.nix
413 ./services/games/asf.nix
415 ./services/games/asf.nix
414 ./services/games/crossfire-server.nix
416 ./services/games/crossfire-server.nix
@@ -458,6 +460,7 @@
458 ./services/hardware/udisks2.nix
460 ./services/hardware/udisks2.nix
459 ./services/hardware/upower.nix
461 ./services/hardware/upower.nix
460 ./services/hardware/usbmuxd.nix
462 ./services/hardware/usbmuxd.nix
463+ ./services/hardware/usbrelayd.nix
461 ./services/hardware/thermald.nix
464 ./services/hardware/thermald.nix
462 ./services/hardware/undervolt.nix
465 ./services/hardware/undervolt.nix
463 ./services/hardware/vdr.nix
466 ./services/hardware/vdr.nix
@@ -596,7 +599,7 @@
596 ./services/misc/osrm.nix
599 ./services/misc/osrm.nix
597 ./services/misc/owncast.nix
600 ./services/misc/owncast.nix
598 ./services/misc/packagekit.nix
601 ./services/misc/packagekit.nix
599− ./services/misc/paperless-ng.nix
602+ ./services/misc/paperless.nix
600 ./services/misc/parsoid.nix
603 ./services/misc/parsoid.nix
601 ./services/misc/plex.nix
604 ./services/misc/plex.nix
602 ./services/misc/plikd.nix
605 ./services/misc/plikd.nix
@@ -660,6 +663,7 @@
660 ./services/monitoring/longview.nix
663 ./services/monitoring/longview.nix
661 ./services/monitoring/mackerel-agent.nix
664 ./services/monitoring/mackerel-agent.nix
662 ./services/monitoring/metricbeat.nix
665 ./services/monitoring/metricbeat.nix
666+ ./services/monitoring/mimir.nix
663 ./services/monitoring/monit.nix
667 ./services/monitoring/monit.nix
664 ./services/monitoring/munin.nix
668 ./services/monitoring/munin.nix
665 ./services/monitoring/nagios.nix
669 ./services/monitoring/nagios.nix
@@ -733,12 +737,14 @@
733 ./services/networking/blocky.nix
737 ./services/networking/blocky.nix
734 ./services/networking/charybdis.nix
738 ./services/networking/charybdis.nix
735 ./services/networking/cjdns.nix
739 ./services/networking/cjdns.nix
740+ ./services/networking/cloudflare-dyndns.nix
736 ./services/networking/cntlm.nix
741 ./services/networking/cntlm.nix
737 ./services/networking/connman.nix
742 ./services/networking/connman.nix
738 ./services/networking/consul.nix
743 ./services/networking/consul.nix
739 ./services/networking/coredns.nix
744 ./services/networking/coredns.nix
740 ./services/networking/corerad.nix
745 ./services/networking/corerad.nix
741 ./services/networking/coturn.nix
746 ./services/networking/coturn.nix
747+ ./services/networking/create_ap.nix
742 ./services/networking/croc.nix
748 ./services/networking/croc.nix
743 ./services/networking/dante.nix
749 ./services/networking/dante.nix
744 ./services/networking/ddclient.nix
750 ./services/networking/ddclient.nix
@@ -753,6 +759,7 @@
753 ./services/networking/ncdns.nix
759 ./services/networking/ncdns.nix
754 ./services/networking/nomad.nix
760 ./services/networking/nomad.nix
755 ./services/networking/ejabberd.nix
761 ./services/networking/ejabberd.nix
762+ ./services/networking/envoy.nix
756 ./services/networking/epmd.nix
763 ./services/networking/epmd.nix
757 ./services/networking/ergo.nix
764 ./services/networking/ergo.nix
758 ./services/networking/ergochat.nix
765 ./services/networking/ergochat.nix
@@ -815,6 +822,7 @@
815 ./services/networking/mosquitto.nix
822 ./services/networking/mosquitto.nix
816 ./services/networking/monero.nix
823 ./services/networking/monero.nix
817 ./services/networking/morty.nix
824 ./services/networking/morty.nix
825+ ./services/networking/mozillavpn.nix
818 ./services/networking/miredo.nix
826 ./services/networking/miredo.nix
819 ./services/networking/mstpd.nix
827 ./services/networking/mstpd.nix
820 ./services/networking/mtprotoproxy.nix
828 ./services/networking/mtprotoproxy.nix
@@ -850,7 +858,7 @@
850 ./services/networking/ofono.nix
858 ./services/networking/ofono.nix
851 ./services/networking/oidentd.nix
859 ./services/networking/oidentd.nix
852 ./services/networking/onedrive.nix
860 ./services/networking/onedrive.nix
853− ./services/networking/openfire.nix
861+ ./services/networking/openconnect.nix
854 ./services/networking/openvpn.nix
862 ./services/networking/openvpn.nix
855 ./services/networking/ostinato.nix
863 ./services/networking/ostinato.nix
856 ./services/networking/owamp.nix
864 ./services/networking/owamp.nix
@@ -1052,6 +1060,7 @@
1052 ./services/web-apps/netbox.nix
1060 ./services/web-apps/netbox.nix
1053 ./services/web-apps/nextcloud.nix
1061 ./services/web-apps/nextcloud.nix
1054 ./services/web-apps/nexus.nix
1062 ./services/web-apps/nexus.nix
1063+ ./services/web-apps/nifi.nix
1055 ./services/web-apps/node-red.nix
1064 ./services/web-apps/node-red.nix
1056 ./services/web-apps/pict-rs.nix
1065 ./services/web-apps/pict-rs.nix
1057 ./services/web-apps/peertube.nix
1066 ./services/web-apps/peertube.nix
@@ -1176,9 +1185,12 @@
1176 ./system/boot/stage-2.nix
1185 ./system/boot/stage-2.nix
1177 ./system/boot/systemd.nix
1186 ./system/boot/systemd.nix
1178 ./system/boot/systemd/coredump.nix
1187 ./system/boot/systemd/coredump.nix
1188+ ./system/boot/systemd/initrd-secrets.nix
1189+ ./system/boot/systemd/initrd.nix
1179 ./system/boot/systemd/journald.nix
1190 ./system/boot/systemd/journald.nix
1180 ./system/boot/systemd/logind.nix
1191 ./system/boot/systemd/logind.nix
1181 ./system/boot/systemd/nspawn.nix
1192 ./system/boot/systemd/nspawn.nix
1193+ ./system/boot/systemd/shutdown.nix
1182 ./system/boot/systemd/tmpfiles.nix
1194 ./system/boot/systemd/tmpfiles.nix
1183 ./system/boot/systemd/user.nix
1195 ./system/boot/systemd/user.nix
1184 ./system/boot/timesyncd.nix
1196 ./system/boot/timesyncd.nix
@@ -1234,6 +1246,7 @@
1234 ./virtualisation/amazon-options.nix
1246 ./virtualisation/amazon-options.nix
1235 ./virtualisation/hyperv-guest.nix
1247 ./virtualisation/hyperv-guest.nix
1236 ./virtualisation/kvmgt.nix
1248 ./virtualisation/kvmgt.nix
1249+ ./virtualisation/openstack-options.nix
1237 ./virtualisation/openvswitch.nix
1250 ./virtualisation/openvswitch.nix
1238 ./virtualisation/parallels-guest.nix
1251 ./virtualisation/parallels-guest.nix
1239 ./virtualisation/podman/default.nix
1252 ./virtualisation/podman/default.nix
@@ -1243,6 +1256,7 @@
1243 ./virtualisation/virtualbox-guest.nix
1256 ./virtualisation/virtualbox-guest.nix
1244 ./virtualisation/virtualbox-host.nix
1257 ./virtualisation/virtualbox-host.nix
1245 ./virtualisation/vmware-guest.nix
1258 ./virtualisation/vmware-guest.nix
1259+ ./virtualisation/vmware-host.nix
1246 ./virtualisation/waydroid.nix
1260 ./virtualisation/waydroid.nix
1247 ./virtualisation/xen-dom0.nix
1261 ./virtualisation/xen-dom0.nix
1248 ./virtualisation/xe-guest-utilities.nix
1262 ./virtualisation/xe-guest-utilities.nix
nixos/modules/profiles/all-hardware.nix+3
@@ -40,6 +40,9 @@ in
40 # SD cards.
40 # SD cards.
41 "sdhci_pci"
41 "sdhci_pci"
42
42
43+ # NVMe drives
44+ "nvme"
45+
43 # Firewire support. Not tested.
46 # Firewire support. Not tested.
44 "ohci1394" "sbp2"
47 "ohci1394" "sbp2"
45
48
nixos/modules/profiles/installation-device.nix+4
@@ -99,6 +99,10 @@ with lib;
99 stdenvNoCC # for runCommand
99 stdenvNoCC # for runCommand
100 busybox
100 busybox
101 jq # for closureInfo
101 jq # for closureInfo
102+ # For boot.initrd.systemd
103+ makeInitrdNGTool
104+ systemdStage1
105+ systemdStage1Network
102 ];
106 ];
103
107
104 # Show all debug messages from the kernel but don't log refused packets
108 # Show all debug messages from the kernel but don't log refused packets
nixos/modules/profiles/qemu-guest.nix+2−2
@@ -1,13 +1,13 @@
1# Common configuration for virtual machines running under QEMU (using
1# Common configuration for virtual machines running under QEMU (using
2# virtio).
2# virtio).
3
3
4−{ ... }:
4+{ config, lib, ... }:
5
5
6{
6{
7 boot.initrd.availableKernelModules = [ "virtio_net" "virtio_pci" "virtio_mmio" "virtio_blk" "virtio_scsi" "9p" "9pnet_virtio" ];
7 boot.initrd.availableKernelModules = [ "virtio_net" "virtio_pci" "virtio_mmio" "virtio_blk" "virtio_scsi" "9p" "9pnet_virtio" ];
8 boot.initrd.kernelModules = [ "virtio_balloon" "virtio_console" "virtio_rng" ];
8 boot.initrd.kernelModules = [ "virtio_balloon" "virtio_console" "virtio_rng" ];
9
9
10− boot.initrd.postDeviceCommands =
10+ boot.initrd.postDeviceCommands = lib.mkIf (!config.boot.initrd.systemd.enable)
11 ''
11 ''
12 # Set the system time from the hardware clock to work around a
12 # Set the system time from the hardware clock to work around a
13 # bug in qemu-kvm > 1.5.2 (where the VM clock is initialised
13 # bug in qemu-kvm > 1.5.2 (where the VM clock is initialised
nixos/modules/programs/adb.nix+1−2
@@ -23,8 +23,7 @@ with lib;
23 ###### implementation
23 ###### implementation
24 config = mkIf config.programs.adb.enable {
24 config = mkIf config.programs.adb.enable {
25 services.udev.packages = [ pkgs.android-udev-rules ];
25 services.udev.packages = [ pkgs.android-udev-rules ];
26− # Give platform-tools lower priority so mke2fs+friends are taken from other packages first
27− environment.systemPackages = [ (lowPrio pkgs.androidenv.androidPkgs_9_0.platform-tools) ];
26+ environment.systemPackages = [ pkgs.android-tools ];
28 users.groups.adbusers = {};
27 users.groups.adbusers = {};
29 };
28 };
30}
29}
nixos/modules/programs/chromium.nix+3
@@ -108,5 +108,8 @@ in
108 # for google-chrome https://www.chromium.org/administrators/linux-quick-start
108 # for google-chrome https://www.chromium.org/administrators/linux-quick-start
109 environment.etc."opt/chrome/policies/managed/default.json".text = builtins.toJSON defaultProfile;
109 environment.etc."opt/chrome/policies/managed/default.json".text = builtins.toJSON defaultProfile;
110 environment.etc."opt/chrome/policies/managed/extra.json".text = builtins.toJSON cfg.extraOpts;
110 environment.etc."opt/chrome/policies/managed/extra.json".text = builtins.toJSON cfg.extraOpts;
111+ # for brave
112+ environment.etc."brave/policies/managed/default.json".text = builtins.toJSON defaultProfile;
113+ environment.etc."brave/policies/managed/extra.json".text = builtins.toJSON cfg.extraOpts;
111 };
114 };
112}
115}
nixos/modules/programs/k3b.nixnew file+52
@@ -0,0 +1,52 @@
1+{ config, pkgs, lib, ... }:
2+
3+with lib;
4+
5+{
6+ # interface
7+ options.programs.k3b = {
8+ enable = mkOption {
9+ type = types.bool;
10+ default = false;
11+ description = ''
12+ Whether to enable k3b, the KDE disk burning application.
13+
14+ Additionally to installing <package>k3b</package> enabling this will
15+ add <literal>setuid</literal> wrappers in <literal>/run/wrappers/bin</literal>
16+ for both <package>cdrdao</package> and <package>cdrecord</package>. On first
17+ run you must manually configure the path of <package>cdrdae</package> and
18+ <package>cdrecord</package> to correspond to the appropriate paths under
19+ <literal>/run/wrappers/bin</literal> in the "Setup External Programs" menu.
20+ '';
21+ };
22+ };
23+
24+ # implementation
25+ config = mkIf config.programs.k3b.enable {
26+
27+ environment.systemPackages = with pkgs; [
28+ k3b
29+ dvdplusrwtools
30+ cdrdao
31+ cdrkit
32+ ];
33+
34+ security.wrappers = {
35+ cdrdao = {
36+ setuid = true;
37+ owner = "root";
38+ group = "cdrom";
39+ permissions = "u+wrx,g+x";
40+ source = "${pkgs.cdrdao}/bin/cdrdao";
41+ };
42+ cdrecord = {
43+ setuid = true;
44+ owner = "root";
45+ group = "cdrom";
46+ permissions = "u+wrx,g+x";
47+ source = "${pkgs.cdrkit}/bin/cdrecord";
48+ };
49+ };
50+
51+ };
52+}
nixos/modules/programs/mininet.nix+2−2
@@ -23,8 +23,8 @@ let
23 ln -s ${pyEnv}/bin/mn $out/bin/mn
23 ln -s ${pyEnv}/bin/mn $out/bin/mn
24
24
25 # mn errors out without a telnet binary
25 # mn errors out without a telnet binary
26− # pkgs.telnet brings an undesired ifconfig into PATH see #43105
26+ # pkgs.inetutils brings an undesired ifconfig into PATH see #43105
27− ln -s ${pkgs.telnet}/bin/telnet $out/bin/telnet
27+ ln -s ${pkgs.inetutils}/bin/telnet $out/bin/telnet
28 '';
28 '';
29in
29in
30{
30{
nixos/modules/programs/nethoscope.nixnew file+30
@@ -0,0 +1,30 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let cfg = config.programs.nethoscope;
6+in
7+{
8+ meta.maintainers = with maintainers; [ _0x4A6F ];
9+
10+ options = {
11+ programs.nethoscope = {
12+ enable = mkOption {
13+ type = types.bool;
14+ default = false;
15+ description = ''
16+ Whether to add nethoscope to the global environment and configure a
17+ setcap wrapper for it.
18+ '';
19+ };
20+ };
21+ };
22+
23+ config = mkIf cfg.enable {
24+ environment.systemPackages = with pkgs; [ nethoscope ];
25+ security.wrappers.nethoscope = {
26+ source = "${pkgs.nethoscope}/bin/nethoscope";
27+ capabilities = "cap_net_raw,cap_net_admin=eip";
28+ };
29+ };
30+}
nixos/modules/programs/ssh.nix+18−7
@@ -157,9 +157,13 @@ in
157 default = [ name ] ++ config.extraHostNames;
157 default = [ name ] ++ config.extraHostNames;
158 defaultText = literalExpression "[ ${name} ] ++ config.${options.extraHostNames}";
158 defaultText = literalExpression "[ ${name} ] ++ config.${options.extraHostNames}";
159 description = ''
159 description = ''
160− DEPRECATED, please use <literal>extraHostNames</literal>.
161 A list of host names and/or IP numbers used for accessing
160 A list of host names and/or IP numbers used for accessing
162− the host's ssh service.
161+ the host's ssh service. This list includes the name of the
162+ containing <literal>knownHosts</literal> attribute by default
163+ for convenience. If you wish to configure multiple host keys
164+ for the same host use multiple <literal>knownHosts</literal>
165+ entries with different attribute names and the same
166+ <literal>hostNames</literal> list.
163 '';
167 '';
164 };
168 };
165 extraHostNames = mkOption {
169 extraHostNames = mkOption {
@@ -167,7 +171,8 @@ in
167 default = [];
171 default = [];
168 description = ''
172 description = ''
169 A list of additional host names and/or IP numbers used for
173 A list of additional host names and/or IP numbers used for
170− accessing the host's ssh service.
174+ accessing the host's ssh service. This list is ignored if
175+ <literal>hostNames</literal> is set explicitly.
171 '';
176 '';
172 };
177 };
173 publicKey = mkOption {
178 publicKey = mkOption {
@@ -198,7 +203,12 @@ in
198 };
203 };
199 }));
204 }));
200 description = ''
205 description = ''
201− The set of system-wide known SSH hosts.
206+ The set of system-wide known SSH hosts. To make simple setups more
207+ convenient the name of an attribute in this set is used as a host name
208+ for the entry. This behaviour can be disabled by setting
209+ <literal>hostNames</literal> explicitly. You can use
210+ <literal>extraHostNames</literal> to add additional host names without
211+ disabling this default.
202 '';
212 '';
203 example = literalExpression ''
213 example = literalExpression ''
204 {
214 {
@@ -207,6 +217,10 @@ in
207 publicKeyFile = ./pubkeys/myhost_ssh_host_dsa_key.pub;
217 publicKeyFile = ./pubkeys/myhost_ssh_host_dsa_key.pub;
208 };
218 };
209 "myhost2.net".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILIRuJ8p1Fi+m6WkHV0KWnRfpM1WxoW8XAS+XvsSKsTK";
219 "myhost2.net".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILIRuJ8p1Fi+m6WkHV0KWnRfpM1WxoW8XAS+XvsSKsTK";
220+ "myhost2.net/dsa" = {
221+ hostNames = [ "myhost2.net" ];
222+ publicKeyFile = ./pubkeys/myhost2_ssh_host_dsa_key.pub;
223+ };
210 }
224 }
211 '';
225 '';
212 };
226 };
@@ -279,9 +293,6 @@ in
279 message = "knownHost ${name} must contain either a publicKey or publicKeyFile";
293 message = "knownHost ${name} must contain either a publicKey or publicKeyFile";
280 });
294 });
281
295
282− warnings = mapAttrsToList (name: _: ''programs.ssh.knownHosts.${name}.hostNames is deprecated, use programs.ssh.knownHosts.${name}.extraHostNames'')
283− (filterAttrs (name: {hostNames, extraHostNames, ...}: hostNames != [ name ] ++ extraHostNames) cfg.knownHosts);
284−
285 # SSH configuration. Slight duplication of the sshd_config
296 # SSH configuration. Slight duplication of the sshd_config
286 # generation in the sshd service.
297 # generation in the sshd service.
287 environment.etc."ssh/ssh_config".text =
298 environment.etc."ssh/ssh_config".text =
nixos/modules/programs/ssmtp.nixdeleted−190
@@ -1,190 +0,0 @@
1−# Configuration for `ssmtp', a trivial mail transfer agent that can
2−# replace sendmail/postfix on simple systems. It delivers email
3−# directly to an SMTP server defined in its configuration file, without
4−# queueing mail locally.
5−
6−{ config, lib, pkgs, ... }:
7−
8−with lib;
9−
10−let
11− cfg = config.services.ssmtp;
12−
13−in
14−{
15−
16− imports = [
17− (mkRenamedOptionModule [ "networking" "defaultMailServer" "directDelivery" ] [ "services" "ssmtp" "enable" ])
18− (mkRenamedOptionModule [ "networking" "defaultMailServer" "hostName" ] [ "services" "ssmtp" "hostName" ])
19− (mkRenamedOptionModule [ "networking" "defaultMailServer" "domain" ] [ "services" "ssmtp" "domain" ])
20− (mkRenamedOptionModule [ "networking" "defaultMailServer" "root" ] [ "services" "ssmtp" "root" ])
21− (mkRenamedOptionModule [ "networking" "defaultMailServer" "useTLS" ] [ "services" "ssmtp" "useTLS" ])
22− (mkRenamedOptionModule [ "networking" "defaultMailServer" "useSTARTTLS" ] [ "services" "ssmtp" "useSTARTTLS" ])
23− (mkRenamedOptionModule [ "networking" "defaultMailServer" "authUser" ] [ "services" "ssmtp" "authUser" ])
24− (mkRenamedOptionModule [ "networking" "defaultMailServer" "authPassFile" ] [ "services" "ssmtp" "authPassFile" ])
25− (mkRenamedOptionModule [ "networking" "defaultMailServer" "setSendmail" ] [ "services" "ssmtp" "setSendmail" ])
26−
27− (mkRemovedOptionModule [ "networking" "defaultMailServer" "authPass" ] "authPass has been removed since it leaks the clear-text password into the world-readable store. Use authPassFile instead and make sure it's not a store path")
28− (mkRemovedOptionModule [ "services" "ssmtp" "authPass" ] "authPass has been removed since it leaks the clear-text password into the world-readable store. Use authPassFile instead and make sure it's not a store path")
29− ];
30−
31− options = {
32−
33− services.ssmtp = {
34−
35− enable = mkOption {
36− type = types.bool;
37− default = false;
38− description = ''
39− Use the trivial Mail Transfer Agent (MTA)
40− <command>ssmtp</command> package to allow programs to send
41− e-mail. If you don't want to run a “real” MTA like
42− <command>sendmail</command> or <command>postfix</command> on
43− your machine, set this option to <literal>true</literal>, and
44− set the option
45− <option>services.ssmtp.hostName</option> to the
46− host name of your preferred mail server.
47− '';
48− };
49−
50− settings = mkOption {
51− type = with types; attrsOf (oneOf [ bool str ]);
52− default = {};
53− description = ''
54− <citerefentry><refentrytitle>ssmtp</refentrytitle><manvolnum>5</manvolnum></citerefentry> configuration. Refer
55− to <link xlink:href="https://linux.die.net/man/5/ssmtp.conf"/> for details on supported values.
56− '';
57− example = literalExpression ''
58− {
59− Debug = true;
60− FromLineOverride = false;
61− }
62− '';
63− };
64−
65− hostName = mkOption {
66− type = types.str;
67− example = "mail.example.org";
68− description = ''
69− The host name of the default mail server to use to deliver
70− e-mail. Can also contain a port number (ex: mail.example.org:587),
71− defaults to port 25 if no port is given.
72− '';
73− };
74−
75− root = mkOption {
76− type = types.str;
77− default = "";
78− example = "root@example.org";
79− description = ''
80− The e-mail to which mail for users with UID &lt; 1000 is forwarded.
81− '';
82− };
83−
84− domain = mkOption {
85− type = types.str;
86− default = "";
87− example = "example.org";
88− description = ''
89− The domain from which mail will appear to be sent.
90− '';
91− };
92−
93− useTLS = mkOption {
94− type = types.bool;
95− default = false;
96− description = ''
97− Whether TLS should be used to connect to the default mail
98− server.
99− '';
100− };
101−
102− useSTARTTLS = mkOption {
103− type = types.bool;
104− default = false;
105− description = ''
106− Whether the STARTTLS should be used to connect to the default
107− mail server. (This is needed for TLS-capable mail servers
108− running on the default SMTP port 25.)
109− '';
110− };
111−
112− authUser = mkOption {
113− type = types.str;
114− default = "";
115− example = "foo@example.org";
116− description = ''
117− Username used for SMTP auth. Leave blank to disable.
118− '';
119− };
120−
121− authPassFile = mkOption {
122− type = types.nullOr types.str;
123− default = null;
124− example = "/run/keys/ssmtp-authpass";
125− description = ''
126− Path to a file that contains the password used for SMTP auth. The file
127− should not contain a trailing newline, if the password does not contain one
128− (e.g. use <command>echo -n "password" > file</command>).
129− This file should be readable by the users that need to execute ssmtp.
130− '';
131− };
132−
133− setSendmail = mkOption {
134− type = types.bool;
135− default = true;
136− description = "Whether to set the system sendmail to ssmtp's.";
137− };
138−
139− };
140−
141− };
142−
143−
144− config = mkIf cfg.enable {
145−
146− assertions = [
147− {
148− assertion = cfg.useSTARTTLS -> cfg.useTLS;
149− message = "services.ssmtp.useSTARTTLS has no effect without services.ssmtp.useTLS";
150− }
151− ];
152−
153− services.ssmtp.settings = mkMerge [
154− ({
155− MailHub = cfg.hostName;
156− FromLineOverride = mkDefault true;
157− UseTLS = cfg.useTLS;
158− UseSTARTTLS = cfg.useSTARTTLS;
159− })
160− (mkIf (cfg.root != "") { root = cfg.root; })
161− (mkIf (cfg.domain != "") { rewriteDomain = cfg.domain; })
162− (mkIf (cfg.authUser != "") { AuthUser = cfg.authUser; })
163− (mkIf (cfg.authPassFile != null) { AuthPassFile = cfg.authPassFile; })
164− ];
165−
166− # careful here: ssmtp REQUIRES all config lines to end with a newline char!
167− environment.etc."ssmtp/ssmtp.conf".text = with generators; toKeyValue {
168− mkKeyValue = mkKeyValueDefault {
169− mkValueString = value:
170− if value == true then "YES"
171− else if value == false then "NO"
172− else mkValueStringDefault {} value
173− ;
174− } "=";
175− } cfg.settings;
176−
177− environment.systemPackages = [pkgs.ssmtp];
178−
179− services.mail.sendmailSetuidWrapper = mkIf cfg.setSendmail {
180− program = "sendmail";
181− source = "${pkgs.ssmtp}/bin/sendmail";
182− setuid = false;
183− setgid = false;
184− owner = "root";
185− group = "root";
186− };
187−
188− };
189−
190−}
nixos/modules/programs/thefuck.nix+7−6
@@ -6,9 +6,12 @@ let
6 prg = config.programs;
6 prg = config.programs;
7 cfg = prg.thefuck;
7 cfg = prg.thefuck;
8
8
9− initScript = ''
9+ bashAndZshInitScript = ''
10 eval $(${pkgs.thefuck}/bin/thefuck --alias ${cfg.alias})
10 eval $(${pkgs.thefuck}/bin/thefuck --alias ${cfg.alias})
11 '';
11 '';
12+ fishInitScript = ''
13+ ${pkgs.thefuck}/bin/thefuck --alias ${cfg.alias} | source
14+ '';
12in
15in
13 {
16 {
14 options = {
17 options = {
@@ -30,10 +33,8 @@ in
30 config = mkIf cfg.enable {
33 config = mkIf cfg.enable {
31 environment.systemPackages = with pkgs; [ thefuck ];
34 environment.systemPackages = with pkgs; [ thefuck ];
32
35
33− programs.bash.interactiveShellInit = initScript;
36+ programs.bash.interactiveShellInit = bashAndZshInitScript;
34− programs.zsh.interactiveShellInit = mkIf prg.zsh.enable initScript;
37+ programs.zsh.interactiveShellInit = mkIf prg.zsh.enable bashAndZshInitScript;
35− programs.fish.interactiveShellInit = mkIf prg.fish.enable ''
38+ programs.fish.interactiveShellInit = mkIf prg.fish.enable fishInitScript;
36− ${pkgs.thefuck}/bin/thefuck --alias | source
37− '';
38 };
39 };
39 }
40 }
nixos/modules/rename.nix+6
@@ -69,6 +69,11 @@ with lib;
69 '')
69 '')
70 (mkRemovedOptionModule [ "services" "quagga" ] "the corresponding package has been removed from nixpkgs")
70 (mkRemovedOptionModule [ "services" "quagga" ] "the corresponding package has been removed from nixpkgs")
71 (mkRemovedOptionModule [ "services" "seeks" ] "")
71 (mkRemovedOptionModule [ "services" "seeks" ] "")
72+ (mkRemovedOptionModule [ "services" "ssmtp" ] ''
73+ The ssmtp package and the corresponding module have been removed due to
74+ the program being unmaintained. The options `programs.msmtp.*` can be
75+ used instead.
76+ '')
72 (mkRemovedOptionModule [ "services" "venus" ] "The corresponding package was removed from nixpkgs.")
77 (mkRemovedOptionModule [ "services" "venus" ] "The corresponding package was removed from nixpkgs.")
73 (mkRemovedOptionModule [ "services" "wakeonlan"] "This module was removed in favor of enabling it with networking.interfaces.<name>.wakeOnLan")
78 (mkRemovedOptionModule [ "services" "wakeonlan"] "This module was removed in favor of enabling it with networking.interfaces.<name>.wakeOnLan")
74 (mkRemovedOptionModule [ "services" "winstone" ] "The corresponding package was removed from nixpkgs.")
79 (mkRemovedOptionModule [ "services" "winstone" ] "The corresponding package was removed from nixpkgs.")
@@ -91,6 +96,7 @@ with lib;
91 (mkRemovedOptionModule [ "services" "shellinabox" ] "The corresponding package was removed from nixpkgs.")
96 (mkRemovedOptionModule [ "services" "shellinabox" ] "The corresponding package was removed from nixpkgs.")
92 (mkRemovedOptionModule [ "services" "gogoclient" ] "The corresponding package was removed from nixpkgs.")
97 (mkRemovedOptionModule [ "services" "gogoclient" ] "The corresponding package was removed from nixpkgs.")
93 (mkRemovedOptionModule [ "services" "virtuoso" ] "The corresponding package was removed from nixpkgs.")
98 (mkRemovedOptionModule [ "services" "virtuoso" ] "The corresponding package was removed from nixpkgs.")
99+ (mkRemovedOptionModule [ "services" "openfire" ] "The corresponding package was removed from nixpkgs.")
94
100
95 # Do NOT add any option renames here, see top of the file
101 # Do NOT add any option renames here, see top of the file
96 ];
102 ];
nixos/modules/security/pam.nix+113−3
@@ -61,6 +61,19 @@ let
61 '';
61 '';
62 };
62 };
63
63
64+ usshAuth = mkOption {
65+ default = false;
66+ type = types.bool;
67+ description = ''
68+ If set, users with an SSH certificate containing an authorized principal
69+ in their SSH agent are able to log in. Specific options are controlled
70+ using the <option>security.pam.ussh</option> options.
71+
72+ Note that the <option>security.pam.ussh.enable</option> must also be
73+ set for this option to take effect.
74+ '';
75+ };
76+
64 yubicoAuth = mkOption {
77 yubicoAuth = mkOption {
65 default = config.security.pam.yubico.enable;
78 default = config.security.pam.yubico.enable;
66 defaultText = literalExpression "config.security.pam.yubico.enable";
79 defaultText = literalExpression "config.security.pam.yubico.enable";
@@ -475,8 +488,11 @@ let
475 optionalString cfg.usbAuth ''
488 optionalString cfg.usbAuth ''
476 auth sufficient ${pkgs.pam_usb}/lib/security/pam_usb.so
489 auth sufficient ${pkgs.pam_usb}/lib/security/pam_usb.so
477 '' +
490 '' +
491+ (let ussh = config.security.pam.ussh; in optionalString (config.security.pam.ussh.enable && cfg.usshAuth) ''
492+ auth ${ussh.control} ${pkgs.pam_ussh}/lib/security/pam_ussh.so ${optionalString (ussh.caFile != null) "ca_file=${ussh.caFile}"} ${optionalString (ussh.authorizedPrincipals != null) "authorized_principals=${ussh.authorizedPrincipals}"} ${optionalString (ussh.authorizedPrincipalsFile != null) "authorized_principals_file=${ussh.authorizedPrincipalsFile}"} ${optionalString (ussh.group != null) "group=${ussh.group}"}
493+ '') +
478 (let oath = config.security.pam.oath; in optionalString cfg.oathAuth ''
494 (let oath = config.security.pam.oath; in optionalString cfg.oathAuth ''
479− auth requisite ${pkgs.oathToolkit}/lib/security/pam_oath.so window=${toString oath.window} usersfile=${toString oath.usersFile} digits=${toString oath.digits}
495+ auth requisite ${pkgs.oath-toolkit}/lib/security/pam_oath.so window=${toString oath.window} usersfile=${toString oath.usersFile} digits=${toString oath.digits}
480 '') +
496 '') +
481 (let yubi = config.security.pam.yubico; in optionalString cfg.yubicoAuth ''
497 (let yubi = config.security.pam.yubico; in optionalString cfg.yubicoAuth ''
482 auth ${yubi.control} ${pkgs.yubico-pam}/lib/security/pam_yubico.so mode=${toString yubi.mode} ${optionalString (yubi.challengeResponsePath != null) "chalresp_path=${yubi.challengeResponsePath}"} ${optionalString (yubi.mode == "client") "id=${toString yubi.id}"} ${optionalString yubi.debug "debug"}
498 auth ${yubi.control} ${pkgs.yubico-pam}/lib/security/pam_yubico.so mode=${toString yubi.mode} ${optionalString (yubi.challengeResponsePath != null) "chalresp_path=${yubi.challengeResponsePath}"} ${optionalString (yubi.mode == "client") "id=${toString yubi.id}"} ${optionalString yubi.debug "debug"}
@@ -594,6 +610,7 @@ let
594 session optional ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so
610 session optional ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so
595 '' +
611 '' +
596 optionalString cfg.pamMount ''
612 optionalString cfg.pamMount ''
613+ session [success=1 default=ignore] ${pkgs.pam}/lib/security/pam_succeed_if.so service = systemd-user quiet
597 session optional ${pkgs.pam_mount}/lib/security/pam_mount.so disable_interactive
614 session optional ${pkgs.pam_mount}/lib/security/pam_mount.so disable_interactive
598 '' +
615 '' +
599 optionalString use_ldap ''
616 optionalString use_ldap ''
@@ -926,6 +943,96 @@ in
926 };
943 };
927 };
944 };
928
945
946+ security.pam.ussh = {
947+ enable = mkOption {
948+ default = false;
949+ type = types.bool;
950+ description = ''
951+ Enables Uber's USSH PAM (<literal>pam-ussh</literal>) module.
952+
953+ This is similar to <literal>pam-ssh-agent</literal>, except that
954+ the presence of a CA-signed SSH key with a valid principal is checked
955+ instead.
956+
957+ Note that this module must both be enabled using this option and on a
958+ per-PAM-service level as well (using <literal>usshAuth</literal>).
959+
960+ More information can be found <link
961+ xlink:href="https://github.com/uber/pam-ussh">here</link>.
962+ '';
963+ };
964+
965+ caFile = mkOption {
966+ default = null;
967+ type = with types; nullOr path;
968+ description = ''
969+ By default <literal>pam-ussh</literal> reads the trusted user CA keys
970+ from <filename>/etc/ssh/trusted_user_ca</filename>.
971+
972+ This should be set the same as your <literal>TrustedUserCAKeys</literal>
973+ option for sshd.
974+ '';
975+ };
976+
977+ authorizedPrincipals = mkOption {
978+ default = null;
979+ type = with types; nullOr commas;
980+ description = ''
981+ Comma-separated list of authorized principals to permit; if the user
982+ presents a certificate with one of these principals, then they will be
983+ authorized.
984+
985+ Note that <literal>pam-ussh</literal> also requires that the certificate
986+ contain a principal matching the user's username. The principals from
987+ this list are in addition to those principals.
988+
989+ Mutually exclusive with <literal>authorizedPrincipalsFile</literal>.
990+ '';
991+ };
992+
993+ authorizedPrincipalsFile = mkOption {
994+ default = null;
995+ type = with types; nullOr path;
996+ description = ''
997+ Path to a list of principals; if the user presents a certificate with
998+ one of these principals, then they will be authorized.
999+
1000+ Note that <literal>pam-ussh</literal> also requires that the certificate
1001+ contain a principal matching the user's username. The principals from
1002+ this file are in addition to those principals.
1003+
1004+ Mutually exclusive with <literal>authorizedPrincipals</literal>.
1005+ '';
1006+ };
1007+
1008+ group = mkOption {
1009+ default = null;
1010+ type = with types; nullOr str;
1011+ description = ''
1012+ If set, then the authenticating user must be a member of this group
1013+ to use this module.
1014+ '';
1015+ };
1016+
1017+ control = mkOption {
1018+ default = "sufficient";
1019+ type = types.enum [ "required" "requisite" "sufficient" "optional" ];
1020+ description = ''
1021+ This option sets pam "control".
1022+ If you want to have multi factor authentication, use "required".
1023+ If you want to use the SSH certificate instead of the regular password,
1024+ use "sufficient".
1025+
1026+ Read
1027+ <citerefentry>
1028+ <refentrytitle>pam.conf</refentrytitle>
1029+ <manvolnum>5</manvolnum>
1030+ </citerefentry>
1031+ for better understanding of this option.
1032+ '';
1033+ };
1034+ };
1035+
929 security.pam.yubico = {
1036 security.pam.yubico = {
930 enable = mkOption {
1037 enable = mkOption {
931 default = false;
1038 default = false;
@@ -1024,7 +1131,7 @@ in
1024 ++ optional config.services.sssd.enable pkgs.sssd
1131 ++ optional config.services.sssd.enable pkgs.sssd
1025 ++ optionals config.krb5.enable [pam_krb5 pam_ccreds]
1132 ++ optionals config.krb5.enable [pam_krb5 pam_ccreds]
1026 ++ optionals config.security.pam.enableOTPW [ pkgs.otpw ]
1133 ++ optionals config.security.pam.enableOTPW [ pkgs.otpw ]
1027− ++ optionals config.security.pam.oath.enable [ pkgs.oathToolkit ]
1134+ ++ optionals config.security.pam.oath.enable [ pkgs.oath-toolkit ]
1028 ++ optionals config.security.pam.p11.enable [ pkgs.pam_p11 ]
1135 ++ optionals config.security.pam.p11.enable [ pkgs.pam_p11 ]
1029 ++ optionals config.security.pam.u2f.enable [ pkgs.pam_u2f ];
1136 ++ optionals config.security.pam.u2f.enable [ pkgs.pam_u2f ];
1030
1137
@@ -1110,8 +1217,11 @@ in
1110 optionalString (isEnabled (cfg: cfg.usbAuth)) ''
1217 optionalString (isEnabled (cfg: cfg.usbAuth)) ''
1111 mr ${pkgs.pam_usb}/lib/security/pam_usb.so,
1218 mr ${pkgs.pam_usb}/lib/security/pam_usb.so,
1112 '' +
1219 '' +
1220+ optionalString (isEnabled (cfg: cfg.usshAuth)) ''
1221+ mr ${pkgs.pam_ussh}/lib/security/pam_ussh.so,
1222+ '' +
1113 optionalString (isEnabled (cfg: cfg.oathAuth)) ''
1223 optionalString (isEnabled (cfg: cfg.oathAuth)) ''
1114− "mr ${pkgs.oathToolkit}/lib/security/pam_oath.so,
1224+ "mr ${pkgs.oath-toolkit}/lib/security/pam_oath.so,
1115 '' +
1225 '' +
1116 optionalString (isEnabled (cfg: cfg.yubicoAuth)) ''
1226 optionalString (isEnabled (cfg: cfg.yubicoAuth)) ''
1117 mr ${pkgs.yubico-pam}/lib/security/pam_yubico.so,
1227 mr ${pkgs.yubico-pam}/lib/security/pam_yubico.so,
nixos/modules/security/pam_mount.nix+78−6
@@ -5,6 +5,14 @@ with lib;
5let
5let
6 cfg = config.security.pam.mount;
6 cfg = config.security.pam.mount;
7
7
8+ oflRequired = cfg.logoutHup || cfg.logoutTerm || cfg.logoutKill;
9+
10+ fake_ofl = pkgs.writeShellScriptBin "fake_ofl" ''
11+ SIGNAL=$1
12+ MNTPT=$2
13+ ${pkgs.lsof}/bin/lsof | ${pkgs.gnugrep}/bin/grep $MNTPT | ${pkgs.gawk}/bin/awk '{print $2}' | ${pkgs.findutils}/bin/xargs ${pkgs.util-linux}/bin/kill -$SIGNAL
14+ '';
15+
8 anyPamMount = any (attrByPath ["pamMount"] false) (attrValues config.security.pam.services);
16 anyPamMount = any (attrByPath ["pamMount"] false) (attrValues config.security.pam.services);
9in
17in
10
18
@@ -51,6 +59,71 @@ in
51 You can define volume-specific options in the volume definitions.
59 You can define volume-specific options in the volume definitions.
52 '';
60 '';
53 };
61 };
62+
63+ debugLevel = mkOption {
64+ type = types.int;
65+ default = 0;
66+ example = 1;
67+ description = ''
68+ Sets the Debug-Level. 0 disables debugging, 1 enables pam_mount tracing,
69+ and 2 additionally enables tracing in mount.crypt. The default is 0.
70+ For more information, visit <link
71+ xlink:href="http://pam-mount.sourceforge.net/pam_mount.conf.5.html" />.
72+ '';
73+ };
74+
75+ logoutWait = mkOption {
76+ type = types.int;
77+ default = 0;
78+ description = ''
79+ Amount of microseconds to wait until killing remaining processes after
80+ final logout.
81+ For more information, visit <link
82+ xlink:href="http://pam-mount.sourceforge.net/pam_mount.conf.5.html" />.
83+ '';
84+ };
85+
86+ logoutHup = mkOption {
87+ type = types.bool;
88+ default = false;
89+ description = ''
90+ Kill remaining processes after logout by sending a SIGHUP.
91+ '';
92+ };
93+
94+ logoutTerm = mkOption {
95+ type = types.bool;
96+ default = false;
97+ description = ''
98+ Kill remaining processes after logout by sending a SIGTERM.
99+ '';
100+ };
101+
102+ logoutKill = mkOption {
103+ type = types.bool;
104+ default = false;
105+ description = ''
106+ Kill remaining processes after logout by sending a SIGKILL.
107+ '';
108+ };
109+
110+ createMountPoints = mkOption {
111+ type = types.bool;
112+ default = true;
113+ description = ''
114+ Create mountpoints for volumes if they do not exist.
115+ '';
116+ };
117+
118+ removeCreatedMountPoints = mkOption {
119+ type = types.bool;
120+ default = true;
121+ description = ''
122+ Remove mountpoints created by pam_mount after logout. This
123+ only affects mountpoints that have been created by pam_mount
124+ in the same session.
125+ '';
126+ };
54 };
127 };
55
128
56 };
129 };
@@ -77,21 +150,20 @@ in
77 <!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
150 <!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
78 <!-- auto generated from Nixos: modules/config/users-groups.nix -->
151 <!-- auto generated from Nixos: modules/config/users-groups.nix -->
79 <pam_mount>
152 <pam_mount>
80− <debug enable="0" />
153+ <debug enable="${toString cfg.debugLevel}" />
81−
82 <!-- if activated, requires ofl from hxtools to be present -->
154 <!-- if activated, requires ofl from hxtools to be present -->
83− <logout wait="0" hup="no" term="no" kill="no" />
155+ <logout wait="${toString cfg.logoutWait}" hup="${if cfg.logoutHup then "yes" else "no"}" term="${if cfg.logoutTerm then "yes" else "no"}" kill="${if cfg.logoutKill then "yes" else "no"}" />
84 <!-- set PATH variable for pam_mount module -->
156 <!-- set PATH variable for pam_mount module -->
85 <path>${makeBinPath ([ pkgs.util-linux ] ++ cfg.additionalSearchPaths)}</path>
157 <path>${makeBinPath ([ pkgs.util-linux ] ++ cfg.additionalSearchPaths)}</path>
86 <!-- create mount point if not present -->
158 <!-- create mount point if not present -->
87− <mkmountpoint enable="1" remove="true" />
159+ <mkmountpoint enable="${if cfg.createMountPoints then "1" else "0"}" remove="${if cfg.removeCreatedMountPoints then "true" else "false"}" />
88−
89 <!-- specify the binaries to be called -->
160 <!-- specify the binaries to be called -->
90 <fusemount>${pkgs.fuse}/bin/mount.fuse %(VOLUME) %(MNTPT) -o ${concatStringsSep "," (cfg.fuseMountOptions ++ [ "%(OPTIONS)" ])}</fusemount>
161 <fusemount>${pkgs.fuse}/bin/mount.fuse %(VOLUME) %(MNTPT) -o ${concatStringsSep "," (cfg.fuseMountOptions ++ [ "%(OPTIONS)" ])}</fusemount>
162+ <fuseumount>${pkgs.fuse}/bin/fusermount -u %(MNTPT)</fuseumount>
91 <cryptmount>${pkgs.pam_mount}/bin/mount.crypt %(VOLUME) %(MNTPT)</cryptmount>
163 <cryptmount>${pkgs.pam_mount}/bin/mount.crypt %(VOLUME) %(MNTPT)</cryptmount>
92 <cryptumount>${pkgs.pam_mount}/bin/umount.crypt %(MNTPT)</cryptumount>
164 <cryptumount>${pkgs.pam_mount}/bin/umount.crypt %(MNTPT)</cryptumount>
93 <pmvarrun>${pkgs.pam_mount}/bin/pmvarrun -u %(USER) -o %(OPERATION)</pmvarrun>
165 <pmvarrun>${pkgs.pam_mount}/bin/pmvarrun -u %(USER) -o %(OPERATION)</pmvarrun>
94−
166+ ${optionalString oflRequired "<ofl>${fake_ofl}/bin/fake_ofl %(SIGNAL) %(MNTPT)</ofl>"}
95 ${concatStrings (map userVolumeEntry (attrValues extraUserVolumes))}
167 ${concatStrings (map userVolumeEntry (attrValues extraUserVolumes))}
96 ${concatStringsSep "\n" cfg.extraVolumes}
168 ${concatStringsSep "\n" cfg.extraVolumes}
97 </pam_mount>
169 </pam_mount>
nixos/modules/security/sudo.nix+1−1
@@ -245,7 +245,7 @@ in
245
245
246 environment.systemPackages = [ sudo ];
246 environment.systemPackages = [ sudo ];
247
247
248− security.pam.services.sudo = { sshAgentAuth = true; };
248+ security.pam.services.sudo = { sshAgentAuth = true; usshAuth = true; };
249
249
250 environment.etc.sudoers =
250 environment.etc.sudoers =
251 { source =
251 { source =
nixos/modules/services/audio/snapserver.nix+15−7
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, options, lib, pkgs, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -101,6 +101,8 @@ in {
101
101
102 openFirewall = mkOption {
102 openFirewall = mkOption {
103 type = types.bool;
103 type = types.bool;
104+ # Make the behavior consistent with other services. Set the default to
105+ # false and remove the accompanying warning after NixOS 22.05 is released.
104 default = true;
106 default = true;
105 description = ''
107 description = ''
106 Whether to automatically open the specified ports in the firewall.
108 Whether to automatically open the specified ports in the firewall.
@@ -273,10 +275,16 @@ in {
273
275
274 config = mkIf cfg.enable {
276 config = mkIf cfg.enable {
275
277
278+ warnings =
276− # https://github.com/badaix/snapcast/blob/98ac8b2fb7305084376607b59173ce4097c620d8/server/streamreader/stream_manager.cpp#L85
279+ # https://github.com/badaix/snapcast/blob/98ac8b2fb7305084376607b59173ce4097c620d8/server/streamreader/stream_manager.cpp#L85
277− warnings = filter (w: w != "") (mapAttrsToList (k: v: if v.type == "spotify" then ''
280+ filter (w: w != "") (mapAttrsToList (k: v: if v.type == "spotify" then ''
278− services.snapserver.streams.${k}.type = "spotify" is deprecated, use services.snapserver.streams.${k}.type = "librespot" instead.
281+ services.snapserver.streams.${k}.type = "spotify" is deprecated, use services.snapserver.streams.${k}.type = "librespot" instead.
279− '' else "") cfg.streams);
282+ '' else "") cfg.streams)
283+ # Remove this warning after NixOS 22.05 is released.
284+ ++ optional (options.services.snapserver.openFirewall.highestPrio >= (mkOptionDefault null).priority) ''
285+ services.snapserver.openFirewall will no longer default to true starting with NixOS 22.11.
286+ Enable it explicitly if you need to control Snapserver remotely.
287+ '';
280
288
281 systemd.services.snapserver = {
289 systemd.services.snapserver = {
282 after = [ "network.target" ];
290 after = [ "network.target" ];
@@ -304,8 +312,8 @@ in {
304
312
305 networking.firewall.allowedTCPPorts =
313 networking.firewall.allowedTCPPorts =
306 optionals cfg.openFirewall [ cfg.port ]
314 optionals cfg.openFirewall [ cfg.port ]
307− ++ optional cfg.tcp.enable cfg.tcp.port
315+ ++ optional (cfg.openFirewall && cfg.tcp.enable) cfg.tcp.port
308− ++ optional cfg.http.enable cfg.http.port;
316+ ++ optional (cfg.openFirewall && cfg.http.enable) cfg.http.port;
309 };
317 };
310
318
311 meta = {
319 meta = {
nixos/modules/services/continuous-integration/github-runner.nix+10
@@ -299,6 +299,16 @@ in
299 RestrictRealtime = true;
299 RestrictRealtime = true;
300 RestrictSUIDSGID = true;
300 RestrictSUIDSGID = true;
301 UMask = "0066";
301 UMask = "0066";
302+ ProtectProc = "invisible";
303+ ProcSubset = "pid";
304+ SystemCallFilter = [
305+ "~@debug"
306+ "~@mount"
307+ "~@privileged"
308+ "~@cpu-emulation"
309+ "~@obsolete"
310+ ];
311+ RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" "AF_NETLINK" ];
302
312
303 # Needs network access
313 # Needs network access
304 PrivateNetwork = false;
314 PrivateNetwork = false;
nixos/modules/services/continuous-integration/gitlab-runner.nix+9−2
@@ -36,12 +36,12 @@ let
36
36
37 # register new services
37 # register new services
38 ${concatStringsSep "\n" (mapAttrsToList (name: service: ''
38 ${concatStringsSep "\n" (mapAttrsToList (name: service: ''
39− if echo "$NEW_SERVICES" | grep -xq ${name}; then
39+ if echo "$NEW_SERVICES" | grep -xq "${name}"; then
40 bash -c ${escapeShellArg (concatStringsSep " \\\n " ([
40 bash -c ${escapeShellArg (concatStringsSep " \\\n " ([
41 "set -a && source ${service.registrationConfigFile} &&"
41 "set -a && source ${service.registrationConfigFile} &&"
42 "gitlab-runner register"
42 "gitlab-runner register"
43 "--non-interactive"
43 "--non-interactive"
44− "--name ${name}"
44+ (if service.description != null then "--description \"${service.description}\"" else "--name '${name}'")
45 "--executor ${service.executor}"
45 "--executor ${service.executor}"
46 "--limit ${toString service.limit}"
46 "--limit ${toString service.limit}"
47 "--request-concurrency ${toString service.requestConcurrency}"
47 "--request-concurrency ${toString service.requestConcurrency}"
@@ -365,6 +365,13 @@ in
365 with <literal>RUNNER_ENV</literal> variable set.
365 with <literal>RUNNER_ENV</literal> variable set.
366 '';
366 '';
367 };
367 };
368+ description = mkOption {
369+ type = types.nullOr types.str;
370+ default = null;
371+ description = ''
372+ Name/description of the runner.
373+ '';
374+ };
368 executor = mkOption {
375 executor = mkOption {
369 type = types.str;
376 type = types.str;
370 default = "docker";
377 default = "docker";
nixos/modules/services/databases/cockroachdb.nix+37−29
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, pkgs, utils, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -6,46 +6,44 @@ let
6 cfg = config.services.cockroachdb;
6 cfg = config.services.cockroachdb;
7 crdb = cfg.package;
7 crdb = cfg.package;
8
8
9− escape = builtins.replaceStrings ["%"] ["%%"];
9+ startupCommand = utils.escapeSystemdExecArgs
10− ifNotNull = v: s: optionalString (v != null) s;
10+ ([
11−
12− startupCommand = lib.concatStringsSep " "
13− [ # Basic startup
11+ # Basic startup
14− "${crdb}/bin/cockroach start"
12+ "${crdb}/bin/cockroach"
13+ "start"
15 "--logtostderr"
14 "--logtostderr"
16 "--store=/var/lib/cockroachdb"
15 "--store=/var/lib/cockroachdb"
17− (ifNotNull cfg.locality "--locality='${cfg.locality}'")
18
16
19 # WebUI settings
17 # WebUI settings
20− "--http-addr='${cfg.http.address}:${toString cfg.http.port}'"
18+ "--http-addr=${cfg.http.address}:${toString cfg.http.port}"
21
19
22 # Cluster listen address
20 # Cluster listen address
23− "--listen-addr='${cfg.listen.address}:${toString cfg.listen.port}'"
21+ "--listen-addr=${cfg.listen.address}:${toString cfg.listen.port}"
24−
25− # Cluster configuration
26− (ifNotNull cfg.join "--join=${cfg.join}")
27
22
28− # Cache and memory settings. Must be escaped.
23+ # Cache and memory settings.
29− "--cache='${escape cfg.cache}'"
24+ "--cache=${cfg.cache}"
30− "--max-sql-memory='${escape cfg.maxSqlMemory}'"
25+ "--max-sql-memory=${cfg.maxSqlMemory}"
31
26
32 # Certificate/security settings.
27 # Certificate/security settings.
33 (if cfg.insecure then "--insecure" else "--certs-dir=${cfg.certsDir}")
28 (if cfg.insecure then "--insecure" else "--certs-dir=${cfg.certsDir}")
34− ];
29+ ]
35−
30+ ++ lib.optional (cfg.join != null) "--join=${cfg.join}"
31+ ++ lib.optional (cfg.locality != null) "--locality=${cfg.locality}"
32+ ++ cfg.extraArgs);
33+
36− addressOption = descr: defaultPort: {
34+ addressOption = descr: defaultPort: {
37− address = mkOption {
35+ address = mkOption {
38− type = types.str;
36+ type = types.str;
39− default = "localhost";
37+ default = "localhost";
40− description = "Address to bind to for ${descr}";
38+ description = "Address to bind to for ${descr}";
41− };
39+ };
42
40
43− port = mkOption {
41+ port = mkOption {
44− type = types.port;
42+ type = types.port;
45− default = defaultPort;
43+ default = defaultPort;
46− description = "Port to bind to for ${descr}";
44+ description = "Port to bind to for ${descr}";
47− };
48 };
45 };
46+ };
49in
47in
50
48
51{
49{
@@ -159,6 +157,16 @@ in
159 only contain open source features and open source code).
157 only contain open source features and open source code).
160 '';
158 '';
161 };
159 };
160+
161+ extraArgs = mkOption {
162+ type = types.listOf types.str;
163+ default = [];
164+ example = [ "--advertise-addr" "[fe80::f6f2:::]" ];
165+ description = ''
166+ Extra CLI arguments passed to <command>cockroach start</command>.
167+ For the full list of supported argumemnts, check <link xlink:href="https://www.cockroachlabs.com/docs/stable/cockroach-start.html#flags"/>
168+ '';
169+ };
162 };
170 };
163 };
171 };
164
172
nixos/modules/services/databases/couchdb.nix+6
@@ -193,6 +193,11 @@ in {
193
193
194 preStart = ''
194 preStart = ''
195 touch ${cfg.configFile}
195 touch ${cfg.configFile}
196+ if ! test -e ${cfg.databaseDir}/.erlang.cookie; then
197+ touch ${cfg.databaseDir}/.erlang.cookie
198+ chmod 600 ${cfg.databaseDir}/.erlang.cookie
199+ dd if=/dev/random bs=16 count=1 | base64 > ${cfg.databaseDir}/.erlang.cookie
200+ fi
196 '';
201 '';
197
202
198 environment = {
203 environment = {
@@ -204,6 +209,7 @@ in {
204 ERL_FLAGS= ''-couch_ini ${cfg.package}/etc/default.ini ${configFile} ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} ${cfg.configFile}'';
209 ERL_FLAGS= ''-couch_ini ${cfg.package}/etc/default.ini ${configFile} ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} ${cfg.configFile}'';
205 # 5. the vm.args file
210 # 5. the vm.args file
206 COUCHDB_ARGS_FILE=''${cfg.argsFile}'';
211 COUCHDB_ARGS_FILE=''${cfg.argsFile}'';
212+ HOME =''${cfg.databaseDir}'';
207 };
213 };
208
214
209 serviceConfig = {
215 serviceConfig = {
nixos/modules/services/desktops/pipewire/pipewire-media-session.nix+4−4
@@ -58,7 +58,7 @@ in {
58 Configuration for the media session core. For details see
58 Configuration for the media session core. For details see
59 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/media-session.conf
59 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/media-session.conf
60 '';
60 '';
61− default = {};
61+ default = defaults.media-session;
62 };
62 };
63
63
64 alsa-monitor = mkOption {
64 alsa-monitor = mkOption {
@@ -67,7 +67,7 @@ in {
67 Configuration for the alsa monitor. For details see
67 Configuration for the alsa monitor. For details see
68 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/alsa-monitor.conf
68 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/alsa-monitor.conf
69 '';
69 '';
70− default = {};
70+ default = defaults.alsa-monitor;
71 };
71 };
72
72
73 bluez-monitor = mkOption {
73 bluez-monitor = mkOption {
@@ -76,7 +76,7 @@ in {
76 Configuration for the bluez5 monitor. For details see
76 Configuration for the bluez5 monitor. For details see
77 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/bluez-monitor.conf
77 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/bluez-monitor.conf
78 '';
78 '';
79− default = {};
79+ default = defaults.bluez-monitor;
80 };
80 };
81
81
82 v4l2-monitor = mkOption {
82 v4l2-monitor = mkOption {
@@ -85,7 +85,7 @@ in {
85 Configuration for the V4L2 monitor. For details see
85 Configuration for the V4L2 monitor. For details see
86 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/v4l2-monitor.conf
86 https://gitlab.freedesktop.org/pipewire/media-session/-/blob/${cfg.package.version}/src/daemon/media-session.d/v4l2-monitor.conf
87 '';
87 '';
88− default = {};
88+ default = defaults.v4l2-monitor;
89 };
89 };
90 };
90 };
91 };
91 };
nixos/modules/services/development/jupyter/default.nix+1
@@ -194,6 +194,7 @@ in {
194 extraGroups = [ cfg.group ];
194 extraGroups = [ cfg.group ];
195 home = "/var/lib/jupyter";
195 home = "/var/lib/jupyter";
196 createHome = true;
196 createHome = true;
197+ isSystemUser = true;
197 useDefaultShell = true; # needed so that the user can start a terminal.
198 useDefaultShell = true; # needed so that the user can start a terminal.
198 };
199 };
199 })
200 })
nixos/modules/services/editors/haste.nixnew file+86
@@ -0,0 +1,86 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ pkg = pkgs.haste-server;
7+ cfg = config.services.haste-server;
8+
9+ format = pkgs.formats.json {};
10+in
11+{
12+ options.services.haste-server = {
13+ enable = mkEnableOption "haste-server";
14+ openFirewall = mkEnableOption "firewall passthrough for haste-server";
15+
16+ settings = mkOption {
17+ description = ''
18+ Configuration for haste-server.
19+ For documentation see <link xlink:href="https://github.com/toptal/haste-server#settings">project readme</link>
20+ '';
21+ type = format.type;
22+ };
23+ };
24+
25+ config = mkIf (cfg.enable) {
26+ networking.firewall.allowedTCPPorts = mkIf (cfg.openFirewall) [ cfg.settings.port ];
27+
28+ services.haste-server = {
29+ settings = {
30+ host = mkDefault "::";
31+ port = mkDefault 7777;
32+
33+ keyLength = mkDefault 10;
34+ maxLength = mkDefault 400000;
35+
36+ staticMaxAge = mkDefault 86400;
37+ recompressStaticAssets = mkDefault false;
38+
39+ logging = mkDefault [
40+ {
41+ level = "verbose";
42+ type = "Console";
43+ colorize = true;
44+ }
45+ ];
46+
47+ keyGenerator = mkDefault {
48+ type = "phonetic";
49+ };
50+
51+ rateLimits = {
52+ categories = {
53+ normal = {
54+ totalRequests = mkDefault 500;
55+ every = mkDefault 60000;
56+ };
57+ };
58+ };
59+
60+ storage = mkDefault {
61+ type = "file";
62+ };
63+
64+ documents = {
65+ about = mkDefault "${pkg}/share/haste-server/about.md";
66+ };
67+ };
68+ };
69+
70+ systemd.services.haste-server = {
71+ wantedBy = [ "multi-user.target" ];
72+ requires = [ "network.target" ];
73+ after = [ "network.target" ];
74+
75+ serviceConfig = {
76+ User = "haste-server";
77+ DynamicUser = true;
78+ StateDirectory = "haste-server";
79+ WorkingDirectory = "/var/lib/haste-server";
80+ ExecStart = "${pkg}/bin/haste-server ${format.generate "config.json" cfg.settings}";
81+ };
82+
83+ path = with pkgs; [ pkg coreutils ];
84+ };
85+ };
86+}
nixos/modules/services/hardware/udev.nix+125−23
@@ -8,6 +8,24 @@ let
8
8
9 cfg = config.services.udev;
9 cfg = config.services.udev;
10
10
11+ initrdUdevRules = pkgs.runCommand "initrd-udev-rules" {} ''
12+ mkdir -p $out/etc/udev/rules.d
13+ for f in 60-cdrom_id 60-persistent-storage 75-net-description 80-drivers 80-net-setup-link; do
14+ ln -s ${config.boot.initrd.systemd.package}/lib/udev/rules.d/$f.rules $out/etc/udev/rules.d
15+ done
16+ '';
17+
18+
19+ # networkd link files are used early by udev to set up interfaces early.
20+ # This must be done in stage 1 to avoid race conditions between udev and
21+ # network daemons.
22+ # TODO move this into the initrd-network module when it exists
23+ initrdLinkUnits = pkgs.runCommand "initrd-link-units" {} ''
24+ mkdir -p $out
25+ ln -s ${udev}/lib/systemd/network/*.link $out/
26+ ${lib.concatMapStringsSep "\n" (file: "ln -s ${file} $out/") (lib.mapAttrsToList (n: v: "${v.unit}/${n}") (lib.filterAttrs (n: _: hasSuffix ".link" n) config.systemd.network.units))}
27+ '';
28+
11 extraUdevRules = pkgs.writeTextFile {
29 extraUdevRules = pkgs.writeTextFile {
12 name = "extra-udev-rules";
30 name = "extra-udev-rules";
13 text = cfg.extraRules;
31 text = cfg.extraRules;
@@ -23,17 +41,16 @@ let
23 nixosRules = ''
41 nixosRules = ''
24 # Miscellaneous devices.
42 # Miscellaneous devices.
25 KERNEL=="kvm", MODE="0666"
43 KERNEL=="kvm", MODE="0666"
26− KERNEL=="kqemu", MODE="0666"
27
44
28 # Needed for gpm.
45 # Needed for gpm.
29 SUBSYSTEM=="input", KERNEL=="mice", TAG+="systemd"
46 SUBSYSTEM=="input", KERNEL=="mice", TAG+="systemd"
30 '';
47 '';
31
48
32 # Perform substitutions in all udev rules files.
49 # Perform substitutions in all udev rules files.
33− udevRules = pkgs.runCommand "udev-rules"
50+ udevRulesFor = { name, udevPackages, udevPath, udev, systemd, binPackages, initrdBin ? null }: pkgs.runCommand name
34 { preferLocalBuild = true;
51 { preferLocalBuild = true;
35 allowSubstitutes = false;
52 allowSubstitutes = false;
36− packages = unique (map toString cfg.packages);
53+ packages = unique (map toString udevPackages);
37 }
54 }
38 ''
55 ''
39 mkdir -p $out
56 mkdir -p $out
@@ -61,6 +78,9 @@ let
61 --replace \"/bin/mount \"${pkgs.util-linux}/bin/mount \
78 --replace \"/bin/mount \"${pkgs.util-linux}/bin/mount \
62 --replace /usr/bin/readlink ${pkgs.coreutils}/bin/readlink \
79 --replace /usr/bin/readlink ${pkgs.coreutils}/bin/readlink \
63 --replace /usr/bin/basename ${pkgs.coreutils}/bin/basename
80 --replace /usr/bin/basename ${pkgs.coreutils}/bin/basename
81+ ${optionalString (initrdBin != null) ''
82+ substituteInPlace $i --replace '/run/current-system/systemd' "${removeSuffix "/bin" initrdBin}"
83+ ''}
64 done
84 done
65
85
66 echo -n "Checking that all programs called by relative paths in udev rules exist in ${udev}/lib/udev... "
86 echo -n "Checking that all programs called by relative paths in udev rules exist in ${udev}/lib/udev... "
@@ -85,8 +105,9 @@ let
85 for i in $import_progs $run_progs; do
105 for i in $import_progs $run_progs; do
86 # if the path refers to /run/current-system/systemd, replace with config.systemd.package
106 # if the path refers to /run/current-system/systemd, replace with config.systemd.package
87 if [[ $i == /run/current-system/systemd* ]]; then
107 if [[ $i == /run/current-system/systemd* ]]; then
88− i="${config.systemd.package}/''${i#/run/current-system/systemd/}"
108+ i="${systemd}/''${i#/run/current-system/systemd/}"
89 fi
109 fi
110+
90 if [[ ! -x $i ]]; then
111 if [[ ! -x $i ]]; then
91 echo "FAIL"
112 echo "FAIL"
92 echo "$i is called in udev rules but is not executable or does not exist"
113 echo "$i is called in udev rules but is not executable or does not exist"
@@ -103,7 +124,7 @@ let
103 echo "Consider fixing the following udev rules:"
124 echo "Consider fixing the following udev rules:"
104 echo "$filesToFixup" | while read localFile; do
125 echo "$filesToFixup" | while read localFile; do
105 remoteFile="origin unknown"
126 remoteFile="origin unknown"
106− for i in ${toString cfg.packages}; do
127+ for i in ${toString binPackages}; do
107 for j in "$i"/*/udev/rules.d/*; do
128 for j in "$i"/*/udev/rules.d/*; do
108 [ -e "$out/$(basename "$j")" ] || continue
129 [ -e "$out/$(basename "$j")" ] || continue
109 [ "$(basename "$j")" = "$(basename "$localFile")" ] || continue
130 [ "$(basename "$j")" = "$(basename "$localFile")" ] || continue
@@ -126,7 +147,7 @@ let
126 ${optionalString (!config.boot.hardwareScan) ''
147 ${optionalString (!config.boot.hardwareScan) ''
127 ln -s /dev/null $out/80-drivers.rules
148 ln -s /dev/null $out/80-drivers.rules
128 ''}
149 ''}
129− ''; # */
150+ '';
130
151
131 hwdbBin = pkgs.runCommand "hwdb.bin"
152 hwdbBin = pkgs.runCommand "hwdb.bin"
132 { preferLocalBuild = true;
153 { preferLocalBuild = true;
@@ -202,20 +223,6 @@ in
202 '';
223 '';
203 };
224 };
204
225
205− initrdRules = mkOption {
206− default = "";
207− example = ''
208− SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1D:60:B9:6D:4F", KERNEL=="eth*", NAME="my_fast_network_card"
209− '';
210− type = types.lines;
211− description = ''
212− <command>udev</command> rules to include in the initrd
213− <emphasis>only</emphasis>. They'll be written into file
214− <filename>99-local.rules</filename>. Thus they are read and applied
215− after the essential initrd rules.
216− '';
217− };
218−
219 extraRules = mkOption {
226 extraRules = mkOption {
220 default = "";
227 default = "";
221 example = ''
228 example = ''
@@ -283,6 +290,52 @@ in
283 '';
290 '';
284 };
291 };
285
292
293+ boot.initrd.services.udev = {
294+
295+ packages = mkOption {
296+ type = types.listOf types.path;
297+ default = [];
298+ visible = false;
299+ description = ''
300+ <emphasis>This will only be used when systemd is used in stage 1.</emphasis>
301+
302+ List of packages containing <command>udev</command> rules that will be copied to stage 1.
303+ All files found in
304+ <filename><replaceable>pkg</replaceable>/etc/udev/rules.d</filename> and
305+ <filename><replaceable>pkg</replaceable>/lib/udev/rules.d</filename>
306+ will be included.
307+ '';
308+ };
309+
310+ binPackages = mkOption {
311+ type = types.listOf types.path;
312+ default = [];
313+ visible = false;
314+ description = ''
315+ <emphasis>This will only be used when systemd is used in stage 1.</emphasis>
316+
317+ Packages to search for binaries that are referenced by the udev rules in stage 1.
318+ This list always contains /bin of the initrd.
319+ '';
320+ apply = map getBin;
321+ };
322+
323+ rules = mkOption {
324+ default = "";
325+ example = ''
326+ SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1D:60:B9:6D:4F", KERNEL=="eth*", NAME="my_fast_network_card"
327+ '';
328+ type = types.lines;
329+ description = ''
330+ <command>udev</command> rules to include in the initrd
331+ <emphasis>only</emphasis>. They'll be written into file
332+ <filename>99-local.rules</filename>. Thus they are read and applied
333+ after the essential initrd rules.
334+ '';
335+ };
336+
337+ };
338+
286 };
339 };
287
340
288
341
@@ -298,16 +351,61 @@ in
298
351
299 boot.kernelParams = mkIf (!config.networking.usePredictableInterfaceNames) [ "net.ifnames=0" ];
352 boot.kernelParams = mkIf (!config.networking.usePredictableInterfaceNames) [ "net.ifnames=0" ];
300
353
301− boot.initrd.extraUdevRulesCommands = optionalString (cfg.initrdRules != "")
354+ boot.initrd.extraUdevRulesCommands = optionalString (!config.boot.initrd.systemd.enable && config.boot.initrd.services.udev.rules != "")
302 ''
355 ''
303 cat <<'EOF' > $out/99-local.rules
356 cat <<'EOF' > $out/99-local.rules
304− ${cfg.initrdRules}
357+ ${config.boot.initrd.services.udev.rules}
305 EOF
358 EOF
306 '';
359 '';
307
360
361+ boot.initrd.systemd.additionalUpstreamUnits = [
362+ # TODO: "initrd-udevadm-cleanup-db.service" is commented out because of https://github.com/systemd/systemd/issues/12953
363+ "systemd-udevd-control.socket"
364+ "systemd-udevd-kernel.socket"
365+ "systemd-udevd.service"
366+ "systemd-udev-settle.service"
367+ "systemd-udev-trigger.service"
368+ ];
369+ boot.initrd.systemd.storePaths = [
370+ "${config.boot.initrd.systemd.package}/lib/systemd/systemd-udevd"
371+ "${config.boot.initrd.systemd.package}/lib/udev/ata_id"
372+ "${config.boot.initrd.systemd.package}/lib/udev/cdrom_id"
373+ "${config.boot.initrd.systemd.package}/lib/udev/scsi_id"
374+ "${config.boot.initrd.systemd.package}/lib/udev/rules.d"
375+ ] ++ map (x: "${x}/bin") config.boot.initrd.services.udev.binPackages;
376+
377+ # Generate the udev rules for the initrd
378+ boot.initrd.systemd.contents = {
379+ "/etc/udev/rules.d".source = udevRulesFor {
380+ name = "initrd-udev-rules";
381+ initrdBin = config.boot.initrd.systemd.contents."/bin".source;
382+ udevPackages = config.boot.initrd.services.udev.packages;
383+ udevPath = config.boot.initrd.systemd.contents."/bin".source;
384+ udev = config.boot.initrd.systemd.package;
385+ systemd = config.boot.initrd.systemd.package;
386+ binPackages = config.boot.initrd.services.udev.binPackages ++ [ config.boot.initrd.systemd.contents."/bin".source ];
387+ };
388+ "/etc/systemd/network".source = initrdLinkUnits;
389+ };
390+ # Insert initrd rules
391+ boot.initrd.services.udev.packages = [
392+ initrdUdevRules
393+ (mkIf (config.boot.initrd.services.udev.rules != "") (pkgs.writeTextFile {
394+ name = "initrd-udev-rules";
395+ destination = "/etc/udev/rules.d/99-local.rules";
396+ text = config.boot.initrd.services.udev.rules;
397+ }))
398+ ];
399+
308 environment.etc =
400 environment.etc =
309 {
401 {
310− "udev/rules.d".source = udevRules;
402+ "udev/rules.d".source = udevRulesFor {
403+ name = "udev-rules";
404+ udevPackages = cfg.packages;
405+ systemd = config.systemd.package;
406+ binPackages = cfg.packages;
407+ inherit udevPath udev;
408+ };
311 "udev/hwdb.bin".source = hwdbBin;
409 "udev/hwdb.bin".source = hwdbBin;
312 };
410 };
313
411
@@ -338,4 +436,8 @@ in
338 };
436 };
339
437
340 };
438 };
439+
440+ imports = [
441+ (mkRenamedOptionModule [ "services" "udev" "initrdRules" ] [ "boot" "initrd" "services" "udev" "rules" ])
442+ ];
341}
443}
nixos/modules/services/hardware/udisks2.nix+39
@@ -4,6 +4,13 @@
4
4
5with lib;
5with lib;
6
6
7+let
8+ settingsFormat = pkgs.formats.ini {
9+ listToValue = concatMapStringsSep "," (generators.mkValueStringDefault {});
10+ };
11+ configFiles = mapAttrs (name: value: (settingsFormat.generate name value)) (mapAttrs' (name: value: nameValuePair name value ) config.services.udisks2.settings);
12+in
13+
7{
14{
8
15
9 ###### interface
16 ###### interface
@@ -21,6 +28,36 @@ with lib;
21 '';
28 '';
22 };
29 };
23
30
31+ settings = mkOption rec {
32+ type = types.attrsOf settingsFormat.type;
33+ apply = recursiveUpdate default;
34+ default = {
35+ "udisks2.conf" = {
36+ udisks2 = {
37+ modules = [ "*" ];
38+ modules_load_preference = "ondemand";
39+ };
40+ defaults = {
41+ encryption = "luks2";
42+ };
43+ };
44+ };
45+ example = literalExpression ''
46+ {
47+ "WDC-WD10EZEX-60M2NA0-WD-WCC3F3SJ0698.conf" = {
48+ ATA = {
49+ StandbyTimeout = 50;
50+ };
51+ };
52+ };
53+ '';
54+ description = ''
55+ Options passed to udisksd.
56+ See <link xlink:href="http://manpages.ubuntu.com/manpages/latest/en/man5/udisks2.conf.5.html">here</link> and
57+ drive configuration in <link xlink:href="http://manpages.ubuntu.com/manpages/latest/en/man8/udisks.8.html">here</link> for supported options.
58+ '';
59+ };
60+
24 };
61 };
25
62
26 };
63 };
@@ -32,6 +69,8 @@ with lib;
32
69
33 environment.systemPackages = [ pkgs.udisks2 ];
70 environment.systemPackages = [ pkgs.udisks2 ];
34
71
72+ environment.etc = mapAttrs' (name: value: nameValuePair "udisks2/${name}" { source = value; } ) configFiles;
73+
35 security.polkit.enable = true;
74 security.polkit.enable = true;
36
75
37 services.dbus.packages = [ pkgs.udisks2 ];
76 services.dbus.packages = [ pkgs.udisks2 ];
nixos/modules/services/hardware/usbrelayd.nixnew file+44
@@ -0,0 +1,44 @@
1+{ config, lib, pkgs, ... }:
2+with lib;
3+let
4+ cfg = config.services.usbrelayd;
5+in
6+{
7+ options.services.usbrelayd = with types; {
8+ enable = mkEnableOption "USB Relay MQTT daemon";
9+
10+ broker = mkOption {
11+ type = str;
12+ description = "Hostname or IP address of your MQTT Broker.";
13+ default = "127.0.0.1";
14+ example = [
15+ "mqtt"
16+ "192.168.1.1"
17+ ];
18+ };
19+
20+ clientName = mkOption {
21+ type = str;
22+ description = "Name, your client connects as.";
23+ default = "MyUSBRelay";
24+ };
25+ };
26+
27+ config = mkIf cfg.enable {
28+
29+ # TODO: Rename to .conf in upcomming release
30+ environment.etc."usbrelayd.ini".text = ''
31+ [MQTT]
32+ BROKER = ${cfg.broker}
33+ CLIENTNAME = ${cfg.clientName}
34+ '';
35+
36+ services.udev.packages = [ pkgs.usbrelayd ];
37+ systemd.packages = [ pkgs.usbrelayd ];
38+ users.users.usbrelay = {
39+ isSystemUser = true;
40+ group = "usbrelay";
41+ };
42+ users.groups.usbrelay = { };
43+ };
44+}
nixos/modules/services/logging/klogd.nix+6−35
@@ -1,38 +1,9 @@
1−{ config, lib, pkgs, ... }:
1+{ lib, ... }:
2−
3−with lib;
4
2
5{
3{
6− ###### interface
4+ imports = [
7−
5+ (lib.mkRemovedOptionModule [ "security" "klogd" "enable" ] ''
8− options = {
6+ Logging of kernel messages is now handled by systemd.
9−
10− services.klogd.enable = mkOption {
11− type = types.bool;
12− default = versionOlder (getVersion config.boot.kernelPackages.kernel) "3.5";
13− defaultText = literalExpression ''versionOlder (getVersion config.boot.kernelPackages.kernel) "3.5"'';
14− description = ''
15− Whether to enable klogd, the kernel log message processing
16− daemon. Since systemd handles logging of kernel messages on
17− Linux 3.5 and later, this is only useful if you're running an
18− older kernel.
19− '';
7+ '')
20− };
21−
22− };
23−
24−
25− ###### implementation
26−
27− config = mkIf config.services.klogd.enable {
28− systemd.services.klogd = {
29− description = "Kernel Log Daemon";
30− wantedBy = [ "multi-user.target" ];
31− path = [ pkgs.sysklogd ];
32− unitConfig.ConditionVirtualization = "!systemd-nspawn";
33− script =
34− "klogd -c 1 -2 -n " +
35− "-k $(dirname $(readlink -f /run/booted-system/kernel))/System.map";
36− };
37− };
8+ ];
38}
9}
nixos/modules/services/logging/logrotate.nix+3−3
@@ -162,8 +162,8 @@ let
162 # file exist, but we only have sandboxed users here so brown these
162 # file exist, but we only have sandboxed users here so brown these
163 # out. according to man page that means su, create and createolddir.
163 # out. according to man page that means su, create and createolddir.
164 # files required to exist also won't be present, so missingok is forced.
164 # files required to exist also won't be present, so missingok is forced.
165− user=$(${pkgs.coreutils}/bin/id -un)
165+ user=$(${pkgs.buildPackages.coreutils}/bin/id -un)
166− group=$(${pkgs.coreutils}/bin/id -gn)
166+ group=$(${pkgs.buildPackages.coreutils}/bin/id -gn)
167 sed -e "s/\bsu\s.*/su $user $group/" \
167 sed -e "s/\bsu\s.*/su $user $group/" \
168 -e "s/\b\(create\s\+[0-9]*\s*\|createolddir\s\+[0-9]*\s\+\).*/\1$user $group/" \
168 -e "s/\b\(create\s\+[0-9]*\s*\|createolddir\s\+[0-9]*\s\+\).*/\1$user $group/" \
169 -e "1imissingok" -e "s/\bnomissingok\b//" \
169 -e "1imissingok" -e "s/\bnomissingok\b//" \
@@ -173,7 +173,7 @@ let
173 # 'error:' at common log level, so we can use grep, taking care
173 # 'error:' at common log level, so we can use grep, taking care
174 # to keep error codes
174 # to keep error codes
175 set -o pipefail
175 set -o pipefail
176− if ! ${pkgs.logrotate}/sbin/logrotate --debug /tmp/logrotate.conf 2>&1 \
176+ if ! ${pkgs.buildPackages.logrotate}/sbin/logrotate --debug /tmp/logrotate.conf 2>&1 \
177 | ( ! grep "error:" ) > /tmp/logrotate-error; then
177 | ( ! grep "error:" ) > /tmp/logrotate-error; then
178 echo "Logrotate configuration check failed."
178 echo "Logrotate configuration check failed."
179 echo "The failing configuration (after adjustments to pass tests in sandbox) was:"
179 echo "The failing configuration (after adjustments to pass tests in sandbox) was:"
nixos/modules/services/mail/mailman.nix+14−7
@@ -192,7 +192,6 @@ in {
192 log_dir = "/var/log/mailman";
192 log_dir = "/var/log/mailman";
193 lock_dir = "$var_dir/lock";
193 lock_dir = "$var_dir/lock";
194 etc_dir = "/etc";
194 etc_dir = "/etc";
195− ext_dir = "$etc_dir/mailman.d";
196 pid_file = "/run/mailman/master.pid";
195 pid_file = "/run/mailman/master.pid";
197 };
196 };
198
197
@@ -225,7 +224,14 @@ in {
225 See <https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html>.
224 See <https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html>.
226 '';
225 '';
227 };
226 };
227+ in [
228+ { assertion = cfg.webHosts != [];
229+ message = ''
230+ services.mailman.serve.enable requires there to be at least one entry
231+ in services.mailman.webHosts.
232+ '';
233+ }
228− in (lib.optionals cfg.enablePostfix [
234+ ] ++ (lib.optionals cfg.enablePostfix [
229 { assertion = postfix.enable;
235 { assertion = postfix.enable;
230 message = ''
236 message = ''
231 Mailman's default NixOS configuration requires Postfix to be enabled.
237 Mailman's default NixOS configuration requires Postfix to be enabled.
@@ -275,15 +281,14 @@ in {
275 globals().update(json.load(f))
281 globals().update(json.load(f))
276 '';
282 '';
277
283
278− services.nginx = mkIf cfg.serve.enable {
284+ services.nginx = mkIf (cfg.serve.enable && cfg.webHosts != []) {
279 enable = mkDefault true;
285 enable = mkDefault true;
280− virtualHosts."${lib.head cfg.webHosts}" = {
286+ virtualHosts = lib.genAttrs cfg.webHosts (webHost: {
281− serverAliases = cfg.webHosts;
282 locations = {
287 locations = {
283 "/".extraConfig = "uwsgi_pass unix:/run/mailman-web.socket;";
288 "/".extraConfig = "uwsgi_pass unix:/run/mailman-web.socket;";
284 "/static/".alias = webSettings.STATIC_ROOT + "/";
289 "/static/".alias = webSettings.STATIC_ROOT + "/";
285 };
290 };
286− };
291+ });
287 };
292 };
288
293
289 environment.systemPackages = [ (pkgs.buildEnv {
294 environment.systemPackages = [ (pkgs.buildEnv {
@@ -313,7 +318,9 @@ in {
313 systemd.services = {
318 systemd.services = {
314 mailman = {
319 mailman = {
315 description = "GNU Mailman Master Process";
320 description = "GNU Mailman Master Process";
321+ before = lib.optional cfg.enablePostfix "postfix.service";
316− after = [ "network.target" ];
322+ after = [ "network.target" ]
323+ ++ lib.optional cfg.enablePostfix "postfix-setup.service";
317 restartTriggers = [ config.environment.etc."mailman.cfg".source ];
324 restartTriggers = [ config.environment.etc."mailman.cfg".source ];
318 wantedBy = [ "multi-user.target" ];
325 wantedBy = [ "multi-user.target" ];
319 serviceConfig = {
326 serviceConfig = {
nixos/modules/services/mail/postfix.nix+22−17
@@ -723,23 +723,10 @@ in
723 { ${setgidGroup}.gid = config.ids.gids.postdrop;
723 { ${setgidGroup}.gid = config.ids.gids.postdrop;
724 };
724 };
725
725
726− systemd.services.postfix =
726+ systemd.services.postfix-setup =
727− { description = "Postfix mail server";
727+ { description = "Setup for Postfix mail server";
728−
729− wantedBy = [ "multi-user.target" ];
730− after = [ "network.target" ];
731− path = [ pkgs.postfix ];
732−
733− serviceConfig = {
728+ serviceConfig.Type = "oneshot";
734− Type = "forking";
729+ script = ''
735− Restart = "always";
736− PIDFile = "/var/lib/postfix/queue/pid/master.pid";
737− ExecStart = "${pkgs.postfix}/bin/postfix start";
738− ExecStop = "${pkgs.postfix}/bin/postfix stop";
739− ExecReload = "${pkgs.postfix}/bin/postfix reload";
740− };
741−
742− preStart = ''
743 # Backwards compatibility
730 # Backwards compatibility
744 if [ ! -d /var/lib/postfix ] && [ -d /var/postfix ]; then
731 if [ ! -d /var/lib/postfix ] && [ -d /var/postfix ]; then
745 mkdir -p /var/lib
732 mkdir -p /var/lib
@@ -777,6 +764,24 @@ in
777 '';
764 '';
778 };
765 };
779
766
767+ systemd.services.postfix =
768+ { description = "Postfix mail server";
769+
770+ wantedBy = [ "multi-user.target" ];
771+ after = [ "network.target" "postfix-setup.service" ];
772+ requires = [ "postfix-setup.service" ];
773+ path = [ pkgs.postfix ];
774+
775+ serviceConfig = {
776+ Type = "forking";
777+ Restart = "always";
778+ PIDFile = "/var/lib/postfix/queue/pid/master.pid";
779+ ExecStart = "${pkgs.postfix}/bin/postfix start";
780+ ExecStop = "${pkgs.postfix}/bin/postfix stop";
781+ ExecReload = "${pkgs.postfix}/bin/postfix reload";
782+ };
783+ };
784+
780 services.postfix.config = (mapAttrs (_: v: mkDefault v) {
785 services.postfix.config = (mapAttrs (_: v: mkDefault v) {
781 compatibility_level = pkgs.postfix.version;
786 compatibility_level = pkgs.postfix.version;
782 mail_owner = cfg.user;
787 mail_owner = cfg.user;
nixos/modules/services/matrix/matrix-synapse.nix+1−1
@@ -81,7 +81,7 @@ in {
81 (mkRemovedOptionModule [ "services" "matrix-synapse" "verbose" ] "Use a log config instead." )
81 (mkRemovedOptionModule [ "services" "matrix-synapse" "verbose" ] "Use a log config instead." )
82
82
83 # options that were moved into rfc42 style settigns
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" )
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" )
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" )
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" )
87 (mkRemovedOptionModule [ "services" "matrix-synapse" "database_type" ] "Use settings.database.name instead" )
nixos/modules/services/misc/dendrite.nix+1
@@ -247,6 +247,7 @@ in
247 WorkingDirectory = workingDir;
247 WorkingDirectory = workingDir;
248 RuntimeDirectory = "dendrite";
248 RuntimeDirectory = "dendrite";
249 RuntimeDirectoryMode = "0700";
249 RuntimeDirectoryMode = "0700";
250+ LimitNOFILE = 65535;
250 EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
251 EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
251 ExecStartPre = ''
252 ExecStartPre = ''
252 ${pkgs.envsubst}/bin/envsubst \
253 ${pkgs.envsubst}/bin/envsubst \
nixos/modules/services/misc/etebase-server.nix+1−1
@@ -166,7 +166,7 @@ in
166 } ''
166 } ''
167 makeWrapper ${pythonEnv}/bin/etebase-server \
167 makeWrapper ${pythonEnv}/bin/etebase-server \
168 $out/bin/etebase-server \
168 $out/bin/etebase-server \
169− --run "cd ${cfg.dataDir}" \
169+ --chdir ${escapeShellArg cfg.dataDir} \
170 --prefix ETEBASE_EASY_CONFIG_PATH : "${configIni}"
170 --prefix ETEBASE_EASY_CONFIG_PATH : "${configIni}"
171 '')
171 '')
172 ];
172 ];
nixos/modules/services/misc/ethminer.nix+4−4
@@ -22,7 +22,7 @@ in
22 };
22 };
23
23
24 recheckInterval = mkOption {
24 recheckInterval = mkOption {
25− type = types.int;
25+ type = types.ints.unsigned;
26 default = 2000;
26 default = 2000;
27 description = "Interval in milliseconds between farm rechecks.";
27 description = "Interval in milliseconds between farm rechecks.";
28 };
28 };
@@ -70,7 +70,7 @@ in
70 };
70 };
71
71
72 maxPower = mkOption {
72 maxPower = mkOption {
73− type = types.int;
73+ type = types.ints.unsigned;
74 default = 113;
74 default = 113;
75 description = "Miner max watt usage.";
75 description = "Miner max watt usage.";
76 };
76 };
@@ -85,7 +85,7 @@ in
85 config = mkIf cfg.enable {
85 config = mkIf cfg.enable {
86
86
87 systemd.services.ethminer = {
87 systemd.services.ethminer = {
88− path = [ pkgs.cudatoolkit ];
88+ path = optional (cfg.toolkit == "cuda") [ pkgs.cudaPackages.cudatoolkit ];
89 description = "ethminer ethereum mining service";
89 description = "ethminer ethereum mining service";
90 wantedBy = [ "multi-user.target" ];
90 wantedBy = [ "multi-user.target" ];
91 after = [ "network.target" ];
91 after = [ "network.target" ];
@@ -97,7 +97,7 @@ in
97 Restart = "always";
97 Restart = "always";
98 };
98 };
99
99
100− environment = {
100+ environment = mkIf (cfg.toolkit == "cuda") {
101 LD_LIBRARY_PATH = "${config.boot.kernelPackages.nvidia_x11}/lib";
101 LD_LIBRARY_PATH = "${config.boot.kernelPackages.nvidia_x11}/lib";
102 };
102 };
103
103
nixos/modules/services/misc/gitea.nix+11−16
@@ -499,6 +499,7 @@ in
499 oldLfsJwtSecret = "${cfg.stateDir}/custom/conf/jwt_secret"; # old file for LFS_JWT_SECRET
499 oldLfsJwtSecret = "${cfg.stateDir}/custom/conf/jwt_secret"; # old file for LFS_JWT_SECRET
500 lfsJwtSecret = "${cfg.stateDir}/custom/conf/lfs_jwt_secret"; # new file for LFS_JWT_SECRET
500 lfsJwtSecret = "${cfg.stateDir}/custom/conf/lfs_jwt_secret"; # new file for LFS_JWT_SECRET
501 internalToken = "${cfg.stateDir}/custom/conf/internal_token";
501 internalToken = "${cfg.stateDir}/custom/conf/internal_token";
502+ replaceSecretBin = "${pkgs.replace-secret}/bin/replace-secret";
502 in ''
503 in ''
503 # copy custom configuration and generate a random secret key if needed
504 # copy custom configuration and generate a random secret key if needed
504 ${optionalString (cfg.useWizard == false) ''
505 ${optionalString (cfg.useWizard == false) ''
@@ -526,23 +527,17 @@ in
526 ${gitea}/bin/gitea generate secret INTERNAL_TOKEN > ${internalToken}
527 ${gitea}/bin/gitea generate secret INTERNAL_TOKEN > ${internalToken}
527 fi
528 fi
528
529
529− SECRETKEY="$(head -n1 ${secretKey})"
530+ chmod u+w '${runConfig}'
531+ ${replaceSecretBin} '#secretkey#' '${secretKey}' '${runConfig}'
530− DBPASS="$(head -n1 ${cfg.database.passwordFile})"
532+ ${replaceSecretBin} '#dbpass#' '${cfg.database.passwordFile}' '${runConfig}'
531− OAUTH2JWTSECRET="$(head -n1 ${oauth2JwtSecret})"
533+ ${replaceSecretBin} '#oauth2jwtsecret#' '${oauth2JwtSecret}' '${runConfig}'
532− LFSJWTSECRET="$(head -n1 ${lfsJwtSecret})"
534+ ${replaceSecretBin} '#lfsjwtsecret#' '${lfsJwtSecret}' '${runConfig}'
533− INTERNALTOKEN="$(head -n1 ${internalToken})"
535+ ${replaceSecretBin} '#internaltoken#' '${internalToken}' '${runConfig}'
536+
534− ${if (cfg.mailerPasswordFile == null) then ''
537+ ${lib.optionalString (cfg.mailerPasswordFile != null) ''
535− MAILERPASSWORD="#mailerpass#"
536− '' else ''
537− MAILERPASSWORD="$(head -n1 ${cfg.mailerPasswordFile} || :)"
538+ ${replaceSecretBin} '#mailerpass#' '${cfg.mailerPasswordFile}' '${runConfig}'
538 ''}
539 ''}
539− sed -e "s,#secretkey#,$SECRETKEY,g" \
540− -e "s,#dbpass#,$DBPASS,g" \
541− -e "s,#oauth2jwtsecret#,$OAUTH2JWTSECRET,g" \
542− -e "s,#lfsjwtsecret#,$LFSJWTSECRET,g" \
543− -e "s,#internaltoken#,$INTERNALTOKEN,g" \
544− -e "s,#mailerpass#,$MAILERPASSWORD,g" \
545− -i ${runConfig}
540+ chmod u-w '${runConfig}'
546 }
541 }
547 (umask 027; gitea_setup)
542 (umask 027; gitea_setup)
548 ''}
543 ''}
nixos/modules/services/misc/gitit.nix+1−1
@@ -10,7 +10,7 @@ let
10
10
11 toYesNo = b: if b then "yes" else "no";
11 toYesNo = b: if b then "yes" else "no";
12
12
13− gititShared = with cfg.haskellPackages; gitit + "/share/" + pkgs.stdenv.hostPlatform.system + "-" + ghc.name + "/" + gitit.pname + "-" + gitit.version;
13+ gititShared = with cfg.haskellPackages; gitit + "/share/" + ghc.targetPrefix + ghc.haskellCompilerName + "/" + gitit.pname + "-" + gitit.version;
14
14
15 gititWithPkgs = hsPkgs: extras: hsPkgs.ghcWithPackages (self: with self; [ gitit ] ++ (extras self));
15 gititWithPkgs = hsPkgs: extras: hsPkgs.ghcWithPackages (self: with self; [ gitit ] ++ (extras self));
16
16
nixos/modules/services/misc/gitlab.nix+2−2
@@ -179,7 +179,7 @@ let
179 ${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
179 ${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
180 --set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar postgresqlPackage pkgs.coreutils pkgs.procps ]}:$PATH' \
180 --set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar postgresqlPackage pkgs.coreutils pkgs.procps ]}:$PATH' \
181 --set RAKEOPT '-f ${cfg.packages.gitlab}/share/gitlab/Rakefile' \
181 --set RAKEOPT '-f ${cfg.packages.gitlab}/share/gitlab/Rakefile' \
182− --run 'cd ${cfg.packages.gitlab}/share/gitlab'
182+ --chdir '${cfg.packages.gitlab}/share/gitlab'
183 '';
183 '';
184 };
184 };
185
185
@@ -193,7 +193,7 @@ let
193 makeWrapper ${cfg.packages.gitlab.rubyEnv}/bin/rails $out/bin/gitlab-rails \
193 makeWrapper ${cfg.packages.gitlab.rubyEnv}/bin/rails $out/bin/gitlab-rails \
194 ${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
194 ${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
195 --set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar postgresqlPackage pkgs.coreutils pkgs.procps ]}:$PATH' \
195 --set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar postgresqlPackage pkgs.coreutils pkgs.procps ]}:$PATH' \
196− --run 'cd ${cfg.packages.gitlab}/share/gitlab'
196+ --chdir '${cfg.packages.gitlab}/share/gitlab'
197 '';
197 '';
198 };
198 };
199
199
nixos/modules/services/misc/nix-daemon.nix+8
@@ -708,6 +708,14 @@ in
708
708
709 systemd.packages = [ nixPackage ];
709 systemd.packages = [ nixPackage ];
710
710
711+ # Will only work once https://github.com/NixOS/nix/pull/6285 is merged
712+ # systemd.tmpfiles.packages = [ nixPackage ];
713+
714+ # Can be dropped for Nix > https://github.com/NixOS/nix/pull/6285
715+ systemd.tmpfiles.rules = [
716+ "d /nix/var/nix/daemon-socket 0755 root root - -"
717+ ];
718+
711 systemd.sockets.nix-daemon.wantedBy = [ "sockets.target" ];
719 systemd.sockets.nix-daemon.wantedBy = [ "sockets.target" ];
712
720
713 systemd.services.nix-daemon =
721 systemd.services.nix-daemon =
nixos/modules/services/misc/paperless-ng.nix → nixos/modules/services/misc/paperless.nixrenamed+49−51
@@ -2,11 +2,13 @@
2
2
3with lib;
3with lib;
4let
4let
5− cfg = config.services.paperless-ng;
5+ cfg = config.services.paperless;
6
6
7 defaultUser = "paperless";
7 defaultUser = "paperless";
8
8
9+ # Don't start a redis instance if the user sets a custom redis connection
9− hasCustomRedis = hasAttr "PAPERLESS_REDIS" cfg.extraConfig;
10+ enableRedis = !hasAttr "PAPERLESS_REDIS" cfg.extraConfig;
11+ redisServer = config.services.redis.servers.paperless;
10
12
11 env = {
13 env = {
12 PAPERLESS_DATA_DIR = cfg.dataDir;
14 PAPERLESS_DATA_DIR = cfg.dataDir;
@@ -15,15 +17,15 @@ let
15 GUNICORN_CMD_ARGS = "--bind=${cfg.address}:${toString cfg.port}";
17 GUNICORN_CMD_ARGS = "--bind=${cfg.address}:${toString cfg.port}";
16 } // (
18 } // (
17 lib.mapAttrs (_: toString) cfg.extraConfig
19 lib.mapAttrs (_: toString) cfg.extraConfig
18− ) // (optionalAttrs (!hasCustomRedis) {
20+ ) // (optionalAttrs enableRedis {
19− PAPERLESS_REDIS = "unix://${config.services.redis.servers.paperless-ng.unixSocket}";
21+ PAPERLESS_REDIS = "unix://${redisServer.unixSocket}";
20 });
22 });
21
23
22 manage = let
24 manage = let
23 setupEnv = lib.concatStringsSep "\n" (mapAttrsToList (name: val: "export ${name}=\"${val}\"") env);
25 setupEnv = lib.concatStringsSep "\n" (mapAttrsToList (name: val: "export ${name}=\"${val}\"") env);
24 in pkgs.writeShellScript "manage" ''
26 in pkgs.writeShellScript "manage" ''
25 ${setupEnv}
27 ${setupEnv}
26− exec ${cfg.package}/bin/paperless-ng "$@"
28+ exec ${cfg.package}/bin/paperless-ngx "$@"
27 '';
29 '';
28
30
29 # Secure the services
31 # Secure the services
@@ -36,7 +38,7 @@ let
36 "-/etc/hosts"
38 "-/etc/hosts"
37 "-/etc/localtime"
39 "-/etc/localtime"
38 "-/run/postgresql"
40 "-/run/postgresql"
39− ] ++ (optional (!hasCustomRedis) config.services.redis.servers.paperless-ng.unixSocket);
41+ ] ++ (optional enableRedis redisServer.unixSocket);
40 BindPaths = [
42 BindPaths = [
41 cfg.consumptionDir
43 cfg.consumptionDir
42 cfg.dataDir
44 cfg.dataDir
@@ -53,7 +55,6 @@ let
53 PrivateNetwork = true;
55 PrivateNetwork = true;
54 PrivateTmp = true;
56 PrivateTmp = true;
55 PrivateUsers = true;
57 PrivateUsers = true;
56− ProcSubset = "pid";
57 ProtectClock = true;
58 ProtectClock = true;
58 # Breaks if the home dir of the user is in /home
59 # Breaks if the home dir of the user is in /home
59 # Also does not add much value in combination with the TemporaryFileSystem.
60 # Also does not add much value in combination with the TemporaryFileSystem.
@@ -66,11 +67,15 @@ let
66 ProtectKernelModules = true;
67 ProtectKernelModules = true;
67 ProtectKernelTunables = true;
68 ProtectKernelTunables = true;
68 ProtectProc = "invisible";
69 ProtectProc = "invisible";
70+ # Don't restrict ProcSubset because django-q requires read access to /proc/stat
71+ # to query CPU and memory information.
72+ # Note that /proc only contains processes of user `paperless`, so this is safe.
73+ # ProcSubset = "pid";
69 RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
74 RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
70 RestrictNamespaces = true;
75 RestrictNamespaces = true;
71 RestrictRealtime = true;
76 RestrictRealtime = true;
72 RestrictSUIDSGID = true;
77 RestrictSUIDSGID = true;
73− SupplementaryGroups = optional (!hasCustomRedis) config.services.redis.servers.paperless-ng.user;
78+ SupplementaryGroups = optional enableRedis redisServer.user;
74 SystemCallArchitectures = "native";
79 SystemCallArchitectures = "native";
75 SystemCallFilter = [ "@system-service" "~@privileged @resources @setuid @keyring" ];
80 SystemCallFilter = [ "@system-service" "~@privileged @resources @setuid @keyring" ];
76 # Does not work well with the temporary root
81 # Does not work well with the temporary root
@@ -81,26 +86,22 @@ in
81 meta.maintainers = with maintainers; [ earvstedt Flakebi ];
86 meta.maintainers = with maintainers; [ earvstedt Flakebi ];
82
87
83 imports = [
88 imports = [
84− (mkRemovedOptionModule [ "services" "paperless"] ''
89+ (mkRenamedOptionModule [ "services" "paperless-ng" ] [ "services" "paperless" ])
85− The paperless module has been removed as the upstream project died.
86− Users should migrate to the paperless-ng module (services.paperless-ng).
87− More information can be found in the NixOS 21.11 release notes.
88− '')
89 ];
90 ];
90
91
91− options.services.paperless-ng = {
92+ options.services.paperless = {
92 enable = mkOption {
93 enable = mkOption {
93 type = lib.types.bool;
94 type = lib.types.bool;
94 default = false;
95 default = false;
95 description = ''
96 description = ''
96− Enable Paperless-ng.
97+ Enable Paperless.
97
98
98 When started, the Paperless database is automatically created if it doesn't
99 When started, the Paperless database is automatically created if it doesn't
99 exist and updated if the Paperless package has changed.
100 exist and updated if the Paperless package has changed.
100 Both tasks are achieved by running a Django migration.
101 Both tasks are achieved by running a Django migration.
101
102
102 A script to manage the Paperless instance (by wrapping Django's manage.py) is linked to
103 A script to manage the Paperless instance (by wrapping Django's manage.py) is linked to
103− <literal>''${dataDir}/paperless-ng-manage</literal>.
104+ <literal>''${dataDir}/paperless-manage</literal>.
104 '';
105 '';
105 };
106 };
106
107
@@ -133,13 +134,13 @@ in
133 passwordFile = mkOption {
134 passwordFile = mkOption {
134 type = types.nullOr types.path;
135 type = types.nullOr types.path;
135 default = null;
136 default = null;
136− example = "/run/keys/paperless-ng-password";
137+ example = "/run/keys/paperless-password";
137 description = ''
138 description = ''
138 A file containing the superuser password.
139 A file containing the superuser password.
139
140
140 A superuser is required to access the web interface.
141 A superuser is required to access the web interface.
141 If unset, you can create a superuser manually by running
142 If unset, you can create a superuser manually by running
142− <literal>''${dataDir}/paperless-ng-manage createsuperuser</literal>.
143+ <literal>''${dataDir}/paperless-manage createsuperuser</literal>.
143
144
144 The default superuser name is <literal>admin</literal>. To change it, set
145 The default superuser name is <literal>admin</literal>. To change it, set
145 option <option>extraConfig.PAPERLESS_ADMIN_USER</option>.
146 option <option>extraConfig.PAPERLESS_ADMIN_USER</option>.
@@ -168,9 +169,9 @@ in
168 type = types.attrs;
169 type = types.attrs;
169 default = {};
170 default = {};
170 description = ''
171 description = ''
171− Extra paperless-ng config options.
172+ Extra paperless config options.
172
173
173− See <link xlink:href="https://paperless-ng.readthedocs.io/en/latest/configuration.html">the documentation</link>
174+ See <link xlink:href="https://paperless-ngx.readthedocs.io/en/latest/configuration.html">the documentation</link>
174 for available options.
175 for available options.
175 '';
176 '';
176 example = literalExpression ''
177 example = literalExpression ''
@@ -188,15 +189,14 @@ in
188
189
189 package = mkOption {
190 package = mkOption {
190 type = types.package;
191 type = types.package;
191− default = pkgs.paperless-ng;
192+ default = pkgs.paperless-ngx;
192− defaultText = literalExpression "pkgs.paperless-ng";
193+ defaultText = literalExpression "pkgs.paperless-ngx";
193 description = "The Paperless package to use.";
194 description = "The Paperless package to use.";
194 };
195 };
195 };
196 };
196
197
197 config = mkIf cfg.enable {
198 config = mkIf cfg.enable {
198− # Enable redis if no special url is set
199− services.redis.servers.paperless-ng.enable = mkIf (!hasCustomRedis) true;
199+ services.redis.servers.paperless.enable = mkIf enableRedis true;
200
200
201 systemd.tmpfiles.rules = [
201 systemd.tmpfiles.rules = [
202 "d '${cfg.dataDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
202 "d '${cfg.dataDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
@@ -208,11 +208,11 @@ in
208 )
208 )
209 ];
209 ];
210
210
211− systemd.services.paperless-ng-server = {
211+ systemd.services.paperless-scheduler = {
212− description = "Paperless document server";
212+ description = "Paperless scheduler";
213 serviceConfig = defaultServiceConfig // {
213 serviceConfig = defaultServiceConfig // {
214 User = cfg.user;
214 User = cfg.user;
215− ExecStart = "${cfg.package}/bin/paperless-ng qcluster";
215+ ExecStart = "${cfg.package}/bin/paperless-ngx qcluster";
216 Restart = "on-failure";
216 Restart = "on-failure";
217 # The `mbind` syscall is needed for running the classifier.
217 # The `mbind` syscall is needed for running the classifier.
218 SystemCallFilter = defaultServiceConfig.SystemCallFilter ++ [ "mbind" ];
218 SystemCallFilter = defaultServiceConfig.SystemCallFilter ++ [ "mbind" ];
@@ -221,15 +221,15 @@ in
221 };
221 };
222 environment = env;
222 environment = env;
223 wantedBy = [ "multi-user.target" ];
223 wantedBy = [ "multi-user.target" ];
224− wants = [ "paperless-ng-consumer.service" "paperless-ng-web.service" ];
224+ wants = [ "paperless-consumer.service" "paperless-web.service" ];
225
225
226 preStart = ''
226 preStart = ''
227− ln -sf ${manage} ${cfg.dataDir}/paperless-ng-manage
227+ ln -sf ${manage} ${cfg.dataDir}/paperless-manage
228
228
229 # Auto-migrate on first run or if the package has changed
229 # Auto-migrate on first run or if the package has changed
230 versionFile="${cfg.dataDir}/src-version"
230 versionFile="${cfg.dataDir}/src-version"
231 if [[ $(cat "$versionFile" 2>/dev/null) != ${cfg.package} ]]; then
231 if [[ $(cat "$versionFile" 2>/dev/null) != ${cfg.package} ]]; then
232− ${cfg.package}/bin/paperless-ng migrate
232+ ${cfg.package}/bin/paperless-ngx migrate
233 echo ${cfg.package} > "$versionFile"
233 echo ${cfg.package} > "$versionFile"
234 fi
234 fi
235 ''
235 ''
@@ -240,20 +240,18 @@ in
240 superuserStateFile="${cfg.dataDir}/superuser-state"
240 superuserStateFile="${cfg.dataDir}/superuser-state"
241
241
242 if [[ $(cat "$superuserStateFile" 2>/dev/null) != $superuserState ]]; then
242 if [[ $(cat "$superuserStateFile" 2>/dev/null) != $superuserState ]]; then
243− ${cfg.package}/bin/paperless-ng manage_superuser
243+ ${cfg.package}/bin/paperless-ngx manage_superuser
244 echo "$superuserState" > "$superuserStateFile"
244 echo "$superuserState" > "$superuserStateFile"
245 fi
245 fi
246 '';
246 '';
247− } // optionalAttrs (!hasCustomRedis) {
247+ } // optionalAttrs enableRedis {
248− after = [ "redis-paperless-ng.service" ];
248+ after = [ "redis-paperless.service" ];
249 };
249 };
250
250
251− # Password copying can't be implemented as a privileged preStart script
251+ # Reading the user-provided password file requires root access
252− # in 'paperless-ng-server' because 'defaultServiceConfig' limits the filesystem
253− # paths accessible by the service.
254− systemd.services.paperless-ng-copy-password = mkIf (cfg.passwordFile != null) {
252+ systemd.services.paperless-copy-password = mkIf (cfg.passwordFile != null) {
255− requiredBy = [ "paperless-ng-server.service" ];
253+ requiredBy = [ "paperless-scheduler.service" ];
256− before = [ "paperless-ng-server.service" ];
254+ before = [ "paperless-scheduler.service" ];
257 serviceConfig = {
255 serviceConfig = {
258 ExecStart = ''
256 ExecStart = ''
259 ${pkgs.coreutils}/bin/install --mode 600 --owner '${cfg.user}' --compare \
257 ${pkgs.coreutils}/bin/install --mode 600 --owner '${cfg.user}' --compare \
@@ -263,27 +261,27 @@ in
263 };
261 };
264 };
262 };
265
263
266− systemd.services.paperless-ng-consumer = {
264+ systemd.services.paperless-consumer = {
267 description = "Paperless document consumer";
265 description = "Paperless document consumer";
268 serviceConfig = defaultServiceConfig // {
266 serviceConfig = defaultServiceConfig // {
269 User = cfg.user;
267 User = cfg.user;
270− ExecStart = "${cfg.package}/bin/paperless-ng document_consumer";
268+ ExecStart = "${cfg.package}/bin/paperless-ngx document_consumer";
271 Restart = "on-failure";
269 Restart = "on-failure";
272 };
270 };
273 environment = env;
271 environment = env;
274− # Bind to `paperless-ng-server` so that the consumer never runs
272+ # Bind to `paperless-scheduler` so that the consumer never runs
275 # during migrations
273 # during migrations
276− bindsTo = [ "paperless-ng-server.service" ];
274+ bindsTo = [ "paperless-scheduler.service" ];
277− after = [ "paperless-ng-server.service" ];
275+ after = [ "paperless-scheduler.service" ];
278 };
276 };
279
277
280− systemd.services.paperless-ng-web = {
278+ systemd.services.paperless-web = {
281 description = "Paperless web server";
279 description = "Paperless web server";
282 serviceConfig = defaultServiceConfig // {
280 serviceConfig = defaultServiceConfig // {
283 User = cfg.user;
281 User = cfg.user;
284 ExecStart = ''
282 ExecStart = ''
285 ${pkgs.python3Packages.gunicorn}/bin/gunicorn \
283 ${pkgs.python3Packages.gunicorn}/bin/gunicorn \
286− -c ${cfg.package}/lib/paperless-ng/gunicorn.conf.py paperless.asgi:application
284+ -c ${cfg.package}/lib/paperless-ngx/gunicorn.conf.py paperless.asgi:application
287 '';
285 '';
288 Restart = "on-failure";
286 Restart = "on-failure";
289
287
@@ -296,15 +294,15 @@ in
296 };
294 };
297 environment = env // {
295 environment = env // {
298 PATH = mkForce cfg.package.path;
296 PATH = mkForce cfg.package.path;
299− PYTHONPATH = "${cfg.package.pythonPath}:${cfg.package}/lib/paperless-ng/src";
297+ PYTHONPATH = "${cfg.package.pythonPath}:${cfg.package}/lib/paperless-ngx/src";
300 };
298 };
301 # Allow the web interface to access the private /tmp directory of the server.
299 # Allow the web interface to access the private /tmp directory of the server.
302 # This is required to support uploading files via the web interface.
300 # This is required to support uploading files via the web interface.
303− unitConfig.JoinsNamespaceOf = "paperless-ng-server.service";
301+ unitConfig.JoinsNamespaceOf = "paperless-scheduler.service";
304− # Bind to `paperless-ng-server` so that the web server never runs
302+ # Bind to `paperless-scheduler` so that the web server never runs
305 # during migrations
303 # during migrations
306− bindsTo = [ "paperless-ng-server.service" ];
304+ bindsTo = [ "paperless-scheduler.service" ];
307− after = [ "paperless-ng-server.service" ];
305+ after = [ "paperless-scheduler.service" ];
308 };
306 };
309
307
310 users = optionalAttrs (cfg.user == defaultUser) {
308 users = optionalAttrs (cfg.user == defaultUser) {
nixos/modules/services/misc/sourcehut/default.nix+1−1
@@ -1018,7 +1018,7 @@ in
1018 inherit configIniOfService;
1018 inherit configIniOfService;
1019 mainService = mkMerge [ baseService {
1019 mainService = mkMerge [ baseService {
1020 serviceConfig.StateDirectory = [ "sourcehut/gitsrht" "sourcehut/gitsrht/repos" ];
1020 serviceConfig.StateDirectory = [ "sourcehut/gitsrht" "sourcehut/gitsrht/repos" ];
1021− preStart = mkIf (!versionAtLeast config.system.stateVersion "22.05") (mkBefore ''
1021+ preStart = mkIf (versionOlder config.system.stateVersion "22.05") (mkBefore ''
1022 # Fix Git hooks of repositories pre-dating https://github.com/NixOS/nixpkgs/pull/133984
1022 # Fix Git hooks of repositories pre-dating https://github.com/NixOS/nixpkgs/pull/133984
1023 (
1023 (
1024 set +f
1024 set +f
nixos/modules/services/misc/taskserver/default.nix+10−6
@@ -106,7 +106,7 @@ let
106
106
107 certtool = "${pkgs.gnutls.bin}/bin/certtool";
107 certtool = "${pkgs.gnutls.bin}/bin/certtool";
108
108
109− nixos-taskserver = with pkgs.python2.pkgs; buildPythonApplication {
109+ nixos-taskserver = with pkgs.python3.pkgs; buildPythonApplication {
110 name = "nixos-taskserver";
110 name = "nixos-taskserver";
111
111
112 src = pkgs.runCommand "nixos-taskserver-src" { preferLocalBuild = true; } ''
112 src = pkgs.runCommand "nixos-taskserver-src" { preferLocalBuild = true; } ''
@@ -277,10 +277,6 @@ in {
277 example = "::";
277 example = "::";
278 description = ''
278 description = ''
279 The address (IPv4, IPv6 or DNS) to listen on.
279 The address (IPv4, IPv6 or DNS) to listen on.
280−
281− If the value is something else than <literal>localhost</literal> the
282− port defined by <option>listenPort</option> is automatically added to
283− <option>networking.firewall.allowedTCPPorts</option>.
284 '';
280 '';
285 };
281 };
286
282
@@ -292,6 +288,14 @@ in {
292 '';
288 '';
293 };
289 };
294
290
291+ openFirewall = mkOption {
292+ type = types.bool;
293+ default = false;
294+ description = ''
295+ Whether to open the firewall for the specified Taskserver port.
296+ '';
297+ };
298+
295 fqdn = mkOption {
299 fqdn = mkOption {
296 type = types.str;
300 type = types.str;
297 default = "localhost";
301 default = "localhost";
@@ -560,7 +564,7 @@ in {
560 '';
564 '';
561 };
565 };
562 })
566 })
563− (mkIf (cfg.enable && cfg.listenHost != "localhost") {
567+ (mkIf (cfg.enable && cfg.openFirewall) {
564 networking.firewall.allowedTCPPorts = [ cfg.listenPort ];
568 networking.firewall.allowedTCPPorts = [ cfg.listenPort ];
565 })
569 })
566 ];
570 ];
nixos/modules/services/misc/taskserver/helper-tool.py+5−5
@@ -90,7 +90,7 @@ def certtool_cmd(*args, **kwargs):
90 """
90 """
91 return subprocess.check_output(
91 return subprocess.check_output(
92 [CERTTOOL_COMMAND] + list(args),
92 [CERTTOOL_COMMAND] + list(args),
93− preexec_fn=lambda: os.umask(0077),
93+ preexec_fn=lambda: os.umask(0o077),
94 stderr=subprocess.STDOUT,
94 stderr=subprocess.STDOUT,
95 **kwargs
95 **kwargs
96 )
96 )
@@ -164,7 +164,7 @@ def generate_key(org, user):
164 pubcert = os.path.join(basedir, "public.cert")
164 pubcert = os.path.join(basedir, "public.cert")
165
165
166 try:
166 try:
167− os.makedirs(basedir, mode=0700)
167+ os.makedirs(basedir, mode=0o700)
168
168
169 certtool_cmd("-p", "--bits", CERT_BITS, "--outfile", privkey)
169 certtool_cmd("-p", "--bits", CERT_BITS, "--outfile", privkey)
170
170
@@ -301,7 +301,7 @@ class Organisation(object):
301 return None
301 return None
302 if name not in self.users.keys():
302 if name not in self.users.keys():
303 output = taskd_cmd("add", "user", self.name, name,
303 output = taskd_cmd("add", "user", self.name, name,
304− capture_stdout=True)
304+ capture_stdout=True, encoding='utf-8')
305 key = RE_USERKEY.search(output)
305 key = RE_USERKEY.search(output)
306 if key is None:
306 if key is None:
307 msg = "Unable to find key while creating user {}."
307 msg = "Unable to find key while creating user {}."
@@ -412,9 +412,9 @@ class Manager(object):
412 if org is not None:
412 if org is not None:
413 if self.ignore_imperative and is_imperative(name):
413 if self.ignore_imperative and is_imperative(name):
414 return
414 return
415− for user in org.users.keys():
415+ for user in list(org.users.keys()):
416 org.del_user(user)
416 org.del_user(user)
417− for group in org.groups.keys():
417+ for group in list(org.groups.keys()):
418 org.del_group(group)
418 org.del_group(group)
419 taskd_cmd("remove", "org", name)
419 taskd_cmd("remove", "org", name)
420 del self._lazy_orgs[name]
420 del self._lazy_orgs[name]
nixos/modules/services/misc/zookeeper.nix+8−1
@@ -114,6 +114,13 @@ in {
114 type = types.package;
114 type = types.package;
115 };
115 };
116
116
117+ jre = mkOption {
118+ description = "The JRE with which to run Zookeeper";
119+ default = cfg.package.jre;
120+ defaultText = literalExpression "pkgs.zookeeper.jre";
121+ example = literalExpression "pkgs.jre";
122+ type = types.package;
123+ };
117 };
124 };
118
125
119
126
@@ -131,7 +138,7 @@ in {
131 after = [ "network.target" ];
138 after = [ "network.target" ];
132 serviceConfig = {
139 serviceConfig = {
133 ExecStart = ''
140 ExecStart = ''
134− ${pkgs.jre}/bin/java \
141+ ${cfg.jre}/bin/java \
135 -cp "${cfg.package}/lib/*:${configDir}" \
142 -cp "${cfg.package}/lib/*:${configDir}" \
136 ${escapeShellArgs cfg.extraCmdLineOptions} \
143 ${escapeShellArgs cfg.extraCmdLineOptions} \
137 -Dzookeeper.datadir.autocreate=false \
144 -Dzookeeper.datadir.autocreate=false \
nixos/modules/services/monitoring/collectd.nix+30−26
@@ -5,36 +5,15 @@ with lib;
5let
5let
6 cfg = config.services.collectd;
6 cfg = config.services.collectd;
7
7
8+ baseDirLine = ''BaseDir "${cfg.dataDir}"'';
8− unvalidated_conf = pkgs.writeText "collectd-unvalidated.conf" ''
9+ unvalidated_conf = pkgs.writeText "collectd-unvalidated.conf" cfg.extraConfig;
9− BaseDir "${cfg.dataDir}"
10− AutoLoadPlugin ${boolToString cfg.autoLoadPlugin}
11− Hostname "${config.networking.hostName}"
12−
13− LoadPlugin syslog
14− <Plugin "syslog">
15− LogLevel "info"
16− NotifyLevel "OKAY"
17− </Plugin>
18−
19− ${concatStrings (mapAttrsToList (plugin: pluginConfig: ''
20− LoadPlugin ${plugin}
21− <Plugin "${plugin}">
22− ${pluginConfig}
23− </Plugin>
24− '') cfg.plugins)}
25−
26− ${concatMapStrings (f: ''
27− Include "${f}"
28− '') cfg.include}
29−
30− ${cfg.extraConfig}
31− '';
32
10
33 conf = if cfg.validateConfig then
11 conf = if cfg.validateConfig then
34 pkgs.runCommand "collectd.conf" {} ''
12 pkgs.runCommand "collectd.conf" {} ''
35 echo testing ${unvalidated_conf}
13 echo testing ${unvalidated_conf}
14+ cp ${unvalidated_conf} collectd.conf
36 # collectd -t fails if BaseDir does not exist.
15 # collectd -t fails if BaseDir does not exist.
37− sed '1s/^BaseDir.*$/BaseDir "."/' ${unvalidated_conf} > collectd.conf
16+ substituteInPlace collectd.conf --replace ${lib.escapeShellArgs [ baseDirLine ]} 'BaseDir "."'
38 ${package}/bin/collectd -t -C collectd.conf
17 ${package}/bin/collectd -t -C collectd.conf
39 cp ${unvalidated_conf} $out
18 cp ${unvalidated_conf} $out
40 '' else unvalidated_conf;
19 '' else unvalidated_conf;
@@ -123,7 +102,8 @@ in {
123 extraConfig = mkOption {
102 extraConfig = mkOption {
124 default = "";
103 default = "";
125 description = ''
104 description = ''
126− Extra configuration for collectd.
105+ Extra configuration for collectd. Use mkBefore to add lines before the
106+ default config, and mkAfter to add them below.
127 '';
107 '';
128 type = lines;
108 type = lines;
129 };
109 };
@@ -131,6 +111,30 @@ in {
131 };
111 };
132
112
133 config = mkIf cfg.enable {
113 config = mkIf cfg.enable {
114+ # 1200 is after the default (1000) but before mkAfter (1500).
115+ services.collectd.extraConfig = lib.mkOrder 1200 ''
116+ ${baseDirLine}
117+ AutoLoadPlugin ${boolToString cfg.autoLoadPlugin}
118+ Hostname "${config.networking.hostName}"
119+
120+ LoadPlugin syslog
121+ <Plugin "syslog">
122+ LogLevel "info"
123+ NotifyLevel "OKAY"
124+ </Plugin>
125+
126+ ${concatStrings (mapAttrsToList (plugin: pluginConfig: ''
127+ LoadPlugin ${plugin}
128+ <Plugin "${plugin}">
129+ ${pluginConfig}
130+ </Plugin>
131+ '') cfg.plugins)}
132+
133+ ${concatMapStrings (f: ''
134+ Include "${f}"
135+ '') cfg.include}
136+ '';
137+
134 systemd.tmpfiles.rules = [
138 systemd.tmpfiles.rules = [
135 "d '${cfg.dataDir}' - ${cfg.user} - - -"
139 "d '${cfg.dataDir}' - ${cfg.user} - - -"
136 ];
140 ];
nixos/modules/services/monitoring/mimir.nixnew file+63
@@ -0,0 +1,63 @@
1+{ config, lib, pkgs, ... }:
2+
3+let
4+ inherit (lib) escapeShellArgs mkEnableOption mkIf mkOption types;
5+
6+ cfg = config.services.mimir;
7+
8+ settingsFormat = pkgs.formats.yaml {};
9+in {
10+ options.services.mimir = {
11+ enable = mkEnableOption "mimir";
12+
13+ configuration = mkOption {
14+ type = (pkgs.formats.json {}).type;
15+ default = {};
16+ description = ''
17+ Specify the configuration for Mimir in Nix.
18+ '';
19+ };
20+
21+ configFile = mkOption {
22+ type = types.nullOr types.path;
23+ default = null;
24+ description = ''
25+ Specify a configuration file that Mimir should use.
26+ '';
27+ };
28+ };
29+
30+ config = mkIf cfg.enable {
31+ assertions = [{
32+ assertion = (
33+ (cfg.configuration == {} -> cfg.configFile != null) &&
34+ (cfg.configFile != null -> cfg.configuration == {})
35+ );
36+ message = ''
37+ Please specify either
38+ 'services.mimir.configuration' or
39+ 'services.mimir.configFile'.
40+ '';
41+ }];
42+
43+ systemd.services.mimir = {
44+ description = "mimir Service Daemon";
45+ wantedBy = [ "multi-user.target" ];
46+
47+ serviceConfig = let
48+ conf = if cfg.configFile == null
49+ then settingsFormat.generate "config.yaml" cfg.configuration
50+ else cfg.configFile;
51+ in
52+ {
53+ ExecStart = "${pkgs.grafana-mimir}/bin/mimir --config.file=${conf}";
54+ DynamicUser = true;
55+ Restart = "always";
56+ ProtectSystem = "full";
57+ DevicePolicy = "closed";
58+ NoNewPrivileges = true;
59+ StateDirectory = "mimir";
60+ };
61+ };
62+ };
63+}
nixos/modules/services/monitoring/nagios.nix+2−2
@@ -102,8 +102,8 @@ in
102
102
103 plugins = mkOption {
103 plugins = mkOption {
104 type = types.listOf types.package;
104 type = types.listOf types.package;
105− default = with pkgs; [ monitoring-plugins ssmtp mailutils ];
105+ default = with pkgs; [ monitoring-plugins msmtp mailutils ];
106− defaultText = literalExpression "[pkgs.monitoring-plugins pkgs.ssmtp pkgs.mailutils]";
106+ defaultText = literalExpression "[pkgs.monitoring-plugins pkgs.msmtp pkgs.mailutils]";
107 description = "
107 description = "
108 Packages to be added to the Nagios <envar>PATH</envar>.
108 Packages to be added to the Nagios <envar>PATH</envar>.
109 Typically used to add plugins, but can be anything.
109 Typically used to add plugins, but can be anything.
nixos/modules/services/monitoring/prometheus/default.nix+2−9
@@ -74,7 +74,6 @@ let
74 }"
74 }"
75 "--web.listen-address=${cfg.listenAddress}:${builtins.toString cfg.port}"
75 "--web.listen-address=${cfg.listenAddress}:${builtins.toString cfg.port}"
76 "--alertmanager.notification-queue-capacity=${toString cfg.alertmanagerNotificationQueueCapacity}"
76 "--alertmanager.notification-queue-capacity=${toString cfg.alertmanagerNotificationQueueCapacity}"
77− "--alertmanager.timeout=${toString cfg.alertmanagerTimeout}s"
78 ] ++ optional (cfg.webExternalUrl != null) "--web.external-url=${cfg.webExternalUrl}"
77 ] ++ optional (cfg.webExternalUrl != null) "--web.external-url=${cfg.webExternalUrl}"
79 ++ optional (cfg.retentionTime != null) "--storage.tsdb.retention.time=${cfg.retentionTime}";
78 ++ optional (cfg.retentionTime != null) "--storage.tsdb.retention.time=${cfg.retentionTime}";
80
79
@@ -1563,6 +1562,8 @@ in
1563 (mkRenamedOptionModule [ "services" "prometheus2" ] [ "services" "prometheus" ])
1562 (mkRenamedOptionModule [ "services" "prometheus2" ] [ "services" "prometheus" ])
1564 (mkRemovedOptionModule [ "services" "prometheus" "environmentFile" ]
1563 (mkRemovedOptionModule [ "services" "prometheus" "environmentFile" ]
1565 "It has been removed since it was causing issues (https://github.com/NixOS/nixpkgs/issues/126083) and Prometheus now has native support for secret files, i.e. `basic_auth.password_file` and `authorization.credentials_file`.")
1564 "It has been removed since it was causing issues (https://github.com/NixOS/nixpkgs/issues/126083) and Prometheus now has native support for secret files, i.e. `basic_auth.password_file` and `authorization.credentials_file`.")
1565+ (mkRemovedOptionModule [ "services" "prometheus" "alertmanagerTimeout" ]
1566+ "Deprecated upstream and no longer had any effect")
1566 ];
1567 ];
1567
1568
1568 options.services.prometheus = {
1569 options.services.prometheus = {
@@ -1719,14 +1720,6 @@ in
1719 '';
1720 '';
1720 };
1721 };
1721
1722
1722− alertmanagerTimeout = mkOption {
1723− type = types.int;
1724− default = 10;
1725− description = ''
1726− Alert manager HTTP API timeout (in seconds).
1727− '';
1728− };
1729−
1730 webExternalUrl = mkOption {
1723 webExternalUrl = mkOption {
1731 type = types.nullOr types.str;
1724 type = types.nullOr types.str;
1732 default = null;
1725 default = null;
nixos/modules/services/monitoring/prometheus/exporters.xml+21
@@ -19,6 +19,7 @@
19<programlisting>
19<programlisting>
20 services.prometheus.exporters.node = {
20 services.prometheus.exporters.node = {
21 enable = true;
21 enable = true;
22+ port = 9100;
22 enabledCollectors = [
23 enabledCollectors = [
23 "logind"
24 "logind"
24 "systemd"
25 "systemd"
@@ -42,6 +43,26 @@
42 <link xlink:href="https://nixos.org/nixos/options.html#prometheus.exporters">available
43 <link xlink:href="https://nixos.org/nixos/options.html#prometheus.exporters">available
43 options</link>.
44 options</link>.
44 </para>
45 </para>
46+
47+ <para>
48+ Prometheus can now be configured to consume the metrics produced by the exporter:
49+ <programlisting>
50+ services.prometheus = {
51+ # ...
52+
53+ scrapeConfigs = [
54+ {
55+ job_name = "node";
56+ static_configs = [{
57+ targets = [ "localhost:${toString config.services.prometheus.exporters.node.port}" ];
58+ }];
59+ }
60+ ];
61+
62+ # ...
63+ }
64+ </programlisting>
65+ </para>
45 </section>
66 </section>
46 <section xml:id="module-services-prometheus-exporters-new-exporter">
67 <section xml:id="module-services-prometheus-exporters-new-exporter">
47 <title>Adding a new exporter</title>
68 <title>Adding a new exporter</title>
nixos/modules/services/network-filesystems/ipfs.nix+16−10
@@ -1,8 +1,7 @@
1−{ config, lib, pkgs, options, utils, ... }:
1+{ config, lib, pkgs, utils, ... }:
2with lib;
2with lib;
3let
3let
4 cfg = config.services.ipfs;
4 cfg = config.services.ipfs;
5− opt = options.services.ipfs;
6
5
7 ipfsFlags = utils.escapeSystemdExecArgs (
6 ipfsFlags = utils.escapeSystemdExecArgs (
8 optional cfg.autoMount "--mount" ++
7 optional cfg.autoMount "--mount" ++
@@ -255,23 +254,27 @@ in
255 else
254 else
256 # After an unclean shutdown this file may exist which will cause the config command to attempt to talk to the daemon. This will hang forever if systemd is holding our sockets open.
255 # After an unclean shutdown this file may exist which will cause the config command to attempt to talk to the daemon. This will hang forever if systemd is holding our sockets open.
257 rm -vf "$IPFS_PATH/api"
256 rm -vf "$IPFS_PATH/api"
258−
257+ '' + optionalString cfg.autoMigrate ''
258+ ${pkgs.ipfs-migrator}/bin/fs-repo-migrations -to '${cfg.package.repoVersion}' -y
259+ '' + ''
259 ipfs --offline config profile apply ${profile}
260 ipfs --offline config profile apply ${profile}
260 fi
261 fi
261 '' + optionalString cfg.autoMount ''
262 '' + optionalString cfg.autoMount ''
262 ipfs --offline config Mounts.FuseAllowOther --json true
263 ipfs --offline config Mounts.FuseAllowOther --json true
263 ipfs --offline config Mounts.IPFS ${cfg.ipfsMountDir}
264 ipfs --offline config Mounts.IPFS ${cfg.ipfsMountDir}
264 ipfs --offline config Mounts.IPNS ${cfg.ipnsMountDir}
265 ipfs --offline config Mounts.IPNS ${cfg.ipnsMountDir}
265− '' + optionalString cfg.autoMigrate ''
266− ${pkgs.ipfs-migrator}/bin/fs-repo-migrations -to '${cfg.package.repoVersion}' -y
267 '' + ''
266 '' + ''
268 ipfs --offline config show \
267 ipfs --offline config show \
269 | ${pkgs.jq}/bin/jq '. * $extraConfig' --argjson extraConfig ${
268 | ${pkgs.jq}/bin/jq '. * $extraConfig' --argjson extraConfig ${
270− escapeShellArg (builtins.toJSON ({
269+ escapeShellArg (builtins.toJSON (
270+ recursiveUpdate
271+ {
271− Addresses.API = cfg.apiAddress;
272+ Addresses.API = cfg.apiAddress;
272− Addresses.Gateway = cfg.gatewayAddress;
273+ Addresses.Gateway = cfg.gatewayAddress;
273− Addresses.Swarm = cfg.swarmAddress;
274+ Addresses.Swarm = cfg.swarmAddress;
275+ }
274− } // cfg.extraConfig))
276+ cfg.extraConfig
277+ ))
275 } \
278 } \
276 | ipfs --offline config replace -
279 | ipfs --offline config replace -
277 '';
280 '';
@@ -312,6 +315,9 @@ in
312 in
315 in
313 [ "" "%t/ipfs.sock" ] ++ lib.optional (fromCfg != null) fromCfg;
316 [ "" "%t/ipfs.sock" ] ++ lib.optional (fromCfg != null) fromCfg;
314 };
317 };
318+ };
315
319
320+ meta = {
321+ maintainers = with lib.maintainers; [ Luflosi ];
316 };
322 };
317}
323}
nixos/modules/services/networking/asterisk.nix+11−43
@@ -14,28 +14,9 @@ let
14
14
15 # Add filecontents from files of useTheseDefaultConfFiles to confFiles, do not override
15 # Add filecontents from files of useTheseDefaultConfFiles to confFiles, do not override
16 defaultConfFiles = subtractLists (attrNames cfg.confFiles) cfg.useTheseDefaultConfFiles;
16 defaultConfFiles = subtractLists (attrNames cfg.confFiles) cfg.useTheseDefaultConfFiles;
17− allConfFiles =
17+ allConfFiles = {
18− cfg.confFiles //
19− builtins.listToAttrs (map (x: { name = x;
20− value = builtins.readFile (cfg.package + "/etc/asterisk/" + x); })
21− defaultConfFiles);
22−
23− asteriskEtc = pkgs.stdenv.mkDerivation
24− ((mapAttrs' (name: value: nameValuePair
25− # Fudge the names to make bash happy
26− ((replaceChars ["."] ["_"] name) + "_")
27− (value)
28− ) allConfFiles) //
29− {
30− confFilesString = concatStringsSep " " (
31− attrNames allConfFiles
32− );
33−
34− name = "asterisk-etc";
35−
36 # Default asterisk.conf file
18 # Default asterisk.conf file
37− # (Notice that astetcdir will be set to the path of this derivation)
19+ "asterisk.conf".text = ''
38− asteriskConf = ''
39 [directories]
20 [directories]
40 astetcdir => /etc/asterisk
21 astetcdir => /etc/asterisk
41 astmoddir => ${cfg.package}/lib/asterisk/modules
22 astmoddir => ${cfg.package}/lib/asterisk/modules
@@ -48,43 +29,28 @@ let
48 astrundir => /run/asterisk
29 astrundir => /run/asterisk
49 astlogdir => /var/log/asterisk
30 astlogdir => /var/log/asterisk
50 astsbindir => ${cfg.package}/sbin
31 astsbindir => ${cfg.package}/sbin
32+ ${cfg.extraConfig}
51 '';
33 '';
52− extraConf = cfg.extraConfig;
53
34
54 # Loading all modules by default is considered sensible by the authors of
35 # Loading all modules by default is considered sensible by the authors of
55 # "Asterisk: The Definitive Guide". Secure sites will likely want to
36 # "Asterisk: The Definitive Guide". Secure sites will likely want to
56 # specify their own "modules.conf" in the confFiles option.
37 # specify their own "modules.conf" in the confFiles option.
57− modulesConf = ''
38+ "modules.conf".text = ''
58 [modules]
39 [modules]
59 autoload=yes
40 autoload=yes
60 '';
41 '';
61
42
62 # Use syslog for logging so logs can be viewed with journalctl
43 # Use syslog for logging so logs can be viewed with journalctl
63− loggerConf = ''
44+ "logger.conf".text = ''
64 [general]
45 [general]
65
46
66 [logfiles]
47 [logfiles]
67 syslog.local0 => notice,warning,error
48 syslog.local0 => notice,warning,error
68 '';
49 '';
50+ } //
51+ mapAttrs (name: text: { inherit text; }) cfg.confFiles //
52+ listToAttrs (map (x: nameValuePair x { source = cfg.package + "/etc/asterisk/" + x; }) defaultConfFiles);
69
53
70− buildCommand = ''
71− mkdir -p "$out"
72−
73− # Create asterisk.conf, pointing astetcdir to the path of this derivation
74− echo "$asteriskConf" | sed "s|@out@|$out|g" > "$out"/asterisk.conf
75− echo "$extraConf" >> "$out"/asterisk.conf
76−
77− echo "$modulesConf" > "$out"/modules.conf
78−
79− echo "$loggerConf" > "$out"/logger.conf
80−
81− # Config files specified in confFiles option override all other files
82− for i in $confFilesString; do
83− conf=$(echo "$i"_ | sed 's/\./_/g')
84− echo "''${!conf}" > "$out"/"$i"
85− done
86− '';
87− });
88in
54in
89
55
90{
56{
@@ -209,7 +175,9 @@ in
209 config = mkIf cfg.enable {
175 config = mkIf cfg.enable {
210 environment.systemPackages = [ cfg.package ];
176 environment.systemPackages = [ cfg.package ];
211
177
212− environment.etc.asterisk.source = asteriskEtc;
178+ environment.etc = mapAttrs' (name: value:
179+ nameValuePair "asterisk/${name}" value
180+ ) allConfFiles;
213
181
214 users.users.asterisk =
182 users.users.asterisk =
215 { name = asteriskUser;
183 { name = asteriskUser;
nixos/modules/services/networking/bird.nix+1−2
@@ -68,8 +68,7 @@ in
68 systemd.services.bird2 = {
68 systemd.services.bird2 = {
69 description = "BIRD Internet Routing Daemon";
69 description = "BIRD Internet Routing Daemon";
70 wantedBy = [ "multi-user.target" ];
70 wantedBy = [ "multi-user.target" ];
71− reloadIfChanged = true;
72− restartTriggers = [ config.environment.etc."bird/bird2.conf".source ];
71+ reloadTriggers = [ config.environment.etc."bird/bird2.conf".source ];
73 serviceConfig = {
72 serviceConfig = {
74 Type = "forking";
73 Type = "forking";
75 Restart = "on-failure";
74 Restart = "on-failure";
nixos/modules/services/networking/cloudflare-dyndns.nixnew file+93
@@ -0,0 +1,93 @@
1+{ config, pkgs, lib, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.cloudflare-dyndns;
7+in
8+{
9+ options = {
10+ services.cloudflare-dyndns = {
11+ enable = mkEnableOption "Cloudflare Dynamic DNS Client";
12+
13+ apiTokenFile = mkOption {
14+ type = types.nullOr types.str;
15+ default = null;
16+ description = ''
17+ The path to a file containing the CloudFlare API token.
18+
19+ The file must have the form `CLOUDFLARE_API_TOKEN=...`
20+ '';
21+ };
22+
23+ domains = mkOption {
24+ type = types.listOf types.str;
25+ default = [ ];
26+ description = ''
27+ List of domain names to update records for.
28+ '';
29+ };
30+
31+ proxied = mkOption {
32+ type = types.bool;
33+ default = false;
34+ description = ''
35+ Whether this is a DNS-only record, or also being proxied through CloudFlare.
36+ '';
37+ };
38+
39+ ipv4 = mkOption {
40+ type = types.bool;
41+ default = true;
42+ description = ''
43+ Whether to enable setting IPv4 A records.
44+ '';
45+ };
46+
47+ ipv6 = mkOption {
48+ type = types.bool;
49+ default = false;
50+ description = ''
51+ Whether to enable setting IPv6 AAAA records.
52+ '';
53+ };
54+
55+ deleteMissing = mkOption {
56+ type = types.bool;
57+ default = false;
58+ description = ''
59+ Whether to delete the record when no IP address is found.
60+ '';
61+ };
62+ };
63+ };
64+
65+ config = mkIf cfg.enable {
66+ systemd.services.cloudflare-dyndns = {
67+ description = "CloudFlare Dynamic DNS Client";
68+ after = [ "network.target" ];
69+ wantedBy = [ "multi-user.target" ];
70+ startAt = "*:0/5";
71+
72+ environment = {
73+ CLOUDFLARE_DOMAINS = toString cfg.domains;
74+ };
75+
76+ serviceConfig = {
77+ Type = "simple";
78+ DynamicUser = true;
79+ StateDirectory = "cloudflare-dyndns";
80+ EnvironmentFile = cfg.apiTokenFile;
81+ ExecStart =
82+ let
83+ args = [ "--cache-file /var/lib/cloudflare-dyndns/ip.cache" ]
84+ ++ (if cfg.ipv4 then [ "-4" ] else [ "-no-4" ])
85+ ++ (if cfg.ipv6 then [ "-6" ] else [ "-no-6" ])
86+ ++ optional cfg.deleteMissing "--delete-missing"
87+ ++ optional cfg.proxied "--proxied";
88+ in
89+ "${pkgs.cloudflare-dyndns}/bin/cloudflare-dyndns ${toString args}";
90+ };
91+ };
92+ };
93+}
nixos/modules/services/networking/consul.nix+32−6
@@ -80,13 +80,21 @@ in
80 The name of the interface to pull the bind_addr from.
80 The name of the interface to pull the bind_addr from.
81 '';
81 '';
82 };
82 };
83+ };
83
84
85+ forceAddrFamily = mkOption {
86+ type = types.enum [ "any" "ipv4" "ipv6" ];
87+ default = "any";
88+ description = ''
89+ Whether to bind ipv4/ipv6 or both kind of addresses.
90+ '';
84 };
91 };
85
92
86 forceIpv4 = mkOption {
93 forceIpv4 = mkOption {
87− type = types.bool;
94+ type = types.nullOr types.bool;
88− default = false;
95+ default = null;
89 description = ''
96 description = ''
97+ Deprecated: Use consul.forceAddrFamily instead.
90 Whether we should force the interfaces to only pull ipv4 addresses.
98 Whether we should force the interfaces to only pull ipv4 addresses.
91 '';
99 '';
92 };
100 };
@@ -175,6 +183,13 @@ in
175 systemPackages = [ cfg.package ];
183 systemPackages = [ cfg.package ];
176 };
184 };
177
185
186+ warnings = lib.flatten [
187+ (lib.optional (cfg.forceIpv4 != null) ''
188+ The option consul.forceIpv4 is deprecated, please use
189+ consul.forceAddrFamily instead.
190+ '')
191+ ];
192+
178 systemd.services.consul = {
193 systemd.services.consul = {
179 wantedBy = [ "multi-user.target" ];
194 wantedBy = [ "multi-user.target" ];
180 after = [ "network.target" ] ++ systemdDevices;
195 after = [ "network.target" ] ++ systemdDevices;
@@ -196,15 +211,21 @@ in
196 });
211 });
197
212
198 path = with pkgs; [ iproute2 gnugrep gawk consul ];
213 path = with pkgs; [ iproute2 gnugrep gawk consul ];
199− preStart = ''
214+ preStart = let
215+ family = if cfg.forceAddrFamily == "ipv6" then
216+ "-6"
217+ else if cfg.forceAddrFamily == "ipv4" then
218+ "-4"
219+ else
220+ "";
221+ in ''
200 mkdir -m 0700 -p ${dataDir}
222 mkdir -m 0700 -p ${dataDir}
201 chown -R consul ${dataDir}
223 chown -R consul ${dataDir}
202
224
203 # Determine interface addresses
225 # Determine interface addresses
204 getAddrOnce () {
226 getAddrOnce () {
205− ip addr show dev "$1" \
227+ ip ${family} addr show dev "$1" scope global \
206− | grep 'inet${optionalString (cfg.forceIpv4) " "}.*scope global' \
207− | awk -F '[ /\t]*' '{print $3}' | head -n 1
228+ | awk -F '[ /\t]*' '/inet/ {print $3}' | head -n 1
208 }
229 }
209 getAddr () {
230 getAddr () {
210 ADDR="$(getAddrOnce $1)"
231 ADDR="$(getAddrOnce $1)"
@@ -234,6 +255,11 @@ in
234 };
255 };
235 }
256 }
236
257
258+ # deprecated
259+ (mkIf (cfg.forceIpv4 != null && cfg.forceIpv4) {
260+ services.consul.forceAddrFamily = "ipv4";
261+ })
262+
237 (mkIf (cfg.alerts.enable) {
263 (mkIf (cfg.alerts.enable) {
238 systemd.services.consul-alerts = {
264 systemd.services.consul-alerts = {
239 wantedBy = [ "multi-user.target" ];
265 wantedBy = [ "multi-user.target" ];
nixos/modules/services/networking/create_ap.nixnew file+50
@@ -0,0 +1,50 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.create_ap;
7+ configFile = pkgs.writeText "create_ap.conf" (generators.toKeyValue { } cfg.settings);
8+in {
9+ options = {
10+ services.create_ap = {
11+ enable = mkEnableOption "setup wifi hotspots using create_ap";
12+ settings = mkOption {
13+ type = with types; attrsOf (oneOf [ int bool str ]);
14+ default = {};
15+ description = ''
16+ Configuration for <package>create_ap</package>.
17+ See <link xlink:href="https://raw.githubusercontent.com/lakinduakash/linux-wifi-hotspot/master/src/scripts/create_ap.conf">upstream example configuration</link>
18+ for supported values.
19+ '';
20+ example = {
21+ INTERNET_IFACE = "eth0";
22+ WIFI_IFACE = "wlan0";
23+ SSID = "My Wifi Hotspot";
24+ PASSPHRASE = "12345678";
25+ };
26+ };
27+ };
28+ };
29+
30+ config = mkIf cfg.enable {
31+
32+ systemd = {
33+ services.create_ap = {
34+ wantedBy = [ "multi-user.target" ];
35+ description = "Create AP Service";
36+ after = [ "network.target" ];
37+ restartTriggers = [ configFile ];
38+ serviceConfig = {
39+ ExecStart = "${pkgs.linux-wifi-hotspot}/bin/create_ap --config ${configFile}";
40+ KillSignal = "SIGINT";
41+ Restart = "on-failure";
42+ };
43+ };
44+ };
45+
46+ };
47+
48+ meta.maintainers = with lib.maintainers; [ onny ];
49+
50+}
nixos/modules/services/networking/envoy.nixnew file+84
@@ -0,0 +1,84 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.envoy;
7+ format = pkgs.formats.json { };
8+ conf = format.generate "envoy.json" cfg.settings;
9+ validateConfig = file:
10+ pkgs.runCommand "validate-envoy-conf" { } ''
11+ ${pkgs.envoy}/bin/envoy --log-level error --mode validate -c "${file}"
12+ cp "${file}" "$out"
13+ '';
14+
15+in
16+
17+{
18+ options.services.envoy = {
19+ enable = mkEnableOption "Envoy reverse proxy";
20+
21+ settings = mkOption {
22+ type = format.type;
23+ default = { };
24+ example = literalExpression ''
25+ {
26+ admin = {
27+ access_log_path = "/dev/null";
28+ address = {
29+ socket_address = {
30+ protocol = "TCP";
31+ address = "127.0.0.1";
32+ port_value = 9901;
33+ };
34+ };
35+ };
36+ static_resources = {
37+ listeners = [];
38+ clusters = [];
39+ };
40+ }
41+ '';
42+ description = ''
43+ Specify the configuration for Envoy in Nix.
44+ '';
45+ };
46+ };
47+
48+ config = mkIf cfg.enable {
49+ environment.systemPackages = [ pkgs.envoy ];
50+ systemd.services.envoy = {
51+ description = "Envoy reverse proxy";
52+ after = [ "network-online.target" ];
53+ requires = [ "network-online.target" ];
54+ wantedBy = [ "multi-user.target" ];
55+ serviceConfig = {
56+ ExecStart = "${pkgs.envoy}/bin/envoy -c ${validateConfig conf}";
57+ DynamicUser = true;
58+ Restart = "no";
59+ CacheDirectory = "envoy";
60+ LogsDirectory = "envoy";
61+ AmbientCapabilities = "CAP_NET_BIND_SERVICE";
62+ CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
63+ RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6 AF_NETLINK AF_XDP";
64+ SystemCallArchitectures = "native";
65+ LockPersonality = true;
66+ RestrictNamespaces = true;
67+ RestrictRealtime = true;
68+ PrivateUsers = false; # breaks CAP_NET_BIND_SERVICE
69+ PrivateDevices = true;
70+ ProtectClock = true;
71+ ProtectControlGroups = true;
72+ ProtectHome = true;
73+ ProtectKernelLogs = true;
74+ ProtectKernelModules = true;
75+ ProtectKernelTunables = true;
76+ ProtectProc = "ptraceable";
77+ ProtectHostname = true;
78+ ProtectSystem = "strict";
79+ UMask = "0066";
80+ SystemCallFilter = "~@clock @module @mount @reboot @swap @obsolete @cpu-emulation";
81+ };
82+ };
83+ };
84+}
nixos/modules/services/networking/headscale.nix+1−1
@@ -479,7 +479,7 @@ in
479 NoNewPrivileges = true;
479 NoNewPrivileges = true;
480 LockPersonality = true;
480 LockPersonality = true;
481 RestrictRealtime = true;
481 RestrictRealtime = true;
482− SystemCallFilter = [ "@system-service" "~@priviledged" "@chown" ];
482+ SystemCallFilter = [ "@system-service" "~@privileged" "@chown" ];
483 SystemCallArchitectures = "native";
483 SystemCallArchitectures = "native";
484 RestrictAddressFamilies = "AF_INET AF_INET6 AF_UNIX";
484 RestrictAddressFamilies = "AF_INET AF_INET6 AF_UNIX";
485 };
485 };
nixos/modules/services/networking/kea.nix+74−8
@@ -9,20 +9,26 @@ with lib;
9let
9let
10 cfg = config.services.kea;
10 cfg = config.services.kea;
11
11
12+ xor = x: y: (!x && y) || (x && !y);
12 format = pkgs.formats.json {};
13 format = pkgs.formats.json {};
13
14
15+ chooseNotNull = x: y: if x != null then x else y;
16+
14− ctrlAgentConfig = format.generate "kea-ctrl-agent.conf" {
17+ ctrlAgentConfig = chooseNotNull cfg.ctrl-agent.configFile (format.generate "kea-ctrl-agent.conf" {
15 Control-agent = cfg.ctrl-agent.settings;
18 Control-agent = cfg.ctrl-agent.settings;
16− };
19+ });
20+
17− dhcp4Config = format.generate "kea-dhcp4.conf" {
21+ dhcp4Config = chooseNotNull cfg.dhcp4.configFile (format.generate "kea-dhcp4.conf" {
18 Dhcp4 = cfg.dhcp4.settings;
22 Dhcp4 = cfg.dhcp4.settings;
19− };
23+ });
24+
20− dhcp6Config = format.generate "kea-dhcp6.conf" {
25+ dhcp6Config = chooseNotNull cfg.dhcp6.configFile (format.generate "kea-dhcp6.conf" {
21 Dhcp6 = cfg.dhcp6.settings;
26 Dhcp6 = cfg.dhcp6.settings;
22− };
27+ });
28+
23− dhcpDdnsConfig = format.generate "kea-dhcp-ddns.conf" {
29+ dhcpDdnsConfig = chooseNotNull cfg.dhcp-ddns.configFile (format.generate "kea-dhcp-ddns.conf" {
24 DhcpDdns = cfg.dhcp-ddns.settings;
30 DhcpDdns = cfg.dhcp-ddns.settings;
25− };
31+ });
26
32
27 package = pkgs.kea;
33 package = pkgs.kea;
28in
34in
@@ -45,6 +51,17 @@ in
45 '';
51 '';
46 };
52 };
47
53
54+ configFile = mkOption {
55+ type = nullOr path;
56+ default = null;
57+ description = ''
58+ Kea Control Agent configuration as a path, see <link xlink:href="https://kea.readthedocs.io/en/kea-${package.version}/arm/agent.html"/>.
59+
60+ Takes preference over <link linkend="opt-services.kea.ctrl-agent.settings">settings</link>.
61+ Most users should prefer using <link linkend="opt-services.kea.ctrl-agent.settings">settings</link> instead.
62+ '';
63+ };
64+
48 settings = mkOption {
65 settings = mkOption {
49 type = format.type;
66 type = format.type;
50 default = null;
67 default = null;
@@ -73,6 +90,17 @@ in
73 '';
90 '';
74 };
91 };
75
92
93+ configFile = mkOption {
94+ type = nullOr path;
95+ default = null;
96+ description = ''
97+ Kea DHCP4 configuration as a path, see <link xlink:href="https://kea.readthedocs.io/en/kea-${package.version}/arm/dhcp4-srv.html"/>.
98+
99+ Takes preference over <link linkend="opt-services.kea.dhcp4.settings">settings</link>.
100+ Most users should prefer using <link linkend="opt-services.kea.dhcp4.settings">settings</link> instead.
101+ '';
102+ };
103+
76 settings = mkOption {
104 settings = mkOption {
77 type = format.type;
105 type = format.type;
78 default = null;
106 default = null;
@@ -122,6 +150,17 @@ in
122 '';
150 '';
123 };
151 };
124
152
153+ configFile = mkOption {
154+ type = nullOr path;
155+ default = null;
156+ description = ''
157+ Kea DHCP6 configuration as a path, see <link xlink:href="https://kea.readthedocs.io/en/kea-${package.version}/arm/dhcp6-srv.html"/>.
158+
159+ Takes preference over <link linkend="opt-services.kea.dhcp6.settings">settings</link>.
160+ Most users should prefer using <link linkend="opt-services.kea.dhcp6.settings">settings</link> instead.
161+ '';
162+ };
163+
125 settings = mkOption {
164 settings = mkOption {
126 type = format.type;
165 type = format.type;
127 default = null;
166 default = null;
@@ -172,6 +211,17 @@ in
172 '';
211 '';
173 };
212 };
174
213
214+ configFile = mkOption {
215+ type = nullOr path;
216+ default = null;
217+ description = ''
218+ Kea DHCP-DDNS configuration as a path, see <link xlink:href="https://kea.readthedocs.io/en/kea-${package.version}/arm/ddns.html"/>.
219+
220+ Takes preference over <link linkend="opt-services.kea.dhcp-ddns.settings">settings</link>.
221+ Most users should prefer using <link linkend="opt-services.kea.dhcp-ddns.settings">settings</link> instead.
222+ '';
223+ };
224+
175 settings = mkOption {
225 settings = mkOption {
176 type = format.type;
226 type = format.type;
177 default = null;
227 default = null;
@@ -214,6 +264,10 @@ in
214 }
264 }
215
265
216 (mkIf cfg.ctrl-agent.enable {
266 (mkIf cfg.ctrl-agent.enable {
267+ assertions = [{
268+ assertion = xor (cfg.ctrl-agent.settings == null) (cfg.ctrl-agent.configFile == null);
269+ message = "Either services.kea.ctrl-agent.settings or services.kea.ctrl-agent.configFile must be set to a non-null value.";
270+ }];
217
271
218 environment.etc."kea/ctrl-agent.conf".source = ctrlAgentConfig;
272 environment.etc."kea/ctrl-agent.conf".source = ctrlAgentConfig;
219
273
@@ -252,6 +306,10 @@ in
252 })
306 })
253
307
254 (mkIf cfg.dhcp4.enable {
308 (mkIf cfg.dhcp4.enable {
309+ assertions = [{
310+ assertion = xor (cfg.dhcp4.settings == null) (cfg.dhcp4.configFile == null);
311+ message = "Either services.kea.dhcp4.settings or services.kea.dhcp4.configFile must be set to a non-null value.";
312+ }];
255
313
256 environment.etc."kea/dhcp4-server.conf".source = dhcp4Config;
314 environment.etc."kea/dhcp4-server.conf".source = dhcp4Config;
257
315
@@ -295,6 +353,10 @@ in
295 })
353 })
296
354
297 (mkIf cfg.dhcp6.enable {
355 (mkIf cfg.dhcp6.enable {
356+ assertions = [{
357+ assertion = xor (cfg.dhcp6.settings == null) (cfg.dhcp6.configFile == null);
358+ message = "Either services.kea.dhcp6.settings or services.kea.dhcp6.configFile must be set to a non-null value.";
359+ }];
298
360
299 environment.etc."kea/dhcp6-server.conf".source = dhcp6Config;
361 environment.etc."kea/dhcp6-server.conf".source = dhcp6Config;
300
362
@@ -336,6 +398,10 @@ in
336 })
398 })
337
399
338 (mkIf cfg.dhcp-ddns.enable {
400 (mkIf cfg.dhcp-ddns.enable {
401+ assertions = [{
402+ assertion = xor (cfg.dhcp-ddns.settings == null) (cfg.dhcp-ddns.configFile == null);
403+ message = "Either services.kea.dhcp-ddns.settings or services.kea.dhcp-ddns.configFile must be set to a non-null value.";
404+ }];
339
405
340 environment.etc."kea/dhcp-ddns.conf".source = dhcpDdnsConfig;
406 environment.etc."kea/dhcp-ddns.conf".source = dhcpDdnsConfig;
341
407
nixos/modules/services/networking/mozillavpn.nixnew file+19
@@ -0,0 +1,19 @@
1+{ config, lib, pkgs, ... }:
2+
3+{
4+ options.services.mozillavpn.enable = lib.mkOption {
5+ type = lib.types.bool;
6+ default = false;
7+ description = ''
8+ Enable the Mozilla VPN daemon.
9+ '';
10+ };
11+
12+ config = lib.mkIf config.services.mozillavpn.enable {
13+ environment.systemPackages = [ pkgs.mozillavpn ];
14+ services.dbus.packages = [ pkgs.mozillavpn ];
15+ systemd.packages = [ pkgs.mozillavpn ];
16+ };
17+
18+ meta.maintainers = with lib.maintainers; [ andersk ];
19+}
nixos/modules/services/networking/nbd.nix+28−15
@@ -4,28 +4,34 @@ with lib;
4
4
5let
5let
6 cfg = config.services.nbd;
6 cfg = config.services.nbd;
7− configFormat = pkgs.formats.ini { };
8 iniFields = with types; attrsOf (oneOf [ bool int float str ]);
7 iniFields = with types; attrsOf (oneOf [ bool int float str ]);
9− serverConfig = configFormat.generate "nbd-server-config"
8+ # The `[generic]` section must come before all the others in the
10− ({
9+ # config file. This means we can't just dump an attrset to INI
11− generic =
10+ # because that sorts the sections by name. Instead, we serialize it
11+ # on its own first.
12+ genericSection = {
12− (cfg.server.extraOptions // {
13+ generic = (cfg.server.extraOptions // {
13− user = "root";
14+ user = "root";
14− group = "root";
15+ group = "root";
15− port = cfg.server.listenPort;
16+ port = cfg.server.listenPort;
16− } // (optionalAttrs (cfg.server.listenAddress != null) {
17+ } // (optionalAttrs (cfg.server.listenAddress != null) {
17− listenaddr = cfg.server.listenAddress;
18+ listenaddr = cfg.server.listenAddress;
18− }));
19+ }));
19− }
20+ };
21+ exportSections =
20− // (mapAttrs
22+ mapAttrs
21 (_: { path, allowAddresses, extraOptions }:
23 (_: { path, allowAddresses, extraOptions }:
22 extraOptions // {
24 extraOptions // {
23 exportname = path;
25 exportname = path;
24 } // (optionalAttrs (allowAddresses != null) {
26 } // (optionalAttrs (allowAddresses != null) {
25 authfile = pkgs.writeText "authfile" (concatStringsSep "\n" allowAddresses);
27 authfile = pkgs.writeText "authfile" (concatStringsSep "\n" allowAddresses);
26 }))
28 }))
27− cfg.server.exports)
29+ cfg.server.exports;
30+ serverConfig =
31+ pkgs.writeText "nbd-server-config" ''
32+ ${lib.generators.toINI {} genericSection}
33+ ${lib.generators.toINI {} exportSections}
28− );
34+ '';
29 splitLists =
35 splitLists =
30 partition
36 partition
31 (path: hasPrefix "/dev/" path)
37 (path: hasPrefix "/dev/" path)
@@ -103,6 +109,13 @@ in
103 };
109 };
104
110
105 config = mkIf cfg.server.enable {
111 config = mkIf cfg.server.enable {
112+ assertions = [
113+ {
114+ assertion = !(cfg.server.exports ? "generic");
115+ message = "services.nbd.server exports must not be named 'generic'";
116+ }
117+ ];
118+
106 boot.kernelModules = [ "nbd" ];
119 boot.kernelModules = [ "nbd" ];
107
120
108 systemd.services.nbd-server = {
121 systemd.services.nbd-server = {
nixos/modules/services/networking/ncdns.nix+2−2
@@ -58,7 +58,7 @@ in
58
58
59 address = mkOption {
59 address = mkOption {
60 type = types.str;
60 type = types.str;
61− default = "127.0.0.1";
61+ default = "[::1]";
62 description = ''
62 description = ''
63 The IP address the ncdns resolver will bind to. Leave this unchanged
63 The IP address the ncdns resolver will bind to. Leave this unchanged
64 if you do not wish to directly expose the resolver.
64 if you do not wish to directly expose the resolver.
@@ -202,7 +202,7 @@ in
202 config = mkIf cfg.enable {
202 config = mkIf cfg.enable {
203
203
204 services.pdns-recursor = mkIf cfgs.pdns-recursor.resolveNamecoin {
204 services.pdns-recursor = mkIf cfgs.pdns-recursor.resolveNamecoin {
205− forwardZonesRecurse.bit = "127.0.0.1:${toString cfg.port}";
205+ forwardZonesRecurse.bit = "${cfg.address}:${toString cfg.port}";
206 luaConfig =
206 luaConfig =
207 if cfg.dnssec.enable
207 if cfg.dnssec.enable
208 then ''readTrustAnchorsFromFile("${cfg.dnssec.keys.public}")''
208 then ''readTrustAnchorsFromFile("${cfg.dnssec.keys.public}")''
nixos/modules/services/networking/networkmanager.nix+56−53
@@ -5,18 +5,6 @@ with lib;
5let
5let
6 cfg = config.networking.networkmanager;
6 cfg = config.networking.networkmanager;
7
7
8− basePackages = with pkgs; [
9− modemmanager
10− networkmanager
11− networkmanager-fortisslvpn
12− networkmanager-iodine
13− networkmanager-l2tp
14− networkmanager-openconnect
15− networkmanager-openvpn
16− networkmanager-vpnc
17− networkmanager-sstp
18− ] ++ optional (!delegateWireless && !enableIwd) wpa_supplicant;
19−
20 delegateWireless = config.networking.wireless.enable == true && cfg.unmanaged != [];
8 delegateWireless = config.networking.wireless.enable == true && cfg.unmanaged != [];
21
9
22 enableIwd = cfg.wifi.backend == "iwd";
10 enableIwd = cfg.wifi.backend == "iwd";
@@ -145,6 +133,15 @@ let
145 '';
133 '';
146 };
134 };
147
135
136+ packages = [
137+ pkgs.modemmanager
138+ pkgs.networkmanager
139+ ]
140+ ++ cfg.plugins
141+ ++ lib.optionals (!delegateWireless && !enableIwd) [
142+ pkgs.wpa_supplicant
143+ ];
144+
148in {
145in {
149
146
150 meta = {
147 meta = {
@@ -227,17 +224,33 @@ in {
227 '';
224 '';
228 };
225 };
229
226
230− packages = mkOption {
227+ plugins = mkOption {
231− type = types.listOf types.package;
228+ type =
229+ let
230+ networkManagerPluginPackage = types.package // {
231+ description = "NetworkManager plug-in";
232+ check =
233+ p:
234+ lib.assertMsg
235+ (types.package.check p
236+ && p ? networkManagerPlugin
237+ && lib.isString p.networkManagerPlugin)
238+ ''
239+ Package ‘${p.name}’, is not a NetworkManager plug-in.
240+ Those need to have a ‘networkManagerPlugin’ attribute.
241+ '';
242+ };
243+ in
244+ types.listOf networkManagerPluginPackage;
232 default = [ ];
245 default = [ ];
233 description = ''
246 description = ''
234− Extra packages that provide NetworkManager plugins.
247+ List of NetworkManager plug-ins to enable.
248+ Some plug-ins are enabled by the NetworkManager module by default.
235 '';
249 '';
236− apply = list: basePackages ++ list;
237 };
250 };
238
251
239 dhcp = mkOption {
252 dhcp = mkOption {
240− type = types.enum [ "dhclient" "dhcpcd" "internal" ];
253+ type = types.enum [ "dhcpcd" "internal" ];
241 default = "internal";
254 default = "internal";
242 description = ''
255 description = ''
243 Which program (or internal library) should be used for DHCP.
256 Which program (or internal library) should be used for DHCP.
@@ -380,7 +393,7 @@ in {
380 </para><para>
393 </para><para>
381 If you enable this option the
394 If you enable this option the
382 <literal>networkmanager_strongswan</literal> plugin will be added to
395 <literal>networkmanager_strongswan</literal> plugin will be added to
383− the <option>networking.networkmanager.packages</option> option
396+ the <option>networking.networkmanager.plugins</option> option
384 so you don't need to to that yourself.
397 so you don't need to to that yourself.
385 '';
398 '';
386 };
399 };
@@ -399,6 +412,9 @@ in {
399 };
412 };
400
413
401 imports = [
414 imports = [
415+ (mkRenamedOptionModule
416+ [ "networking" "networkmanager" "packages" ]
417+ [ "networking" "networkmanager" "plugins" ])
402 (mkRenamedOptionModule [ "networking" "networkmanager" "useDnsmasq" ] [ "networking" "networkmanager" "dns" ])
418 (mkRenamedOptionModule [ "networking" "networkmanager" "useDnsmasq" ] [ "networking" "networkmanager" "dns" ])
403 (mkRemovedOptionModule ["networking" "networkmanager" "dynamicHosts"] ''
419 (mkRemovedOptionModule ["networking" "networkmanager" "dynamicHosts"] ''
404 This option was removed because allowing (multiple) regular users to
420 This option was removed because allowing (multiple) regular users to
@@ -426,31 +442,12 @@ in {
426
442
427 hardware.wirelessRegulatoryDatabase = true;
443 hardware.wirelessRegulatoryDatabase = true;
428
444
429− environment.etc = with pkgs; {
445+ environment.etc = {
430− "NetworkManager/NetworkManager.conf".source = configFile;
446+ "NetworkManager/NetworkManager.conf".source = configFile;
431−
432− "NetworkManager/VPN/nm-openvpn-service.name".source =
433− "${networkmanager-openvpn}/lib/NetworkManager/VPN/nm-openvpn-service.name";
434−
435− "NetworkManager/VPN/nm-vpnc-service.name".source =
436− "${networkmanager-vpnc}/lib/NetworkManager/VPN/nm-vpnc-service.name";
437−
438− "NetworkManager/VPN/nm-openconnect-service.name".source =
439− "${networkmanager-openconnect}/lib/NetworkManager/VPN/nm-openconnect-service.name";
440−
441− "NetworkManager/VPN/nm-fortisslvpn-service.name".source =
442− "${networkmanager-fortisslvpn}/lib/NetworkManager/VPN/nm-fortisslvpn-service.name";
443−
444− "NetworkManager/VPN/nm-l2tp-service.name".source =
445− "${networkmanager-l2tp}/lib/NetworkManager/VPN/nm-l2tp-service.name";
446−
447− "NetworkManager/VPN/nm-iodine-service.name".source =
448− "${networkmanager-iodine}/lib/NetworkManager/VPN/nm-iodine-service.name";
449−
450− "NetworkManager/VPN/nm-sstp-service.name".source =
451− "${networkmanager-sstp}/lib/NetworkManager/VPN/nm-sstp-service.name";
452−
453 }
447 }
448+ // builtins.listToAttrs (map (pkg: nameValuePair "NetworkManager/${pkg.networkManagerPlugin}" {
449+ source = "${pkg}/lib/NetworkManager/${pkg.networkManagerPlugin}";
450+ }) cfg.plugins)
454 // optionalAttrs cfg.enableFccUnlock
451 // optionalAttrs cfg.enableFccUnlock
455 {
452 {
456 "ModemManager/fcc-unlock.d".source =
453 "ModemManager/fcc-unlock.d".source =
@@ -460,18 +457,13 @@ in {
460 {
457 {
461 "NetworkManager/dispatcher.d/02overridedns".source = overrideNameserversScript;
458 "NetworkManager/dispatcher.d/02overridedns".source = overrideNameserversScript;
462 }
459 }
463− // optionalAttrs cfg.enableStrongSwan
464− {
465− "NetworkManager/VPN/nm-strongswan-service.name".source =
466− "${pkgs.networkmanager_strongswan}/lib/NetworkManager/VPN/nm-strongswan-service.name";
467− }
468 // listToAttrs (lib.imap1 (i: s:
460 // listToAttrs (lib.imap1 (i: s:
469 {
461 {
470 name = "NetworkManager/dispatcher.d/${dispatcherTypesSubdirMap.${s.type}}03userscript${lib.fixedWidthNumber 4 i}";
462 name = "NetworkManager/dispatcher.d/${dispatcherTypesSubdirMap.${s.type}}03userscript${lib.fixedWidthNumber 4 i}";
471 value = { mode = "0544"; inherit (s) source; };
463 value = { mode = "0544"; inherit (s) source; };
472 }) cfg.dispatcherScripts);
464 }) cfg.dispatcherScripts);
473
465
474− environment.systemPackages = cfg.packages;
466+ environment.systemPackages = packages;
475
467
476 users.groups = {
468 users.groups = {
477 networkmanager.gid = config.ids.gids.networkmanager;
469 networkmanager.gid = config.ids.gids.networkmanager;
@@ -490,14 +482,13 @@ in {
490 };
482 };
491 };
483 };
492
484
493− systemd.packages = cfg.packages;
485+ systemd.packages = packages;
494
486
495 systemd.tmpfiles.rules = [
487 systemd.tmpfiles.rules = [
496 "d /etc/NetworkManager/system-connections 0700 root root -"
488 "d /etc/NetworkManager/system-connections 0700 root root -"
497 "d /etc/ipsec.d 0700 root root -"
489 "d /etc/ipsec.d 0700 root root -"
498 "d /var/lib/NetworkManager-fortisslvpn 0700 root root -"
490 "d /var/lib/NetworkManager-fortisslvpn 0700 root root -"
499
491
500− "d /var/lib/dhclient 0755 root root -"
501 "d /var/lib/misc 0755 root root -" # for dnsmasq.leases
492 "d /var/lib/misc 0755 root root -" # for dnsmasq.leases
502 ];
493 ];
503
494
@@ -534,8 +525,20 @@ in {
534 useDHCP = false;
525 useDHCP = false;
535 })
526 })
536
527
528+ {
529+ networkmanager.plugins = with pkgs; [
530+ networkmanager-fortisslvpn
531+ networkmanager-iodine
532+ networkmanager-l2tp
533+ networkmanager-openconnect
534+ networkmanager-openvpn
535+ networkmanager-vpnc
536+ networkmanager-sstp
537+ ];
538+ }
539+
537 (mkIf cfg.enableStrongSwan {
540 (mkIf cfg.enableStrongSwan {
538− networkmanager.packages = [ pkgs.networkmanager_strongswan ];
541+ networkmanager.plugins = [ pkgs.networkmanager_strongswan ];
539 })
542 })
540
543
541 (mkIf enableIwd {
544 (mkIf enableIwd {
@@ -559,10 +562,10 @@ in {
559 security.polkit.enable = true;
562 security.polkit.enable = true;
560 security.polkit.extraConfig = polkitConf;
563 security.polkit.extraConfig = polkitConf;
561
564
562− services.dbus.packages = cfg.packages
565+ services.dbus.packages = packages
563 ++ optional cfg.enableStrongSwan pkgs.strongswanNM
566 ++ optional cfg.enableStrongSwan pkgs.strongswanNM
564 ++ optional (cfg.dns == "dnsmasq") pkgs.dnsmasq;
567 ++ optional (cfg.dns == "dnsmasq") pkgs.dnsmasq;
565
568
566− services.udev.packages = cfg.packages;
569+ services.udev.packages = packages;
567 };
570 };
568}
571}
nixos/modules/services/networking/openconnect.nixnew file+137
@@ -0,0 +1,137 @@
1+{ config, lib, options, pkgs, ... }:
2+with lib;
3+let
4+ cfg = config.networking.openconnect;
5+ openconnect = cfg.package;
6+ pkcs11 = types.strMatching "pkcs11:.+" // {
7+ name = "pkcs11";
8+ description = "PKCS#11 URI";
9+ };
10+ interfaceOptions = {
11+ options = {
12+ gateway = mkOption {
13+ description = "Gateway server to connect to.";
14+ example = "gateway.example.com";
15+ type = types.str;
16+ };
17+
18+ protocol = mkOption {
19+ description = "Protocol to use.";
20+ example = "anyconnect";
21+ type =
22+ types.enum [ "anyconnect" "array" "nc" "pulse" "gp" "f5" "fortinet" ];
23+ };
24+
25+ user = mkOption {
26+ description = "Username to authenticate with.";
27+ example = "example-user";
28+ type = types.nullOr types.str;
29+ };
30+
31+ # Note: It does not make sense to provide a way to declaratively
32+ # set an authentication cookie, because they have to be requested
33+ # for every new connection and would only work once.
34+ passwordFile = mkOption {
35+ description = ''
36+ File containing the password to authenticate with. This
37+ is passed to <code>openconnect</code> via the
38+ <code>--passwd-on-stdin</code> option.
39+ '';
40+ default = null;
41+ example = "/var/lib/secrets/openconnect-passwd";
42+ type = types.nullOr types.path;
43+ };
44+
45+ certificate = mkOption {
46+ description = "Certificate to authenticate with.";
47+ default = null;
48+ example = "/var/lib/secrets/openconnect_certificate.pem";
49+ type = with types; nullOr (either path pkcs11);
50+ };
51+
52+ privateKey = mkOption {
53+ description = "Private key to authenticate with.";
54+ example = "/var/lib/secrets/openconnect_private_key.pem";
55+ default = null;
56+ type = with types; nullOr (either path pkcs11);
57+ };
58+
59+ extraOptions = mkOption {
60+ description = ''
61+ Extra config to be appended to the interface config. It should
62+ contain long-format options as would be accepted on the command
63+ line by <code>openconnect</code>
64+ (see https://www.infradead.org/openconnect/manual.html).
65+ Non-key-value options like <code>deflate</code> can be used by
66+ declaring them as booleans, i. e. <code>deflate = true;</code>.
67+ '';
68+ default = { };
69+ example = {
70+ compression = "stateless";
71+
72+ no-http-keepalive = true;
73+ no-dtls = true;
74+ };
75+ type = with types; attrsOf (either str bool);
76+ };
77+ };
78+ };
79+ generateExtraConfig = extra_cfg:
80+ strings.concatStringsSep "\n" (attrsets.mapAttrsToList
81+ (name: value: if (value == true) then name else "${name}=${value}")
82+ (attrsets.filterAttrs (_: value: value != false) extra_cfg));
83+ generateConfig = name: icfg:
84+ pkgs.writeText "config" ''
85+ interface=${name}
86+ ${optionalString (icfg.user != null) "user=${icfg.user}"}
87+ ${optionalString (icfg.passwordFile != null) "passwd-on-stdin"}
88+ ${optionalString (icfg.certificate != null)
89+ "certificate=${icfg.certificate}"}
90+ ${optionalString (icfg.privateKey != null) "sslkey=${icfg.privateKey}"}
91+
92+ ${generateExtraConfig icfg.extraOptions}
93+ '';
94+ generateUnit = name: icfg: {
95+ description = "OpenConnect Interface - ${name}";
96+ requires = [ "network-online.target" ];
97+ after = [ "network.target" "network-online.target" ];
98+ wantedBy = [ "multi-user.target" ];
99+
100+ serviceConfig = {
101+ Type = "simple";
102+ ExecStart = "${openconnect}/bin/openconnect --config=${
103+ generateConfig name icfg
104+ } ${icfg.gateway}";
105+ StandardInput = "file:${icfg.passwordFile}";
106+
107+ ProtectHome = true;
108+ };
109+ };
110+in {
111+ options.networking.openconnect = {
112+ package = mkPackageOption pkgs "openconnect" { };
113+
114+ interfaces = mkOption {
115+ description = "OpenConnect interfaces.";
116+ default = { };
117+ example = {
118+ openconnect0 = {
119+ gateway = "gateway.example.com";
120+ protocol = "anyconnect";
121+ user = "example-user";
122+ passwordFile = "/var/lib/secrets/openconnect-passwd";
123+ };
124+ };
125+ type = with types; attrsOf (submodule interfaceOptions);
126+ };
127+ };
128+
129+ config = {
130+ systemd.services = mapAttrs' (name: value: {
131+ name = "openconnect-${name}";
132+ value = generateUnit name value;
133+ }) cfg.interfaces;
134+ };
135+
136+ meta.maintainers = with maintainers; [ alyaeanyx ];
137+}
nixos/modules/services/networking/openfire.nixdeleted−56
@@ -1,56 +0,0 @@
1−{ config, lib, pkgs, ... }:
2−
3−with lib;
4−
5−{
6− ###### interface
7−
8− options = {
9−
10− services.openfire = {
11−
12− enable = mkEnableOption "OpenFire XMPP server";
13−
14− usePostgreSQL = mkOption {
15− type = types.bool;
16− default = true;
17− description = "
18− Whether you use PostgreSQL service for your storage back-end.
19− ";
20− };
21−
22− };
23−
24− };
25−
26−
27− ###### implementation
28−
29− config = mkIf config.services.openfire.enable {
30−
31− assertions = singleton
32− { assertion = !(config.services.openfire.usePostgreSQL -> config.services.postgresql.enable);
33− message = "OpenFire configured to use PostgreSQL but services.postgresql.enable is not enabled.";
34− };
35−
36− systemd.services.openfire = {
37− description = "OpenFire XMPP server";
38− wantedBy = [ "multi-user.target" ];
39− after = [ "networking.target" ] ++
40− optional config.services.openfire.usePostgreSQL "postgresql.service";
41− path = with pkgs; [ jre openfire coreutils which gnugrep gawk gnused ];
42− script = ''
43− export HOME=/tmp
44− mkdir /var/log/openfire || true
45− mkdir /etc/openfire || true
46− for i in ${pkgs.openfire}/conf.inst/*; do
47− if ! test -f /etc/openfire/$(basename $i); then
48− cp $i /etc/openfire/
49− fi
50− done
51− openfire start
52− ''; # */
53− };
54− };
55−
56−}
nixos/modules/services/networking/pdns-recursor.nix+12−7
@@ -30,10 +30,10 @@ in {
30 enable = mkEnableOption "PowerDNS Recursor, a recursive DNS server";
30 enable = mkEnableOption "PowerDNS Recursor, a recursive DNS server";
31
31
32 dns.address = mkOption {
32 dns.address = mkOption {
33− type = types.str;
33+ type = oneOrMore types.str;
34− default = "0.0.0.0";
34+ default = [ "::" "0.0.0.0" ];
35 description = ''
35 description = ''
36− IP address Recursor DNS server will bind to.
36+ IP addresses Recursor DNS server will bind to.
37 '';
37 '';
38 };
38 };
39
39
@@ -47,8 +47,12 @@ in {
47
47
48 dns.allowFrom = mkOption {
48 dns.allowFrom = mkOption {
49 type = types.listOf types.str;
49 type = types.listOf types.str;
50− default = [ "10.0.0.0/8" "172.16.0.0/12" "192.168.0.0/16" ];
50+ default = [
51+ "127.0.0.0/8" "10.0.0.0/8" "100.64.0.0/10"
52+ "169.254.0.0/16" "192.168.0.0/16" "172.16.0.0/12"
53+ "::1/128" "fc00::/7" "fe80::/10"
54+ ];
51− example = [ "0.0.0.0/0" ];
55+ example = [ "0.0.0.0/0" "::/0" ];
52 description = ''
56 description = ''
53 IP address ranges of clients allowed to make DNS queries.
57 IP address ranges of clients allowed to make DNS queries.
54 '';
58 '';
@@ -72,7 +76,8 @@ in {
72
76
73 api.allowFrom = mkOption {
77 api.allowFrom = mkOption {
74 type = types.listOf types.str;
78 type = types.listOf types.str;
75− default = [ "0.0.0.0/0" ];
79+ default = [ "127.0.0.1" "::1" ];
80+ example = [ "0.0.0.0/0" "::/0" ];
76 description = ''
81 description = ''
77 IP address ranges of clients allowed to make API requests.
82 IP address ranges of clients allowed to make API requests.
78 '';
83 '';
@@ -96,7 +101,7 @@ in {
96
101
97 forwardZonesRecurse = mkOption {
102 forwardZonesRecurse = mkOption {
98 type = types.attrs;
103 type = types.attrs;
99− example = { eth = "127.0.0.1:5353"; };
104+ example = { eth = "[::1]:5353"; };
100 default = {};
105 default = {};
101 description = ''
106 description = ''
102 DNS zones to be forwarded to other recursive servers.
107 DNS zones to be forwarded to other recursive servers.
nixos/modules/services/networking/prosody.nix+1
@@ -820,6 +820,7 @@ in
820 '') cfg.muc}
820 '') cfg.muc}
821
821
822 ${ lib.optionalString (cfg.uploadHttp != null) ''
822 ${ lib.optionalString (cfg.uploadHttp != null) ''
823+ -- TODO: think about migrating this to mod-http_file_share instead.
823 Component ${toLua cfg.uploadHttp.domain} "http_upload"
824 Component ${toLua cfg.uploadHttp.domain} "http_upload"
824 http_upload_file_size_limit = ${cfg.uploadHttp.uploadFileSizeLimit}
825 http_upload_file_size_limit = ${cfg.uploadHttp.uploadFileSizeLimit}
825 http_upload_expire_after = ${cfg.uploadHttp.uploadExpireAfter}
826 http_upload_expire_after = ${cfg.uploadHttp.uploadExpireAfter}
nixos/modules/services/networking/shellhub-agent.nix+26−17
@@ -1,31 +1,37 @@
1{ config, lib, pkgs, ... }:
1{ config, lib, pkgs, ... }:
2
2
3with lib;
3with lib;
4+
4let
5let
5 cfg = config.services.shellhub-agent;
6 cfg = config.services.shellhub-agent;
6−in {
7+in
7−
8+{
8 ###### interface
9 ###### interface
9
10
10 options = {
11 options = {
11
12
12 services.shellhub-agent = {
13 services.shellhub-agent = {
13
14
15+ enable = mkEnableOption "ShellHub Agent daemon";
16+
17+ package = mkPackageOption pkgs "shellhub-agent" { };
18+
14− enable = mkOption {
19+ preferredHostname = mkOption {
15− type = types.bool;
20+ type = types.str;
16− default = false;
21+ default = "";
17 description = ''
22 description = ''
18− Whether to enable the ShellHub Agent daemon, which allows
23+ Set the device preferred hostname. This provides a hint to
19− secure remote logins.
24+ the server to use this as hostname if it is available.
20 '';
25 '';
21 };
26 };
22
27
23− package = mkOption {
28+ keepAliveInterval = mkOption {
24− type = types.package;
29+ type = types.int;
25− default = pkgs.shellhub-agent;
30+ default = 30;
26− defaultText = literalExpression "pkgs.shellhub-agent";
27 description = ''
31 description = ''
28− Which ShellHub Agent package to use.
32+ Determine the interval to send the keep alive message to
33+ the server. This has a direct impact of the bandwidth
34+ used by the device.
29 '';
35 '';
30 };
36 };
31
37
@@ -74,9 +80,13 @@ in {
74 "time-sync.target"
80 "time-sync.target"
75 ];
81 ];
76
82
77− environment.SERVER_ADDRESS = cfg.server;
83+ environment = {
78− environment.PRIVATE_KEY = cfg.privateKey;
84+ SHELLHUB_SERVER_ADDRESS = cfg.server;
79− environment.TENANT_ID = cfg.tenantId;
85+ SHELLHUB_PRIVATE_KEY = cfg.privateKey;
86+ SHELLHUB_TENANT_ID = cfg.tenantId;
87+ SHELLHUB_KEEPALIVE_INTERVAL = toString cfg.keepAliveInterval;
88+ SHELLHUB_PREFERRED_HOSTNAME = cfg.preferredHostname;
89+ };
80
90
81 serviceConfig = {
91 serviceConfig = {
82 # The service starts sessions for different users.
92 # The service starts sessions for different users.
@@ -85,7 +95,6 @@ in {
85 ExecStart = "${cfg.package}/bin/agent";
95 ExecStart = "${cfg.package}/bin/agent";
86 };
96 };
87 };
97 };
88−
89− environment.systemPackages = [ cfg.package ];
90 };
98 };
91}
99}
100+
nixos/modules/services/networking/ssh/sshd.nix+1
@@ -441,6 +441,7 @@ in
441
441
442 ${flip concatMapStrings cfg.hostKeys (k: ''
442 ${flip concatMapStrings cfg.hostKeys (k: ''
443 if ! [ -s "${k.path}" ]; then
443 if ! [ -s "${k.path}" ]; then
444+ rm -f "${k.path}"
444 ssh-keygen \
445 ssh-keygen \
445 -t "${k.type}" \
446 -t "${k.type}" \
446 ${if k ? bits then "-b ${toString k.bits}" else ""} \
447 ${if k ? bits then "-b ${toString k.bits}" else ""} \
nixos/modules/services/networking/supplicant.nix+1−1
@@ -43,7 +43,7 @@ let
43 path = [ pkgs.coreutils ];
43 path = [ pkgs.coreutils ];
44
44
45 preStart = ''
45 preStart = ''
46− ${optionalString (suppl.configFile.path!=null) ''
46+ ${optionalString (suppl.configFile.path!=null && suppl.configFile.writable) ''
47 (umask 077 && touch -a "${suppl.configFile.path}")
47 (umask 077 && touch -a "${suppl.configFile.path}")
48 ''}
48 ''}
49 ${optionalString suppl.userControlled.enable ''
49 ${optionalString suppl.userControlled.enable ''
nixos/modules/services/networking/syncplay.nix+1−1
@@ -89,7 +89,7 @@ in
89 ${lib.optionalString (cfg.passwordFile != null) ''
89 ${lib.optionalString (cfg.passwordFile != null) ''
90 export SYNCPLAY_PASSWORD=$(cat "''${CREDENTIALS_DIRECTORY}/password")
90 export SYNCPLAY_PASSWORD=$(cat "''${CREDENTIALS_DIRECTORY}/password")
91 ''}
91 ''}
92− exec ${pkgs.syncplay}/bin/syncplay-server ${escapeShellArgs cmdArgs}
92+ exec ${pkgs.syncplay-nogui}/bin/syncplay-server ${escapeShellArgs cmdArgs}
93 '';
93 '';
94 };
94 };
95 };
95 };
nixos/modules/services/networking/tailscale.nix+9−1
@@ -21,6 +21,12 @@ in {
21 description = ''The interface name for tunnel traffic. Use "userspace-networking" (beta) to not use TUN.'';
21 description = ''The interface name for tunnel traffic. Use "userspace-networking" (beta) to not use TUN.'';
22 };
22 };
23
23
24+ permitCertUid = mkOption {
25+ type = types.nullOr types.nonEmptyStr;
26+ default = null;
27+ description = "Username or user ID of the user allowed to to fetch Tailscale TLS certificates for the node.";
28+ };
29+
24 package = mkOption {
30 package = mkOption {
25 type = types.package;
31 type = types.package;
26 default = pkgs.tailscale;
32 default = pkgs.tailscale;
@@ -38,7 +44,9 @@ in {
38 serviceConfig.Environment = [
44 serviceConfig.Environment = [
39 "PORT=${toString cfg.port}"
45 "PORT=${toString cfg.port}"
40 ''"FLAGS=--tun ${lib.escapeShellArg cfg.interfaceName}"''
46 ''"FLAGS=--tun ${lib.escapeShellArg cfg.interfaceName}"''
47+ ] ++ (lib.optionals (cfg.permitCertUid != null) [
48+ "TS_PERMIT_CERT_UID=${cfg.permitCertUid}"
41− ];
49+ ]);
42 };
50 };
43 };
51 };
44}
52}
nixos/modules/services/networking/zeronet.nix+1−1
@@ -90,5 +90,5 @@ in with lib; {
90 (mkRemovedOptionModule [ "services" "zeronet" "logDir" ] "Zeronet will log by default in /var/lib/zeronet")
90 (mkRemovedOptionModule [ "services" "zeronet" "logDir" ] "Zeronet will log by default in /var/lib/zeronet")
91 ];
91 ];
92
92
93− meta.maintainers = with maintainers; [ chiiruno ];
93+ meta.maintainers = with maintainers; [ Madouura ];
94}
94}
nixos/modules/services/system/nscd.nix+17−8
@@ -7,10 +7,6 @@ let
7 nssModulesPath = config.system.nssModules.path;
7 nssModulesPath = config.system.nssModules.path;
8 cfg = config.services.nscd;
8 cfg = config.services.nscd;
9
9
10− nscd = if pkgs.stdenv.hostPlatform.libc == "glibc"
11− then pkgs.stdenv.cc.libc.bin
12− else pkgs.glibc.bin;
13−
14in
10in
15
11
16{
12{
@@ -37,6 +33,19 @@ in
37 description = "Configuration to use for Name Service Cache Daemon.";
33 description = "Configuration to use for Name Service Cache Daemon.";
38 };
34 };
39
35
36+ package = mkOption {
37+ type = types.package;
38+ default = if pkgs.stdenv.hostPlatform.libc == "glibc"
39+ then pkgs.stdenv.cc.libc.bin
40+ else pkgs.glibc.bin;
41+ defaultText = lib.literalExpression ''
42+ if pkgs.stdenv.hostPlatform.libc == "glibc"
43+ then pkgs.stdenv.cc.libc.bin
44+ else pkgs.glibc.bin;
45+ '';
46+ description = "package containing the nscd binary to be used by the service";
47+ };
48+
40 };
49 };
41
50
42 };
51 };
@@ -69,16 +78,16 @@ in
69 # files. So prefix the ExecStart command with "!" to prevent systemd
78 # files. So prefix the ExecStart command with "!" to prevent systemd
70 # from dropping privileges early. See ExecStart in systemd.service(5).
79 # from dropping privileges early. See ExecStart in systemd.service(5).
71 serviceConfig =
80 serviceConfig =
72− { ExecStart = "!@${nscd}/sbin/nscd nscd";
81+ { ExecStart = "!@${cfg.package}/bin/nscd nscd";
73 Type = "forking";
82 Type = "forking";
74 DynamicUser = true;
83 DynamicUser = true;
75 RuntimeDirectory = "nscd";
84 RuntimeDirectory = "nscd";
76 PIDFile = "/run/nscd/nscd.pid";
85 PIDFile = "/run/nscd/nscd.pid";
77 Restart = "always";
86 Restart = "always";
78 ExecReload =
87 ExecReload =
79− [ "${nscd}/sbin/nscd --invalidate passwd"
88+ [ "${cfg.package}/bin/nscd --invalidate passwd"
80− "${nscd}/sbin/nscd --invalidate group"
89+ "${cfg.package}/bin/nscd --invalidate group"
81− "${nscd}/sbin/nscd --invalidate hosts"
90+ "${cfg.package}/bin/nscd --invalidate hosts"
82 ];
91 ];
83 };
92 };
84 };
93 };
nixos/modules/services/ttys/kmscon.nix+24−5
@@ -1,6 +1,6 @@
1{ config, pkgs, lib, ... }:
1{ config, pkgs, lib, ... }:
2let
2let
3− inherit (lib) mkOption types mkIf;
3+ inherit (lib) mapAttrs mkIf mkOption optional optionals types;
4
4
5 cfg = config.services.kmscon;
5 cfg = config.services.kmscon;
6
6
@@ -28,6 +28,19 @@ in {
28 default = false;
28 default = false;
29 };
29 };
30
30
31+ fonts = mkOption {
32+ description = "Fonts used by kmscon, in order of priority.";
33+ default = null;
34+ example = lib.literalExpression ''[ { name = "Source Code Pro"; package = pkgs.source-code-pro; } ]'';
35+ type = with types;
36+ let fontType = submodule {
37+ options = {
38+ name = mkOption { type = str; description = "Font name, as used by fontconfig."; };
39+ package = mkOption { type = package; description = "Package providing the font."; };
40+ };
41+ }; in nullOr (nonEmptyListOf fontType);
42+ };
43+
31 extraConfig = mkOption {
44 extraConfig = mkOption {
32 description = "Extra contents of the kmscon.conf file.";
45 description = "Extra contents of the kmscon.conf file.";
33 type = types.lines;
46 type = types.lines;
@@ -87,11 +100,17 @@ in {
87
100
88 systemd.services.systemd-vconsole-setup.enable = false;
101 systemd.services.systemd-vconsole-setup.enable = false;
89
102
90− services.kmscon.extraConfig = mkIf cfg.hwRender ''
103+ services.kmscon.extraConfig =
91− drm
104+ let
92− hwaccel
105+ render = optionals cfg.hwRender [ "drm" "hwaccel" ];
93− '';
106+ fonts = optional (cfg.fonts != null) "font-name=${lib.concatMapStringsSep ", " (f: f.name) cfg.fonts}";
107+ in lib.concatStringsSep "\n" (render ++ fonts);
94
108
95 hardware.opengl.enable = mkIf cfg.hwRender true;
109 hardware.opengl.enable = mkIf cfg.hwRender true;
110+
111+ fonts = mkIf (cfg.fonts != null) {
112+ fontconfig.enable = true;
113+ fonts = map (f: f.package) cfg.fonts;
114+ };
96 };
115 };
97}
116}
nixos/modules/services/web-apps/atlassian/jira.nix+1
@@ -151,6 +151,7 @@ in
151 users.users.${cfg.user} = {
151 users.users.${cfg.user} = {
152 isSystemUser = true;
152 isSystemUser = true;
153 group = cfg.group;
153 group = cfg.group;
154+ home = cfg.home;
154 };
155 };
155
156
156 users.groups.${cfg.group} = {};
157 users.groups.${cfg.group} = {};
nixos/modules/services/web-apps/discourse.nix+9−3
@@ -609,6 +609,7 @@ in
609 connection_reaper_interval = 30;
609 connection_reaper_interval = 30;
610 relative_url_root = null;
610 relative_url_root = null;
611 message_bus_max_backlog_size = 100;
611 message_bus_max_backlog_size = 100;
612+ message_bus_clear_every = 50;
612 secret_key_base = cfg.secretKeyBaseFile;
613 secret_key_base = cfg.secretKeyBaseFile;
613 fallback_assets_path = null;
614 fallback_assets_path = null;
614
615
@@ -655,7 +656,12 @@ in
655 long_polling_interval = null;
656 long_polling_interval = null;
656 };
657 };
657
658
659+ services.redis.servers.discourse =
658− services.redis.enable = lib.mkDefault (cfg.redis.host == "localhost");
660+ lib.mkIf (lib.elem cfg.redis.host [ "localhost" "127.0.0.1" ]) {
661+ enable = true;
662+ bind = cfg.redis.host;
663+ port = cfg.backendSettings.redis_port;
664+ };
659
665
660 services.postgresql = lib.mkIf databaseActuallyCreateLocally {
666 services.postgresql = lib.mkIf databaseActuallyCreateLocally {
661 enable = true;
667 enable = true;
@@ -696,12 +702,12 @@ in
696 systemd.services.discourse = {
702 systemd.services.discourse = {
697 wantedBy = [ "multi-user.target" ];
703 wantedBy = [ "multi-user.target" ];
698 after = [
704 after = [
699− "redis.service"
705+ "redis-discourse.service"
700 "postgresql.service"
706 "postgresql.service"
701 "discourse-postgresql.service"
707 "discourse-postgresql.service"
702 ];
708 ];
703 bindsTo = [
709 bindsTo = [
704− "redis.service"
710+ "redis-discourse.service"
705 ] ++ lib.optionals (cfg.database.host == null) [
711 ] ++ lib.optionals (cfg.database.host == null) [
706 "postgresql.service"
712 "postgresql.service"
707 "discourse-postgresql.service"
713 "discourse-postgresql.service"
nixos/modules/services/web-apps/galene.nix+29
@@ -164,6 +164,35 @@ in
164 optional (cfg.dataDir == defaultdataDir) "galene/data" ++
164 optional (cfg.dataDir == defaultdataDir) "galene/data" ++
165 optional (cfg.groupsDir == defaultgroupsDir) "galene/groups" ++
165 optional (cfg.groupsDir == defaultgroupsDir) "galene/groups" ++
166 optional (cfg.recordingsDir == defaultrecordingsDir) "galene/recordings";
166 optional (cfg.recordingsDir == defaultrecordingsDir) "galene/recordings";
167+
168+ # Hardening
169+ CapabilityBoundingSet = [ "" ];
170+ DeviceAllow = [ "" ];
171+ LockPersonality = true;
172+ MemoryDenyWriteExecute = true;
173+ NoNewPrivileges = true;
174+ PrivateDevices = true;
175+ PrivateTmp = true;
176+ PrivateUsers = true;
177+ ProcSubset = "pid";
178+ ProtectClock = true;
179+ ProtectControlGroups = true;
180+ ProtectHome = true;
181+ ProtectHostname = true;
182+ ProtectKernelLogs = true;
183+ ProtectKernelModules = true;
184+ ProtectKernelTunables = true;
185+ ProtectProc = "invisible";
186+ ProtectSystem = "strict";
187+ ReadWritePaths = cfg.recordingsDir;
188+ RemoveIPC = true;
189+ RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
190+ RestrictNamespaces = true;
191+ RestrictRealtime = true;
192+ RestrictSUIDSGID = true;
193+ SystemCallArchitectures = "native";
194+ SystemCallFilter = [ "@system-service" "~@privileged" "~@resources" ];
195+ UMask = "0077";
167 }
196 }
168 ];
197 ];
169 };
198 };
nixos/modules/services/web-apps/keycloak.nix+360−514
@@ -4,20 +4,94 @@ let
4 cfg = config.services.keycloak;
4 cfg = config.services.keycloak;
5 opt = options.services.keycloak;
5 opt = options.services.keycloak;
6
6
7+ inherit (lib)
8+ types
9+ mkMerge
10+ mkOption
11+ mkChangedOptionModule
12+ mkRenamedOptionModule
13+ mkRemovedOptionModule
7− inherit (lib) types mkOption concatStringsSep mapAttrsToList
14+ concatStringsSep
8− escapeShellArg recursiveUpdate optionalAttrs boolToString mkOrder
15+ mapAttrsToList
9− sort filterAttrs concatMapStringsSep concatStrings mkIf
16+ escapeShellArg
17+ mkIf
18+ optionalString
19+ optionals
20+ mkDefault
10− optionalString optionals mkDefault literalExpression hasSuffix
21+ literalExpression
22+ isAttrs
11− foldl' isAttrs filter attrNames elem literalDocBook
23+ literalDocBook
12− maintainers;
24+ maintainers
13−
25+ catAttrs
26+ collect
27+ splitString
28+ ;
29+
14− inherit (builtins) match typeOf;
30+ inherit (builtins)
31+ elem
32+ typeOf
33+ isInt
34+ isString
35+ hashString
36+ isPath
37+ ;
38+
39+ prefixUnlessEmpty = prefix: string: optionalString (string != "") "${prefix}${string}";
15in
40in
16{
41{
42+ imports =
43+ [
44+ (mkRenamedOptionModule
45+ [ "services" "keycloak" "bindAddress" ]
46+ [ "services" "keycloak" "settings" "http-host" ])
47+ (mkRenamedOptionModule
48+ [ "services" "keycloak" "forceBackendUrlToFrontendUrl"]
49+ [ "services" "keycloak" "settings" "hostname-strict-backchannel"])
50+ (mkChangedOptionModule
51+ [ "services" "keycloak" "httpPort" ]
52+ [ "services" "keycloak" "settings" "http-port" ]
53+ (config:
54+ builtins.fromJSON config.services.keycloak.httpPort))
55+ (mkChangedOptionModule
56+ [ "services" "keycloak" "httpsPort" ]
57+ [ "services" "keycloak" "settings" "https-port" ]
58+ (config:
59+ builtins.fromJSON config.services.keycloak.httpsPort))
60+ (mkRemovedOptionModule
61+ [ "services" "keycloak" "frontendUrl" ]
62+ ''
63+ Set `services.keycloak.settings.hostname' and `services.keycloak.settings.http-relative-path' instead.
64+ NOTE: You likely want to set 'http-relative-path' to '/auth' to keep compatibility with your clients.
65+ See its description for more information.
66+ '')
67+ (mkRemovedOptionModule
68+ [ "services" "keycloak" "extraConfig" ]
69+ "Use `services.keycloak.settings' instead.")
70+ ];
71+
17 options.services.keycloak =
72 options.services.keycloak =
18 let
73 let
19− inherit (types) bool str nullOr attrsOf path enum anything
74+ inherit (types)
75+ bool
76+ str
77+ int
78+ nullOr
79+ attrsOf
80+ oneOf
81+ path
82+ enum
20− package port;
83+ package
84+ port;
85+
86+ assertStringPath = optionName: value:
87+ if isPath value then
88+ throw ''
89+ services.keycloak.${optionName}:
90+ ${toString value}
91+ is a Nix path, but should be a string, since Nix
92+ paths are copied into the world-readable Nix store.
93+ ''
94+ else value;
21 in
95 in
22 {
96 {
23 enable = mkOption {
97 enable = mkOption {
@@ -30,89 +104,14 @@ in
30 '';
104 '';
31 };
105 };
32
106
33− bindAddress = mkOption {
34− type = str;
35− default = "\${jboss.bind.address:0.0.0.0}";
36− example = "127.0.0.1";
37− description = ''
38− On which address Keycloak should accept new connections.
39−
40− A special syntax can be used to allow command line Java system
41− properties to override the value: ''${property.name:value}
42− '';
43− };
44−
45− httpPort = mkOption {
46− type = str;
47− default = "\${jboss.http.port:80}";
48− example = "8080";
49− description = ''
50− On which port Keycloak should listen for new HTTP connections.
51−
52− A special syntax can be used to allow command line Java system
53− properties to override the value: ''${property.name:value}
54− '';
55− };
56−
57− httpsPort = mkOption {
58− type = str;
59− default = "\${jboss.https.port:443}";
60− example = "8443";
61− description = ''
62− On which port Keycloak should listen for new HTTPS connections.
63−
64− A special syntax can be used to allow command line Java system
65− properties to override the value: ''${property.name:value}
66− '';
67− };
68−
69− frontendUrl = mkOption {
70− type = str;
71− apply = x:
72− if x == "" || hasSuffix "/" x then
73− x
74− else
75− x + "/";
76− example = "keycloak.example.com/auth";
77− description = ''
78− The public URL used as base for all frontend requests. Should
79− normally include a trailing <literal>/auth</literal>.
80−
81− See <link xlink:href="https://www.keycloak.org/docs/latest/server_installation/#_hostname">the
82− Hostname section of the Keycloak server installation
83− manual</link> for more information.
84− '';
85− };
86−
87− forceBackendUrlToFrontendUrl = mkOption {
88− type = bool;
89− default = false;
90− example = true;
91− description = ''
92− Whether Keycloak should force all requests to go through the
93− frontend URL configured in <xref
94− linkend="opt-services.keycloak.frontendUrl" />. By default,
95− Keycloak allows backend requests to instead use its local
96− hostname or IP address and may also advertise it to clients
97− through its OpenID Connect Discovery endpoint.
98−
99− See <link
100− xlink:href="https://www.keycloak.org/docs/latest/server_installation/#_hostname">the
101− Hostname section of the Keycloak server installation
102− manual</link> for more information.
103− '';
104− };
105−
106 sslCertificate = mkOption {
107 sslCertificate = mkOption {
107 type = nullOr path;
108 type = nullOr path;
108 default = null;
109 default = null;
109 example = "/run/keys/ssl_cert";
110 example = "/run/keys/ssl_cert";
111+ apply = assertStringPath "sslCertificate";
110 description = ''
112 description = ''
111 The path to a PEM formatted certificate to use for TLS/SSL
113 The path to a PEM formatted certificate to use for TLS/SSL
112 connections.
114 connections.
113−
114− This should be a string, not a Nix path, since Nix paths are
115− copied into the world-readable Nix store.
116 '';
115 '';
117 };
116 };
118
117
@@ -120,28 +119,28 @@ in
120 type = nullOr path;
119 type = nullOr path;
121 default = null;
120 default = null;
122 example = "/run/keys/ssl_key";
121 example = "/run/keys/ssl_key";
122+ apply = assertStringPath "sslCertificateKey";
123 description = ''
123 description = ''
124 The path to a PEM formatted private key to use for TLS/SSL
124 The path to a PEM formatted private key to use for TLS/SSL
125 connections.
125 connections.
126−
127− This should be a string, not a Nix path, since Nix paths are
128− copied into the world-readable Nix store.
129 '';
126 '';
130 };
127 };
131
128
132 plugins = lib.mkOption {
129 plugins = lib.mkOption {
133 type = lib.types.listOf lib.types.path;
130 type = lib.types.listOf lib.types.path;
134− default = [];
131+ default = [ ];
135 description = ''
132 description = ''
136− Keycloak plugin jar, ear files or derivations with them
133+ Keycloak plugin jar, ear files or derivations containing
134+ them. Packaged plugins are available through
135+ <literal>pkgs.keycloak.plugins</literal>.
137 '';
136 '';
138 };
137 };
139
138
140 database = {
139 database = {
141 type = mkOption {
140 type = mkOption {
142− type = enum [ "mysql" "postgresql" ];
141+ type = enum [ "mysql" "mariadb" "postgresql" ];
143 default = "postgresql";
142 default = "postgresql";
144− example = "mysql";
143+ example = "mariadb";
145 description = ''
144 description = ''
146 The type of database Keycloak should connect to.
145 The type of database Keycloak should connect to.
147 '';
146 '';
@@ -159,6 +158,7 @@ in
159 let
158 let
160 dbPorts = {
159 dbPorts = {
161 postgresql = 5432;
160 postgresql = 5432;
161+ mariadb = 3306;
162 mysql = 3306;
162 mysql = 3306;
163 };
163 };
164 in
164 in
@@ -207,6 +207,21 @@ in
207 '';
207 '';
208 };
208 };
209
209
210+ name = mkOption {
211+ type = str;
212+ default = "keycloak";
213+ description = ''
214+ Database name to use when connecting to an external or
215+ manually provisioned database; has no effect when a local
216+ database is automatically provisioned.
217+
218+ To use this with a local database, set <xref
219+ linkend="opt-services.keycloak.database.createLocally" /> to
220+ <literal>false</literal> and create the database and user
221+ manually.
222+ '';
223+ };
224+
210 username = mkOption {
225 username = mkOption {
211 type = str;
226 type = str;
212 default = "keycloak";
227 default = "keycloak";
@@ -218,19 +233,16 @@ in
218 To use this with a local database, set <xref
233 To use this with a local database, set <xref
219 linkend="opt-services.keycloak.database.createLocally" /> to
234 linkend="opt-services.keycloak.database.createLocally" /> to
220 <literal>false</literal> and create the database and user
235 <literal>false</literal> and create the database and user
221− manually. The database should be called
236+ manually.
222− <literal>keycloak</literal>.
223 '';
237 '';
224 };
238 };
225
239
226 passwordFile = mkOption {
240 passwordFile = mkOption {
227 type = path;
241 type = path;
228 example = "/run/keys/db_password";
242 example = "/run/keys/db_password";
243+ apply = assertStringPath "passwordFile";
229 description = ''
244 description = ''
230− File containing the database password.
245+ The path to a file containing the database password.
231−
232− This should be a string, not a Nix path, since Nix paths are
233− copied into the world-readable Nix store.
234 '';
246 '';
235 };
247 };
236 };
248 };
@@ -268,67 +280,181 @@ in
268 '';
280 '';
269 };
281 };
270
282
271− extraConfig = mkOption {
283+ settings = mkOption {
272− type = attrsOf anything;
284+ type = lib.types.submodule {
285+ freeformType = attrsOf (nullOr (oneOf [ str int bool (attrsOf path) ]));
286+
287+ options = {
288+ http-host = mkOption {
289+ type = str;
273− default = { };
290+ default = "0.0.0.0";
291+ example = "127.0.0.1";
292+ description = ''
293+ On which address Keycloak should accept new connections.
294+ '';
295+ };
296+
297+ http-port = mkOption {
298+ type = port;
299+ default = 80;
300+ example = 8080;
301+ description = ''
302+ On which port Keycloak should listen for new HTTP connections.
303+ '';
304+ };
305+
306+ https-port = mkOption {
307+ type = port;
308+ default = 443;
309+ example = 8443;
310+ description = ''
311+ On which port Keycloak should listen for new HTTPS connections.
312+ '';
313+ };
314+
315+ http-relative-path = mkOption {
316+ type = str;
317+ default = "";
318+ example = "/auth";
319+ description = ''
320+ The path relative to <literal>/</literal> for serving
321+ resources.
322+
323+ <note>
324+ <para>
325+ In versions of Keycloak using Wildfly (&lt;17),
326+ this defaulted to <literal>/auth</literal>. If
327+ upgrading from the Wildfly version of Keycloak,
328+ i.e. a NixOS version before 22.05, you'll likely
329+ want to set this to <literal>/auth</literal> to
330+ keep compatibility with your clients.
331+
332+ See <link
333+ xlink:href="https://www.keycloak.org/migration/migrating-to-quarkus"
334+ /> for more information on migrating from Wildfly
335+ to Quarkus.
336+ </para>
337+ </note>
338+ '';
339+ };
340+
341+ hostname = mkOption {
342+ type = str;
343+ example = "keycloak.example.com";
344+ description = ''
345+ The hostname part of the public URL used as base for
346+ all frontend requests.
347+
348+ See <link xlink:href="https://www.keycloak.org/server/hostname" />
349+ for more information about hostname configuration.
350+ '';
351+ };
352+
353+ hostname-strict-backchannel = mkOption {
354+ type = bool;
355+ default = false;
356+ example = true;
357+ description = ''
358+ Whether Keycloak should force all requests to go
359+ through the frontend URL. By default, Keycloak allows
360+ backend requests to instead use its local hostname or
361+ IP address and may also advertise it to clients
362+ through its OpenID Connect Discovery endpoint.
363+
364+ See <link xlink:href="https://www.keycloak.org/server/hostname" />
365+ for more information about hostname configuration.
366+ '';
367+ };
368+
369+ proxy = mkOption {
370+ type = enum [ "edge" "reencrypt" "passthrough" "none" ];
371+ default = "none";
372+ example = "edge";
373+ description = ''
374+ The proxy address forwarding mode if the server is
375+ behind a reverse proxy.
376+
377+ <variablelist>
378+ <varlistentry>
379+ <term>edge</term>
380+ <listitem>
381+ <para>
382+ Enables communication through HTTP between the
383+ proxy and Keycloak.
384+ </para>
385+ </listitem>
386+ </varlistentry>
387+ <varlistentry>
388+ <term>reencrypt</term>
389+ <listitem>
390+ <para>
391+ Requires communication through HTTPS between the
392+ proxy and Keycloak.
393+ </para>
394+ </listitem>
395+ </varlistentry>
396+ <varlistentry>
397+ <term>passthrough</term>
398+ <listitem>
399+ <para>
400+ Enables communication through HTTP or HTTPS between
401+ the proxy and Keycloak.
402+ </para>
403+ </listitem>
404+ </varlistentry>
405+ </variablelist>
406+
407+ See <link
408+ xlink:href="https://www.keycloak.org/server/reverseproxy"
409+ /> for more information.
410+ '';
411+ };
412+ };
413+ };
414+
274 example = literalExpression ''
415 example = literalExpression ''
275 {
416 {
276− "subsystem=keycloak-server" = {
277− "spi=hostname" = {
278− "provider=default" = null;
279− "provider=fixed" = {
280− enabled = true;
281− properties.hostname = "keycloak.example.com";
417+ hostname = "keycloak.example.com";
282− };
418+ proxy = "reencrypt";
283− default-provider = "fixed";
419+ https-key-store-file = "/path/to/file";
284− };
420+ https-key-store-password = { _secret = "/run/keys/store_password"; };
285− };
286 }
421 }
287 '';
422 '';
423+
288 description = ''
424 description = ''
289− Additional Keycloak configuration options to set in
425+ Configuration options corresponding to parameters set in
290− <literal>standalone.xml</literal>.
426+ <filename>conf/keycloak.conf</filename>.
291−
427+
292− Options are expressed as a Nix attribute set which matches the
428+ Most available options are documented at <link
293− structure of the jboss-cli configuration. The configuration is
294− effectively overlayed on top of the default configuration
295− shipped with Keycloak. To remove existing nodes and undefine
296− attributes from the default configuration, set them to
297− <literal>null</literal>.
298−
299− The example configuration does the equivalent of the following
300− script, which removes the hostname provider
301− <literal>default</literal>, adds the deprecated hostname
302− provider <literal>fixed</literal> and defines it the default:
303−
304− <programlisting>
305− /subsystem=keycloak-server/spi=hostname/provider=default:remove()
306− /subsystem=keycloak-server/spi=hostname/provider=fixed:add(enabled = true, properties = { hostname = "keycloak.example.com" })
307− /subsystem=keycloak-server/spi=hostname:write-attribute(name=default-provider, value="fixed")
308− </programlisting>
309−
310− You can discover available options by using the <link
311− xlink:href="http://docs.wildfly.org/21/Admin_Guide.html#Command_Line_Interface">jboss-cli.sh</link>
312− program and by referring to the <link
313− xlink:href="https://www.keycloak.org/docs/latest/server_installation/index.html">Keycloak
429+ xlink:href="https://www.keycloak.org/server/all-config" />.
314− Server Installation and Configuration Guide</link>.
430+
431+ Options containing secret data should be set to an attribute
432+ set containing the attribute <literal>_secret</literal> - a
433+ string pointing to a file containing the value the option
434+ should be set to. See the example to get a better picture of
435+ this: in the resulting
436+ <filename>conf/keycloak.conf</filename> file, the
437+ <literal>https-key-store-password</literal> key will be set
438+ to the contents of the
439+ <filename>/run/keys/store_password</filename> file.
315 '';
440 '';
316 };
441 };
317−
318 };
442 };
319
443
320 config =
444 config =
321 let
445 let
322− # We only want to create a database if we're actually going to connect to it.
446+ # We only want to create a database if we're actually going to
447+ # connect to it.
323 databaseActuallyCreateLocally = cfg.database.createLocally && cfg.database.host == "localhost";
448 databaseActuallyCreateLocally = cfg.database.createLocally && cfg.database.host == "localhost";
324 createLocalPostgreSQL = databaseActuallyCreateLocally && cfg.database.type == "postgresql";
449 createLocalPostgreSQL = databaseActuallyCreateLocally && cfg.database.type == "postgresql";
325− createLocalMySQL = databaseActuallyCreateLocally && cfg.database.type == "mysql";
450+ createLocalMySQL = databaseActuallyCreateLocally && elem cfg.database.type [ "mysql" "mariadb" ];
326
451
327 mySqlCaKeystore = pkgs.runCommand "mysql-ca-keystore" { } ''
452 mySqlCaKeystore = pkgs.runCommand "mysql-ca-keystore" { } ''
328 ${pkgs.jre}/bin/keytool -importcert -trustcacerts -alias MySQLCACert -file ${cfg.database.caCert} -keystore $out -storepass notsosecretpassword -noprompt
453 ${pkgs.jre}/bin/keytool -importcert -trustcacerts -alias MySQLCACert -file ${cfg.database.caCert} -keystore $out -storepass notsosecretpassword -noprompt
329 '';
454 '';
330
455
331− # Both theme and theme type directories need to be actual directories in one hierarchy to pass Keycloak checks.
456+ # Both theme and theme type directories need to be actual
457+ # directories in one hierarchy to pass Keycloak checks.
332 themesBundle = pkgs.runCommand "keycloak-themes" { } ''
458 themesBundle = pkgs.runCommand "keycloak-themes" { } ''
333 linkTheme() {
459 linkTheme() {
334 theme="$1"
460 theme="$1"
@@ -347,7 +473,7 @@ in
347 }
473 }
348
474
349 mkdir -p "$out"
475 mkdir -p "$out"
350− for theme in ${cfg.package}/themes/*; do
476+ for theme in ${keycloakBuild}/themes/*; do
351 if [ -d "$theme" ]; then
477 if [ -d "$theme" ]; then
352 linkTheme "$theme" "$(basename "$theme")"
478 linkTheme "$theme" "$(basename "$theme")"
353 fi
479 fi
@@ -356,329 +482,25 @@ in
356 ${concatStringsSep "\n" (mapAttrsToList (name: theme: "linkTheme ${theme} ${escapeShellArg name}") cfg.themes)}
482 ${concatStringsSep "\n" (mapAttrsToList (name: theme: "linkTheme ${theme} ${escapeShellArg name}") cfg.themes)}
357 '';
483 '';
358
484
359− keycloakConfig' = foldl' recursiveUpdate
485+ keycloakConfig = lib.generators.toKeyValue {
360− {
486+ mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" {
361− "interface=public".inet-address = cfg.bindAddress;
487+ mkValueString = v: with builtins;
362− "socket-binding-group=standard-sockets"."socket-binding=http".port = cfg.httpPort;
488+ if isInt v then toString v
363− "subsystem=keycloak-server" = {
489+ else if isString v then v
364− "spi=hostname"."provider=default" = {
490+ else if true == v then "true"
365− enabled = true;
491+ else if false == v then "false"
366− properties = {
492+ else if isSecret v then hashString "sha256" v._secret
367− inherit (cfg) frontendUrl forceBackendUrlToFrontendUrl;
493+ else throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty {}) v}";
368− };
494+ };
369− };
370− "theme=defaults".dir = toString themesBundle;
371− };
372− "subsystem=datasources"."data-source=KeycloakDS" = {
373− max-pool-size = "20";
374− user-name = if databaseActuallyCreateLocally then "keycloak" else cfg.database.username;
375− password = "@db-password@";
376− };
377− } [
378− (optionalAttrs (cfg.database.type == "postgresql") {
379− "subsystem=datasources" = {
380− "jdbc-driver=postgresql" = {
381− driver-module-name = "org.postgresql";
382− driver-name = "postgresql";
383− driver-xa-datasource-class-name = "org.postgresql.xa.PGXADataSource";
384− };
385− "data-source=KeycloakDS" = {
386− connection-url = "jdbc:postgresql://${cfg.database.host}:${toString cfg.database.port}/keycloak";
387− driver-name = "postgresql";
388− "connection-properties=ssl".value = boolToString cfg.database.useSSL;
389− } // (optionalAttrs (cfg.database.caCert != null) {
390− "connection-properties=sslrootcert".value = cfg.database.caCert;
391− "connection-properties=sslmode".value = "verify-ca";
392− });
393− };
394− })
395− (optionalAttrs (cfg.database.type == "mysql") {
396− "subsystem=datasources" = {
397− "jdbc-driver=mysql" = {
398− driver-module-name = "com.mysql";
399− driver-name = "mysql";
400− driver-class-name = "com.mysql.jdbc.Driver";
401− };
402− "data-source=KeycloakDS" = {
403− connection-url = "jdbc:mysql://${cfg.database.host}:${toString cfg.database.port}/keycloak";
404− driver-name = "mysql";
405− "connection-properties=useSSL".value = boolToString cfg.database.useSSL;
406− "connection-properties=requireSSL".value = boolToString cfg.database.useSSL;
407− "connection-properties=verifyServerCertificate".value = boolToString cfg.database.useSSL;
408− "connection-properties=characterEncoding".value = "UTF-8";
409− valid-connection-checker-class-name = "org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker";
410− validate-on-match = true;
411− exception-sorter-class-name = "org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter";
412− } // (optionalAttrs (cfg.database.caCert != null) {
413− "connection-properties=trustCertificateKeyStoreUrl".value = "file:${mySqlCaKeystore}";
414− "connection-properties=trustCertificateKeyStorePassword".value = "notsosecretpassword";
415− });
416− };
417− })
418− (optionalAttrs (cfg.sslCertificate != null && cfg.sslCertificateKey != null) {
419− "socket-binding-group=standard-sockets"."socket-binding=https".port = cfg.httpsPort;
420− "subsystem=elytron" = mkOrder 900 {
421− "key-store=httpsKS" = mkOrder 900 {
422− path = "/run/keycloak/ssl/certificate_private_key_bundle.p12";
423− credential-reference.clear-text = "notsosecretpassword";
424− type = "JKS";
425− };
426− "key-manager=httpsKM" = mkOrder 901 {
427− key-store = "httpsKS";
428− credential-reference.clear-text = "notsosecretpassword";
429− };
430− "server-ssl-context=httpsSSC" = mkOrder 902 {
431− key-manager = "httpsKM";
432− };
433− };
434− "subsystem=undertow" = mkOrder 901 {
435− "server=default-server"."https-listener=https".ssl-context = "httpsSSC";
436− };
437− })
438− cfg.extraConfig
439− ];
440−
441−
442− /* Produces a JBoss CLI script that creates paths and sets
443− attributes matching those described by `attrs`. When the
444− script is run, the existing settings are effectively overlayed
445− by those from `attrs`. Existing attributes can be unset by
446− defining them `null`.
447−
448− JBoss paths and attributes / maps are distinguished by their
449− name, where paths follow a `key=value` scheme.
450−
451− Example:
452− mkJbossScript {
453− "subsystem=keycloak-server"."spi=hostname" = {
454− "provider=fixed" = null;
455− "provider=default" = {
456− enabled = true;
457− properties = {
458− inherit frontendUrl;
459− forceBackendUrlToFrontendUrl = false;
460− };
461− };
462− };
463− }
464− => ''
465− if (outcome != success) of /:read-resource()
466− /:add()
467− end-if
468− if (outcome != success) of /subsystem=keycloak-server:read-resource()
469− /subsystem=keycloak-server:add()
470− end-if
471− if (outcome != success) of /subsystem=keycloak-server/spi=hostname:read-resource()
472− /subsystem=keycloak-server/spi=hostname:add()
473− end-if
474− if (outcome != success) of /subsystem=keycloak-server/spi=hostname/provider=default:read-resource()
475− /subsystem=keycloak-server/spi=hostname/provider=default:add(enabled = true, properties = { forceBackendUrlToFrontendUrl = false, frontendUrl = "https://keycloak.example.com/auth" })
476− end-if
477− if (result != true) of /subsystem=keycloak-server/spi=hostname/provider=default:read-attribute(name="enabled")
478− /subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=enabled, value=true)
479− end-if
480− if (result != false) of /subsystem=keycloak-server/spi=hostname/provider=default:read-attribute(name="properties.forceBackendUrlToFrontendUrl")
481− /subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=properties.forceBackendUrlToFrontendUrl, value=false)
482− end-if
483− if (result != "https://keycloak.example.com/auth") of /subsystem=keycloak-server/spi=hostname/provider=default:read-attribute(name="properties.frontendUrl")
484− /subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=properties.frontendUrl, value="https://keycloak.example.com/auth")
485− end-if
486− if (outcome != success) of /subsystem=keycloak-server/spi=hostname/provider=fixed:read-resource()
487− /subsystem=keycloak-server/spi=hostname/provider=fixed:remove()
488− end-if
489− ''
490− */
491− mkJbossScript = attrs:
492− let
493− /* From a JBoss path and an attrset, produces a JBoss CLI
494− snippet that writes the corresponding attributes starting
495− at `path`. Recurses down into subattrsets as necessary,
496− producing the variable name from its full path in the
497− attrset.
498−
499− Example:
500− writeAttributes "/subsystem=keycloak-server/spi=hostname/provider=default" {
501− enabled = true;
502− properties = {
503− forceBackendUrlToFrontendUrl = false;
504− frontendUrl = "https://keycloak.example.com/auth";
505− };
506− }
507− => ''
508− if (result != true) of /subsystem=keycloak-server/spi=hostname/provider=default:read-attribute(name="enabled")
509− /subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=enabled, value=true)
510− end-if
511− if (result != false) of /subsystem=keycloak-server/spi=hostname/provider=default:read-attribute(name="properties.forceBackendUrlToFrontendUrl")
512− /subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=properties.forceBackendUrlToFrontendUrl, value=false)
513− end-if
514− if (result != "https://keycloak.example.com/auth") of /subsystem=keycloak-server/spi=hostname/provider=default:read-attribute(name="properties.frontendUrl")
515− /subsystem=keycloak-server/spi=hostname/provider=default:write-attribute(name=properties.frontendUrl, value="https://keycloak.example.com/auth")
516− end-if
517− ''
518− */
519− writeAttributes = path: set:
520− let
521− # JBoss expressions like `${var}` need to be prefixed
522− # with `expression` to evaluate.
523− prefixExpression = string:
524− let
525− matchResult = match ''"\$\{.*}"'' string;
526− in
527− if matchResult != null then
528− "expression " + string
529− else
530− string;
531−
532− writeAttribute = attribute: value:
533− let
534− type = typeOf value;
535− in
536− if type == "set" then
537− let
538− names = attrNames value;
539− in
540− foldl' (text: name: text + (writeAttribute "${attribute}.${name}" value.${name})) "" names
541− else if value == null then ''
542− if (outcome == success) of ${path}:read-attribute(name="${attribute}")
543− ${path}:undefine-attribute(name="${attribute}")
544− end-if
545− ''
546− else if elem type [ "string" "path" "bool" ] then
547− let
548− value' = if type == "bool" then boolToString value else ''"${value}"'';
549− in
550− ''
551− if (result != ${prefixExpression value'}) of ${path}:read-attribute(name="${attribute}")
552− ${path}:write-attribute(name=${attribute}, value=${value'})
553− end-if
554− ''
555− else throw "Unsupported type '${type}' for path '${path}'!";
556− in
557− concatStrings
558− (mapAttrsToList
559− (attribute: value: (writeAttribute attribute value))
560− set);
561−
562−
563− /* Produces an argument list for the JBoss `add()` function,
564− which adds a JBoss path and takes as its arguments the
565− required subpaths and attributes.
566−
567− Example:
568− makeArgList {
569− enabled = true;
570− properties = {
571− forceBackendUrlToFrontendUrl = false;
572− frontendUrl = "https://keycloak.example.com/auth";
573− };
574− }
575− => ''
576− enabled = true, properties = { forceBackendUrlToFrontendUrl = false, frontendUrl = "https://keycloak.example.com/auth" }
577− ''
578− */
579− makeArgList = set:
580− let
581− makeArg = attribute: value:
582− let
583− type = typeOf value;
584− in
585− if type == "set" then
586− "${attribute} = { " + (makeArgList value) + " }"
587− else if elem type [ "string" "path" "bool" ] then
588− "${attribute} = ${if type == "bool" then boolToString value else ''"${value}"''}"
589− else if value == null then
590− ""
591− else
592− throw "Unsupported type '${type}' for attribute '${attribute}'!";
593−
594− in
595− concatStringsSep ", " (mapAttrsToList makeArg set);
596−
597−
598− /* Recurses into the `nodeValue` attrset. Only subattrsets that
599− are JBoss paths, i.e. follows the `key=value` format, are recursed
600− into - the rest are considered JBoss attributes / maps.
601− */
602− recurse = nodePath: nodeValue:
603− let
604− nodeContent =
605− if isAttrs nodeValue && nodeValue._type or "" == "order" then
606− nodeValue.content
607− else
608− nodeValue;
609− isPath = name:
610− let
611− value = nodeContent.${name};
612− in
613− if (match ".*([=]).*" name) == [ "=" ] then
614− if isAttrs value || value == null then
615− true
616− else
617− throw "Parsing path '${concatStringsSep "." (nodePath ++ [ name ])}' failed: JBoss attributes cannot contain '='!"
618− else
619− false;
620− jbossPath = "/" + concatStringsSep "/" nodePath;
621− children = if !isAttrs nodeContent then { } else nodeContent;
622− subPaths = filter isPath (attrNames children);
623− getPriority = name:
624− let
625− value = children.${name};
626− in
627− if value._type or "" == "order" then value.priority else 1000;
628− orderedSubPaths = sort (a: b: getPriority a < getPriority b) subPaths;
629− jbossAttrs = filterAttrs (name: _: !(isPath name)) children;
630− text =
631− if nodeContent != null then
632− ''
633− if (outcome != success) of ${jbossPath}:read-resource()
634− ${jbossPath}:add(${makeArgList jbossAttrs})
635− end-if
636− '' + writeAttributes jbossPath jbossAttrs
637− else
638− ''
639− if (outcome == success) of ${jbossPath}:read-resource()
640− ${jbossPath}:remove()
641− end-if
642− '';
643− in
644− text + concatMapStringsSep "\n" (name: recurse (nodePath ++ [ name ]) children.${name}) orderedSubPaths;
645− in
646− recurse [ ] attrs;
647−
648− jbossCliScript = pkgs.writeText "jboss-cli-script" (mkJbossScript keycloakConfig');
649−
650− keycloakConfig = pkgs.runCommand "keycloak-config"
651− {
652− nativeBuildInputs = [ cfg.package ];
653− }
495+ };
654− ''
655− export JBOSS_BASE_DIR="$(pwd -P)";
656− export JBOSS_MODULEPATH="${cfg.package}/modules";
657− export JBOSS_LOG_DIR="$JBOSS_BASE_DIR/log";
658−
659− cp -r ${cfg.package}/standalone/configuration .
660− chmod -R u+rwX ./configuration
661−
662− mkdir -p {deployments,ssl}
663−
664− standalone.sh&
665−
666− attempt=1
667− max_attempts=30
668− while ! jboss-cli.sh --connect ':read-attribute(name=server-state)'; do
669− if [[ "$attempt" == "$max_attempts" ]]; then
670− echo "ERROR: Could not connect to Keycloak after $attempt attempts! Failing.." >&2
671− exit 1
672− fi
673− echo "Keycloak not fully started yet, retrying.. ($attempt/$max_attempts)"
674− sleep 1
675− (( attempt++ ))
676− done
677−
678− jboss-cli.sh --connect --file=${jbossCliScript} --echo-command
679
496
680− cp configuration/standalone.xml $out
497+ isSecret = v: isAttrs v && v ? _secret && isString v._secret;
498+ filteredConfig = lib.converge (lib.filterAttrsRecursive (_: v: ! elem v [{ } null])) cfg.settings;
499+ confFile = pkgs.writeText "keycloak.conf" (keycloakConfig filteredConfig);
500+ keycloakBuild = cfg.package.override {
501+ inherit confFile;
502+ plugins = cfg.package.enabledPlugins ++ cfg.plugins;
681− '';
503+ };
682 in
504 in
683 mkIf cfg.enable
505 mkIf cfg.enable
684 {
506 {
@@ -689,7 +511,46 @@ in
689 }
511 }
690 ];
512 ];
691
513
692− environment.systemPackages = [ cfg.package ];
514+ environment.systemPackages = [ keycloakBuild ];
515+
516+ services.keycloak.settings =
517+ let
518+ postgresParams = concatStringsSep "&" (
519+ optionals cfg.database.useSSL [
520+ "ssl=true"
521+ ] ++ optionals (cfg.database.caCert != null) [
522+ "sslrootcert=${cfg.database.caCert}"
523+ "sslmode=verify-ca"
524+ ]
525+ );
526+ mariadbParams = concatStringsSep "&" ([
527+ "characterEncoding=UTF-8"
528+ ] ++ optionals cfg.database.useSSL [
529+ "useSSL=true"
530+ "requireSSL=true"
531+ "verifyServerCertificate=true"
532+ ] ++ optionals (cfg.database.caCert != null) [
533+ "trustCertificateKeyStoreUrl=file:${mySqlCaKeystore}"
534+ "trustCertificateKeyStorePassword=notsosecretpassword"
535+ ]);
536+ dbProps = if cfg.database.type == "postgresql" then postgresParams else mariadbParams;
537+ in
538+ mkMerge [
539+ {
540+ db = if cfg.database.type == "postgresql" then "postgres" else cfg.database.type;
541+ db-username = if databaseActuallyCreateLocally then "keycloak" else cfg.database.username;
542+ db-password._secret = cfg.database.passwordFile;
543+ db-url-host = cfg.database.host;
544+ db-url-port = toString cfg.database.port;
545+ db-url-database = if databaseActuallyCreateLocally then "keycloak" else cfg.database.name;
546+ db-url-properties = prefixUnlessEmpty "?" dbProps;
547+ db-url = null;
548+ }
549+ (mkIf (cfg.sslCertificate != null && cfg.sslCertificateKey != null) {
550+ https-certificate-file = "/run/keycloak/ssl/ssl_cert";
551+ https-certificate-key-file = "/run/keycloak/ssl/ssl_key";
552+ })
553+ ];
693
554
694 systemd.services.keycloakPostgreSQLInit = mkIf createLocalPostgreSQL {
555 systemd.services.keycloakPostgreSQLInit = mkIf createLocalPostgreSQL {
695 after = [ "postgresql.service" ];
556 after = [ "postgresql.service" ];
@@ -752,41 +613,37 @@ in
752 "mysql.service"
613 "mysql.service"
753 ]
614 ]
754 else [ ];
615 else [ ];
616+ secretPaths = catAttrs "_secret" (collect isSecret cfg.settings);
617+ mkSecretReplacement = file: ''
618+ replace-secret ${hashString "sha256" file} $CREDENTIALS_DIRECTORY/${baseNameOf file} /run/keycloak/conf/keycloak.conf
619+ '';
620+ secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths;
755 in
621 in
756 {
622 {
757 after = databaseServices;
623 after = databaseServices;
758 bindsTo = databaseServices;
624 bindsTo = databaseServices;
759 wantedBy = [ "multi-user.target" ];
625 wantedBy = [ "multi-user.target" ];
760 path = with pkgs; [
626 path = with pkgs; [
761− cfg.package
627+ keycloakBuild
762 openssl
628 openssl
763 replace-secret
629 replace-secret
764 ];
630 ];
765 environment = {
631 environment = {
766− JBOSS_LOG_DIR = "/var/log/keycloak";
632+ KC_HOME_DIR = "/run/keycloak";
767− JBOSS_BASE_DIR = "/run/keycloak";
633+ KC_CONF_DIR = "/run/keycloak/conf";
768− JBOSS_MODULEPATH = "${cfg.package}/modules";
769 };
634 };
770 serviceConfig = {
635 serviceConfig = {
771− LoadCredential = [
636+ LoadCredential =
772− "db_password:${cfg.database.passwordFile}"
637+ map (p: "${baseNameOf p}:${p}") secretPaths
773− ] ++ optionals (cfg.sslCertificate != null && cfg.sslCertificateKey != null) [
638+ ++ optionals (cfg.sslCertificate != null && cfg.sslCertificateKey != null) [
774− "ssl_cert:${cfg.sslCertificate}"
639+ "ssl_cert:${cfg.sslCertificate}"
775− "ssl_key:${cfg.sslCertificateKey}"
640+ "ssl_key:${cfg.sslCertificateKey}"
776− ];
641+ ];
777 User = "keycloak";
642 User = "keycloak";
778 Group = "keycloak";
643 Group = "keycloak";
779 DynamicUser = true;
644 DynamicUser = true;
780− RuntimeDirectory = map (p: "keycloak/" + p) [
645+ RuntimeDirectory = "keycloak";
781− "configuration"
782− "deployments"
783− "data"
784− "ssl"
785− "log"
786− "tmp"
787− ];
788 RuntimeDirectoryMode = 0700;
646 RuntimeDirectoryMode = 0700;
789− LogsDirectory = "keycloak";
790 AmbientCapabilities = "CAP_NET_BIND_SERVICE";
647 AmbientCapabilities = "CAP_NET_BIND_SERVICE";
791 };
648 };
792 script = ''
649 script = ''
@@ -795,41 +652,30 @@ in
795
652
796 umask u=rwx,g=,o=
653 umask u=rwx,g=,o=
797
654
798− install_plugin() {
655+ ln -s ${themesBundle} /run/keycloak/themes
799− if [ -d "$1" ]; then
656+ ln -s ${keycloakBuild}/providers /run/keycloak/
800− find "$1" -type f \( -iname \*.ear -o -iname \*.jar \) -exec install -m 0500 -o keycloak -g keycloak "{}" "/run/keycloak/deployments/" \;
657+
801− else
802− install -m 0500 -o keycloak -g keycloak "$1" "/run/keycloak/deployments/"
803− fi
804− }
805−
806− install -m 0600 ${cfg.package}/standalone/configuration/*.properties /run/keycloak/configuration
807− install -T -m 0600 ${keycloakConfig} /run/keycloak/configuration/standalone.xml
658+ install -D -m 0600 ${confFile} /run/keycloak/conf/keycloak.conf
808−
659+
809− replace-secret '@db-password@' "$CREDENTIALS_DIRECTORY/db_password" /run/keycloak/configuration/standalone.xml
660+ ${secretReplacements}
810−
661+
811− export JAVA_OPTS=-Djboss.server.config.user.dir=/run/keycloak/configuration
812− add-user-keycloak.sh -u admin -p '${cfg.initialAdminPassword}'
813− ''
814− + lib.optionalString (cfg.plugins != []) (lib.concatStringsSep "\n" (map (pl: "install_plugin ${lib.escapeShellArg pl}") cfg.plugins)) + "\n"
815− + optionalString (cfg.sslCertificate != null && cfg.sslCertificateKey != null) ''
662+ '' + optionalString (cfg.sslCertificate != null && cfg.sslCertificateKey != null) ''
816− pushd /run/keycloak/ssl/
663+ mkdir -p /run/keycloak/ssl
817− cat "$CREDENTIALS_DIRECTORY/ssl_cert" <(echo) \
664+ cp $CREDENTIALS_DIRECTORY/ssl_{cert,key} /run/keycloak/ssl/
818− "$CREDENTIALS_DIRECTORY/ssl_key" <(echo) \
819− /etc/ssl/certs/ca-certificates.crt \
820− > allcerts.pem
821− openssl pkcs12 -export -in "$CREDENTIALS_DIRECTORY/ssl_cert" -inkey "$CREDENTIALS_DIRECTORY/ssl_key" -chain \
822− -name "${cfg.frontendUrl}" -out certificate_private_key_bundle.p12 \
823− -CAfile allcerts.pem -passout pass:notsosecretpassword
824− popd
825 '' + ''
665 '' + ''
826− ${cfg.package}/bin/standalone.sh
666+ export KEYCLOAK_ADMIN=admin
667+ export KEYCLOAK_ADMIN_PASSWORD=${cfg.initialAdminPassword}
668+ kc.sh start
827 '';
669 '';
828 };
670 };
829
671
830 services.postgresql.enable = mkDefault createLocalPostgreSQL;
672 services.postgresql.enable = mkDefault createLocalPostgreSQL;
831 services.mysql.enable = mkDefault createLocalMySQL;
673 services.mysql.enable = mkDefault createLocalMySQL;
832− services.mysql.package = mkIf createLocalMySQL pkgs.mariadb;
674+ services.mysql.package =
675+ let
676+ dbPkg = if cfg.database.type == "mariadb" then pkgs.mariadb else pkgs.mysql80;
677+ in
678+ mkIf createLocalMySQL (mkDefault dbPkg);
833 };
679 };
834
680
835 meta.doc = ./keycloak.xml;
681 meta.doc = ./keycloak.xml;
nixos/modules/services/web-apps/keycloak.xml+61−81
@@ -27,10 +27,10 @@
27
27
28 <para>
28 <para>
29 Refer to the <link
29 Refer to the <link
30− xlink:href="https://www.keycloak.org/docs/latest/server_admin/index.html#admin-console">Admin
30+ xlink:href="https://www.keycloak.org/docs/latest/server_admin/index.html">
31− Console section of the Keycloak Server Administration Guide</link> for
31+ Keycloak Server Administration Guide</link> for information on
32− information on how to administer your
33− <productname>Keycloak</productname> instance.
32+ how to administer your <productname>Keycloak</productname>
33+ instance.
34 </para>
34 </para>
35 </section>
35 </section>
36
36
@@ -38,27 +38,28 @@
38 <title>Database access</title>
38 <title>Database access</title>
39 <para>
39 <para>
40 <productname>Keycloak</productname> can be used with either
40 <productname>Keycloak</productname> can be used with either
41− <productname>PostgreSQL</productname> or
41+ <productname>PostgreSQL</productname>,
42+ <productname>MariaDB</productname> or
42 <productname>MySQL</productname>. Which one is used can be
43 <productname>MySQL</productname>. Which one is used can be
43 configured in <xref
44 configured in <xref
44 linkend="opt-services.keycloak.database.type" />. The selected
45 linkend="opt-services.keycloak.database.type" />. The selected
45 database will automatically be enabled and a database and role
46 database will automatically be enabled and a database and role
46 created unless <xref
47 created unless <xref
47− linkend="opt-services.keycloak.database.host" /> is changed from
48+ linkend="opt-services.keycloak.database.host" /> is changed
48− its default of <literal>localhost</literal> or <xref
49+ from its default of <literal>localhost</literal> or <xref
49− linkend="opt-services.keycloak.database.createLocally" /> is set
50+ linkend="opt-services.keycloak.database.createLocally" /> is
50− to <literal>false</literal>.
51+ set to <literal>false</literal>.
51 </para>
52 </para>
52
53
53 <para>
54 <para>
54 External database access can also be configured by setting
55 External database access can also be configured by setting
55 <xref linkend="opt-services.keycloak.database.host" />, <xref
56 <xref linkend="opt-services.keycloak.database.host" />, <xref
57+ linkend="opt-services.keycloak.database.name" />, <xref
56 linkend="opt-services.keycloak.database.username" />, <xref
58 linkend="opt-services.keycloak.database.username" />, <xref
57 linkend="opt-services.keycloak.database.useSSL" /> and <xref
59 linkend="opt-services.keycloak.database.useSSL" /> and <xref
58 linkend="opt-services.keycloak.database.caCert" /> as
60 linkend="opt-services.keycloak.database.caCert" /> as
59− appropriate. Note that you need to manually create a database
61+ appropriate. Note that you need to manually create the database
60− called <literal>keycloak</literal> and allow the configured
61− database user full access to it.
62+ and allow the configured database user full access to it.
62 </para>
63 </para>
63
64
64 <para>
65 <para>
@@ -79,22 +80,27 @@
79 </warning>
80 </warning>
80 </section>
81 </section>
81
82
82− <section xml:id="module-services-keycloak-frontendurl">
83+ <section xml:id="module-services-keycloak-hostname">
83− <title>Frontend URL</title>
84+ <title>Hostname</title>
84 <para>
85 <para>
86+ The hostname is used to build the public URL used as base for
85− The frontend URL is used as base for all frontend requests and
87+ all frontend requests and must be configured through <xref
86− must be configured through <xref linkend="opt-services.keycloak.frontendUrl" />.
88+ linkend="opt-services.keycloak.settings.hostname" />.
87− It should normally include a trailing <literal>/auth</literal>
88− (the default web context). If you use a reverse proxy, you need
89− to set this option to <literal>""</literal>, so that frontend URL
90− is derived from HTTP headers. <literal>X-Forwarded-*</literal> headers
91− support also should be enabled, using <link
92− xlink:href="https://www.keycloak.org/docs/latest/server_installation/index.html#identifying-client-ip-addresses">
93− respective guidelines</link>.
94 </para>
89 </para>
95
90
91+ <note>
92+ <para>
93+ If you're migrating an old Wildfly based Keycloak instance
94+ and want to keep compatibility with your current clients,
95+ you'll likely want to set <xref
96+ linkend="opt-services.keycloak.settings.http-relative-path"
97+ /> to <literal>/auth</literal>. See the option description
98+ for more details.
99+ </para>
100+ </note>
101+
96 <para>
102 <para>
97− <xref linkend="opt-services.keycloak.forceBackendUrlToFrontendUrl" />
103+ <xref linkend="opt-services.keycloak.settings.hostname-strict-backchannel" />
98 determines whether Keycloak should force all requests to go
104 determines whether Keycloak should force all requests to go
99 through the frontend URL. By default,
105 through the frontend URL. By default,
100 <productname>Keycloak</productname> allows backend requests to
106 <productname>Keycloak</productname> allows backend requests to
@@ -104,10 +110,10 @@
104 </para>
110 </para>
105
111
106 <para>
112 <para>
107− See the <link
113+ For more information on hostname configuration, see the <link
108− xlink:href="https://www.keycloak.org/docs/latest/server_installation/#_hostname">Hostname
114+ xlink:href="https://www.keycloak.org/server/hostname">Hostname
109− section of the Keycloak Server Installation and Configuration
115+ section of the Keycloak Server Installation and Configuration
110− Guide</link> for more information.
116+ Guide</link>.
111 </para>
117 </para>
112 </section>
118 </section>
113
119
@@ -139,68 +145,40 @@
139 <section xml:id="module-services-keycloak-themes">
145 <section xml:id="module-services-keycloak-themes">
140 <title>Themes</title>
146 <title>Themes</title>
141 <para>
147 <para>
142− You can package custom themes and make them visible to Keycloak via
148+ You can package custom themes and make them visible to
143− <xref linkend="opt-services.keycloak.themes" />
149+ Keycloak through <xref linkend="opt-services.keycloak.themes"
150+ />. See the <link
144− option. See the <link xlink:href="https://www.keycloak.org/docs/latest/server_development/#_themes">
151+ xlink:href="https://www.keycloak.org/docs/latest/server_development/#_themes">
145 Themes section of the Keycloak Server Development Guide</link>
152 Themes section of the Keycloak Server Development Guide</link>
153+ and the description of the aforementioned NixOS option for
146− and respective NixOS option description for more information.
154+ more information.
147 </para>
155 </para>
148 </section>
156 </section>
149
157
150− <section xml:id="module-services-keycloak-extra-config">
158+ <section xml:id="module-services-keycloak-settings">
151− <title>Additional configuration</title>
159+ <title>Configuration file settings</title>
152 <para>
160 <para>
153− Additional Keycloak configuration options, for which no
161+ Keycloak server configuration parameters can be set in <xref
154− explicit <productname>NixOS</productname> options are provided,
155− can be set in <xref linkend="opt-services.keycloak.extraConfig" />.
162+ linkend="opt-services.keycloak.settings" />. These correspond
163+ directly to options in
164+ <filename>conf/keycloak.conf</filename>. Some of the most
165+ important parameters are documented as suboptions, the rest can
166+ be found in the <link
167+ xlink:href="https://www.keycloak.org/server/all-config">All
168+ configuration section of the Keycloak Server Installation and
169+ Configuration Guide</link>.
156 </para>
170 </para>
157
171
158 <para>
172 <para>
159− Options are expressed as a Nix attribute set which matches the
173+ Options containing secret data should be set to an attribute
160− structure of the jboss-cli configuration. The configuration is
174+ set containing the attribute <literal>_secret</literal> - a
161− effectively overlayed on top of the default configuration
175+ string pointing to a file containing the value the option
162− shipped with Keycloak. To remove existing nodes and undefine
176+ should be set to. See the description of <xref
163− attributes from the default configuration, set them to
164− <literal>null</literal>.
165− </para>
166− <para>
167− For example, the following script, which removes the hostname
168− provider <literal>default</literal>, adds the deprecated
169− hostname provider <literal>fixed</literal> and defines it the
170− default:
171−
172−<programlisting>
173−/subsystem=keycloak-server/spi=hostname/provider=default:remove()
174−/subsystem=keycloak-server/spi=hostname/provider=fixed:add(enabled = true, properties = { hostname = "keycloak.example.com" })
175−/subsystem=keycloak-server/spi=hostname:write-attribute(name=default-provider, value="fixed")
176−</programlisting>
177−
178− would be expressed as
179−
180−<programlisting>
181−services.keycloak.extraConfig = {
177+ linkend="opt-services.keycloak.settings" /> for an example.
182− "subsystem=keycloak-server" = {
183− "spi=hostname" = {
184− "provider=default" = null;
185− "provider=fixed" = {
186− enabled = true;
187− properties.hostname = "keycloak.example.com";
188− };
189− default-provider = "fixed";
190− };
191− };
192−};
193−</programlisting>
194− </para>
195− <para>
196− You can discover available options by using the <link
197− xlink:href="http://docs.wildfly.org/21/Admin_Guide.html#Command_Line_Interface">jboss-cli.sh</link>
198− program and by referring to the <link
199− xlink:href="https://www.keycloak.org/docs/latest/server_installation/index.html">Keycloak
200− Server Installation and Configuration Guide</link>.
201 </para>
178 </para>
202 </section>
179 </section>
203
180
181+
204 <section xml:id="module-services-keycloak-example-config">
182 <section xml:id="module-services-keycloak-example-config">
205 <title>Example configuration</title>
183 <title>Example configuration</title>
206 <para>
184 <para>
@@ -208,9 +186,11 @@ services.keycloak.extraConfig = {
208<programlisting>
186<programlisting>
209services.keycloak = {
187services.keycloak = {
210 <link linkend="opt-services.keycloak.enable">enable</link> = true;
188 <link linkend="opt-services.keycloak.enable">enable</link> = true;
189+ settings = {
190+ <link linkend="opt-services.keycloak.settings.hostname">hostname</link> = "keycloak.example.com";
191+ <link linkend="opt-services.keycloak.settings.hostname-strict-backchannel">hostname-strict-backchannel</link> = true;
192+ };
211 <link linkend="opt-services.keycloak.initialAdminPassword">initialAdminPassword</link> = "e6Wcm0RrtegMEHl"; # change on first login
193 <link linkend="opt-services.keycloak.initialAdminPassword">initialAdminPassword</link> = "e6Wcm0RrtegMEHl"; # change on first login
212− <link linkend="opt-services.keycloak.frontendUrl">frontendUrl</link> = "https://keycloak.example.com/auth";
213− <link linkend="opt-services.keycloak.forceBackendUrlToFrontendUrl">forceBackendUrlToFrontendUrl</link> = true;
214 <link linkend="opt-services.keycloak.sslCertificate">sslCertificate</link> = "/run/keys/ssl_cert";
194 <link linkend="opt-services.keycloak.sslCertificate">sslCertificate</link> = "/run/keys/ssl_cert";
215 <link linkend="opt-services.keycloak.sslCertificateKey">sslCertificateKey</link> = "/run/keys/ssl_key";
195 <link linkend="opt-services.keycloak.sslCertificateKey">sslCertificateKey</link> = "/run/keys/ssl_key";
216 <link linkend="opt-services.keycloak.database.passwordFile">database.passwordFile</link> = "/run/keys/db_password";
196 <link linkend="opt-services.keycloak.database.passwordFile">database.passwordFile</link> = "/run/keys/db_password";
nixos/modules/services/web-apps/nextcloud.nix+75
@@ -251,6 +251,23 @@ in {
251 '';
251 '';
252 };
252 };
253
253
254+ database = {
255+
256+ createLocally = mkOption {
257+ type = types.bool;
258+ default = false;
259+ description = ''
260+ Create the database and database user locally. Only available for
261+ mysql database.
262+ Note that this option will use the latest version of MariaDB which
263+ is not officially supported by Nextcloud. As for now a workaround
264+ is used to also support MariaDB version >= 10.6.
265+ '';
266+ };
267+
268+ };
269+
270+
254 config = {
271 config = {
255 dbtype = mkOption {
272 dbtype = mkOption {
256 type = types.enum [ "sqlite" "pgsql" "mysql" ];
273 type = types.enum [ "sqlite" "pgsql" "mysql" ];
@@ -505,6 +522,29 @@ in {
505 The nextcloud-occ program preconfigured to target this Nextcloud instance.
522 The nextcloud-occ program preconfigured to target this Nextcloud instance.
506 '';
523 '';
507 };
524 };
525+ globalProfiles = mkEnableOption "global profiles" // {
526+ description = ''
527+ Makes user-profiles globally available under <literal>nextcloud.tld/u/user.name</literal>.
528+ Even though it's enabled by default in Nextcloud, it must be explicitly enabled
529+ here because it has the side-effect that personal information is even accessible to
530+ unauthenticated users by default.
531+
532+ By default, the following properties are set to <quote>Show to everyone</quote>
533+ if this flag is enabled:
534+ <itemizedlist>
535+ <listitem><para>About</para></listitem>
536+ <listitem><para>Full name</para></listitem>
537+ <listitem><para>Headline</para></listitem>
538+ <listitem><para>Organisation</para></listitem>
539+ <listitem><para>Profile picture</para></listitem>
540+ <listitem><para>Role</para></listitem>
541+ <listitem><para>Twitter</para></listitem>
542+ <listitem><para>Website</para></listitem>
543+ </itemizedlist>
544+
545+ Only has an effect in Nextcloud 23 and later.
546+ '';
547+ };
508
548
509 nginx.recommendedHttpHeaders = mkOption {
549 nginx.recommendedHttpHeaders = mkOption {
510 type = types.bool;
550 type = types.bool;
@@ -583,6 +623,12 @@ in {
583 else pkgs.php80;
623 else pkgs.php80;
584 }
624 }
585
625
626+ { assertions = [
627+ { assertion = cfg.database.createLocally -> cfg.config.dbtype == "mysql";
628+ message = ''services.nextcloud.config.dbtype must be set to mysql if services.nextcloud.database.createLocally is set to true.'';
629+ }
630+ ]; }
631+
586 { systemd.timers.nextcloud-cron = {
632 { systemd.timers.nextcloud-cron = {
587 wantedBy = [ "timers.target" ];
633 wantedBy = [ "timers.target" ];
588 timerConfig.OnBootSec = "5m";
634 timerConfig.OnBootSec = "5m";
@@ -627,6 +673,8 @@ in {
627 if x == null then "false"
673 if x == null then "false"
628 else boolToString x;
674 else boolToString x;
629
675
676+ nextcloudGreaterOrEqualThan = req: versionAtLeast cfg.package.version req;
677+
630 overrideConfig = pkgs.writeText "nextcloud-config.php" ''
678 overrideConfig = pkgs.writeText "nextcloud-config.php" ''
631 <?php
679 <?php
632 ${optionalString requiresReadSecretFunction ''
680 ${optionalString requiresReadSecretFunction ''
@@ -666,6 +714,7 @@ in {
666 'trusted_domains' => ${writePhpArrary ([ cfg.hostName ] ++ c.extraTrustedDomains)},
714 'trusted_domains' => ${writePhpArrary ([ cfg.hostName ] ++ c.extraTrustedDomains)},
667 'trusted_proxies' => ${writePhpArrary (c.trustedProxies)},
715 'trusted_proxies' => ${writePhpArrary (c.trustedProxies)},
668 ${optionalString (c.defaultPhoneRegion != null) "'default_phone_region' => '${c.defaultPhoneRegion}',"}
716 ${optionalString (c.defaultPhoneRegion != null) "'default_phone_region' => '${c.defaultPhoneRegion}',"}
717+ ${optionalString (nextcloudGreaterOrEqualThan "23") "'profile.enabled' => ${boolToString cfg.globalProfiles}"}
669 ${objectstoreConfig}
718 ${objectstoreConfig}
670 ];
719 ];
671 '';
720 '';
@@ -811,6 +860,32 @@ in {
811
860
812 environment.systemPackages = [ occ ];
861 environment.systemPackages = [ occ ];
813
862
863+ services.mysql = lib.mkIf cfg.database.createLocally {
864+ enable = true;
865+ package = lib.mkDefault pkgs.mariadb;
866+ ensureDatabases = [ cfg.config.dbname ];
867+ ensureUsers = [{
868+ name = cfg.config.dbuser;
869+ ensurePermissions = { "${cfg.config.dbname}.*" = "ALL PRIVILEGES"; };
870+ }];
871+ # FIXME(@Ma27) Nextcloud isn't compatible with mariadb 10.6,
872+ # this is a workaround.
873+ # See https://help.nextcloud.com/t/update-to-next-cloud-21-0-2-has-get-an-error/117028/22
874+ settings = {
875+ mysqld = {
876+ innodb_read_only_compressed = 0;
877+ };
878+ };
879+ initialScript = pkgs.writeText "mysql-init" ''
880+ CREATE USER '${cfg.config.dbname}'@'localhost' IDENTIFIED BY '${builtins.readFile( cfg.config.dbpassFile )}';
881+ CREATE DATABASE IF NOT EXISTS ${cfg.config.dbname};
882+ GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER,
883+ CREATE TEMPORARY TABLES ON ${cfg.config.dbname}.* TO '${cfg.config.dbuser}'@'localhost'
884+ IDENTIFIED BY '${builtins.readFile( cfg.config.dbpassFile )}';
885+ FLUSH privileges;
886+ '';
887+ };
888+
814 services.nginx.enable = mkDefault true;
889 services.nginx.enable = mkDefault true;
815
890
816 services.nginx.virtualHosts.${cfg.hostName} = {
891 services.nginx.virtualHosts.${cfg.hostName} = {
nixos/modules/services/web-apps/nifi.nixnew file+318
@@ -0,0 +1,318 @@
1+{ lib, pkgs, config, options, ... }:
2+
3+let
4+ cfg = config.services.nifi;
5+ opt = options.services.nifi;
6+
7+ env = {
8+ NIFI_OVERRIDE_NIFIENV = "true";
9+ NIFI_HOME = "/var/lib/nifi";
10+ NIFI_PID_DIR = "/run/nifi";
11+ NIFI_LOG_DIR = "/var/log/nifi";
12+ };
13+
14+ envFile = pkgs.writeText "nifi.env" (lib.concatMapStrings (s: s + "\n") (
15+ (lib.concatLists (lib.mapAttrsToList (name: value:
16+ if value != null then [
17+ "${name}=\"${toString value}\""
18+ ] else []
19+ ) env))));
20+
21+ nifiEnv = pkgs.writeShellScriptBin "nifi-env" ''
22+ set -a
23+ source "${envFile}"
24+ eval -- "\$@"
25+ '';
26+
27+in {
28+ options = {
29+ services.nifi = {
30+ enable = lib.mkEnableOption "Apache NiFi";
31+
32+ package = lib.mkOption {
33+ type = lib.types.package;
34+ default = pkgs.nifi;
35+ defaultText = lib.literalExpression "pkgs.nifi";
36+ description = "Apache NiFi package to use.";
37+ };
38+
39+ user = lib.mkOption {
40+ type = lib.types.str;
41+ default = "nifi";
42+ description = "User account where Apache NiFi runs.";
43+ };
44+
45+ group = lib.mkOption {
46+ type = lib.types.str;
47+ default = "nifi";
48+ description = "Group account where Apache NiFi runs.";
49+ };
50+
51+ enableHTTPS = lib.mkOption {
52+ type = lib.types.bool;
53+ default = true;
54+ description = "Enable HTTPS protocol. Don`t use in production.";
55+ };
56+
57+ listenHost = lib.mkOption {
58+ type = lib.types.str;
59+ default = if cfg.enableHTTPS then "0.0.0.0" else "127.0.0.1";
60+ defaultText = lib.literalExpression ''
61+ if config.${opt.enableHTTPS}
62+ then "0.0.0.0"
63+ else "127.0.0.1"
64+ '';
65+ description = "Bind to an ip for Apache NiFi web-ui.";
66+ };
67+
68+ listenPort = lib.mkOption {
69+ type = lib.types.int;
70+ default = if cfg.enableHTTPS then 8443 else 8080;
71+ defaultText = lib.literalExpression ''
72+ if config.${opt.enableHTTPS}
73+ then "8443"
74+ else "8000"
75+ '';
76+ description = "Bind to a port for Apache NiFi web-ui.";
77+ };
78+
79+ proxyHost = lib.mkOption {
80+ type = lib.types.nullOr lib.types.str;
81+ default = if cfg.enableHTTPS then "0.0.0.0" else null;
82+ defaultText = lib.literalExpression ''
83+ if config.${opt.enableHTTPS}
84+ then "0.0.0.0"
85+ else null
86+ '';
87+ description = "Allow requests from a specific host.";
88+ };
89+
90+ proxyPort = lib.mkOption {
91+ type = lib.types.nullOr lib.types.int;
92+ default = if cfg.enableHTTPS then 8443 else null;
93+ defaultText = lib.literalExpression ''
94+ if config.${opt.enableHTTPS}
95+ then "8443"
96+ else null
97+ '';
98+ description = "Allow requests from a specific port.";
99+ };
100+
101+ initUser = lib.mkOption {
102+ type = lib.types.nullOr lib.types.str;
103+ default = null;
104+ description = "Initial user account for Apache NiFi. Username must be at least 4 characters.";
105+ };
106+
107+ initPasswordFile = lib.mkOption {
108+ type = lib.types.nullOr lib.types.path;
109+ default = null;
110+ example = "/run/keys/nifi/password-nifi";
111+ description = "nitial password for Apache NiFi. Password must be at least 12 characters.";
112+ };
113+
114+ initJavaHeapSize = lib.mkOption {
115+ type = lib.types.nullOr lib.types.int;
116+ default = null;
117+ example = 1024;
118+ description = "Set the initial heap size for the JVM in MB.";
119+ };
120+
121+ maxJavaHeapSize = lib.mkOption {
122+ type = lib.types.nullOr lib.types.int;
123+ default = null;
124+ example = 2048;
125+ description = "Set the initial heap size for the JVM in MB.";
126+ };
127+ };
128+ };
129+
130+ config = lib.mkIf cfg.enable {
131+ assertions = [
132+ { assertion = cfg.initUser!=null || cfg.initPasswordFile==null;
133+ message = ''
134+ <option>services.nifi.initUser</option> needs to be set if <option>services.nifi.initPasswordFile</option> enabled.
135+ '';
136+ }
137+ { assertion = cfg.initUser==null || cfg.initPasswordFile!=null;
138+ message = ''
139+ <option>services.nifi.initPasswordFile</option> needs to be set if <option>services.nifi.initUser</option> enabled.
140+ '';
141+ }
142+ { assertion = cfg.proxyHost==null || cfg.proxyPort!=null;
143+ message = ''
144+ <option>services.nifi.proxyPort</option> needs to be set if <option>services.nifi.proxyHost</option> value specified.
145+ '';
146+ }
147+ { assertion = cfg.proxyHost!=null || cfg.proxyPort==null;
148+ message = ''
149+ <option>services.nifi.proxyHost</option> needs to be set if <option>services.nifi.proxyPort</option> value specified.
150+ '';
151+ }
152+ { assertion = cfg.initJavaHeapSize==null || cfg.maxJavaHeapSize!=null;
153+ message = ''
154+ <option>services.nifi.maxJavaHeapSize</option> needs to be set if <option>services.nifi.initJavaHeapSize</option> value specified.
155+ '';
156+ }
157+ { assertion = cfg.initJavaHeapSize!=null || cfg.maxJavaHeapSize==null;
158+ message = ''
159+ <option>services.nifi.initJavaHeapSize</option> needs to be set if <option>services.nifi.maxJavaHeapSize</option> value specified.
160+ '';
161+ }
162+ ];
163+
164+ warnings = lib.optional (cfg.enableHTTPS==false) ''
165+ Please do not disable HTTPS mode in production. In this mode, access to the nifi is opened without authentication.
166+ '';
167+
168+ systemd.tmpfiles.rules = [
169+ "d '/var/lib/nifi/conf' 0750 ${cfg.user} ${cfg.group}"
170+ "L+ '/var/lib/nifi/lib' - - - - ${cfg.package}/lib"
171+ ];
172+
173+
174+ systemd.services.nifi = {
175+ description = "Apache NiFi";
176+ after = [ "network.target" ];
177+ wantedBy = [ "multi-user.target" ];
178+
179+ environment = env;
180+ path = [ pkgs.gawk ];
181+
182+ serviceConfig = {
183+ Type = "forking";
184+ PIDFile = "/run/nifi/nifi.pid";
185+ ExecStartPre = pkgs.writeScript "nifi-pre-start.sh" ''
186+ #!/bin/sh
187+ umask 077
188+ test -f '/var/lib/nifi/conf/authorizers.xml' || (cp '${cfg.package}/share/nifi/conf/authorizers.xml' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/authorizers.xml')
189+ test -f '/var/lib/nifi/conf/bootstrap.conf' || (cp '${cfg.package}/share/nifi/conf/bootstrap.conf' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/bootstrap.conf')
190+ test -f '/var/lib/nifi/conf/bootstrap-hashicorp-vault.conf' || (cp '${cfg.package}/share/nifi/conf/bootstrap-hashicorp-vault.conf' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/bootstrap-hashicorp-vault.conf')
191+ test -f '/var/lib/nifi/conf/bootstrap-notification-services.xml' || (cp '${cfg.package}/share/nifi/conf/bootstrap-notification-services.xml' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/bootstrap-notification-services.xml')
192+ test -f '/var/lib/nifi/conf/logback.xml' || (cp '${cfg.package}/share/nifi/conf/logback.xml' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/logback.xml')
193+ test -f '/var/lib/nifi/conf/login-identity-providers.xml' || (cp '${cfg.package}/share/nifi/conf/login-identity-providers.xml' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/login-identity-providers.xml')
194+ test -f '/var/lib/nifi/conf/nifi.properties' || (cp '${cfg.package}/share/nifi/conf/nifi.properties' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/nifi.properties')
195+ test -f '/var/lib/nifi/conf/stateless-logback.xml' || (cp '${cfg.package}/share/nifi/conf/stateless-logback.xml' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/stateless-logback.xml')
196+ test -f '/var/lib/nifi/conf/stateless.properties' || (cp '${cfg.package}/share/nifi/conf/stateless.properties' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/stateless.properties')
197+ test -f '/var/lib/nifi/conf/state-management.xml' || (cp '${cfg.package}/share/nifi/conf/state-management.xml' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/state-management.xml')
198+ test -f '/var/lib/nifi/conf/zookeeper.properties' || (cp '${cfg.package}/share/nifi/conf/zookeeper.properties' '/var/lib/nifi/conf/' && chmod 0640 '/var/lib/nifi/conf/zookeeper.properties')
199+ test -d '/var/lib/nifi/docs/html' || (mkdir -p /var/lib/nifi/docs && cp -r '${cfg.package}/share/nifi/docs/html' '/var/lib/nifi/docs/html')
200+ ${lib.optionalString ((cfg.initUser != null) && (cfg.initPasswordFile != null)) ''
201+ awk -F'[<|>]' '/property name="Username"/ {if ($3!="") f=1} END{exit !f}' /var/lib/nifi/conf/login-identity-providers.xml || ${cfg.package}/bin/nifi.sh set-single-user-credentials ${cfg.initUser} $(cat ${cfg.initPasswordFile})
202+ ''}
203+ ${lib.optionalString (cfg.enableHTTPS == false) ''
204+ sed -i /var/lib/nifi/conf/nifi.properties \
205+ -e 's|nifi.remote.input.secure=.*|nifi.remote.input.secure=false|g' \
206+ -e 's|nifi.web.http.host=.*|nifi.web.http.host=${cfg.listenHost}|g' \
207+ -e 's|nifi.web.http.port=.*|nifi.web.http.port=${(toString cfg.listenPort)}|g' \
208+ -e 's|nifi.web.https.host=.*|nifi.web.https.host=|g' \
209+ -e 's|nifi.web.https.port=.*|nifi.web.https.port=|g' \
210+ -e 's|nifi.security.keystore=.*|nifi.security.keystore=|g' \
211+ -e 's|nifi.security.keystoreType=.*|nifi.security.keystoreType=|g' \
212+ -e 's|nifi.security.truststore=.*|nifi.security.truststore=|g' \
213+ -e 's|nifi.security.truststoreType=.*|nifi.security.truststoreType=|g' \
214+ -e '/nifi.security.keystorePasswd/s|^|#|' \
215+ -e '/nifi.security.keyPasswd/s|^|#|' \
216+ -e '/nifi.security.truststorePasswd/s|^|#|'
217+ ''}
218+ ${lib.optionalString (cfg.enableHTTPS == true) ''
219+ sed -i /var/lib/nifi/conf/nifi.properties \
220+ -e 's|nifi.remote.input.secure=.*|nifi.remote.input.secure=true|g' \
221+ -e 's|nifi.web.http.host=.*|nifi.web.http.host=|g' \
222+ -e 's|nifi.web.http.port=.*|nifi.web.http.port=|g' \
223+ -e 's|nifi.web.https.host=.*|nifi.web.https.host=${cfg.listenHost}|g' \
224+ -e 's|nifi.web.https.port=.*|nifi.web.https.port=${(toString cfg.listenPort)}|g' \
225+ -e 's|nifi.security.keystore=.*|nifi.security.keystore=./conf/keystore.p12|g' \
226+ -e 's|nifi.security.keystoreType=.*|nifi.security.keystoreType=PKCS12|g' \
227+ -e 's|nifi.security.truststore=.*|nifi.security.truststore=./conf/truststore.p12|g' \
228+ -e 's|nifi.security.truststoreType=.*|nifi.security.truststoreType=PKCS12|g' \
229+ -e '/nifi.security.keystorePasswd/s|^#\+||' \
230+ -e '/nifi.security.keyPasswd/s|^#\+||' \
231+ -e '/nifi.security.truststorePasswd/s|^#\+||'
232+ ''}
233+ ${lib.optionalString ((cfg.enableHTTPS == true) && (cfg.proxyHost != null) && (cfg.proxyPort != null)) ''
234+ sed -i /var/lib/nifi/conf/nifi.properties \
235+ -e 's|nifi.web.proxy.host=.*|nifi.web.proxy.host=${cfg.proxyHost}:${(toString cfg.proxyPort)}|g'
236+ ''}
237+ ${lib.optionalString ((cfg.enableHTTPS == false) || (cfg.proxyHost == null) && (cfg.proxyPort == null)) ''
238+ sed -i /var/lib/nifi/conf/nifi.properties \
239+ -e 's|nifi.web.proxy.host=.*|nifi.web.proxy.host=|g'
240+ ''}
241+ ${lib.optionalString ((cfg.initJavaHeapSize != null) && (cfg.maxJavaHeapSize != null))''
242+ sed -i /var/lib/nifi/conf/bootstrap.conf \
243+ -e 's|java.arg.2=.*|java.arg.2=-Xms${(toString cfg.initJavaHeapSize)}m|g' \
244+ -e 's|java.arg.3=.*|java.arg.3=-Xmx${(toString cfg.maxJavaHeapSize)}m|g'
245+ ''}
246+ ${lib.optionalString ((cfg.initJavaHeapSize == null) && (cfg.maxJavaHeapSize == null))''
247+ sed -i /var/lib/nifi/conf/bootstrap.conf \
248+ -e 's|java.arg.2=.*|java.arg.2=-Xms512m|g' \
249+ -e 's|java.arg.3=.*|java.arg.3=-Xmx512m|g'
250+ ''}
251+ '';
252+ ExecStart = "${cfg.package}/bin/nifi.sh start";
253+ ExecStop = "${cfg.package}/bin/nifi.sh stop";
254+ # User and group
255+ User = cfg.user;
256+ Group = cfg.group;
257+ # Runtime directory and mode
258+ RuntimeDirectory = "nifi";
259+ RuntimeDirectoryMode = "0750";
260+ # State directory and mode
261+ StateDirectory = "nifi";
262+ StateDirectoryMode = "0750";
263+ # Logs directory and mode
264+ LogsDirectory = "nifi";
265+ LogsDirectoryMode = "0750";
266+ # Proc filesystem
267+ ProcSubset = "pid";
268+ ProtectProc = "invisible";
269+ # Access write directories
270+ ReadWritePaths = [ cfg.initPasswordFile ];
271+ UMask = "0027";
272+ # Capabilities
273+ CapabilityBoundingSet = "";
274+ # Security
275+ NoNewPrivileges = true;
276+ # Sandboxing
277+ ProtectSystem = "strict";
278+ ProtectHome = true;
279+ PrivateTmp = true;
280+ PrivateDevices = true;
281+ PrivateIPC = true;
282+ PrivateUsers = true;
283+ ProtectHostname = true;
284+ ProtectClock = true;
285+ ProtectKernelTunables = true;
286+ ProtectKernelModules = true;
287+ ProtectKernelLogs = true;
288+ ProtectControlGroups = true;
289+ RestrictAddressFamilies = [ "AF_INET AF_INET6" ];
290+ RestrictNamespaces = true;
291+ LockPersonality = true;
292+ MemoryDenyWriteExecute = false;
293+ RestrictRealtime = true;
294+ RestrictSUIDSGID = true;
295+ RemoveIPC = true;
296+ PrivateMounts = true;
297+ # System Call Filtering
298+ SystemCallArchitectures = "native";
299+ SystemCallFilter = [ "~@cpu-emulation @debug @keyring @memlock @mount @obsolete @resources @privileged @setuid" "@chown" ];
300+ };
301+ };
302+
303+ users.users = lib.mkMerge [
304+ (lib.mkIf (cfg.user == "nifi") {
305+ nifi = {
306+ group = cfg.group;
307+ isSystemUser = true;
308+ home = cfg.package;
309+ };
310+ })
311+ (lib.attrsets.setAttrByPath [ cfg.user "packages" ] [ cfg.package nifiEnv ])
312+ ];
313+
314+ users.groups = lib.optionalAttrs (cfg.group == "nifi") {
315+ nifi = { };
316+ };
317+ };
318+}
nixos/modules/services/web-servers/hydron.nix+1−1
@@ -161,5 +161,5 @@ in with lib; {
161 (mkRenamedOptionModule [ "services" "hydron" "baseDir" ] [ "services" "hydron" "dataDir" ])
161 (mkRenamedOptionModule [ "services" "hydron" "baseDir" ] [ "services" "hydron" "dataDir" ])
162 ];
162 ];
163
163
164− meta.maintainers = with maintainers; [ chiiruno ];
164+ meta.maintainers = with maintainers; [ Madouura ];
165}
165}
nixos/modules/services/web-servers/nginx/default.nix+18−11
@@ -255,20 +255,22 @@ let
255 else defaultListen;
255 else defaultListen;
256
256
257 listenString = { addr, port, ssl, extraParameters ? [], ... }:
257 listenString = { addr, port, ssl, extraParameters ? [], ... }:
258+ (if ssl && vhost.http3 then "
259+ # UDP listener for **QUIC+HTTP/3
258− "listen ${addr}:${toString port} "
260+ listen ${addr}:${toString port} http3 "
261+ + optionalString vhost.default "default_server "
259− + optionalString ssl "ssl "
262+ + optionalString vhost.reuseport "reuseport "
263+ + optionalString (extraParameters != []) (concatStringsSep " " extraParameters)
264+ + ";" else "")
265+ + "
266+
267+ listen ${addr}:${toString port} "
260 + optionalString (ssl && vhost.http2) "http2 "
268 + optionalString (ssl && vhost.http2) "http2 "
269+ + optionalString ssl "ssl "
261 + optionalString vhost.default "default_server "
270 + optionalString vhost.default "default_server "
271+ + optionalString vhost.reuseport "reuseport "
262 + optionalString (extraParameters != []) (concatStringsSep " " extraParameters)
272 + optionalString (extraParameters != []) (concatStringsSep " " extraParameters)
263− + ";"
273+ + ";";
264− + (if ssl && vhost.http3 then ''
265− # UDP listener for **QUIC+HTTP/3
266− listen ${addr}:${toString port} http3 reuseport;
267− # Advertise that HTTP/3 is available
268− add_header Alt-Svc 'h3=":443"';
269− # Sent when QUIC was used
270− add_header QUIC-Status $quic;
271− '' else "");
272
274
273 redirectListen = filter (x: !x.ssl) defaultListen;
275 redirectListen = filter (x: !x.ssl) defaultListen;
274
276
@@ -321,6 +323,11 @@ let
321 ssl_conf_command Options KTLS;
323 ssl_conf_command Options KTLS;
322 ''}
324 ''}
323
325
326+ ${optionalString (hasSSL && vhost.http3) ''
327+ # Advertise that HTTP/3 is available
328+ add_header Alt-Svc 'h3=":443"; ma=86400' always;
329+ ''}
330+
324 ${mkBasicAuth vhostName vhost}
331 ${mkBasicAuth vhostName vhost}
325
332
326 ${mkLocations vhost.locations}
333 ${mkLocations vhost.locations}
nixos/modules/services/web-servers/nginx/vhost-options.nix+12−3
@@ -20,7 +20,7 @@ with lib;
20 serverAliases = mkOption {
20 serverAliases = mkOption {
21 type = types.listOf types.str;
21 type = types.listOf types.str;
22 default = [];
22 default = [];
23− example = ["www.example.org" "example.org"];
23+ example = [ "www.example.org" "example.org" ];
24 description = ''
24 description = ''
25 Additional names of virtual hosts served by this virtual host configuration.
25 Additional names of virtual hosts served by this virtual host configuration.
26 '';
26 '';
@@ -31,11 +31,11 @@ with lib;
31 addr = mkOption { type = str; description = "IP address."; };
31 addr = mkOption { type = str; description = "IP address."; };
32 port = mkOption { type = int; description = "Port number."; default = 80; };
32 port = mkOption { type = int; description = "Port number."; default = 80; };
33 ssl = mkOption { type = bool; description = "Enable SSL."; default = false; };
33 ssl = mkOption { type = bool; description = "Enable SSL."; default = false; };
34− extraParameters = mkOption { type = listOf str; description = "Extra parameters of this listen directive."; default = []; example = [ "reuseport" "deferred" ]; };
34+ extraParameters = mkOption { type = listOf str; description = "Extra parameters of this listen directive."; default = []; example = [ "backlog=1024" "deferred" ]; };
35 }; });
35 }; });
36 default = [];
36 default = [];
37 example = [
37 example = [
38− { addr = "195.154.1.1"; port = 443; ssl = true;}
38+ { addr = "195.154.1.1"; port = 443; ssl = true; }
39 { addr = "192.154.1.1"; port = 80; }
39 { addr = "192.154.1.1"; port = 80; }
40 ];
40 ];
41 description = ''
41 description = ''
@@ -207,6 +207,15 @@ with lib;
207 '';
207 '';
208 };
208 };
209
209
210+ reuseport = mkOption {
211+ type = types.bool;
212+ default = false;
213+ description = ''
214+ Create an individual listening socket .
215+ It is required to specify only once on one of the hosts.
216+ '';
217+ };
218+
210 root = mkOption {
219 root = mkOption {
211 type = types.nullOr types.path;
220 type = types.nullOr types.path;
212 default = null;
221 default = null;
nixos/modules/services/x11/desktop-managers/cinnamon.nix+3−3
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, pkgs, utils, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -196,7 +196,7 @@ in
196 programs.evince.enable = mkDefault true;
196 programs.evince.enable = mkDefault true;
197 programs.file-roller.enable = mkDefault true;
197 programs.file-roller.enable = mkDefault true;
198
198
199− environment.systemPackages = (with pkgs // pkgs.gnome // pkgs.cinnamon; pkgs.gnome.removePackagesByName [
199+ environment.systemPackages = with pkgs // pkgs.gnome // pkgs.cinnamon; utils.removePackagesByName [
200 # cinnamon team apps
200 # cinnamon team apps
201 bulky
201 bulky
202 blueberry
202 blueberry
@@ -212,7 +212,7 @@ in
212 # external apps shipped with linux-mint
212 # external apps shipped with linux-mint
213 hexchat
213 hexchat
214 gnome-calculator
214 gnome-calculator
215− ] config.environment.cinnamon.excludePackages);
215+ ] config.environment.cinnamon.excludePackages;
216 })
216 })
217 ];
217 ];
218}
218}
nixos/modules/services/x11/desktop-managers/enlightenment.nix+5
@@ -16,6 +16,10 @@ let
16in
16in
17
17
18{
18{
19+ meta = {
20+ maintainers = teams.enlightenment.members;
21+ };
22+
19 imports = [
23 imports = [
20 (mkRenamedOptionModule [ "services" "xserver" "desktopManager" "e19" "enable" ] [ "services" "xserver" "desktopManager" "enlightenment" "enable" ])
24 (mkRenamedOptionModule [ "services" "xserver" "desktopManager" "e19" "enable" ] [ "services" "xserver" "desktopManager" "enlightenment" "enable" ])
21 ];
25 ];
@@ -92,6 +96,7 @@ in
92
96
93 services.udisks2.enable = true;
97 services.udisks2.enable = true;
94 services.upower.enable = config.powerManagement.enable;
98 services.upower.enable = config.powerManagement.enable;
99+ services.xserver.libinput.enable = mkDefault true;
95
100
96 services.dbus.packages = [ e.efl ];
101 services.dbus.packages = [ e.efl ];
97
102
nixos/modules/services/x11/desktop-managers/gnome.nix+33−10
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, pkgs, utils, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -22,6 +22,9 @@ let
22 favorite-apps=[ 'org.gnome.Epiphany.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Photos.desktop', 'org.gnome.Nautilus.desktop' ]
22 favorite-apps=[ 'org.gnome.Epiphany.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Photos.desktop', 'org.gnome.Nautilus.desktop' ]
23 '';
23 '';
24
24
25+ nixos-background-ligtht = pkgs.nixos-artwork.wallpapers.simple-blue;
26+ nixos-background-dark = pkgs.nixos-artwork.wallpapers.simple-dark-gray;
27+
25 nixos-gsettings-desktop-schemas = let
28 nixos-gsettings-desktop-schemas = let
26 defaultPackages = with pkgs; [ gsettings-desktop-schemas gnome.gnome-shell ];
29 defaultPackages = with pkgs; [ gsettings-desktop-schemas gnome.gnome-shell ];
27 in
30 in
@@ -42,10 +45,11 @@ let
42 chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides
45 chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides
43 cat - > $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/nixos-defaults.gschema.override <<- EOF
46 cat - > $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/nixos-defaults.gschema.override <<- EOF
44 [org.gnome.desktop.background]
47 [org.gnome.desktop.background]
45− picture-uri='file://${pkgs.nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}'
48+ picture-uri='file://${nixos-background-ligtht.gnomeFilePath}'
49+ picture-uri-dark='file://${nixos-background-dark.gnomeFilePath}'
46
50
47 [org.gnome.desktop.screensaver]
51 [org.gnome.desktop.screensaver]
48− picture-uri='file://${pkgs.nixos-artwork.wallpapers.simple-dark-gray-bottom.gnomeFilePath}'
52+ picture-uri='file://${nixos-background-dark.gnomeFilePath}'
49
53
50 ${cfg.favoriteAppsOverride}
54 ${cfg.favoriteAppsOverride}
51
55
@@ -55,6 +59,26 @@ let
55 ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/
59 ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/
56 '';
60 '';
57
61
62+ nixos-background-info = pkgs.writeTextFile rec {
63+ name = "nixos-background-info";
64+ text = ''
65+ <?xml version="1.0"?>
66+ <!DOCTYPE wallpapers SYSTEM "gnome-wp-list.dtd">
67+ <wallpapers>
68+ <wallpaper deleted="false">
69+ <name>Blobs</name>
70+ <filename>${nixos-background-ligtht.gnomeFilePath}</filename>
71+ <filename-dark>${nixos-background-dark.gnomeFilePath}</filename-dark>
72+ <options>zoom</options>
73+ <shade_type>solid</shade_type>
74+ <pcolor>#3a4ba0</pcolor>
75+ <scolor>#2f302f</scolor>
76+ </wallpaper>
77+ </wallpapers>
78+ '';
79+ destination = "/share/gnome-background-properties/nixos.xml";
80+ };
81+
58 flashbackEnabled = cfg.flashback.enableMetacity || length cfg.flashback.customSessions > 0;
82 flashbackEnabled = cfg.flashback.enableMetacity || length cfg.flashback.customSessions > 0;
59 flashbackWms = optional cfg.flashback.enableMetacity {
83 flashbackWms = optional cfg.flashback.enableMetacity {
60 wmName = "metacity";
84 wmName = "metacity";
@@ -430,6 +454,7 @@ in
430 # Adapt from https://gitlab.gnome.org/GNOME/gnome-build-meta/blob/gnome-3-38/elements/core/meta-gnome-core-shell.bst
454 # Adapt from https://gitlab.gnome.org/GNOME/gnome-build-meta/blob/gnome-3-38/elements/core/meta-gnome-core-shell.bst
431 environment.systemPackages = with pkgs.gnome; [
455 environment.systemPackages = with pkgs.gnome; [
432 adwaita-icon-theme
456 adwaita-icon-theme
457+ nixos-background-info
433 gnome-backgrounds
458 gnome-backgrounds
434 gnome-bluetooth
459 gnome-bluetooth
435 gnome-color-manager
460 gnome-color-manager
@@ -438,8 +463,6 @@ in
438 gnome-shell-extensions
463 gnome-shell-extensions
439 gnome-themes-extra
464 gnome-themes-extra
440 pkgs.gnome-tour # GNOME Shell detects the .desktop file on first log-in.
465 pkgs.gnome-tour # GNOME Shell detects the .desktop file on first log-in.
441− pkgs.nixos-artwork.wallpapers.simple-dark-gray
442− pkgs.nixos-artwork.wallpapers.simple-dark-gray-bottom
443 pkgs.gnome-user-docs
466 pkgs.gnome-user-docs
444 pkgs.orca
467 pkgs.orca
445 pkgs.glib # for gsettings
468 pkgs.glib # for gsettings
@@ -455,7 +478,7 @@ in
455 (mkIf serviceCfg.core-utilities.enable {
478 (mkIf serviceCfg.core-utilities.enable {
456 environment.systemPackages =
479 environment.systemPackages =
457 with pkgs.gnome;
480 with pkgs.gnome;
458− removePackagesByName
481+ utils.removePackagesByName
459 ([
482 ([
460 baobab
483 baobab
461 cheese
484 cheese
@@ -515,7 +538,7 @@ in
515 })
538 })
516
539
517 (mkIf serviceCfg.games.enable {
540 (mkIf serviceCfg.games.enable {
518− environment.systemPackages = (with pkgs.gnome; removePackagesByName [
541+ environment.systemPackages = with pkgs.gnome; utils.removePackagesByName [
519 aisleriot
542 aisleriot
520 atomix
543 atomix
521 five-or-more
544 five-or-more
@@ -536,12 +559,12 @@ in
536 quadrapassel
559 quadrapassel
537 swell-foop
560 swell-foop
538 tali
561 tali
539− ] config.environment.gnome.excludePackages);
562+ ] config.environment.gnome.excludePackages;
540 })
563 })
541
564
542 # Adapt from https://gitlab.gnome.org/GNOME/gnome-build-meta/-/blob/3.38.0/elements/core/meta-gnome-core-developer-tools.bst
565 # Adapt from https://gitlab.gnome.org/GNOME/gnome-build-meta/-/blob/3.38.0/elements/core/meta-gnome-core-developer-tools.bst
543 (mkIf serviceCfg.core-developer-tools.enable {
566 (mkIf serviceCfg.core-developer-tools.enable {
544− environment.systemPackages = (with pkgs.gnome; removePackagesByName [
567+ environment.systemPackages = with pkgs.gnome; utils.removePackagesByName [
545 dconf-editor
568 dconf-editor
546 devhelp
569 devhelp
547 pkgs.gnome-builder
570 pkgs.gnome-builder
@@ -550,7 +573,7 @@ in
550 # in default configurations.
573 # in default configurations.
551 # https://github.com/NixOS/nixpkgs/issues/60908
574 # https://github.com/NixOS/nixpkgs/issues/60908
552 /* gnome-boxes */
575 /* gnome-boxes */
553− ] config.environment.gnome.excludePackages);
576+ ] config.environment.gnome.excludePackages;
554
577
555 services.sysprof.enable = notExcluded pkgs.sysprof;
578 services.sysprof.enable = notExcluded pkgs.sysprof;
556 })
579 })
nixos/modules/services/x11/desktop-managers/lumina.nix+4
@@ -10,6 +10,10 @@ let
10in
10in
11
11
12{
12{
13+ meta = {
14+ maintainers = teams.lumina.members;
15+ };
16+
13 options = {
17 options = {
14
18
15 services.xserver.desktopManager.lumina.enable = mkOption {
19 services.xserver.desktopManager.lumina.enable = mkOption {
nixos/modules/services/x11/desktop-managers/lxqt.nix+11−2
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, pkgs, utils, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -9,6 +9,10 @@ let
9in
9in
10
10
11{
11{
12+ meta = {
13+ maintainers = teams.lxqt.members;
14+ };
15+
12 options = {
16 options = {
13
17
14 services.xserver.desktopManager.lxqt.enable = mkOption {
18 services.xserver.desktopManager.lxqt.enable = mkOption {
@@ -51,7 +55,7 @@ in
51 environment.systemPackages =
55 environment.systemPackages =
52 pkgs.lxqt.preRequisitePackages ++
56 pkgs.lxqt.preRequisitePackages ++
53 pkgs.lxqt.corePackages ++
57 pkgs.lxqt.corePackages ++
54− (pkgs.gnome.removePackagesByName
58+ (utils.removePackagesByName
55 pkgs.lxqt.optionalPackages
59 pkgs.lxqt.optionalPackages
56 config.environment.lxqt.excludePackages);
60 config.environment.lxqt.excludePackages);
57
61
@@ -62,6 +66,11 @@ in
62 services.gvfs.enable = true;
66 services.gvfs.enable = true;
63
67
64 services.upower.enable = config.powerManagement.enable;
68 services.upower.enable = config.powerManagement.enable;
69+
70+ services.xserver.libinput.enable = mkDefault true;
71+
72+ xdg.portal.enable = true;
73+ xdg.portal.extraPortals = [ pkgs.lxqt.xdg-desktop-portal-lxqt ];
65 };
74 };
66
75
67}
76}
nixos/modules/services/x11/desktop-managers/mate.nix+5−32
@@ -1,20 +1,9 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, pkgs, utils, ... }:
2
2
3with lib;
3with lib;
4
4
5let
5let
6
6
7− addToXDGDirs = p: ''
8− if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then
9− export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name}
10− fi
11−
12− if [ -d "${p}/lib/girepository-1.0" ]; then
13− export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0
14− export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib
15− fi
16− '';
17−
18 xcfg = config.services.xserver;
7 xcfg = config.services.xserver;
19 cfg = xcfg.desktopManager.mate;
8 cfg = xcfg.desktopManager.mate;
20
9
@@ -48,24 +37,8 @@ in
48 pkgs.mate.mate-session-manager
37 pkgs.mate.mate-session-manager
49 ];
38 ];
50
39
51− services.xserver.displayManager.sessionCommands = ''
52− if test "$XDG_CURRENT_DESKTOP" = "MATE"; then
53− export XDG_MENU_PREFIX=mate-
54−
55− # Let caja find extensions
40+ # Let caja find extensions
56− export CAJA_EXTENSION_DIRS=$CAJA_EXTENSION_DIRS''${CAJA_EXTENSION_DIRS:+:}${config.system.path}/lib/caja/extensions-2.0
41+ environment.sessionVariables.CAJA_EXTENSION_DIRS = [ "${config.system.path}/lib/caja/extensions-2.0" ];
57−
58− # Let caja extensions find gsettings schemas
59− ${concatMapStrings (p: ''
60− if [ -d "${p}/lib/caja/extensions-2.0" ]; then
61− ${addToXDGDirs p}
62− fi
63− '') config.environment.systemPackages}
64−
65− # Add mate-control-center paths to some XDG variables because its schemas are needed by mate-settings-daemon, and mate-settings-daemon is a dependency for mate-control-center (that is, they are mutually recursive)
66− ${addToXDGDirs pkgs.mate.mate-control-center}
67− fi
68− '';
69
42
70 # Let mate-panel find applets
43 # Let mate-panel find applets
71 environment.sessionVariables."MATE_PANEL_APPLETS_DIR" = "${config.system.path}/share/mate-panel/applets";
44 environment.sessionVariables."MATE_PANEL_APPLETS_DIR" = "${config.system.path}/share/mate-panel/applets";
@@ -74,7 +47,7 @@ in
74 # Debugging
47 # Debugging
75 environment.sessionVariables.MATE_SESSION_DEBUG = mkIf cfg.debug "1";
48 environment.sessionVariables.MATE_SESSION_DEBUG = mkIf cfg.debug "1";
76
49
77− environment.systemPackages = pkgs.gnome.removePackagesByName
50+ environment.systemPackages = utils.removePackagesByName
78 (pkgs.mate.basePackages ++
51 (pkgs.mate.basePackages ++
79 pkgs.mate.extraPackages ++
52 pkgs.mate.extraPackages ++
80 [
53 [
@@ -83,7 +56,6 @@ in
83 pkgs.gtk3.out
56 pkgs.gtk3.out
84 pkgs.shared-mime-info
57 pkgs.shared-mime-info
85 pkgs.xdg-user-dirs # Update user dirs as described in https://freedesktop.org/wiki/Software/xdg-user-dirs/
58 pkgs.xdg-user-dirs # Update user dirs as described in https://freedesktop.org/wiki/Software/xdg-user-dirs/
86− pkgs.mate.mate-settings-daemon
87 pkgs.yelp # for 'Contents' in 'Help' menus
59 pkgs.yelp # for 'Contents' in 'Help' menus
88 ])
60 ])
89 config.environment.mate.excludePackages;
61 config.environment.mate.excludePackages;
@@ -101,6 +73,7 @@ in
101 services.udev.packages = [ pkgs.mate.mate-settings-daemon ];
73 services.udev.packages = [ pkgs.mate.mate-settings-daemon ];
102 services.gvfs.enable = true;
74 services.gvfs.enable = true;
103 services.upower.enable = config.powerManagement.enable;
75 services.upower.enable = config.powerManagement.enable;
76+ services.xserver.libinput.enable = mkDefault true;
104
77
105 security.pam.services.mate-screensaver.unixAuth = true;
78 security.pam.services.mate-screensaver.unixAuth = true;
106
79
nixos/modules/services/x11/desktop-managers/none.nix+44−5
@@ -1,7 +1,46 @@
1+{ config, lib, pkgs, ... }:
2+with lib;
3+let
4+ runXdgAutostart = config.services.xserver.desktopManager.runXdgAutostartIfNone;
5+in
1{
6{
7+ options = {
2− services.xserver.desktopManager.session =
8+ services.xserver.desktopManager.runXdgAutostartIfNone = mkOption {
9+ type = types.bool;
10+ default = false;
11+ description = ''
12+ Whether to run XDG autostart files for sessions without a desktop manager
13+ (with only a window manager), these sessions usually don't handle XDG
14+ autostart files by default.
15+
16+ Some services like <option>i18n.inputMethod</option> and
17+ <option>service.earlyoom</option> use XDG autostart files to start.
18+ If this option is not set to <literal>true</literal> and you are using
19+ a window manager without a desktop manager, you need to manually start
20+ them or running <package>dex</package> somewhere.
21+ '';
22+ };
23+ };
24+
25+ config = mkMerge [
26+ {
27+ services.xserver.desktopManager.session = [
28+ {
3− [ { name = "none";
29+ name = "none";
4− start = "";
30+ start = optionalString runXdgAutostart ''
31+ /run/current-system/systemd/bin/systemctl --user start xdg-autostart-if-no-desktop-manager.target
32+ '';
33+ }
34+ ];
35+ }
36+ (mkIf runXdgAutostart {
37+ systemd.user.targets.xdg-autostart-if-no-desktop-manager = {
38+ description = "Run XDG autostart files";
39+ # From `plasma-workspace`, `share/systemd/user/plasma-workspace@.target`.
40+ requires = [ "xdg-desktop-autostart.target" "graphical-session.target" ];
41+ before = [ "xdg-desktop-autostart.target" "graphical-session.target" ];
42+ bindsTo = [ "graphical-session.target" ];
5− }
43+ };
44+ })
6− ];
45+ ];
7}
46}
nixos/modules/services/x11/desktop-managers/pantheon.nix+3−3
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, utils, pkgs, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -214,7 +214,7 @@ in
214 elementary-settings-daemon
214 elementary-settings-daemon
215 pantheon-agent-geoclue2
215 pantheon-agent-geoclue2
216 pantheon-agent-polkit
216 pantheon-agent-polkit
217− ]) ++ (gnome.removePackagesByName [
217+ ]) ++ (utils.removePackagesByName [
218 gnome.gnome-font-viewer
218 gnome.gnome-font-viewer
219 gnome.gnome-settings-daemon338
219 gnome.gnome-settings-daemon338
220 ] config.environment.pantheon.excludePackages);
220 ] config.environment.pantheon.excludePackages);
@@ -272,7 +272,7 @@ in
272 })
272 })
273
273
274 (mkIf serviceCfg.apps.enable {
274 (mkIf serviceCfg.apps.enable {
275− environment.systemPackages = with pkgs.pantheon; pkgs.gnome.removePackagesByName ([
275+ environment.systemPackages = with pkgs.pantheon; utils.removePackagesByName ([
276 elementary-calculator
276 elementary-calculator
277 elementary-calendar
277 elementary-calendar
278 elementary-camera
278 elementary-camera
nixos/modules/services/x11/desktop-managers/pantheon.xml+3−3
@@ -3,7 +3,7 @@
3 xml:id="chap-pantheon">
3 xml:id="chap-pantheon">
4 <title>Pantheon Desktop</title>
4 <title>Pantheon Desktop</title>
5 <para>
5 <para>
6− Pantheon is the desktop environment created for the elementary OS distribution. It is written from scratch in Vala, utilizing GNOME technologies with GTK 3 and Granite.
6+ Pantheon is the desktop environment created for the elementary OS distribution. It is written from scratch in Vala, utilizing GNOME technologies with GTK and Granite.
7 </para>
7 </para>
8 <section xml:id="sec-pantheon-enable">
8 <section xml:id="sec-pantheon-enable">
9 <title>Enabling Pantheon</title>
9 <title>Enabling Pantheon</title>
@@ -89,9 +89,9 @@ switchboard-with-plugs.override {
89 </para>
89 </para>
90 </listitem>
90 </listitem>
91 </varlistentry>
91 </varlistentry>
92− <varlistentry xml:id="sec-pantheon-faq-gnome3-and-pantheon">
92+ <varlistentry xml:id="sec-pantheon-faq-gnome-and-pantheon">
93 <term>
93 <term>
94− I cannot enable both GNOME 3 and Pantheon.
94+ I cannot enable both GNOME and Pantheon.
95 </term>
95 </term>
96 <listitem>
96 <listitem>
97 <para>
97 <para>
nixos/modules/services/x11/desktop-managers/xfce.nix+8−1
@@ -66,6 +66,12 @@ in
66 default = true;
66 default = true;
67 description = "Enable the XFWM (default) window manager.";
67 description = "Enable the XFWM (default) window manager.";
68 };
68 };
69+
70+ enableScreensaver = mkOption {
71+ type = types.bool;
72+ default = true;
73+ description = "Enable the XFCE screensaver.";
74+ };
69 };
75 };
70 };
76 };
71
77
@@ -122,7 +128,7 @@ in
122 ] ++ optionals (!cfg.noDesktop) [
128 ] ++ optionals (!cfg.noDesktop) [
123 xfce4-panel
129 xfce4-panel
124 xfdesktop
130 xfdesktop
125− ];
131+ ] ++ optional cfg.enableScreensaver xfce4-screensaver;
126
132
127 environment.pathsToLink = [
133 environment.pathsToLink = [
128 "/share/xfce4"
134 "/share/xfce4"
@@ -168,5 +174,6 @@ in
168 xfce4-notifyd
174 xfce4-notifyd
169 ];
175 ];
170
176
177+ security.pam.services.xfce4-screensaver.unixAuth = cfg.enableScreensaver;
171 };
178 };
172}
179}
nixos/modules/services/x11/window-managers/qtile.nix+11−4
@@ -7,19 +7,26 @@ let
7in
7in
8
8
9{
9{
10− options = {
11− services.xserver.windowManager.qtile.enable = mkEnableOption "qtile";
10+ options.services.xserver.windowManager.qtile = {
11+ enable = mkEnableOption "qtile";
12+
13+ package = mkPackageOption pkgs "qtile" { };
12 };
14 };
13
15
14 config = mkIf cfg.enable {
16 config = mkIf cfg.enable {
15 services.xserver.windowManager.session = [{
17 services.xserver.windowManager.session = [{
16 name = "qtile";
18 name = "qtile";
17 start = ''
19 start = ''
18− ${pkgs.qtile}/bin/qtile start &
20+ ${cfg.package}/bin/qtile start &
19 waitPID=$!
21 waitPID=$!
20 '';
22 '';
21 }];
23 }];
22
24
23− environment.systemPackages = [ pkgs.qtile ];
25+ environment.systemPackages = [
26+ # pkgs.qtile is currently a buildenv of qtile and its dependencies.
27+ # For userland commands, we want the underlying package so that
28+ # packages such as python don't bleed into userland and overwrite intended behavior.
29+ (cfg.package.unwrapped or cfg.package)
30+ ];
24 };
31 };
25}
32}
nixos/modules/services/x11/xserver.nix+10−3
@@ -1,4 +1,4 @@
1−{ config, lib, pkgs, ... }:
1+{ config, lib, utils, pkgs, ... }:
2
2
3with lib;
3with lib;
4
4
@@ -181,6 +181,13 @@ in
181 '';
181 '';
182 };
182 };
183
183
184+ excludePackages = mkOption {
185+ default = [];
186+ example = literalExpression "[ pkgs.xterm ]";
187+ type = types.listOf types.package;
188+ description = "Which X11 packages to exclude from the default environment";
189+ };
190+
184 exportConfiguration = mkOption {
191 exportConfiguration = mkOption {
185 type = types.bool;
192 type = types.bool;
186 default = false;
193 default = false;
@@ -655,7 +662,7 @@ in
655 ${cfgPath}.source = xorg.xf86inputevdev.out + "/share" + cfgPath;
662 ${cfgPath}.source = xorg.xf86inputevdev.out + "/share" + cfgPath;
656 });
663 });
657
664
658− environment.systemPackages =
665+ environment.systemPackages = utils.removePackagesByName
659 [ xorg.xorgserver.out
666 [ xorg.xorgserver.out
660 xorg.xrandr
667 xorg.xrandr
661 xorg.xrdb
668 xorg.xrdb
@@ -671,7 +678,7 @@ in
671 pkgs.xdg-utils
678 pkgs.xdg-utils
672 xorg.xf86inputevdev.out # get evdev.4 man page
679 xorg.xf86inputevdev.out # get evdev.4 man page
673 pkgs.nixos-icons # needed for gnome and pantheon about dialog, nixos-manual and maybe more
680 pkgs.nixos-icons # needed for gnome and pantheon about dialog, nixos-manual and maybe more
674− ]
681+ ] config.services.xserver.excludePackages
675 ++ optional (elem "virtualbox" cfg.videoDrivers) xorg.xrefresh;
682 ++ optional (elem "virtualbox" cfg.videoDrivers) xorg.xrefresh;
676
683
677 environment.pathsToLink = [ "/share/X11" ];
684 environment.pathsToLink = [ "/share/X11" ];
nixos/modules/system/activation/switch-to-configuration.pl+12
@@ -1,5 +1,17 @@
1#! @perl@/bin/perl
1#! @perl@/bin/perl
2
2
3+# Issue #166838 uncovered a situation in which a configuration not suitable
4+# for the target architecture caused a cryptic error message instead of
5+# a clean failure. Due to this mismatch, the perl interpreter in the shebang
6+# line wasn't able to be executed, causing this script to be misinterpreted
7+# as a shell script.
8+#
9+# Let's detect this situation to give a more meaningful error
10+# message. The following two lines are carefully written to be both valid Perl
11+# and Bash.
12+printf "Perl script erroneously interpreted as shell script,\ndoes target platform match nixpkgs.crossSystem platform?\n" && exit 1
13+ if 0;
14+
3use strict;
15use strict;
4use warnings;
16use warnings;
5use Config::IniFiles;
17use Config::IniFiles;
nixos/modules/system/activation/top-level.nix+12−5
@@ -55,11 +55,18 @@ let
55 substituteInPlace $out/dry-activate --subst-var out
55 substituteInPlace $out/dry-activate --subst-var out
56 chmod u+x $out/activate $out/dry-activate
56 chmod u+x $out/activate $out/dry-activate
57 unset activationScript dryActivationScript
57 unset activationScript dryActivationScript
58− ${pkgs.stdenv.shellDryRun} $out/activate
59− ${pkgs.stdenv.shellDryRun} $out/dry-activate
60
58
59+ ${if config.boot.initrd.systemd.enable then ''
61− cp ${config.system.build.bootStage2} $out/init
60+ cp ${config.system.build.bootStage2} $out/prepare-root
61+ substituteInPlace $out/prepare-root --subst-var-by systemConfig $out
62+ # This must not be a symlink or the abs_path of the grub builder for the tests
63+ # will resolve the symlink and we end up with a path that doesn't point to a
64+ # system closure.
65+ cp "$systemd/lib/systemd/systemd" $out/init
66+ '' else ''
67+ cp ${config.system.build.bootStage2} $out/init
62− substituteInPlace $out/init --subst-var-by systemConfig $out
68+ substituteInPlace $out/init --subst-var-by systemConfig $out
69+ ''}
63
70
64 ln -s ${config.system.build.etc}/etc $out/etc
71 ln -s ${config.system.build.etc}/etc $out/etc
65 ln -s ${config.system.path} $out/sw
72 ln -s ${config.system.path} $out/sw
@@ -156,7 +163,7 @@ in
156
163
157 specialisation = mkOption {
164 specialisation = mkOption {
158 default = {};
165 default = {};
159− example = lib.literalExpression "{ fewJobsManyCores.configuration = { nix.settings = { core = 0; max-jobs = 1; }; }";
166+ example = lib.literalExpression "{ fewJobsManyCores.configuration = { nix.settings = { core = 0; max-jobs = 1; }; }; }";
160 description = ''
167 description = ''
161 Additional configurations to build. If
168 Additional configurations to build. If
162 <literal>inheritParentConfig</literal> is true, the system
169 <literal>inheritParentConfig</literal> is true, the system
nixos/modules/system/boot/loader/grub/grub.nix+26
@@ -44,6 +44,8 @@ let
44 { splashImage = f cfg.splashImage;
44 { splashImage = f cfg.splashImage;
45 splashMode = f cfg.splashMode;
45 splashMode = f cfg.splashMode;
46 backgroundColor = f cfg.backgroundColor;
46 backgroundColor = f cfg.backgroundColor;
47+ entryOptions = f cfg.entryOptions;
48+ subEntryOptions = f cfg.subEntryOptions;
47 grub = f grub;
49 grub = f grub;
48 grubTarget = f (grub.grubTarget or "");
50 grubTarget = f (grub.grubTarget or "");
49 shell = "${pkgs.runtimeShell}";
51 shell = "${pkgs.runtimeShell}";
@@ -448,6 +450,30 @@ in
448 '';
450 '';
449 };
451 };
450
452
453+ entryOptions = mkOption {
454+ default = "--class nixos --unrestricted";
455+ type = types.nullOr types.str;
456+ description = ''
457+ Options applied to the primary NixOS menu entry.
458+
459+ <note><para>
460+ This options has no effect for GRUB 1.
461+ </para></note>
462+ '';
463+ };
464+
465+ subEntryOptions = mkOption {
466+ default = "--class nixos";
467+ type = types.nullOr types.str;
468+ description = ''
469+ Options applied to the secondary NixOS submenu entry.
470+
471+ <note><para>
472+ This options has no effect for GRUB 1.
473+ </para></note>
474+ '';
475+ };
476+
451 theme = mkOption {
477 theme = mkOption {
452 type = types.nullOr types.path;
478 type = types.nullOr types.path;
453 example = literalExpression "pkgs.nixos-grub2-theme";
479 example = literalExpression "pkgs.nixos-grub2-theme";
nixos/modules/system/boot/loader/grub/install-grub.pl+5−3
@@ -64,6 +64,8 @@ my $extraEntries = get("extraEntries");
64my $extraEntriesBeforeNixOS = get("extraEntriesBeforeNixOS") eq "true";
64my $extraEntriesBeforeNixOS = get("extraEntriesBeforeNixOS") eq "true";
65my $splashImage = get("splashImage");
65my $splashImage = get("splashImage");
66my $splashMode = get("splashMode");
66my $splashMode = get("splashMode");
67+my $entryOptions = get("entryOptions");
68+my $subEntryOptions = get("subEntryOptions");
67my $backgroundColor = get("backgroundColor");
69my $backgroundColor = get("backgroundColor");
68my $configurationLimit = int(get("configurationLimit"));
70my $configurationLimit = int(get("configurationLimit"));
69my $copyKernels = get("copyKernels") eq "true";
71my $copyKernels = get("copyKernels") eq "true";
@@ -509,7 +511,7 @@ sub addEntry {
509# Add default entries.
511# Add default entries.
510$conf .= "$extraEntries\n" if $extraEntriesBeforeNixOS;
512$conf .= "$extraEntries\n" if $extraEntriesBeforeNixOS;
511
513
512−addEntry("NixOS - Default", $defaultConfig, "--unrestricted");
514+addEntry("NixOS - Default", $defaultConfig, $entryOptions);
513
515
514$conf .= "$extraEntries\n" unless $extraEntriesBeforeNixOS;
516$conf .= "$extraEntries\n" unless $extraEntriesBeforeNixOS;
515
517
@@ -546,7 +548,7 @@ sub addProfile {
546 my ($profile, $description) = @_;
548 my ($profile, $description) = @_;
547
549
548 # Add entries for all generations of this profile.
550 # Add entries for all generations of this profile.
549− $conf .= "submenu \"$description\" {\n" if $grubVersion == 2;
551+ $conf .= "submenu \"$description\" --class submenu {\n" if $grubVersion == 2;
550
552
551 sub nrFromGen { my ($x) = @_; $x =~ /\/\w+-(\d+)-link/; return $1; }
553 sub nrFromGen { my ($x) = @_; $x =~ /\/\w+-(\d+)-link/; return $1; }
552
554
@@ -566,7 +568,7 @@ sub addProfile {
566 -e "$link/nixos-version"
568 -e "$link/nixos-version"
567 ? readFile("$link/nixos-version")
569 ? readFile("$link/nixos-version")
568 : basename((glob(dirname(Cwd::abs_path("$link/kernel")) . "/lib/modules/*"))[0]);
570 : basename((glob(dirname(Cwd::abs_path("$link/kernel")) . "/lib/modules/*"))[0]);
569− addEntry("NixOS - Configuration " . nrFromGen($link) . " ($date - $version)", $link);
571+ addEntry("NixOS - Configuration " . nrFromGen($link) . " ($date - $version)", $link, $subEntryOptions);
570 }
572 }
571
573
572 $conf .= "}\n" if $grubVersion == 2;
574 $conf .= "}\n" if $grubVersion == 2;
nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix+1−1
@@ -33,7 +33,7 @@ let
33 netbootxyz = if cfg.netbootxyz.enable then pkgs.netbootxyz-efi else "";
33 netbootxyz = if cfg.netbootxyz.enable then pkgs.netbootxyz-efi else "";
34
34
35 copyExtraFiles = pkgs.writeShellScript "copy-extra-files" ''
35 copyExtraFiles = pkgs.writeShellScript "copy-extra-files" ''
36− empty_file=$(mktemp)
36+ empty_file=$(${pkgs.coreutils}/bin/mktemp)
37
37
38 ${concatStrings (mapAttrsToList (n: v: ''
38 ${concatStrings (mapAttrsToList (n: v: ''
39 ${pkgs.coreutils}/bin/install -Dp "${v}" "${efi.efiSysMountPoint}/"${escapeShellArg n}
39 ${pkgs.coreutils}/bin/install -Dp "${v}" "${efi.efiSysMountPoint}/"${escapeShellArg n}
nixos/modules/system/boot/luksroot.nix+73−6
@@ -1,10 +1,11 @@
1−{ config, lib, pkgs, ... }:
1+{ config, options, lib, pkgs, ... }:
2
2
3with lib;
3with lib;
4
4
5let
5let
6 luks = config.boot.initrd.luks;
6 luks = config.boot.initrd.luks;
7 kernelPackages = config.boot.kernelPackages;
7 kernelPackages = config.boot.kernelPackages;
8+ defaultPrio = (mkOptionDefault {}).priority;
8
9
9 commonFunctions = ''
10 commonFunctions = ''
10 die() {
11 die() {
@@ -474,6 +475,16 @@ let
474 preLVM = filterAttrs (n: v: v.preLVM) luks.devices;
475 preLVM = filterAttrs (n: v: v.preLVM) luks.devices;
475 postLVM = filterAttrs (n: v: !v.preLVM) luks.devices;
476 postLVM = filterAttrs (n: v: !v.preLVM) luks.devices;
476
477
478+ stage1Crypttab = pkgs.writeText "initrd-crypttab" (lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: let
479+ opts = v.crypttabExtraOpts
480+ ++ optional v.allowDiscards "discard"
481+ ++ optionals v.bypassWorkqueues [ "no-read-workqueue" "no-write-workqueue" ]
482+ ++ optional (v.header != null) "header=${v.header}"
483+ ++ optional (v.keyFileOffset != null) "keyfile-offset=${v.keyFileOffset}"
484+ ++ optional (v.keyFileSize != null) "keyfile-size=${v.keyFileSize}"
485+ ;
486+ in "${n} ${v.device} ${if v.keyFile == null then "-" else v.keyFile} ${lib.concatStringsSep "," opts}") luks.devices));
487+
477in
488in
478{
489{
479 imports = [
490 imports = [
@@ -802,6 +813,18 @@ in
802 Commands that should be run right after we have mounted our LUKS device.
813 Commands that should be run right after we have mounted our LUKS device.
803 '';
814 '';
804 };
815 };
816+
817+ crypttabExtraOpts = mkOption {
818+ type = with types; listOf singleLineStr;
819+ default = [];
820+ example = [ "_netdev" ];
821+ visible = false;
822+ description = ''
823+ Only used with systemd stage 1.
824+
825+ Extra options to append to the last column of the generated crypttab file.
826+ '';
827+ };
805 };
828 };
806 }));
829 }));
807 };
830 };
@@ -853,6 +876,31 @@ in
853 -> versionAtLeast kernelPackages.kernel.version "5.9";
876 -> versionAtLeast kernelPackages.kernel.version "5.9";
854 message = "boot.initrd.luks.devices.<name>.bypassWorkqueues is not supported for kernels older than 5.9";
877 message = "boot.initrd.luks.devices.<name>.bypassWorkqueues is not supported for kernels older than 5.9";
855 }
878 }
879+
880+ { assertion = config.boot.initrd.systemd.enable -> all (dev: !dev.fallbackToPassword) (attrValues luks.devices);
881+ message = "boot.initrd.luks.devices.<name>.fallbackToPassword is implied by systemd stage 1.";
882+ }
883+ { assertion = config.boot.initrd.systemd.enable -> all (dev: dev.preLVM) (attrValues luks.devices);
884+ message = "boot.initrd.luks.devices.<name>.preLVM is not used by systemd stage 1.";
885+ }
886+ { assertion = config.boot.initrd.systemd.enable -> options.boot.initrd.luks.reusePassphrases.highestPrio == defaultPrio;
887+ message = "boot.initrd.luks.reusePassphrases has no effect with systemd stage 1.";
888+ }
889+ { assertion = config.boot.initrd.systemd.enable -> all (dev: dev.preOpenCommands == "" && dev.postOpenCommands == "") (attrValues luks.devices);
890+ message = "boot.initrd.luks.devices.<name>.preOpenCommands and postOpenCommands is not supported by systemd stage 1. Please bind a service to cryptsetup.target or cryptsetup-pre.target instead.";
891+ }
892+ # TODO
893+ { assertion = config.boot.initrd.systemd.enable -> !luks.gpgSupport;
894+ message = "systemd stage 1 does not support GPG smartcards yet.";
895+ }
896+ # TODO
897+ { assertion = config.boot.initrd.systemd.enable -> !luks.fido2Support;
898+ message = "systemd stage 1 does not support FIDO2 yet.";
899+ }
900+ # TODO
901+ { assertion = config.boot.initrd.systemd.enable -> !luks.yubikeySupport;
902+ message = "systemd stage 1 does not support Yubikeys yet.";
903+ }
856 ];
904 ];
857
905
858 # actually, sbp2 driver is the one enabling the DMA attack, but this needs to be tested
906 # actually, sbp2 driver is the one enabling the DMA attack, but this needs to be tested
@@ -867,7 +915,7 @@ in
867 ++ (if builtins.elem "xts" luks.cryptoModules then ["ecb"] else []);
915 ++ (if builtins.elem "xts" luks.cryptoModules then ["ecb"] else []);
868
916
869 # copy the cryptsetup binary and it's dependencies
917 # copy the cryptsetup binary and it's dependencies
870− boot.initrd.extraUtilsCommands = ''
918+ boot.initrd.extraUtilsCommands = mkIf (!config.boot.initrd.systemd.enable) ''
871 copy_bin_and_libs ${pkgs.cryptsetup}/bin/cryptsetup
919 copy_bin_and_libs ${pkgs.cryptsetup}/bin/cryptsetup
872 copy_bin_and_libs ${askPass}/bin/cryptsetup-askpass
920 copy_bin_and_libs ${askPass}/bin/cryptsetup-askpass
873 sed -i s,/bin/sh,$out/bin/sh, $out/bin/cryptsetup-askpass
921 sed -i s,/bin/sh,$out/bin/sh, $out/bin/cryptsetup-askpass
@@ -915,7 +963,7 @@ in
915 ''}
963 ''}
916 '';
964 '';
917
965
918− boot.initrd.extraUtilsCommandsTest = ''
966+ boot.initrd.extraUtilsCommandsTest = mkIf (!config.boot.initrd.systemd.enable) ''
919 $out/bin/cryptsetup --version
967 $out/bin/cryptsetup --version
920 ${optionalString luks.yubikeySupport ''
968 ${optionalString luks.yubikeySupport ''
921 $out/bin/ykchalresp -V
969 $out/bin/ykchalresp -V
@@ -932,9 +980,28 @@ in
932 ''}
980 ''}
933 '';
981 '';
934
982
983+ boot.initrd.systemd = {
984+ contents."/etc/crypttab".source = stage1Crypttab;
985+
986+ extraBin.systemd-cryptsetup = "${config.boot.initrd.systemd.package}/lib/systemd/systemd-cryptsetup";
987+
988+ additionalUpstreamUnits = [
989+ "cryptsetup-pre.target"
990+ "cryptsetup.target"
991+ "remote-cryptsetup.target"
992+ ];
993+ storePaths = [
994+ "${config.boot.initrd.systemd.package}/lib/systemd/systemd-cryptsetup"
995+ "${config.boot.initrd.systemd.package}/lib/systemd/system-generators/systemd-cryptsetup-generator"
996+ ];
997+
998+ };
999+ # We do this because we need the udev rules from the package
1000+ boot.initrd.services.lvm.enable = true;
1001+
935− boot.initrd.preFailCommands = postCommands;
1002+ boot.initrd.preFailCommands = mkIf (!config.boot.initrd.systemd.enable) postCommands;
936− boot.initrd.preLVMCommands = commonFunctions + preCommands + concatStrings (mapAttrsToList openCommand preLVM) + postCommands;
1003+ boot.initrd.preLVMCommands = mkIf (!config.boot.initrd.systemd.enable) (commonFunctions + preCommands + concatStrings (mapAttrsToList openCommand preLVM) + postCommands);
937− boot.initrd.postDeviceCommands = commonFunctions + preCommands + concatStrings (mapAttrsToList openCommand postLVM) + postCommands;
1004+ boot.initrd.postDeviceCommands = mkIf (!config.boot.initrd.systemd.enable) (commonFunctions + preCommands + concatStrings (mapAttrsToList openCommand postLVM) + postCommands);
938
1005
939 environment.systemPackages = [ pkgs.cryptsetup ];
1006 environment.systemPackages = [ pkgs.cryptsetup ];
940 };
1007 };
nixos/modules/system/boot/networkd.nix+139−1
@@ -10,6 +10,36 @@ let
10
10
11 check = {
11 check = {
12
12
13+ global = {
14+ sectionNetwork = checkUnitConfig "Network" [
15+ (assertOnlyFields [
16+ "SpeedMeter"
17+ "SpeedMeterIntervalSec"
18+ "ManageForeignRoutingPolicyRules"
19+ "ManageForeignRoutes"
20+ "RouteTable"
21+ ])
22+ (assertValueOneOf "SpeedMeter" boolValues)
23+ (assertInt "SpeedMeterIntervalSec")
24+ (assertValueOneOf "ManageForeignRoutingPolicyRules" boolValues)
25+ (assertValueOneOf "ManageForeignRoutes" boolValues)
26+ ];
27+
28+ sectionDHCPv4 = checkUnitConfig "DHCPv4" [
29+ (assertOnlyFields [
30+ "DUIDType"
31+ "DUIDRawData"
32+ ])
33+ ];
34+
35+ sectionDHCPv6 = checkUnitConfig "DHCPv6" [
36+ (assertOnlyFields [
37+ "DUIDType"
38+ "DUIDRawData"
39+ ])
40+ ];
41+ };
42+
13 link = {
43 link = {
14
44
15 sectionLink = checkUnitConfig "Link" [
45 sectionLink = checkUnitConfig "Link" [
@@ -281,6 +311,8 @@ let
281 "PrivateKeyFile"
311 "PrivateKeyFile"
282 "ListenPort"
312 "ListenPort"
283 "FirewallMark"
313 "FirewallMark"
314+ "RouteTable"
315+ "RouteMetric"
284 ])
316 ])
285 (assertInt "FirewallMark")
317 (assertInt "FirewallMark")
286 (assertRange "FirewallMark" 1 4294967295)
318 (assertRange "FirewallMark" 1 4294967295)
@@ -296,6 +328,8 @@ let
296 "AllowedIPs"
328 "AllowedIPs"
297 "Endpoint"
329 "Endpoint"
298 "PersistentKeepalive"
330 "PersistentKeepalive"
331+ "RouteTable"
332+ "RouteMetric"
299 ])
333 ])
300 (assertInt "PersistentKeepalive")
334 (assertInt "PersistentKeepalive")
301 (assertRange "PersistentKeepalive" 0 65535)
335 (assertRange "PersistentKeepalive" 0 65535)
@@ -867,6 +901,44 @@ let
867 };
901 };
868 };
902 };
869
903
904+ networkdOptions = {
905+ networkConfig = mkOption {
906+ default = {};
907+ example = { SpeedMeter = true; ManageForeignRoutingPolicyRules = false; };
908+ type = types.addCheck (types.attrsOf unitOption) check.global.sectionNetwork;
909+ description = ''
910+ Each attribute in this set specifies an option in the
911+ <literal>[Network]</literal> section of the networkd config.
912+ See <citerefentry><refentrytitle>networkd.conf</refentrytitle>
913+ <manvolnum>5</manvolnum></citerefentry> for details.
914+ '';
915+ };
916+
917+ dhcpV4Config = mkOption {
918+ default = {};
919+ example = { DUIDType = "vendor"; };
920+ type = types.addCheck (types.attrsOf unitOption) check.global.sectionDHCPv4;
921+ description = ''
922+ Each attribute in this set specifies an option in the
923+ <literal>[DHCPv4]</literal> section of the networkd config.
924+ See <citerefentry><refentrytitle>networkd.conf</refentrytitle>
925+ <manvolnum>5</manvolnum></citerefentry> for details.
926+ '';
927+ };
928+
929+ dhcpV6Config = mkOption {
930+ default = {};
931+ example = { DUIDType = "vendor"; };
932+ type = types.addCheck (types.attrsOf unitOption) check.global.sectionDHCPv6;
933+ description = ''
934+ Each attribute in this set specifies an option in the
935+ <literal>[DHCPv6]</literal> section of the networkd config.
936+ See <citerefentry><refentrytitle>networkd.conf</refentrytitle>
937+ <manvolnum>5</manvolnum></citerefentry> for details.
938+ '';
939+ };
940+ };
941+
870 linkOptions = commonNetworkOptions // {
942 linkOptions = commonNetworkOptions // {
871 # overwrite enable option from above
943 # overwrite enable option from above
872 enable = mkOption {
944 enable = mkOption {
@@ -1515,6 +1587,39 @@ let
1515 };
1587 };
1516 };
1588 };
1517
1589
1590+ networkdConfig = { config, ... }: {
1591+ options = {
1592+ routeTables = mkOption {
1593+ default = {};
1594+ example = { foo = 27; };
1595+ type = with types; attrsOf int;
1596+ description = ''
1597+ Defines route table names as an attrset of name to number.
1598+ See <citerefentry><refentrytitle>networkd.conf</refentrytitle>
1599+ <manvolnum>5</manvolnum></citerefentry> for details.
1600+ '';
1601+ };
1602+
1603+ addRouteTablesToIPRoute2 = mkOption {
1604+ default = true;
1605+ example = false;
1606+ type = types.bool;
1607+ description = ''
1608+ If true and routeTables are set, then the specified route tables
1609+ will also be installed into /etc/iproute2/rt_tables.
1610+ '';
1611+ };
1612+ };
1613+
1614+ config = {
1615+ networkConfig = optionalAttrs (config.routeTables != { }) {
1616+ RouteTable = mapAttrsToList
1617+ (name: number: "${name}:${toString number}")
1618+ config.routeTables;
1619+ };
1620+ };
1621+ };
1622+
1518 commonMatchText = def: optionalString (def.matchConfig != { }) ''
1623 commonMatchText = def: optionalString (def.matchConfig != { }) ''
1519 [Match]
1624 [Match]
1520 ${attrsToSection def.matchConfig}
1625 ${attrsToSection def.matchConfig}
@@ -1596,6 +1701,20 @@ let
1596 + def.extraConfig;
1701 + def.extraConfig;
1597 };
1702 };
1598
1703
1704+ renderConfig = def:
1705+ { text = ''
1706+ [Network]
1707+ ${attrsToSection def.networkConfig}
1708+ ''
1709+ + optionalString (def.dhcpV4Config != { }) ''
1710+ [DHCPv4]
1711+ ${attrsToSection def.dhcpV4Config}
1712+ ''
1713+ + optionalString (def.dhcpV6Config != { }) ''
1714+ [DHCPv6]
1715+ ${attrsToSection def.dhcpV6Config}
1716+ ''; };
1717+
1599 networkToUnit = name: def:
1718 networkToUnit = name: def:
1600 { inherit (def) enable;
1719 { inherit (def) enable;
1601 text = commonMatchText def
1720 text = commonMatchText def
@@ -1728,6 +1847,12 @@ in
1728 description = "Definition of systemd networks.";
1847 description = "Definition of systemd networks.";
1729 };
1848 };
1730
1849
1850+ systemd.network.config = mkOption {
1851+ default = {};
1852+ type = with types; submodule [ { options = networkdOptions; } networkdConfig ];
1853+ description = "Definition of global systemd network config.";
1854+ };
1855+
1731 systemd.network.units = mkOption {
1856 systemd.network.units = mkOption {
1732 description = "Definition of networkd units.";
1857 description = "Definition of networkd units.";
1733 default = {};
1858 default = {};
@@ -1819,7 +1944,9 @@ in
1819 systemd.services.systemd-networkd = {
1944 systemd.services.systemd-networkd = {
1820 wantedBy = [ "multi-user.target" ];
1945 wantedBy = [ "multi-user.target" ];
1821 aliases = [ "dbus-org.freedesktop.network1.service" ];
1946 aliases = [ "dbus-org.freedesktop.network1.service" ];
1822− restartTriggers = map (x: x.source) (attrValues unitFiles);
1947+ restartTriggers = map (x: x.source) (attrValues unitFiles) ++ [
1948+ config.environment.etc."systemd/networkd.conf".source
1949+ ];
1823 };
1950 };
1824
1951
1825 systemd.services.systemd-networkd-wait-online = {
1952 systemd.services.systemd-networkd-wait-online = {
@@ -1842,6 +1969,17 @@ in
1842 };
1969 };
1843 };
1970 };
1844
1971
1972+ environment.etc."systemd/networkd.conf" = renderConfig cfg.config;
1973+
1974+ networking.iproute2 = mkIf (cfg.config.addRouteTablesToIPRoute2 && cfg.config.routeTables != { }) {
1975+ enable = mkDefault true;
1976+ rttablesExtraConfig = ''
1977+
1978+ # Extra tables defined in NixOS systemd.networkd.config.routeTables.
1979+ ${concatStringsSep "\n" (mapAttrsToList (name: number: "${toString number} ${name}") cfg.config.routeTables)}
1980+ '';
1981+ };
1982+
1845 services.resolved.enable = mkDefault true;
1983 services.resolved.enable = mkDefault true;
1846 })
1984 })
1847 ];
1985 ];
nixos/modules/system/boot/stage-1-init.sh+3−6
@@ -232,7 +232,8 @@ done
232mkdir -p /lib
232mkdir -p /lib
233ln -s @modulesClosure@/lib/modules /lib/modules
233ln -s @modulesClosure@/lib/modules /lib/modules
234ln -s @modulesClosure@/lib/firmware /lib/firmware
234ln -s @modulesClosure@/lib/firmware /lib/firmware
235+# see comment in stage-1.nix for explanation
235−echo @extraUtils@/bin/modprobe > /proc/sys/kernel/modprobe
236+echo @extraUtils@/bin/modprobe-kernel > /proc/sys/kernel/modprobe
236for i in @kernelModules@; do
237for i in @kernelModules@; do
237 info "loading module $(basename $i)..."
238 info "loading module $(basename $i)..."
238 modprobe $i
239 modprobe $i
@@ -317,11 +318,7 @@ checkFS() {
317
318
318 echo "checking $device..."
319 echo "checking $device..."
319
320
320− fsckFlags=
321+ fsck -V -a "$device"
321− if test "$fsType" != "btrfs"; then
322− fsckFlags="-V -a"
323− fi
324− fsck $fsckFlags "$device"
325 fsckResult=$?
322 fsckResult=$?
326
323
327 if test $(($fsckResult | 2)) = $fsckResult; then
324 if test $(($fsckResult | 2)) = $fsckResult; then
nixos/modules/system/boot/stage-1.nix+33−14
@@ -131,6 +131,26 @@ let
131 copy_bin_and_libs ${pkgs.kmod}/bin/kmod
131 copy_bin_and_libs ${pkgs.kmod}/bin/kmod
132 ln -sf kmod $out/bin/modprobe
132 ln -sf kmod $out/bin/modprobe
133
133
134+ # Dirty hack to make sure the kernel properly loads modules
135+ # such as ext4 on demand (e.g. on a `mount(2)` syscall). This is necessary
136+ # because `kmod` isn't linked against `libpthread.so.0` anymore (since
137+ # it was merged into `libc.so.6` since version `2.34`), but still needs
138+ # to access it for some reason. This is not an issue in stage-1 itself
139+ # because of the `LD_LIBRARY_PATH`-variable and anytime later because the rpath of
140+ # kmod/modprobe points to glibc's `$out/lib` where `libpthread.so.6` exists.
141+ # However, this is a problem when the kernel calls `modprobe` inside
142+ # the initial ramdisk because it doesn't know about the
143+ # `LD_LIBRARY_PATH` and the rpath was nuked.
144+ #
145+ # Also, we can't use `makeWrapper` here because `kmod` only does
146+ # `modprobe` functionality if `argv[0] == "modprobe"`.
147+ cat >$out/bin/modprobe-kernel <<EOF
148+ #!$out/bin/ash
149+ export LD_LIBRARY_PATH=$out/lib
150+ exec $out/bin/modprobe "\$@"
151+ EOF
152+ chmod +x $out/bin/modprobe-kernel
153+
134 # Copy resize2fs if any ext* filesystems are to be resized
154 # Copy resize2fs if any ext* filesystems are to be resized
135 ${optionalString (any (fs: fs.autoResize && (lib.hasPrefix "ext" fs.fsType)) fileSystems) ''
155 ${optionalString (any (fs: fs.autoResize && (lib.hasPrefix "ext" fs.fsType)) fileSystems) ''
136 # We need mke2fs in the initrd.
156 # We need mke2fs in the initrd.
@@ -335,7 +355,7 @@ let
335 [ { object = bootStage1;
355 [ { object = bootStage1;
336 symlink = "/init";
356 symlink = "/init";
337 }
357 }
338− { object = pkgs.writeText "mdadm.conf" config.boot.initrd.mdadmConf;
358+ { object = pkgs.writeText "mdadm.conf" config.boot.initrd.services.swraid.mdadmConf;
339 symlink = "/etc/mdadm.conf";
359 symlink = "/etc/mdadm.conf";
340 }
360 }
341 { object = pkgs.runCommand "initrd-kmod-blacklist-ubuntu" {
361 { object = pkgs.runCommand "initrd-kmod-blacklist-ubuntu" {
@@ -400,7 +420,7 @@ let
400 ${lib.optionalString (config.boot.initrd.secrets == {})
420 ${lib.optionalString (config.boot.initrd.secrets == {})
401 "exit 0"}
421 "exit 0"}
402
422
403− export PATH=${pkgs.coreutils}/bin:${pkgs.cpio}/bin:${pkgs.gzip}/bin:${pkgs.findutils}/bin
423+ export PATH=${pkgs.coreutils}/bin:${pkgs.libarchive}/bin:${pkgs.gzip}/bin:${pkgs.findutils}/bin
404
424
405 function cleanup {
425 function cleanup {
406 if [ -n "$tmp" -a -d "$tmp" ]; then
426 if [ -n "$tmp" -a -d "$tmp" ]; then
@@ -420,7 +440,7 @@ let
420 ) config.boot.initrd.secrets)
440 ) config.boot.initrd.secrets)
421 }
441 }
422
442
423− (cd "$tmp" && find . -print0 | sort -z | cpio --quiet -o -H newc -R +0:+0 --reproducible --null) | \
443+ (cd "$tmp" && find . -print0 | sort -z | bsdtar --uid 0 --gid 0 -cnf - -T - | bsdtar --null -cf - --format=newc @-) | \
424 ${compressorExe} ${lib.escapeShellArgs initialRamdisk.compressorArgs} >> "$1"
444 ${compressorExe} ${lib.escapeShellArgs initialRamdisk.compressorArgs} >> "$1"
425 '';
445 '';
426
446
@@ -485,14 +505,6 @@ in
485 '';
505 '';
486 };
506 };
487
507
488− boot.initrd.mdadmConf = mkOption {
489− default = "";
490− type = types.lines;
491− description = ''
492− Contents of <filename>/etc/mdadm.conf</filename> in stage 1.
493− '';
494− };
495−
496 boot.initrd.preLVMCommands = mkOption {
508 boot.initrd.preLVMCommands = mkOption {
497 default = "";
509 default = "";
498 type = types.lines;
510 type = types.lines;
@@ -703,8 +715,12 @@ in
703 }
715 }
704 ];
716 ];
705
717
706− system.build =
718+ system.build = mkMerge [
707− { inherit bootStage1 initialRamdisk initialRamdiskSecretAppender extraUtils; };
719+ { inherit bootStage1 initialRamdiskSecretAppender extraUtils; }
720+
721+ # generated in nixos/modules/system/boot/systemd/initrd.nix
722+ (mkIf (!config.boot.initrd.systemd.enable) { inherit initialRamdisk; })
723+ ];
708
724
709 system.requiredKernelConfig = with config.lib.kernelConfig; [
725 system.requiredKernelConfig = with config.lib.kernelConfig; [
710 (isYes "TMPFS")
726 (isYes "TMPFS")
@@ -712,6 +728,9 @@ in
712 ];
728 ];
713
729
714 boot.initrd.supportedFilesystems = map (fs: fs.fsType) fileSystems;
730 boot.initrd.supportedFilesystems = map (fs: fs.fsType) fileSystems;
715−
716 };
731 };
732+
733+ imports = [
734+ (mkRenamedOptionModule [ "boot" "initrd" "mdadmConf" ] [ "boot" "initrd" "services" "swraid" "mdadmConf" ])
735+ ];
717}
736}
nixos/modules/system/boot/stage-2-init.sh+66−94
@@ -5,32 +5,30 @@ systemConfig=@systemConfig@
5export HOME=/root PATH="@path@"
5export HOME=/root PATH="@path@"
6
6
7
7
8+if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" != true ]; then
8−# Process the kernel command line.
9+ # Process the kernel command line.
9−for o in $(</proc/cmdline); do
10+ for o in $(</proc/cmdline); do
10− case $o in
11+ case $o in
11− boot.debugtrace)
12+ boot.debugtrace)
12− # Show each command.
13+ # Show each command.
13− set -x
14+ set -x
14− ;;
15+ ;;
15− resume=*)
16− set -- $(IFS==; echo $o)
17− resumeDevice=$2
18− ;;
19− esac
16+ esac
20−done
17+ done
21−
18+
22−
19+
23−# Print a greeting.
20+ # Print a greeting.
24−echo
21+ echo
25−echo -e "\e[1;32m<<< NixOS Stage 2 >>>\e[0m"
22+ echo -e "\e[1;32m<<< NixOS Stage 2 >>>\e[0m"
26−echo
23+ echo
27−
24+
28−
25+
29−# Normally, stage 1 mounts the root filesystem read/writable.
26+ # Normally, stage 1 mounts the root filesystem read/writable.
30−# However, in some environments, stage 2 is executed directly, and the
27+ # However, in some environments, stage 2 is executed directly, and the
31−# root is read-only. So make it writable here.
28+ # root is read-only. So make it writable here.
32−if [ -z "$container" ]; then
29+ if [ -z "$container" ]; then
33− mount -n -o remount,rw none /
30+ mount -n -o remount,rw none /
31+ fi
34fi
32fi
35
33
36
34
@@ -43,6 +41,12 @@ if [ ! -e /proc/1 ]; then
43 local options="$3"
41 local options="$3"
44 local fsType="$4"
42 local fsType="$4"
45
43
44+ # We must not overwrite this mount because it's bind-mounted
45+ # from stage 1's /run
46+ if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" = true ] && [ "${mountPoint}" = /run ]; then
47+ return
48+ fi
49+
46 install -m 0755 -d "$mountPoint"
50 install -m 0755 -d "$mountPoint"
47 mount -n -t "$fsType" -o "$options" "$device" "$mountPoint"
51 mount -n -t "$fsType" -o "$options" "$device" "$mountPoint"
48 }
52 }
@@ -50,7 +54,11 @@ if [ ! -e /proc/1 ]; then
50fi
54fi
51
55
52
56
57+if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" = true ]; then
58+ echo "booting system configuration ${systemConfig}"
59+else
53−echo "booting system configuration $systemConfig" > /dev/kmsg
60+ echo "booting system configuration $systemConfig" > /dev/kmsg
61+fi
54
62
55
63
56# Make /nix/store a read-only bind mount to enforce immutability of
64# Make /nix/store a read-only bind mount to enforce immutability of
@@ -72,59 +80,32 @@ if [ -n "@readOnlyStore@" ]; then
72fi
80fi
73
81
74
82
75−# Provide a /etc/mtab.
83+if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" != true ]; then
76−install -m 0755 -d /etc
84+ # Use /etc/resolv.conf supplied by systemd-nspawn, if applicable.
77−test -e /etc/fstab || touch /etc/fstab # to shut up mount
85+ if [ -n "@useHostResolvConf@" ] && [ -e /etc/resolv.conf ]; then
78−rm -f /etc/mtab* # not that we care about stale locks
86+ resolvconf -m 1000 -a host </etc/resolv.conf
79−ln -s /proc/mounts /etc/mtab
87+ fi
80−
81−
82−# More special file systems, initialise required directories.
83−[ -e /proc/bus/usb ] && mount -t usbfs usbfs /proc/bus/usb # UML doesn't have USB by default
84−install -m 01777 -d /tmp
85−install -m 0755 -d /var/{log,lib,db} /nix/var /etc/nixos/ \
86− /run/lock /home /bin # for the /bin/sh symlink
87−
88−
89−# Miscellaneous boot time cleanup.
90−rm -rf /var/run /var/lock
91−rm -f /etc/{group,passwd,shadow}.lock
92−
93−
94−# Also get rid of temporary GC roots.
95−rm -rf /nix/var/nix/gcroots/tmp /nix/var/nix/temproots
96−
97−
98−# For backwards compatibility, symlink /var/run to /run, and /var/lock
99−# to /run/lock.
100−ln -s /run /var/run
101−ln -s /run/lock /var/lock
102
88
103
89
104−# Clear the resume device.
90+ # Log the script output to /dev/kmsg or /run/log/stage-2-init.log.
91+ # Only at this point are all the necessary prerequisites ready for these commands.
92+ exec {logOutFd}>&1 {logErrFd}>&2
93+ if test -w /dev/kmsg; then
94+ exec > >(tee -i /proc/self/fd/"$logOutFd" | while read -r line; do
105−if test -n "$resumeDevice"; then
95+ if test -n "$line"; then
106− mkswap "$resumeDevice" || echo 'Failed to clear saved image.'
96+ echo "<7>stage-2-init: $line" > /dev/kmsg
97+ fi
98+ done) 2>&1
99+ else
100+ mkdir -p /run/log
101+ exec > >(tee -i /run/log/stage-2-init.log) 2>&1
102+ fi
107fi
103fi
108
104
109
105
110−# Use /etc/resolv.conf supplied by systemd-nspawn, if applicable.
106+# Required by the activation script
111−if [ -n "@useHostResolvConf@" ] && [ -e /etc/resolv.conf ]; then
107+install -m 0755 -d /etc /etc/nixos
112− resolvconf -m 1000 -a host </etc/resolv.conf
108+install -m 01777 -d /tmp
113−fi
114−
115−# Log the script output to /dev/kmsg or /run/log/stage-2-init.log.
116−# Only at this point are all the necessary prerequisites ready for these commands.
117−exec {logOutFd}>&1 {logErrFd}>&2
118−if test -w /dev/kmsg; then
119− exec > >(tee -i /proc/self/fd/"$logOutFd" | while read -r line; do
120− if test -n "$line"; then
121− echo "<7>stage-2-init: $line" > /dev/kmsg
122− fi
123− done) 2>&1
124−else
125− mkdir -p /run/log
126− exec > >(tee -i /run/log/stage-2-init.log) 2>&1
127−fi
128
109
129
110
130# Run the script that performs all configuration activation that does
111# Run the script that performs all configuration activation that does
@@ -133,22 +114,9 @@ echo "running activation script..."
133$systemConfig/activate
114$systemConfig/activate
134
115
135
116
136−# Restore the system time from the hardware clock. We do this after
137−# running the activation script to be sure that /etc/localtime points
138−# at the current time zone.
139−if [ -e /dev/rtc ]; then
140− hwclock --hctosys
141−fi
142−
143−
144# Record the boot configuration.
117# Record the boot configuration.
145ln -sfn "$systemConfig" /run/booted-system
118ln -sfn "$systemConfig" /run/booted-system
146
119
147−# Prevent the booted system from being garbage-collected. If it weren't
148−# a gcroot, if we were running a different kernel, switched system,
149−# and garbage collected all, we could not load kernel modules anymore.
150−ln -sfn /run/booted-system /nix/var/nix/gcroots/booted-system
151−
152
120
153# Run any user-specified commands.
121# Run any user-specified commands.
154@shell@ @postBootCommands@
122@shell@ @postBootCommands@
@@ -162,11 +130,15 @@ ln -sfn /run/booted-system /nix/var/nix/gcroots/booted-system
162: >> /etc/machine-id
130: >> /etc/machine-id
163
131
164
132
133+# No need to restore the stdout/stderr streams we never redirected and
134+# especially no need to start systemd
135+if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" != true ]; then
165−# Reset the logging file descriptors.
136+ # Reset the logging file descriptors.
166−exec 1>&$logOutFd 2>&$logErrFd
137+ exec 1>&$logOutFd 2>&$logErrFd
167−exec {logOutFd}>&- {logErrFd}>&-
138+ exec {logOutFd}>&- {logErrFd}>&-
168
139
169
140
170−# Start systemd in a clean environment.
141+ # Start systemd in a clean environment.
171−echo "starting systemd..."
142+ echo "starting systemd..."
172−exec env - @systemdExecutable@ "$@"
143+ exec @systemdExecutable@ "$@"
144+fi
nixos/modules/system/boot/systemd.nix+18−33
@@ -11,14 +11,7 @@ let
11 systemd = cfg.package;
11 systemd = cfg.package;
12
12
13 inherit (systemdUtils.lib)
13 inherit (systemdUtils.lib)
14− makeUnit
15 generateUnits
14 generateUnits
16− makeJobScript
17− unitConfig
18− serviceConfig
19− mountConfig
20− automountConfig
21− commonUnitText
22 targetToUnit
15 targetToUnit
23 serviceToUnit
16 serviceToUnit
24 socketToUnit
17 socketToUnit
@@ -185,13 +178,7 @@ in
185 systemd.units = mkOption {
178 systemd.units = mkOption {
186 description = "Definition of systemd units.";
179 description = "Definition of systemd units.";
187 default = {};
180 default = {};
188− type = with types; attrsOf (submodule (
181+ type = systemdUtils.types.units;
189− { name, config, ... }:
190− { options = concreteUnitOptions;
191− config = {
192− unit = mkDefault (makeUnit name config);
193− };
194− }));
195 };
182 };
196
183
197 systemd.packages = mkOption {
184 systemd.packages = mkOption {
@@ -203,37 +190,37 @@ in
203
190
204 systemd.targets = mkOption {
191 systemd.targets = mkOption {
205 default = {};
192 default = {};
206− type = with types; attrsOf (submodule [ { options = targetOptions; } unitConfig] );
193+ type = systemdUtils.types.targets;
207 description = "Definition of systemd target units.";
194 description = "Definition of systemd target units.";
208 };
195 };
209
196
210 systemd.services = mkOption {
197 systemd.services = mkOption {
211 default = {};
198 default = {};
212− type = with types; attrsOf (submodule [ { options = serviceOptions; } unitConfig serviceConfig ]);
199+ type = systemdUtils.types.services;
213 description = "Definition of systemd service units.";
200 description = "Definition of systemd service units.";
214 };
201 };
215
202
216 systemd.sockets = mkOption {
203 systemd.sockets = mkOption {
217 default = {};
204 default = {};
218− type = with types; attrsOf (submodule [ { options = socketOptions; } unitConfig ]);
205+ type = systemdUtils.types.sockets;
219 description = "Definition of systemd socket units.";
206 description = "Definition of systemd socket units.";
220 };
207 };
221
208
222 systemd.timers = mkOption {
209 systemd.timers = mkOption {
223 default = {};
210 default = {};
224− type = with types; attrsOf (submodule [ { options = timerOptions; } unitConfig ]);
211+ type = systemdUtils.types.timers;
225 description = "Definition of systemd timer units.";
212 description = "Definition of systemd timer units.";
226 };
213 };
227
214
228 systemd.paths = mkOption {
215 systemd.paths = mkOption {
229 default = {};
216 default = {};
230− type = with types; attrsOf (submodule [ { options = pathOptions; } unitConfig ]);
217+ type = systemdUtils.types.paths;
231 description = "Definition of systemd path units.";
218 description = "Definition of systemd path units.";
232 };
219 };
233
220
234 systemd.mounts = mkOption {
221 systemd.mounts = mkOption {
235 default = [];
222 default = [];
236− type = with types; listOf (submodule [ { options = mountOptions; } unitConfig mountConfig ]);
223+ type = systemdUtils.types.mounts;
237 description = ''
224 description = ''
238 Definition of systemd mount units.
225 Definition of systemd mount units.
239 This is a list instead of an attrSet, because systemd mandates the names to be derived from
226 This is a list instead of an attrSet, because systemd mandates the names to be derived from
@@ -243,7 +230,7 @@ in
243
230
244 systemd.automounts = mkOption {
231 systemd.automounts = mkOption {
245 default = [];
232 default = [];
246− type = with types; listOf (submodule [ { options = automountOptions; } unitConfig automountConfig ]);
233+ type = systemdUtils.types.automounts;
247 description = ''
234 description = ''
248 Definition of systemd automount units.
235 Definition of systemd automount units.
249 This is a list instead of an attrSet, because systemd mandates the names to be derived from
236 This is a list instead of an attrSet, because systemd mandates the names to be derived from
@@ -253,7 +240,7 @@ in
253
240
254 systemd.slices = mkOption {
241 systemd.slices = mkOption {
255 default = {};
242 default = {};
256− type = with types; attrsOf (submodule [ { options = sliceOptions; } unitConfig] );
243+ type = systemdUtils.types.slices;
257 description = "Definition of slice configurations.";
244 description = "Definition of slice configurations.";
258 };
245 };
259
246
@@ -362,10 +349,11 @@ in
362 type = types.listOf types.str;
349 type = types.listOf types.str;
363 example = [ "systemd-backlight@.service" ];
350 example = [ "systemd-backlight@.service" ];
364 description = ''
351 description = ''
365− A list of units to suppress when generating system systemd configuration directory. This has
352+ A list of units to skip when generating system systemd configuration directory. This has
366 priority over upstream units, <option>systemd.units</option>, and
353 priority over upstream units, <option>systemd.units</option>, and
367 <option>systemd.additionalUpstreamSystemUnits</option>. The main purpose of this is to
354 <option>systemd.additionalUpstreamSystemUnits</option>. The main purpose of this is to
368− suppress a upstream systemd unit with any modifications made to it by other NixOS modules.
355+ prevent a upstream systemd unit from being added to the initrd with any modifications made to it
356+ by other NixOS modules.
369 '';
357 '';
370 };
358 };
371
359
@@ -482,7 +470,12 @@ in
482 enabledUnits = filterAttrs (n: v: ! elem n cfg.suppressedSystemUnits) cfg.units;
470 enabledUnits = filterAttrs (n: v: ! elem n cfg.suppressedSystemUnits) cfg.units;
483
471
484 in ({
472 in ({
485− "systemd/system".source = generateUnits "system" enabledUnits enabledUpstreamSystemUnits upstreamSystemWants;
473+ "systemd/system".source = generateUnits {
474+ type = "system";
475+ units = enabledUnits;
476+ upstreamUnits = enabledUpstreamSystemUnits;
477+ upstreamWants = upstreamSystemWants;
478+ };
486
479
487 "systemd/system.conf".text = ''
480 "systemd/system.conf".text = ''
488 [Manager]
481 [Manager]
@@ -580,14 +573,6 @@ in
580 })
573 })
581 (filterAttrs (name: service: service.enable && service.startAt != []) cfg.services);
574 (filterAttrs (name: service: service.enable && service.startAt != []) cfg.services);
582
575
583− # Generate timer units for all services that have a ‘startAt’ value.
584− systemd.user.timers =
585− mapAttrs (name: service:
586− { wantedBy = [ "timers.target" ];
587− timerConfig.OnCalendar = service.startAt;
588− })
589− (filterAttrs (name: service: service.startAt != []) cfg.user.services);
590−
591 # Some overrides to upstream units.
576 # Some overrides to upstream units.
592 systemd.services."systemd-backlight@".restartIfChanged = false;
577 systemd.services."systemd-backlight@".restartIfChanged = false;
593 systemd.services."systemd-fsck@".restartIfChanged = false;
578 systemd.services."systemd-fsck@".restartIfChanged = false;
nixos/modules/system/boot/systemd/initrd-secrets.nixnew file+36
@@ -0,0 +1,36 @@
1+{ config, pkgs, lib, ... }:
2+
3+{
4+ config = lib.mkIf (config.boot.initrd.enable && config.boot.initrd.systemd.enable) {
5+ # Copy secrets into the initrd if they cannot be appended
6+ boot.initrd.systemd.contents = lib.mkIf (!config.boot.loader.supportsInitrdSecrets)
7+ (lib.mapAttrs' (dest: source: lib.nameValuePair "/.initrd-secrets/${dest}" { source = if source == null then dest else source; }) config.boot.initrd.secrets);
8+
9+ # Copy secrets to their respective locations
10+ boot.initrd.systemd.services.initrd-nixos-copy-secrets = lib.mkIf (config.boot.initrd.secrets != {}) {
11+ description = "Copy secrets into place";
12+ # Run as early as possible
13+ wantedBy = [ "sysinit.target" ];
14+ before = [ "cryptsetup-pre.target" ];
15+ unitConfig.DefaultDependencies = false;
16+
17+ # We write the secrets to /.initrd-secrets and move them because this allows
18+ # secrets to be written to /run. If we put the secret directly to /run and
19+ # drop this service, we'd mount the /run tmpfs over the secret, making it
20+ # invisible in stage 2.
21+ script = ''
22+ for secret in $(cd /.initrd-secrets; find . -type f); do
23+ mkdir -p "$(dirname "/$secret")"
24+ cp "/.initrd-secrets/$secret" "/$secret"
25+ done
26+ '';
27+
28+ unitConfig = {
29+ Type = "oneshot";
30+ RemainAfterExit = true;
31+ };
32+ };
33+ # The script needs this
34+ boot.initrd.systemd.extraBin.find = "${pkgs.findutils}/bin/find";
35+ };
36+}
nixos/modules/system/boot/systemd/initrd.nixnew file+502
@@ -0,0 +1,502 @@
1+{ lib, config, utils, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ inherit (utils) systemdUtils escapeSystemdPath;
7+ inherit (systemdUtils.lib)
8+ generateUnits
9+ pathToUnit
10+ serviceToUnit
11+ sliceToUnit
12+ socketToUnit
13+ targetToUnit
14+ timerToUnit
15+ mountToUnit
16+ automountToUnit;
17+
18+
19+ cfg = config.boot.initrd.systemd;
20+
21+ # Copied from fedora
22+ upstreamUnits = [
23+ "basic.target"
24+ "ctrl-alt-del.target"
25+ "emergency.service"
26+ "emergency.target"
27+ "final.target"
28+ "halt.target"
29+ "initrd-cleanup.service"
30+ "initrd-fs.target"
31+ "initrd-parse-etc.service"
32+ "initrd-root-device.target"
33+ "initrd-root-fs.target"
34+ "initrd-switch-root.service"
35+ "initrd-switch-root.target"
36+ "initrd.target"
37+ "kexec.target"
38+ "kmod-static-nodes.service"
39+ "local-fs-pre.target"
40+ "local-fs.target"
41+ "multi-user.target"
42+ "paths.target"
43+ "poweroff.target"
44+ "reboot.target"
45+ "rescue.service"
46+ "rescue.target"
47+ "rpcbind.target"
48+ "shutdown.target"
49+ "sigpwr.target"
50+ "slices.target"
51+ "sockets.target"
52+ "swap.target"
53+ "sysinit.target"
54+ "sys-kernel-config.mount"
55+ "syslog.socket"
56+ "systemd-ask-password-console.path"
57+ "systemd-ask-password-console.service"
58+ "systemd-fsck@.service"
59+ "systemd-halt.service"
60+ "systemd-hibernate-resume@.service"
61+ "systemd-journald-audit.socket"
62+ "systemd-journald-dev-log.socket"
63+ "systemd-journald.service"
64+ "systemd-journald.socket"
65+ "systemd-kexec.service"
66+ "systemd-modules-load.service"
67+ "systemd-poweroff.service"
68+ "systemd-reboot.service"
69+ "systemd-sysctl.service"
70+ "systemd-tmpfiles-setup-dev.service"
71+ "systemd-tmpfiles-setup.service"
72+ "timers.target"
73+ "umount.target"
74+
75+ # TODO: Networking
76+ # "network-online.target"
77+ # "network-pre.target"
78+ # "network.target"
79+ # "nss-lookup.target"
80+ # "nss-user-lookup.target"
81+ # "remote-fs-pre.target"
82+ # "remote-fs.target"
83+ ] ++ cfg.additionalUpstreamUnits;
84+
85+ upstreamWants = [
86+ "sysinit.target.wants"
87+ ];
88+
89+ enabledUpstreamUnits = filter (n: ! elem n cfg.suppressedUnits) upstreamUnits;
90+ enabledUnits = filterAttrs (n: v: ! elem n cfg.suppressedUnits) cfg.units;
91+ jobScripts = concatLists (mapAttrsToList (_: unit: unit.jobScripts or []) (filterAttrs (_: v: v.enable) cfg.services));
92+
93+ stage1Units = generateUnits {
94+ type = "initrd";
95+ units = enabledUnits;
96+ upstreamUnits = enabledUpstreamUnits;
97+ inherit upstreamWants;
98+ inherit (cfg) packages package;
99+ };
100+
101+ fileSystems = filter utils.fsNeededForBoot config.system.build.fileSystems;
102+
103+ fstab = pkgs.writeText "initrd-fstab" (lib.concatMapStringsSep "\n"
104+ ({ fsType, mountPoint, device, options, autoFormat, autoResize, ... }@fs: let
105+ opts = options ++ optional autoFormat "x-systemd.makefs" ++ optional autoResize "x-systemd.growfs";
106+ in "${device} /sysroot${mountPoint} ${fsType} ${lib.concatStringsSep "," opts}") fileSystems);
107+
108+ needMakefs = lib.any (fs: fs.autoFormat) fileSystems;
109+ needGrowfs = lib.any (fs: fs.autoResize) fileSystems;
110+
111+ kernel-name = config.boot.kernelPackages.kernel.name or "kernel";
112+ modulesTree = config.system.modulesTree.override { name = kernel-name + "-modules"; };
113+ firmware = config.hardware.firmware;
114+ # Determine the set of modules that we need to mount the root FS.
115+ modulesClosure = pkgs.makeModulesClosure {
116+ rootModules = config.boot.initrd.availableKernelModules ++ config.boot.initrd.kernelModules;
117+ kernel = modulesTree;
118+ firmware = firmware;
119+ allowMissing = false;
120+ };
121+
122+ initrdBinEnv = pkgs.buildEnv {
123+ name = "initrd-bin-env";
124+ paths = map getBin cfg.initrdBin;
125+ pathsToLink = ["/bin" "/sbin"];
126+ postBuild = concatStringsSep "\n" (mapAttrsToList (n: v: "ln -s '${v}' $out/bin/'${n}'") cfg.extraBin);
127+ };
128+
129+ initialRamdisk = pkgs.makeInitrdNG {
130+ name = "initrd-${kernel-name}";
131+ inherit (config.boot.initrd) compressor compressorArgs prepend;
132+
133+ contents = map (path: { object = path; symlink = ""; }) (subtractLists cfg.suppressedStorePaths cfg.storePaths)
134+ ++ mapAttrsToList (_: v: { object = v.source; symlink = v.target; }) (filterAttrs (_: v: v.enable) cfg.contents);
135+ };
136+
137+in {
138+ options.boot.initrd.systemd = {
139+ enable = mkEnableOption ''systemd in initrd.
140+
141+ Note: This is in very early development and is highly
142+ experimental. Most of the features NixOS supports in initrd are
143+ not yet supported by the intrd generated with this option.
144+ '';
145+
146+ package = (mkPackageOption pkgs "systemd" {
147+ default = "systemdStage1";
148+ }) // {
149+ visible = false;
150+ };
151+
152+ contents = mkOption {
153+ description = "Set of files that have to be linked into the initrd";
154+ example = literalExpression ''
155+ {
156+ "/etc/hostname".text = "mymachine";
157+ }
158+ '';
159+ visible = false;
160+ default = {};
161+ type = utils.systemdUtils.types.initrdContents;
162+ };
163+
164+ storePaths = mkOption {
165+ description = ''
166+ Store paths to copy into the initrd as well.
167+ '';
168+ type = with types; listOf (oneOf [ singleLineStr package ]);
169+ default = [];
170+ };
171+
172+ extraBin = mkOption {
173+ description = ''
174+ Tools to add to /bin
175+ '';
176+ example = literalExpression ''
177+ {
178+ umount = ''${pkgs.util-linux}/bin/umount;
179+ }
180+ '';
181+ type = types.attrsOf types.path;
182+ default = {};
183+ };
184+
185+ suppressedStorePaths = mkOption {
186+ description = ''
187+ Store paths specified in the storePaths option that
188+ should not be copied.
189+ '';
190+ type = types.listOf types.singleLineStr;
191+ default = [];
192+ };
193+
194+ emergencyAccess = mkOption {
195+ type = with types; oneOf [ bool singleLineStr ];
196+ visible = false;
197+ description = ''
198+ Set to true for unauthenticated emergency access, and false for
199+ no emergency access.
200+
201+ Can also be set to a hashed super user password to allow
202+ authenticated access to the emergency mode.
203+ '';
204+ default = false;
205+ };
206+
207+ initrdBin = mkOption {
208+ type = types.listOf types.package;
209+ default = [];
210+ visible = false;
211+ description = ''
212+ Packages to include in /bin for the stage 1 emergency shell.
213+ '';
214+ };
215+
216+ additionalUpstreamUnits = mkOption {
217+ default = [ ];
218+ type = types.listOf types.str;
219+ visible = false;
220+ example = [ "debug-shell.service" "systemd-quotacheck.service" ];
221+ description = ''
222+ Additional units shipped with systemd that shall be enabled.
223+ '';
224+ };
225+
226+ suppressedUnits = mkOption {
227+ default = [ ];
228+ type = types.listOf types.str;
229+ example = [ "systemd-backlight@.service" ];
230+ visible = false;
231+ description = ''
232+ A list of units to skip when generating system systemd configuration directory. This has
233+ priority over upstream units, <option>boot.initrd.systemd.units</option>, and
234+ <option>boot.initrd.systemd.additionalUpstreamUnits</option>. The main purpose of this is to
235+ prevent a upstream systemd unit from being added to the initrd with any modifications made to it
236+ by other NixOS modules.
237+ '';
238+ };
239+
240+ units = mkOption {
241+ description = "Definition of systemd units.";
242+ default = {};
243+ visible = false;
244+ type = systemdUtils.types.units;
245+ };
246+
247+ packages = mkOption {
248+ default = [];
249+ visible = false;
250+ type = types.listOf types.package;
251+ example = literalExpression "[ pkgs.systemd-cryptsetup-generator ]";
252+ description = "Packages providing systemd units and hooks.";
253+ };
254+
255+ targets = mkOption {
256+ default = {};
257+ visible = false;
258+ type = systemdUtils.types.initrdTargets;
259+ description = "Definition of systemd target units.";
260+ };
261+
262+ services = mkOption {
263+ default = {};
264+ type = systemdUtils.types.initrdServices;
265+ visible = false;
266+ description = "Definition of systemd service units.";
267+ };
268+
269+ sockets = mkOption {
270+ default = {};
271+ type = systemdUtils.types.initrdSockets;
272+ visible = false;
273+ description = "Definition of systemd socket units.";
274+ };
275+
276+ timers = mkOption {
277+ default = {};
278+ type = systemdUtils.types.initrdTimers;
279+ visible = false;
280+ description = "Definition of systemd timer units.";
281+ };
282+
283+ paths = mkOption {
284+ default = {};
285+ type = systemdUtils.types.initrdPaths;
286+ visible = false;
287+ description = "Definition of systemd path units.";
288+ };
289+
290+ mounts = mkOption {
291+ default = [];
292+ type = systemdUtils.types.initrdMounts;
293+ visible = false;
294+ description = ''
295+ Definition of systemd mount units.
296+ This is a list instead of an attrSet, because systemd mandates the names to be derived from
297+ the 'where' attribute.
298+ '';
299+ };
300+
301+ automounts = mkOption {
302+ default = [];
303+ type = systemdUtils.types.automounts;
304+ visible = false;
305+ description = ''
306+ Definition of systemd automount units.
307+ This is a list instead of an attrSet, because systemd mandates the names to be derived from
308+ the 'where' attribute.
309+ '';
310+ };
311+
312+ slices = mkOption {
313+ default = {};
314+ type = systemdUtils.types.slices;
315+ visible = false;
316+ description = "Definition of slice configurations.";
317+ };
318+ };
319+
320+ config = mkIf (config.boot.initrd.enable && cfg.enable) {
321+ system.build = { inherit initialRamdisk; };
322+
323+ boot.initrd.availableKernelModules = [ "autofs4" ]; # systemd needs this for some features
324+
325+ boot.initrd.systemd = {
326+ initrdBin = [pkgs.bash pkgs.coreutils cfg.package.kmod cfg.package] ++ config.system.fsPackages;
327+ extraBin = {
328+ less = "${pkgs.less}/bin/less";
329+ mount = "${cfg.package.util-linux}/bin/mount";
330+ umount = "${cfg.package.util-linux}/bin/umount";
331+ };
332+
333+ contents = {
334+ "/init".source = "${cfg.package}/lib/systemd/systemd";
335+ "/etc/systemd/system".source = stage1Units;
336+
337+ "/etc/systemd/system.conf".text = ''
338+ [Manager]
339+ DefaultEnvironment=PATH=/bin:/sbin ${optionalString (isBool cfg.emergencyAccess && cfg.emergencyAccess) "SYSTEMD_SULOGIN_FORCE=1"}
340+ '';
341+
342+ "/etc/fstab".source = fstab;
343+
344+ "/lib/modules".source = "${modulesClosure}/lib/modules";
345+ "/lib/firmware".source = "${modulesClosure}/lib/firmware";
346+
347+ "/etc/modules-load.d/nixos.conf".text = concatStringsSep "\n" config.boot.initrd.kernelModules;
348+
349+ "/etc/passwd".source = "${pkgs.fakeNss}/etc/passwd";
350+ "/etc/shadow".text = "root:${if isBool cfg.emergencyAccess then "!" else cfg.emergencyAccess}:::::::";
351+
352+ "/bin".source = "${initrdBinEnv}/bin";
353+ "/sbin".source = "${initrdBinEnv}/sbin";
354+
355+ "/etc/sysctl.d/nixos.conf".text = "kernel.modprobe = /sbin/modprobe";
356+ "/etc/modprobe.d/systemd.conf".source = "${cfg.package}/lib/modprobe.d/systemd.conf";
357+ "/etc/modprobe.d/ubuntu.conf".source = pkgs.runCommand "initrd-kmod-blacklist-ubuntu" { } ''
358+ ${pkgs.buildPackages.perl}/bin/perl -0pe 's/## file: iwlwifi.conf(.+?)##/##/s;' $src > $out
359+ '';
360+ "/etc/modprobe.d/debian.conf".source = pkgs.kmod-debian-aliases;
361+
362+ };
363+
364+ storePaths = [
365+ # systemd tooling
366+ "${cfg.package}/lib/systemd/systemd-fsck"
367+ (lib.mkIf needGrowfs "${cfg.package}/lib/systemd/systemd-growfs")
368+ "${cfg.package}/lib/systemd/systemd-hibernate-resume"
369+ "${cfg.package}/lib/systemd/systemd-journald"
370+ (lib.mkIf needMakefs "${cfg.package}/lib/systemd/systemd-makefs")
371+ "${cfg.package}/lib/systemd/systemd-modules-load"
372+ "${cfg.package}/lib/systemd/systemd-remount-fs"
373+ "${cfg.package}/lib/systemd/systemd-shutdown"
374+ "${cfg.package}/lib/systemd/systemd-sulogin-shell"
375+ "${cfg.package}/lib/systemd/systemd-sysctl"
376+
377+ # generators
378+ "${cfg.package}/lib/systemd/system-generators/systemd-debug-generator"
379+ "${cfg.package}/lib/systemd/system-generators/systemd-fstab-generator"
380+ "${cfg.package}/lib/systemd/system-generators/systemd-gpt-auto-generator"
381+ "${cfg.package}/lib/systemd/system-generators/systemd-hibernate-resume-generator"
382+ "${cfg.package}/lib/systemd/system-generators/systemd-run-generator"
383+
384+ # utilities needed by systemd
385+ "${cfg.package.util-linux}/bin/mount"
386+ "${cfg.package.util-linux}/bin/umount"
387+ "${cfg.package.util-linux}/bin/sulogin"
388+
389+ # so NSS can look up usernames
390+ "${pkgs.glibc}/lib/libnss_files.so.2"
391+ ] ++ jobScripts;
392+
393+ targets.initrd.aliases = ["default.target"];
394+ units =
395+ mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.paths
396+ // mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.services
397+ // mapAttrs' (n: v: nameValuePair "${n}.slice" (sliceToUnit n v)) cfg.slices
398+ // mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.sockets
399+ // mapAttrs' (n: v: nameValuePair "${n}.target" (targetToUnit n v)) cfg.targets
400+ // mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.timers
401+ // listToAttrs (map
402+ (v: let n = escapeSystemdPath v.where;
403+ in nameValuePair "${n}.mount" (mountToUnit n v)) cfg.mounts)
404+ // listToAttrs (map
405+ (v: let n = escapeSystemdPath v.where;
406+ in nameValuePair "${n}.automount" (automountToUnit n v)) cfg.automounts);
407+
408+ # The unit in /run/systemd/generator shadows the unit in
409+ # /etc/systemd/system, but will still apply drop-ins from
410+ # /etc/systemd/system/foo.service.d/
411+ #
412+ # We need IgnoreOnIsolate, otherwise the Requires dependency of
413+ # a mount unit on its makefs unit causes it to be unmounted when
414+ # we isolate for switch-root. Use a dummy package so that
415+ # generateUnits will generate drop-ins instead of unit files.
416+ packages = [(pkgs.runCommand "dummy" {} ''
417+ mkdir -p $out/etc/systemd/system
418+ touch $out/etc/systemd/system/systemd-{makefs,growfs}@.service
419+ '')];
420+ services."systemd-makefs@" = lib.mkIf needMakefs { unitConfig.IgnoreOnIsolate = true; };
421+ services."systemd-growfs@" = lib.mkIf needGrowfs { unitConfig.IgnoreOnIsolate = true; };
422+
423+ services.initrd-nixos-activation = {
424+ after = [ "initrd-fs.target" ];
425+ requiredBy = [ "initrd.target" ];
426+ unitConfig.AssertPathExists = "/etc/initrd-release";
427+ serviceConfig.Type = "oneshot";
428+ description = "NixOS Activation";
429+
430+ script = /* bash */ ''
431+ set -uo pipefail
432+ export PATH="/bin:${cfg.package.util-linux}/bin"
433+
434+ # Figure out what closure to boot
435+ closure=
436+ for o in $(< /proc/cmdline); do
437+ case $o in
438+ init=*)
439+ IFS== read -r -a initParam <<< "$o"
440+ closure="$(dirname "''${initParam[1]}")"
441+ ;;
442+ esac
443+ done
444+
445+ # Sanity check
446+ if [ -z "''${closure:-}" ]; then
447+ echo 'No init= parameter on the kernel command line' >&2
448+ exit 1
449+ fi
450+
451+ # If we are not booting a NixOS closure (e.g. init=/bin/sh),
452+ # we don't know what root to prepare so we don't do anything
453+ if ! [ -x "/sysroot$closure/prepare-root" ]; then
454+ echo "NEW_INIT=''${initParam[1]}" > /etc/switch-root.conf
455+ echo "$closure does not look like a NixOS installation - not activating"
456+ exit 0
457+ fi
458+ echo 'NEW_INIT=' > /etc/switch-root.conf
459+
460+
461+ # We need to propagate /run for things like /run/booted-system
462+ # and /run/current-system.
463+ mkdir -p /sysroot/run
464+ mount --bind /run /sysroot/run
465+
466+ # Initialize the system
467+ export IN_NIXOS_SYSTEMD_STAGE1=true
468+ exec chroot /sysroot $closure/prepare-root
469+ '';
470+ };
471+
472+ # This will either call systemctl with the new init as the last parameter (which
473+ # is the case when not booting a NixOS system) or with an empty string, causing
474+ # systemd to bypass its verification code that checks whether the next file is a systemd
475+ # and using its compiled-in value
476+ services.initrd-switch-root.serviceConfig = {
477+ EnvironmentFile = "-/etc/switch-root.conf";
478+ ExecStart = [
479+ ""
480+ ''systemctl --no-block switch-root /sysroot "''${NEW_INIT}"''
481+ ];
482+ };
483+
484+ services.panic-on-fail = {
485+ wantedBy = ["emergency.target"];
486+ unitConfig = {
487+ DefaultDependencies = false;
488+ ConditionKernelCommandLine = [
489+ "|boot.panic_on_fail"
490+ "|stage1panic"
491+ ];
492+ };
493+ script = ''
494+ echo c > /proc/sysrq-trigger
495+ '';
496+ serviceConfig.Type = "oneshot";
497+ };
498+ };
499+
500+ boot.kernelParams = lib.mkIf (config.boot.resumeDevice != "") [ "resume=${config.boot.resumeDevice}" ];
501+ };
502+}
nixos/modules/system/boot/systemd/nspawn.nix+7−1
@@ -116,7 +116,13 @@ in {
116 in
116 in
117 mkMerge [
117 mkMerge [
118 (mkIf (cfg != {}) {
118 (mkIf (cfg != {}) {
119− environment.etc."systemd/nspawn".source = mkIf (cfg != {}) (generateUnits' false "nspawn" units [] []);
119+ environment.etc."systemd/nspawn".source = mkIf (cfg != {}) (generateUnits {
120+ allowCollisions = false;
121+ type = "nspawn";
122+ inherit units;
123+ upstreamUnits = [];
124+ upstreamWants = [];
125+ });
120 })
126 })
121 {
127 {
122 systemd.targets.multi-user.wants = [ "machines.target" ];
128 systemd.targets.multi-user.wants = [ "machines.target" ];
nixos/modules/system/boot/systemd/shutdown.nixnew file+58
@@ -0,0 +1,58 @@
1+{ config, lib, utils, pkgs, ... }: let
2+
3+ cfg = config.systemd.shutdownRamfs;
4+
5+ ramfsContents = let
6+ storePaths = map (p: "${p}\n") cfg.storePaths;
7+ contents = lib.mapAttrsToList (_: v: "${v.source}\n${v.target}") (lib.filterAttrs (_: v: v.enable) cfg.contents);
8+ in pkgs.writeText "shutdown-ramfs-contents" (lib.concatStringsSep "\n" (storePaths ++ contents));
9+
10+in {
11+ options.systemd.shutdownRamfs = {
12+ enable = lib.mkEnableOption "pivoting back to an initramfs for shutdown" // { default = true; };
13+ contents = lib.mkOption {
14+ description = "Set of files that have to be linked into the shutdown ramfs";
15+ example = lib.literalExpression ''
16+ {
17+ "/lib/systemd/system-shutdown/zpool-sync-shutdown".source = writeShellScript "zpool" "exec ''${zfs}/bin/zpool sync"
18+ }
19+ '';
20+ type = utils.systemdUtils.types.initrdContents;
21+ };
22+
23+ storePaths = lib.mkOption {
24+ description = ''
25+ Store paths to copy into the shutdown ramfs as well.
26+ '';
27+ type = lib.types.listOf lib.types.singleLineStr;
28+ default = [];
29+ };
30+ };
31+
32+ config = lib.mkIf cfg.enable {
33+ systemd.shutdownRamfs.contents."/shutdown".source = "${config.systemd.package}/lib/systemd/systemd-shutdown";
34+ systemd.shutdownRamfs.storePaths = [pkgs.runtimeShell "${pkgs.coreutils}/bin"];
35+
36+ systemd.services.generate-shutdown-ramfs = {
37+ description = "Generate shutdown ramfs";
38+ wantedBy = [ "shutdown.target" ];
39+ before = [ "shutdown.target" ];
40+ unitConfig = {
41+ DefaultDependencies = false;
42+ ConditionFileIsExecutable = [
43+ "!/run/initramfs/shutdown"
44+ ];
45+ };
46+
47+ path = [pkgs.util-linux pkgs.makeInitrdNGTool];
48+ serviceConfig.Type = "oneshot";
49+ script = ''
50+ mkdir -p /run/initramfs
51+ if ! mountpoint -q /run/initramfs; then
52+ mount -t tmpfs tmpfs /run/initramfs
53+ fi
54+ make-initrd-ng ${ramfsContents} /run/initramfs
55+ '';
56+ };
57+ };
58+}
nixos/modules/system/boot/systemd/tmpfiles.nix+16
@@ -100,5 +100,21 @@ in
100 '';
100 '';
101 })
101 })
102 ];
102 ];
103+
104+ systemd.tmpfiles.rules = [
105+ "d /nix/var 0755 root root - -"
106+ "L+ /nix/var/nix/gcroots/booted-system 0755 root root - /run/booted-system"
107+ "d /run/lock 0755 root root - -"
108+ "d /var/db 0755 root root - -"
109+ "L /etc/mtab - - - - ../proc/mounts"
110+ "L /var/lock - - - - ../run/lock"
111+ # Boot-time cleanup
112+ "R! /etc/group.lock - - - - -"
113+ "R! /etc/passwd.lock - - - - -"
114+ "R! /etc/shadow.lock - - - - -"
115+ "R! /etc/mtab* - - - - -"
116+ "R! /nix/var/nix/gcroots/tmp - - - - -"
117+ "R! /nix/var/nix/temproots - - - - -"
118+ ];
103 };
119 };
104}
120}
nixos/modules/system/boot/systemd/user.nix+13−18
@@ -12,10 +12,6 @@ let
12 (systemdUtils.lib)
12 (systemdUtils.lib)
13 makeUnit
13 makeUnit
14 generateUnits
14 generateUnits
15− makeJobScript
16− unitConfig
17− serviceConfig
18− commonUnitText
19 targetToUnit
15 targetToUnit
20 serviceToUnit
16 serviceToUnit
21 socketToUnit
17 socketToUnit
@@ -57,48 +53,42 @@ in {
57 systemd.user.units = mkOption {
53 systemd.user.units = mkOption {
58 description = "Definition of systemd per-user units.";
54 description = "Definition of systemd per-user units.";
59 default = {};
55 default = {};
60− type = with types; attrsOf (submodule (
56+ type = systemdUtils.types.units;
61− { name, config, ... }:
62− { options = concreteUnitOptions;
63− config = {
64− unit = mkDefault (makeUnit name config);
65− };
66− }));
67 };
57 };
68
58
69 systemd.user.paths = mkOption {
59 systemd.user.paths = mkOption {
70 default = {};
60 default = {};
71− type = with types; attrsOf (submodule [ { options = pathOptions; } unitConfig ]);
61+ type = systemdUtils.types.paths;
72 description = "Definition of systemd per-user path units.";
62 description = "Definition of systemd per-user path units.";
73 };
63 };
74
64
75 systemd.user.services = mkOption {
65 systemd.user.services = mkOption {
76 default = {};
66 default = {};
77− type = with types; attrsOf (submodule [ { options = serviceOptions; } unitConfig serviceConfig ] );
67+ type = systemdUtils.types.services;
78 description = "Definition of systemd per-user service units.";
68 description = "Definition of systemd per-user service units.";
79 };
69 };
80
70
81 systemd.user.slices = mkOption {
71 systemd.user.slices = mkOption {
82 default = {};
72 default = {};
83− type = with types; attrsOf (submodule [ { options = sliceOptions; } unitConfig ] );
73+ type = systemdUtils.types.slices;
84 description = "Definition of systemd per-user slice units.";
74 description = "Definition of systemd per-user slice units.";
85 };
75 };
86
76
87 systemd.user.sockets = mkOption {
77 systemd.user.sockets = mkOption {
88 default = {};
78 default = {};
89− type = with types; attrsOf (submodule [ { options = socketOptions; } unitConfig ] );
79+ type = systemdUtils.types.sockets;
90 description = "Definition of systemd per-user socket units.";
80 description = "Definition of systemd per-user socket units.";
91 };
81 };
92
82
93 systemd.user.targets = mkOption {
83 systemd.user.targets = mkOption {
94 default = {};
84 default = {};
95− type = with types; attrsOf (submodule [ { options = targetOptions; } unitConfig] );
85+ type = systemdUtils.types.targets;
96 description = "Definition of systemd per-user target units.";
86 description = "Definition of systemd per-user target units.";
97 };
87 };
98
88
99 systemd.user.timers = mkOption {
89 systemd.user.timers = mkOption {
100 default = {};
90 default = {};
101− type = with types; attrsOf (submodule [ { options = timerOptions; } unitConfig ] );
91+ type = systemdUtils.types.timers;
102 description = "Definition of systemd per-user timer units.";
92 description = "Definition of systemd per-user timer units.";
103 };
93 };
104
94
@@ -119,7 +109,12 @@ in {
119 ];
109 ];
120
110
121 environment.etc = {
111 environment.etc = {
122− "systemd/user".source = generateUnits "user" cfg.units upstreamUserUnits [];
112+ "systemd/user".source = generateUnits {
113+ type = "user";
114+ inherit (cfg) units;
115+ upstreamUnits = upstreamUserUnits;
116+ upstreamWants = [];
117+ };
123
118
124 "systemd/user.conf".text = ''
119 "systemd/user.conf".text = ''
125 [Manager]
120 [Manager]
nixos/modules/system/boot/timesyncd.nix+17−5
@@ -60,15 +60,27 @@ with lib;
60 };
60 };
61 users.groups.systemd-timesync.gid = config.ids.gids.systemd-timesync;
61 users.groups.systemd-timesync.gid = config.ids.gids.systemd-timesync;
62
62
63− system.activationScripts.systemd-timesyncd-migration = mkIf (versionOlder config.system.stateVersion "19.09") ''
63+ system.activationScripts.systemd-timesyncd-migration =
64 # workaround an issue of systemd-timesyncd not starting due to upstream systemd reverting their dynamic users changes
64 # workaround an issue of systemd-timesyncd not starting due to upstream systemd reverting their dynamic users changes
65 # - https://github.com/NixOS/nixpkgs/pull/61321#issuecomment-492423742
65 # - https://github.com/NixOS/nixpkgs/pull/61321#issuecomment-492423742
66 # - https://github.com/systemd/systemd/issues/12131
66 # - https://github.com/systemd/systemd/issues/12131
67+ mkIf (versionOlder config.system.stateVersion "19.09") ''
67− if [ -L /var/lib/systemd/timesync ]; then
68+ if [ -L /var/lib/systemd/timesync ]; then
68− rm /var/lib/systemd/timesync
69+ rm /var/lib/systemd/timesync
69− mv /var/lib/private/systemd/timesync /var/lib/systemd/timesync
70+ mv /var/lib/private/systemd/timesync /var/lib/systemd/timesync
71+ fi
72+ '';
73+ system.activationScripts.systemd-timesyncd-init-clock =
74+ # Ensure that we have some stored time to prevent systemd-timesyncd to
75+ # resort back to the fallback time.
76+ # If the file doesn't exist we assume that our current system clock is
77+ # good enough to provide an initial value.
78+ ''
79+ if ! [ -f /var/lib/systemd/timesync/clock ]; then
80+ test -d /var/lib/systemd/timesync || mkdir -p /var/lib/systemd/timesync
81+ touch /var/lib/systemd/timesync/clock
70 fi
82 fi
71− '';
83+ '';
72 };
84 };
73
85
74}
86}
nixos/modules/tasks/auto-upgrade.nix+32−7
@@ -63,13 +63,16 @@ in {
63 };
63 };
64
64
65 dates = mkOption {
65 dates = mkOption {
66− default = "04:40";
67 type = types.str;
66 type = types.str;
67+ default = "04:40";
68+ example = "daily";
68 description = ''
69 description = ''
70+ How often or when upgrade occurs. For most desktop and server systems
71+ a sufficient upgrade frequency is once a day.
72+
69− Specification (in the format described by
73+ The format is described in
70 <citerefentry><refentrytitle>systemd.time</refentrytitle>
74 <citerefentry><refentrytitle>systemd.time</refentrytitle>
71− <manvolnum>7</manvolnum></citerefentry>) of the time at
75+ <manvolnum>7</manvolnum></citerefentry>.
72− which the update will occur.
73 '';
76 '';
74 };
77 };
75
78
@@ -123,6 +126,22 @@ in {
123 });
126 });
124 };
127 };
125
128
129+ persistent = mkOption {
130+ default = true;
131+ type = types.bool;
132+ example = false;
133+ description = ''
134+ Takes a boolean argument. If true, the time when the service
135+ unit was last triggered is stored on disk. When the timer is
136+ activated, the service unit is triggered immediately if it
137+ would have been triggered at least once during the time when
138+ the timer was inactive. Such triggering is nonetheless
139+ subject to the delay imposed by RandomizedDelaySec=. This is
140+ useful to catch up on missed runs of the service when the
141+ system was powered down.
142+ '';
143+ };
144+
126 };
145 };
127
146
128 };
147 };
@@ -217,11 +236,17 @@ in {
217 '';
236 '';
218
237
219 startAt = cfg.dates;
238 startAt = cfg.dates;
220− };
221
239
222− systemd.timers.nixos-upgrade.timerConfig.RandomizedDelaySec =
240+ after = [ "network-online.target" ];
223− cfg.randomizedDelaySec;
241+ wants = [ "network-online.target" ];
242+ };
224
243
244+ systemd.timers.nixos-upgrade = {
245+ timerConfig = {
246+ RandomizedDelaySec = cfg.randomizedDelaySec;
247+ Persistent = cfg.persistent;
248+ };
249+ };
225 };
250 };
226
251
227}
252}
nixos/modules/tasks/bcache.nix+16−6
@@ -1,13 +1,23 @@
1−{ pkgs, ... }:
1+{ config, lib, pkgs, ... }:
2
2
3{
3{
4+ options.boot.initrd.services.bcache.enable = (lib.mkEnableOption "bcache support in the initrd") // {
5+ visible = false; # only works with systemd stage 1
6+ };
4
7
5− environment.systemPackages = [ pkgs.bcache-tools ];
8+ config = {
6
9
7− services.udev.packages = [ pkgs.bcache-tools ];
10+ environment.systemPackages = [ pkgs.bcache-tools ];
8
11
9− boot.initrd.extraUdevRulesCommands = ''
10− cp -v ${pkgs.bcache-tools}/lib/udev/rules.d/*.rules $out/
12+ services.udev.packages = [ pkgs.bcache-tools ];
11− '';
12
13
14+ boot.initrd.extraUdevRulesCommands = lib.mkIf (!config.boot.initrd.systemd.enable) ''
15+ cp -v ${pkgs.bcache-tools}/lib/udev/rules.d/*.rules $out/
16+ '';
17+
18+ boot.initrd.services.udev = lib.mkIf config.boot.initrd.services.bcache.enable {
19+ packages = [ pkgs.bcache-tools ];
20+ binPackages = [ pkgs.bcache-tools ];
21+ };
22+ };
13}
23}
nixos/modules/tasks/filesystems.nix+1−1
@@ -352,7 +352,7 @@ in
352 unitConfig.DefaultDependencies = false; # needed to prevent a cycle
352 unitConfig.DefaultDependencies = false; # needed to prevent a cycle
353 serviceConfig.Type = "oneshot";
353 serviceConfig.Type = "oneshot";
354 };
354 };
355− in listToAttrs (map formatDevice (filter (fs: fs.autoFormat) fileSystems)) // {
355+ in listToAttrs (map formatDevice (filter (fs: fs.autoFormat && !(utils.fsNeededForBoot fs)) fileSystems)) // {
356 # Mount /sys/fs/pstore for evacuating panic logs and crashdumps from persistent storage onto the disk using systemd-pstore.
356 # Mount /sys/fs/pstore for evacuating panic logs and crashdumps from persistent storage onto the disk using systemd-pstore.
357 # This cannot be done with the other special filesystems because the pstore module (which creates the mount point) is not loaded then.
357 # This cannot be done with the other special filesystems because the pstore module (which creates the mount point) is not loaded then.
358 "mount-pstore" = {
358 "mount-pstore" = {
nixos/modules/tasks/filesystems/btrfs.nix+3−3
@@ -66,19 +66,19 @@ in
66 ]
66 ]
67 );
67 );
68
68
69− boot.initrd.extraUtilsCommands = mkIf inInitrd
69+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
70 ''
70 ''
71 copy_bin_and_libs ${pkgs.btrfs-progs}/bin/btrfs
71 copy_bin_and_libs ${pkgs.btrfs-progs}/bin/btrfs
72 ln -sv btrfs $out/bin/btrfsck
72 ln -sv btrfs $out/bin/btrfsck
73 ln -sv btrfsck $out/bin/fsck.btrfs
73 ln -sv btrfsck $out/bin/fsck.btrfs
74 '';
74 '';
75
75
76− boot.initrd.extraUtilsCommandsTest = mkIf inInitrd
76+ boot.initrd.extraUtilsCommandsTest = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
77 ''
77 ''
78 $out/bin/btrfs --version
78 $out/bin/btrfs --version
79 '';
79 '';
80
80
81− boot.initrd.postDeviceCommands = mkIf inInitrd
81+ boot.initrd.postDeviceCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
82 ''
82 ''
83 btrfs device scan
83 btrfs device scan
84 '';
84 '';
nixos/modules/tasks/filesystems/cifs.nix+1−1
@@ -16,7 +16,7 @@ in
16 boot.initrd.availableKernelModules = mkIf inInitrd
16 boot.initrd.availableKernelModules = mkIf inInitrd
17 [ "cifs" "nls_utf8" "hmac" "md4" "ecb" "des_generic" "sha256" ];
17 [ "cifs" "nls_utf8" "hmac" "md4" "ecb" "des_generic" "sha256" ];
18
18
19− boot.initrd.extraUtilsCommands = mkIf inInitrd
19+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
20 ''
20 ''
21 copy_bin_and_libs ${pkgs.cifs-utils}/sbin/mount.cifs
21 copy_bin_and_libs ${pkgs.cifs-utils}/sbin/mount.cifs
22 '';
22 '';
nixos/modules/tasks/filesystems/ext.nix+10−4
@@ -1,14 +1,20 @@
1−{ pkgs, ... }:
1+{ config, lib, pkgs, ... }:
2+
3+let
4+
5+ inInitrd = lib.any (fs: fs == "ext2" || fs == "ext3" || fs == "ext4") config.boot.initrd.supportedFilesystems;
6+
7+in
2
8
3{
9{
4 config = {
10 config = {
5
11
6− system.fsPackages = [ pkgs.e2fsprogs ];
12+ system.fsPackages = lib.mkIf (config.boot.initrd.systemd.enable -> inInitrd) [ pkgs.e2fsprogs ];
7
13
8 # As of kernel 4.3, there is no separate ext3 driver (they're also handled by ext4.ko)
14 # As of kernel 4.3, there is no separate ext3 driver (they're also handled by ext4.ko)
9− boot.initrd.availableKernelModules = [ "ext2" "ext4" ];
15+ boot.initrd.availableKernelModules = lib.mkIf (config.boot.initrd.systemd.enable -> inInitrd) [ "ext2" "ext4" ];
10
16
11− boot.initrd.extraUtilsCommands =
17+ boot.initrd.extraUtilsCommands = lib.mkIf (!config.boot.initrd.systemd.enable)
12 ''
18 ''
13 # Copy e2fsck and friends.
19 # Copy e2fsck and friends.
14 copy_bin_and_libs ${pkgs.e2fsprogs}/sbin/e2fsck
20 copy_bin_and_libs ${pkgs.e2fsprogs}/sbin/e2fsck
nixos/modules/tasks/filesystems/f2fs.nix+1−1
@@ -13,7 +13,7 @@ in
13
13
14 boot.initrd.availableKernelModules = mkIf inInitrd [ "f2fs" "crc32" ];
14 boot.initrd.availableKernelModules = mkIf inInitrd [ "f2fs" "crc32" ];
15
15
16− boot.initrd.extraUtilsCommands = mkIf inInitrd ''
16+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable) ''
17 copy_bin_and_libs ${pkgs.f2fs-tools}/sbin/fsck.f2fs
17 copy_bin_and_libs ${pkgs.f2fs-tools}/sbin/fsck.f2fs
18 ${optionalString (any (fs: fs.autoResize) fileSystems) ''
18 ${optionalString (any (fs: fs.autoResize) fileSystems) ''
19 # We need f2fs-tools' tools to resize filesystems
19 # We need f2fs-tools' tools to resize filesystems
nixos/modules/tasks/filesystems/jfs.nix+1−1
@@ -12,7 +12,7 @@ in
12
12
13 boot.initrd.kernelModules = mkIf inInitrd [ "jfs" ];
13 boot.initrd.kernelModules = mkIf inInitrd [ "jfs" ];
14
14
15− boot.initrd.extraUtilsCommands = mkIf inInitrd ''
15+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !boot.initrd.systemd.enable) ''
16 copy_bin_and_libs ${pkgs.jfsutils}/sbin/fsck.jfs
16 copy_bin_and_libs ${pkgs.jfsutils}/sbin/fsck.jfs
17 '';
17 '';
18 };
18 };
nixos/modules/tasks/filesystems/reiserfs.nix+1−1
@@ -15,7 +15,7 @@ in
15
15
16 boot.initrd.kernelModules = mkIf inInitrd [ "reiserfs" ];
16 boot.initrd.kernelModules = mkIf inInitrd [ "reiserfs" ];
17
17
18− boot.initrd.extraUtilsCommands = mkIf inInitrd
18+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
19 ''
19 ''
20 copy_bin_and_libs ${pkgs.reiserfsprogs}/sbin/reiserfsck
20 copy_bin_and_libs ${pkgs.reiserfsprogs}/sbin/reiserfsck
21 ln -s reiserfsck $out/bin/fsck.reiserfs
21 ln -s reiserfsck $out/bin/fsck.reiserfs
nixos/modules/tasks/filesystems/unionfs-fuse.nix+13−2
@@ -6,7 +6,7 @@
6 (lib.mkIf (lib.any (fs: fs == "unionfs-fuse") config.boot.initrd.supportedFilesystems) {
6 (lib.mkIf (lib.any (fs: fs == "unionfs-fuse") config.boot.initrd.supportedFilesystems) {
7 boot.initrd.kernelModules = [ "fuse" ];
7 boot.initrd.kernelModules = [ "fuse" ];
8
8
9− boot.initrd.extraUtilsCommands = ''
9+ boot.initrd.extraUtilsCommands = lib.mkIf (!config.boot.initrd.systemd.enable) ''
10 copy_bin_and_libs ${pkgs.fuse}/sbin/mount.fuse
10 copy_bin_and_libs ${pkgs.fuse}/sbin/mount.fuse
11 copy_bin_and_libs ${pkgs.unionfs-fuse}/bin/unionfs
11 copy_bin_and_libs ${pkgs.unionfs-fuse}/bin/unionfs
12 substitute ${pkgs.unionfs-fuse}/sbin/mount.unionfs-fuse $out/bin/mount.unionfs-fuse \
12 substitute ${pkgs.unionfs-fuse}/sbin/mount.unionfs-fuse $out/bin/mount.unionfs-fuse \
@@ -16,12 +16,23 @@
16 chmod +x $out/bin/mount.unionfs-fuse
16 chmod +x $out/bin/mount.unionfs-fuse
17 '';
17 '';
18
18
19− boot.initrd.postDeviceCommands = ''
19+ boot.initrd.postDeviceCommands = lib.mkIf (!config.boot.initrd.systemd.enable) ''
20 # Hacky!!! fuse hard-codes the path to mount
20 # Hacky!!! fuse hard-codes the path to mount
21 mkdir -p /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-${pkgs.util-linux.name}-bin/bin
21 mkdir -p /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-${pkgs.util-linux.name}-bin/bin
22 ln -s $(which mount) /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-${pkgs.util-linux.name}-bin/bin
22 ln -s $(which mount) /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-${pkgs.util-linux.name}-bin/bin
23 ln -s $(which umount) /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-${pkgs.util-linux.name}-bin/bin
23 ln -s $(which umount) /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-${pkgs.util-linux.name}-bin/bin
24 '';
24 '';
25+
26+ boot.initrd.systemd.extraBin = {
27+ "mount.fuse" = "${pkgs.fuse}/bin/mount.fuse";
28+ "unionfs" = "${pkgs.unionfs-fuse}/bin/unionfs";
29+ "mount.unionfs-fuse" = pkgs.runCommand "mount.unionfs-fuse" {} ''
30+ substitute ${pkgs.unionfs-fuse}/sbin/mount.unionfs-fuse $out \
31+ --replace '${pkgs.bash}/bin/bash' /bin/sh \
32+ --replace '${pkgs.fuse}/sbin' /bin \
33+ --replace '${pkgs.unionfs-fuse}/bin' /bin
34+ '';
35+ };
25 })
36 })
26
37
27 (lib.mkIf (lib.any (fs: fs == "unionfs-fuse") config.boot.supportedFilesystems) {
38 (lib.mkIf (lib.any (fs: fs == "unionfs-fuse") config.boot.supportedFilesystems) {
nixos/modules/tasks/filesystems/vfat.nix+1−1
@@ -15,7 +15,7 @@ in
15
15
16 boot.initrd.kernelModules = mkIf inInitrd [ "vfat" "nls_cp437" "nls_iso8859-1" ];
16 boot.initrd.kernelModules = mkIf inInitrd [ "vfat" "nls_cp437" "nls_iso8859-1" ];
17
17
18− boot.initrd.extraUtilsCommands = mkIf inInitrd
18+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
19 ''
19 ''
20 copy_bin_and_libs ${pkgs.dosfstools}/sbin/dosfsck
20 copy_bin_and_libs ${pkgs.dosfstools}/sbin/dosfsck
21 ln -sv dosfsck $out/bin/fsck.vfat
21 ln -sv dosfsck $out/bin/fsck.vfat
nixos/modules/tasks/filesystems/xfs.nix+2−2
@@ -15,14 +15,14 @@ in
15
15
16 boot.initrd.availableKernelModules = mkIf inInitrd [ "xfs" "crc32c" ];
16 boot.initrd.availableKernelModules = mkIf inInitrd [ "xfs" "crc32c" ];
17
17
18− boot.initrd.extraUtilsCommands = mkIf inInitrd
18+ boot.initrd.extraUtilsCommands = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
19 ''
19 ''
20 copy_bin_and_libs ${pkgs.xfsprogs.bin}/bin/fsck.xfs
20 copy_bin_and_libs ${pkgs.xfsprogs.bin}/bin/fsck.xfs
21 copy_bin_and_libs ${pkgs.xfsprogs.bin}/bin/xfs_repair
21 copy_bin_and_libs ${pkgs.xfsprogs.bin}/bin/xfs_repair
22 '';
22 '';
23
23
24 # Trick just to set 'sh' after the extraUtils nuke-refs.
24 # Trick just to set 'sh' after the extraUtils nuke-refs.
25− boot.initrd.extraUtilsCommandsTest = mkIf inInitrd
25+ boot.initrd.extraUtilsCommandsTest = mkIf (inInitrd && !config.boot.initrd.systemd.enable)
26 ''
26 ''
27 sed -i -e 's,^#!.*,#!'$out/bin/sh, $out/bin/fsck.xfs
27 sed -i -e 's,^#!.*,#!'$out/bin/sh, $out/bin/fsck.xfs
28 '';
28 '';
nixos/modules/tasks/filesystems/zfs.nix+9−33
@@ -466,6 +466,11 @@ in
466 '') rootPools));
466 '') rootPools));
467 };
467 };
468
468
469+ systemd.shutdownRamfs.contents."/etc/systemd/system-shutdown/zpool".source = pkgs.writeShellScript "zpool-sync-shutdown" ''
470+ exec ${cfgZfs.package}/bin/zpool sync
471+ '';
472+ systemd.shutdownRamfs.storePaths = ["${cfgZfs.package}/bin/zpool"];
473+
469 # TODO FIXME See https://github.com/NixOS/nixpkgs/pull/99386#issuecomment-798813567. To not break people's bootloader and as probably not everybody would read release notes that thoroughly add inSystem.
474 # TODO FIXME See https://github.com/NixOS/nixpkgs/pull/99386#issuecomment-798813567. To not break people's bootloader and as probably not everybody would read release notes that thoroughly add inSystem.
470 boot.loader.grub = mkIf (inInitrd || inSystem) {
475 boot.loader.grub = mkIf (inInitrd || inSystem) {
471 zfsSupport = true;
476 zfsSupport = true;
@@ -642,41 +647,14 @@ in
642 };
647 };
643
648
644 scriptArgs = "%i";
649 scriptArgs = "%i";
645− path = [ pkgs.gawk cfgZfs.package ];
650+ path = [ cfgZfs.package ];
646−
651+
647− # ZFS has no way of enumerating just devices in a pool in a way
648− # that 'zpool online -e' supports. Thus, we've implemented a
649− # bit of a strange approach of highlighting just devices.
650− # See: https://github.com/openzfs/zfs/issues/12505
651− script = let
652+ script = ''
652− # This UUID has been chosen at random and is to provide a
653− # collision-proof, predictable token to search for
654− magicIdentifier = "NIXOS-ZFS-ZPOOL-DEVICE-IDENTIFIER-37108bec-aff6-4b58-9e5e-53c7c9766f05";
655− zpoolScripts = pkgs.writeShellScriptBin "device-highlighter" ''
656− echo "${magicIdentifier}"
657− '';
658− in ''
659 pool=$1
653 pool=$1
660
654
661 echo "Expanding all devices for $pool."
655 echo "Expanding all devices for $pool."
662
656
663− # Put our device-highlighter script it to the PATH
657+ ${pkgs.zpool-auto-expand-partitions}/bin/zpool_part_disks --automatically-grow "$pool"
664− export ZPOOL_SCRIPTS_PATH=${zpoolScripts}/bin
665−
666− # Enable running our precisely specified zpool script as root
667− export ZPOOL_SCRIPTS_AS_ROOT=1
668−
669− devices() (
670− zpool status -c device-highlighter "$pool" \
671− | awk '($2 == "ONLINE" && $6 == "${magicIdentifier}") { print $1; }'
672− )
673−
674− for device in $(devices); do
675− echo "Attempting to expand $device of $pool..."
676− if ! zpool online -e "$pool" "$device"; then
677− echo "Failed to expand '$device' of '$pool'."
678− fi
679− done
680 '';
658 '';
681 };
659 };
682
660
@@ -701,8 +679,6 @@ in
701 RemainAfterExit = true;
679 RemainAfterExit = true;
702 };
680 };
703
681
704− path = [ pkgs.gawk cfgZfs.package ];
705−
706 script = ''
682 script = ''
707 for pool in ${poolListProvider}; do
683 for pool in ${poolListProvider}; do
708 systemctl start --no-block "zpool-expand@$pool"
684 systemctl start --no-block "zpool-expand@$pool"
nixos/modules/tasks/lvm.nix+55−6
@@ -7,17 +7,22 @@ in {
7 options.services.lvm = {
7 options.services.lvm = {
8 package = mkOption {
8 package = mkOption {
9 type = types.package;
9 type = types.package;
10− default = if cfg.dmeventd.enable then pkgs.lvm2_dmeventd else pkgs.lvm2;
10+ default = pkgs.lvm2;
11 internal = true;
11 internal = true;
12 defaultText = literalExpression "pkgs.lvm2";
12 defaultText = literalExpression "pkgs.lvm2";
13 description = ''
13 description = ''
14 This option allows you to override the LVM package that's used on the system
14 This option allows you to override the LVM package that's used on the system
15 (udev rules, tmpfiles, systemd services).
15 (udev rules, tmpfiles, systemd services).
16− Defaults to pkgs.lvm2, or pkgs.lvm2_dmeventd if dmeventd is enabled.
16+ Defaults to pkgs.lvm2, pkgs.lvm2_dmeventd if dmeventd or pkgs.lvm2_vdo if vdo is enabled.
17 '';
17 '';
18 };
18 };
19 dmeventd.enable = mkEnableOption "the LVM dmevent daemon";
19 dmeventd.enable = mkEnableOption "the LVM dmevent daemon";
20 boot.thin.enable = mkEnableOption "support for booting from ThinLVs";
20 boot.thin.enable = mkEnableOption "support for booting from ThinLVs";
21+ boot.vdo.enable = mkEnableOption "support for booting from VDOLVs";
22+ };
23+
24+ options.boot.initrd.services.lvm.enable = (mkEnableOption "enable booting from LVM2 in the initrd") // {
25+ visible = false;
21 };
26 };
22
27
23 config = mkMerge [
28 config = mkMerge [
@@ -30,8 +35,13 @@ in {
30 environment.systemPackages = [ cfg.package ];
35 environment.systemPackages = [ cfg.package ];
31 systemd.packages = [ cfg.package ];
36 systemd.packages = [ cfg.package ];
32
37
33− # TODO: update once https://github.com/NixOS/nixpkgs/pull/93006 was merged
34 services.udev.packages = [ cfg.package.out ];
38 services.udev.packages = [ cfg.package.out ];
39+
40+ # We need lvm2 for the device-mapper rules
41+ boot.initrd.services.udev.packages = lib.mkIf config.boot.initrd.services.lvm.enable [ cfg.package ];
42+ # The device-mapper rules want to call tools from lvm2
43+ boot.initrd.systemd.initrdBin = lib.mkIf config.boot.initrd.services.lvm.enable [ cfg.package ];
44+ boot.initrd.services.udev.binPackages = lib.mkIf config.boot.initrd.services.lvm.enable [ cfg.package ];
35 })
45 })
36 (mkIf cfg.dmeventd.enable {
46 (mkIf cfg.dmeventd.enable {
37 systemd.sockets."dm-event".wantedBy = [ "sockets.target" ];
47 systemd.sockets."dm-event".wantedBy = [ "sockets.target" ];
@@ -40,18 +50,21 @@ in {
40 environment.etc."lvm/lvm.conf".text = ''
50 environment.etc."lvm/lvm.conf".text = ''
41 dmeventd/executable = "${cfg.package}/bin/dmeventd"
51 dmeventd/executable = "${cfg.package}/bin/dmeventd"
42 '';
52 '';
53+ services.lvm.package = mkDefault pkgs.lvm2_dmeventd;
43 })
54 })
44 (mkIf cfg.boot.thin.enable {
55 (mkIf cfg.boot.thin.enable {
45 boot.initrd = {
56 boot.initrd = {
46 kernelModules = [ "dm-snapshot" "dm-thin-pool" ];
57 kernelModules = [ "dm-snapshot" "dm-thin-pool" ];
47
58
59+ systemd.initrdBin = lib.mkIf config.boot.initrd.services.lvm.enable [ pkgs.thin-provisioning-tools ];
60+
48− extraUtilsCommands = ''
61+ extraUtilsCommands = mkIf (!config.boot.initrd.systemd.enable) ''
49 for BIN in ${pkgs.thin-provisioning-tools}/bin/*; do
62 for BIN in ${pkgs.thin-provisioning-tools}/bin/*; do
50 copy_bin_and_libs $BIN
63 copy_bin_and_libs $BIN
51 done
64 done
52 '';
65 '';
53
66
54− extraUtilsCommandsTest = ''
67+ extraUtilsCommandsTest = mkIf (!config.boot.initrd.systemd.enable) ''
55 ls ${pkgs.thin-provisioning-tools}/bin/ | grep -v pdata_tools | while read BIN; do
68 ls ${pkgs.thin-provisioning-tools}/bin/ | grep -v pdata_tools | while read BIN; do
56 $out/bin/$(basename $BIN) --help > /dev/null
69 $out/bin/$(basename $BIN) --help > /dev/null
57 done
70 done
@@ -61,9 +74,45 @@ in {
61 environment.etc."lvm/lvm.conf".text = concatMapStringsSep "\n"
74 environment.etc."lvm/lvm.conf".text = concatMapStringsSep "\n"
62 (bin: "global/${bin}_executable = ${pkgs.thin-provisioning-tools}/bin/${bin}")
75 (bin: "global/${bin}_executable = ${pkgs.thin-provisioning-tools}/bin/${bin}")
63 [ "thin_check" "thin_dump" "thin_repair" "cache_check" "cache_dump" "cache_repair" ];
76 [ "thin_check" "thin_dump" "thin_repair" "cache_check" "cache_dump" "cache_repair" ];
77+
78+ environment.systemPackages = [ pkgs.thin-provisioning-tools ];
79+ })
80+ (mkIf cfg.boot.vdo.enable {
81+ boot = {
82+ initrd = {
83+ kernelModules = [ "kvdo" ];
84+
85+ systemd.initrdBin = lib.mkIf config.boot.initrd.services.lvm.enable [ pkgs.vdo ];
86+
87+ extraUtilsCommands = mkIf (!config.boot.initrd.systemd.enable)''
88+ ls ${pkgs.vdo}/bin/ | grep -v adaptLVMVDO | while read BIN; do
89+ copy_bin_and_libs ${pkgs.vdo}/bin/$BIN
90+ done
91+ '';
92+
93+ extraUtilsCommandsTest = mkIf (!config.boot.initrd.systemd.enable)''
94+ ls ${pkgs.vdo}/bin/ | grep -v adaptLVMVDO | while read BIN; do
95+ $out/bin/$(basename $BIN) --help > /dev/null
96+ done
97+ '';
98+ };
99+ extraModulePackages = [ config.boot.kernelPackages.kvdo ];
100+ };
101+
102+ services.lvm.package = mkOverride 999 pkgs.lvm2_vdo; # this overrides mkDefault
103+
104+ environment.systemPackages = [ pkgs.vdo ];
64 })
105 })
65 (mkIf (cfg.dmeventd.enable || cfg.boot.thin.enable) {
106 (mkIf (cfg.dmeventd.enable || cfg.boot.thin.enable) {
66− boot.initrd.preLVMCommands = ''
107+ boot.initrd.systemd.contents."/etc/lvm/lvm.conf".text = optionalString (config.boot.initrd.services.lvm.enable && cfg.boot.thin.enable) (concatMapStringsSep "\n"
108+ (bin: "global/${bin}_executable = /bin/${bin}")
109+ [ "thin_check" "thin_dump" "thin_repair" "cache_check" "cache_dump" "cache_repair" ]
110+ ) + "\n" + optionalString cfg.dmeventd.enable ''
111+ dmeventd/executable = /bin/false
112+ activation/monitoring = 0
113+ '';
114+
115+ boot.initrd.preLVMCommands = mkIf (!config.boot.initrd.systemd.enable) ''
67 mkdir -p /etc/lvm
116 mkdir -p /etc/lvm
68 cat << EOF >> /etc/lvm/lvm.conf
117 cat << EOF >> /etc/lvm/lvm.conf
69 ${optionalString cfg.boot.thin.enable (
118 ${optionalString cfg.boot.thin.enable (
nixos/modules/tasks/network-interfaces.nix+11−10
@@ -403,6 +403,15 @@ let
403 </itemizedlist>
403 </itemizedlist>
404 '';
404 '';
405
405
406+ hostidFile = pkgs.runCommand "gen-hostid" { preferLocalBuild = true; } ''
407+ hi="${cfg.hostId}"
408+ ${if pkgs.stdenv.isBigEndian then ''
409+ echo -ne "\x''${hi:0:2}\x''${hi:2:2}\x''${hi:4:2}\x''${hi:6:2}" > $out
410+ '' else ''
411+ echo -ne "\x''${hi:6:2}\x''${hi:4:2}\x''${hi:2:2}\x''${hi:0:2}" > $out
412+ ''}
413+ '';
414+
406in
415in
407
416
408{
417{
@@ -1383,16 +1392,8 @@ in
1383 domainname "${cfg.domain}"
1392 domainname "${cfg.domain}"
1384 '';
1393 '';
1385
1394
1386− environment.etc.hostid = mkIf (cfg.hostId != null)
1395+ environment.etc.hostid = mkIf (cfg.hostId != null) { source = hostidFile; };
1387− { source = pkgs.runCommand "gen-hostid" { preferLocalBuild = true; } ''
1396+ boot.initrd.systemd.contents."/etc/hostid" = mkIf (cfg.hostId != null) { source = hostidFile; };
1388− hi="${cfg.hostId}"
1389− ${if pkgs.stdenv.isBigEndian then ''
1390− echo -ne "\x''${hi:0:2}\x''${hi:2:2}\x''${hi:4:2}\x''${hi:6:2}" > $out
1391− '' else ''
1392− echo -ne "\x''${hi:6:2}\x''${hi:4:2}\x''${hi:2:2}\x''${hi:0:2}" > $out
1393− ''}
1394− '';
1395− };
1396
1397
1397 # static hostname configuration needed for hostnamectl and the
1398 # static hostname configuration needed for hostnamectl and the
1398 # org.freedesktop.hostname1 dbus service (both provided by systemd)
1399 # org.freedesktop.hostname1 dbus service (both provided by systemd)
nixos/modules/tasks/swraid.nix+35−9
@@ -1,17 +1,43 @@
1−{ pkgs, ... }:
1+{ config, pkgs, lib, ... }: let
2
2
3−{
3+ cfg = config.boot.initrd.services.swraid;
4
4
5− environment.systemPackages = [ pkgs.mdadm ];
5+in {
6
6
7− services.udev.packages = [ pkgs.mdadm ];
7+ options.boot.initrd.services.swraid = {
8+ enable = (lib.mkEnableOption "swraid support using mdadm") // {
9+ visible = false; # only has effect when the new stage 1 is in place
10+ };
8
11
9− systemd.packages = [ pkgs.mdadm ];
12+ mdadmConf = lib.mkOption {
13+ description = "Contents of <filename>/etc/mdadm.conf</filename> in initrd.";
14+ type = lib.types.lines;
15+ default = "";
16+ };
17+ };
10
18
11− boot.initrd.availableKernelModules = [ "md_mod" "raid0" "raid1" "raid10" "raid456" ];
19+ config = {
20+ environment.systemPackages = [ pkgs.mdadm ];
12
21
13− boot.initrd.extraUdevRulesCommands = ''
22+ services.udev.packages = [ pkgs.mdadm ];
14− cp -v ${pkgs.mdadm}/lib/udev/rules.d/*.rules $out/
15− '';
16
23
24+ systemd.packages = [ pkgs.mdadm ];
25+
26+ boot.initrd.availableKernelModules = lib.mkIf (config.boot.initrd.systemd.enable -> cfg.enable) [ "md_mod" "raid0" "raid1" "raid10" "raid456" ];
27+
28+ boot.initrd.extraUdevRulesCommands = lib.mkIf (!config.boot.initrd.systemd.enable) ''
29+ cp -v ${pkgs.mdadm}/lib/udev/rules.d/*.rules $out/
30+ '';
31+
32+ boot.initrd.systemd = lib.mkIf cfg.enable {
33+ contents."/etc/mdadm.conf" = lib.mkIf (cfg.mdadmConf != "") {
34+ text = cfg.mdadmConf;
35+ };
36+
37+ packages = [ pkgs.mdadm ];
38+ initrdBin = [ pkgs.mdadm ];
39+ };
40+
41+ boot.initrd.services.udev.packages = lib.mkIf cfg.enable [ pkgs.mdadm ];
42+ };
17}
43}
nixos/modules/testing/test-instrumentation.nix+19−26
@@ -65,33 +65,26 @@ in
65 };
65 };
66 };
66 };
67
67
68− boot.initrd.preDeviceCommands =
68+ boot.kernel.sysctl = {
69− ''
70− echo 600 > /proc/sys/kernel/hung_task_timeout_secs
69+ "kernel.hung_task_timeout_secs" = 600;
71− '';
72−
73− boot.initrd.postDeviceCommands =
74− ''
75− # Using acpi_pm as a clock source causes the guest clock to
76− # slow down under high host load. This is usually a bad
77− # thing, but for VM tests it should provide a bit more
78− # determinism (e.g. if the VM runs at lower speed, then
79− # timeouts in the VM should also be delayed).
80− echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource
81− '';
82−
83− boot.postBootCommands =
84− ''
85− # Panic on out-of-memory conditions rather than letting the
70+ # Panic on out-of-memory conditions rather than letting the
86− # OOM killer randomly get rid of processes, since this leads
71+ # OOM killer randomly get rid of processes, since this leads
87− # to failures that are hard to diagnose.
72+ # to failures that are hard to diagnose.
88− echo 2 > /proc/sys/vm/panic_on_oom
73+ "vm.panic_on_oom" = lib.mkDefault 2;
89− '';
74+ };
90
75
91− # Panic if an error occurs in stage 1 (rather than waiting for
92− # user intervention).
93− boot.kernelParams =
76+ boot.kernelParams = [
94− [ "console=${qemu-common.qemuSerialDevice}" "panic=1" "boot.panic_on_fail" ];
77+ "console=${qemu-common.qemuSerialDevice}"
78+ # Panic if an error occurs in stage 1 (rather than waiting for
79+ # user intervention).
80+ "panic=1" "boot.panic_on_fail"
81+ # Using acpi_pm as a clock source causes the guest clock to
82+ # slow down under high host load. This is usually a bad
83+ # thing, but for VM tests it should provide a bit more
84+ # determinism (e.g. if the VM runs at lower speed, then
85+ # timeouts in the VM should also be delayed).
86+ "clock=acpi_pm"
87+ ];
95
88
96 # `xwininfo' is used by the test driver to query open windows.
89 # `xwininfo' is used by the test driver to query open windows.
97 environment.systemPackages = [ pkgs.xorg.xwininfo ];
90 environment.systemPackages = [ pkgs.xorg.xwininfo ];
nixos/modules/virtualisation/azure-common.nix+5−1
@@ -21,7 +21,11 @@ with lib;
21 # way to select them anyway.
21 # way to select them anyway.
22 boot.loader.grub.configurationLimit = 0;
22 boot.loader.grub.configurationLimit = 0;
23
23
24+ fileSystems."/" = {
24− fileSystems."/".device = "/dev/disk/by-label/nixos";
25+ device = "/dev/disk/by-label/nixos";
26+ fsType = "ext4";
27+ autoResize = true;
28+ };
25
29
26 # Allow root logins only using the SSH key that the user specified
30 # Allow root logins only using the SSH key that the user specified
27 # at instance creation time, ping client connections to avoid timeouts
31 # at instance creation time, ping client connections to avoid timeouts
nixos/modules/virtualisation/libvirtd.nix+4
@@ -344,6 +344,10 @@ in
344 restartIfChanged = false;
344 restartIfChanged = false;
345 };
345 };
346
346
347+ systemd.services.virtchd = {
348+ path = [ pkgs.cloud-hypervisor ];
349+ };
350+
347 systemd.services.libvirt-guests = {
351 systemd.services.libvirt-guests = {
348 wantedBy = [ "multi-user.target" ];
352 wantedBy = [ "multi-user.target" ];
349 path = with pkgs; [ coreutils gawk cfg.package ];
353 path = with pkgs; [ coreutils gawk cfg.package ];
nixos/modules/virtualisation/nixos-containers.nix+26−11
@@ -4,6 +4,11 @@ with lib;
4
4
5let
5let
6
6
7+ configurationPrefix = optionalString (versionAtLeast config.system.stateVersion "22.05") "nixos-";
8+ configurationDirectoryName = "${configurationPrefix}containers";
9+ configurationDirectory = "/etc/${configurationDirectoryName}";
10+ stateDirectory = "/var/lib/${configurationPrefix}containers";
11+
7 # The container's init script, a small wrapper around the regular
12 # The container's init script, a small wrapper around the regular
8 # NixOS stage-2 init script.
13 # NixOS stage-2 init script.
9 containerInit = (cfg:
14 containerInit = (cfg:
@@ -77,7 +82,7 @@ let
77 startScript = cfg:
82 startScript = cfg:
78 ''
83 ''
79 mkdir -p -m 0755 "$root/etc" "$root/var/lib"
84 mkdir -p -m 0755 "$root/etc" "$root/var/lib"
80− mkdir -p -m 0700 "$root/var/lib/private" "$root/root" /run/containers
85+ mkdir -p -m 0700 "$root/var/lib/private" "$root/root" /run/nixos-containers
81 if ! [ -e "$root/etc/os-release" ]; then
86 if ! [ -e "$root/etc/os-release" ]; then
82 touch "$root/etc/os-release"
87 touch "$root/etc/os-release"
83 fi
88 fi
@@ -249,11 +254,11 @@ let
249
254
250 SyslogIdentifier = "container %i";
255 SyslogIdentifier = "container %i";
251
256
252− EnvironmentFile = "-/etc/containers/%i.conf";
257+ EnvironmentFile = "-${configurationDirectory}/%i.conf";
253
258
254 Type = "notify";
259 Type = "notify";
255
260
256− RuntimeDirectory = lib.optional cfg.ephemeral "containers/%i";
261+ RuntimeDirectory = lib.optional cfg.ephemeral "${configurationDirectoryName}/%i";
257
262
258 # Note that on reboot, systemd-nspawn returns 133, so this
263 # Note that on reboot, systemd-nspawn returns 133, so this
259 # unit will be restarted. On poweroff, it returns 0, so the
264 # unit will be restarted. On poweroff, it returns 0, so the
@@ -737,15 +742,21 @@ in
737
742
738 config = mkIf (config.boot.enableContainers) (let
743 config = mkIf (config.boot.enableContainers) (let
739
744
745+ warnings = flatten [
746+ (optional (config.virtualisation.containers.enable && versionOlder config.system.stateVersion "22.05") ''
747+ Enabling both boot.enableContainers & virtualisation.containers on system.stateVersion < 22.05 is unsupported.
748+ '')
749+ ];
750+
740 unit = {
751 unit = {
741 description = "Container '%i'";
752 description = "Container '%i'";
742
753
743− unitConfig.RequiresMountsFor = "/var/lib/containers/%i";
754+ unitConfig.RequiresMountsFor = "${stateDirectory}/%i";
744
755
745 path = [ pkgs.iproute2 ];
756 path = [ pkgs.iproute2 ];
746
757
747 environment = {
758 environment = {
748− root = "/var/lib/containers/%i";
759+ root = "${stateDirectory}/%i";
749 INSTANCE = "%i";
760 INSTANCE = "%i";
750 };
761 };
751
762
@@ -782,8 +793,8 @@ in
782 script = startScript containerConfig;
793 script = startScript containerConfig;
783 postStart = postStartScript containerConfig;
794 postStart = postStartScript containerConfig;
784 serviceConfig = serviceDirectives containerConfig;
795 serviceConfig = serviceDirectives containerConfig;
785− unitConfig.RequiresMountsFor = lib.optional (!containerConfig.ephemeral) "/var/lib/containers/%i";
796+ unitConfig.RequiresMountsFor = lib.optional (!containerConfig.ephemeral) "${stateDirectory}/%i";
786− environment.root = if containerConfig.ephemeral then "/run/containers/%i" else "/var/lib/containers/%i";
797+ environment.root = if containerConfig.ephemeral then "/run/nixos-containers/%i" else "${stateDirectory}/%i";
787 } // (
798 } // (
788 if containerConfig.autoStart then
799 if containerConfig.autoStart then
789 {
800 {
@@ -792,7 +803,7 @@ in
792 after = [ "network.target" ];
803 after = [ "network.target" ];
793 restartTriggers = [
804 restartTriggers = [
794 containerConfig.path
805 containerConfig.path
795− config.environment.etc."containers/${name}.conf".source
806+ config.environment.etc."${configurationDirectoryName}/${name}.conf".source
796 ];
807 ];
797 restartIfChanged = true;
808 restartIfChanged = true;
798 }
809 }
@@ -800,12 +811,12 @@ in
800 )) config.containers)
811 )) config.containers)
801 ));
812 ));
802
813
803− # Generate a configuration file in /etc/containers for each
814+ # Generate a configuration file in /etc/nixos-containers for each
804 # container so that container@.target can get the container
815 # container so that container@.target can get the container
805 # configuration.
816 # configuration.
806 environment.etc =
817 environment.etc =
807 let mkPortStr = p: p.protocol + ":" + (toString p.hostPort) + ":" + (if p.containerPort == null then toString p.hostPort else toString p.containerPort);
818 let mkPortStr = p: p.protocol + ":" + (toString p.hostPort) + ":" + (if p.containerPort == null then toString p.hostPort else toString p.containerPort);
808− in mapAttrs' (name: cfg: nameValuePair "containers/${name}.conf"
819+ in mapAttrs' (name: cfg: nameValuePair "${configurationDirectoryName}/${name}.conf"
809 { text =
820 { text =
810 ''
821 ''
811 SYSTEM_PATH=${cfg.path}
822 SYSTEM_PATH=${cfg.path}
@@ -854,7 +865,11 @@ in
854 ENV{INTERFACE}=="v[eb]-*", ENV{NM_UNMANAGED}="1"
865 ENV{INTERFACE}=="v[eb]-*", ENV{NM_UNMANAGED}="1"
855 '';
866 '';
856
867
857− environment.systemPackages = [ pkgs.nixos-container ];
868+ environment.systemPackages = [
869+ (pkgs.nixos-container.override {
870+ inherit stateDirectory configurationDirectory;
871+ })
872+ ];
858
873
859 boot.kernelModules = [
874 boot.kernelModules = [
860 "bridge"
875 "bridge"
nixos/modules/virtualisation/oci-containers.nix+1−5
@@ -338,11 +338,7 @@ in {
338
338
339 backend = mkOption {
339 backend = mkOption {
340 type = types.enum [ "podman" "docker" ];
340 type = types.enum [ "podman" "docker" ];
341− default =
342− # TODO: Once https://github.com/NixOS/nixpkgs/issues/77925 is resolved default to podman
343− # if versionAtLeast config.system.stateVersion "20.09" then "podman"
341+ default = if versionAtLeast config.system.stateVersion "22.05" then "podman" else "docker";
344− # else "docker";
345− "docker";
346 description = "The underlying Docker implementation to use.";
342 description = "The underlying Docker implementation to use.";
347 };
343 };
348
344
nixos/modules/virtualisation/openstack-config.nix+39−7
@@ -1,8 +1,11 @@
1−{ pkgs, lib, ... }:
1+{ config, pkgs, lib, ... }:
2
2
3−with lib;
3+# image metadata:
4+# hw_firmware_type=uefi
4
5
5let
6let
7+ inherit (lib) mkIf mkDefault;
8+ cfg = config.openstack;
6 metadataFetcher = import ./openstack-metadata-fetcher.nix {
9 metadataFetcher = import ./openstack-metadata-fetcher.nix {
7 targetRoot = "/";
10 targetRoot = "/";
8 wgetExtraOptions = "--retry-connrefused";
11 wgetExtraOptions = "--retry-connrefused";
@@ -11,23 +14,47 @@ in
11{
14{
12 imports = [
15 imports = [
13 ../profiles/qemu-guest.nix
16 ../profiles/qemu-guest.nix
17+
18+ # Note: While we do use the headless profile, we also explicitly
19+ # turn on the serial console on tty1 below.
20+ # Note that I could not find any documentation indicating tty1 was
21+ # the correct choice. I picked tty1 because that is what one
22+ # particular host was using.
14 ../profiles/headless.nix
23 ../profiles/headless.nix
24+
15 # The Openstack Metadata service exposes data on an EC2 API also.
25 # The Openstack Metadata service exposes data on an EC2 API also.
16 ./ec2-data.nix
26 ./ec2-data.nix
17 ./amazon-init.nix
27 ./amazon-init.nix
18 ];
28 ];
19
29
20 config = {
30 config = {
21− fileSystems."/" = {
31+ fileSystems."/" = mkIf (!cfg.zfs.enable) {
22 device = "/dev/disk/by-label/nixos";
32 device = "/dev/disk/by-label/nixos";
23 fsType = "ext4";
33 fsType = "ext4";
24 autoResize = true;
34 autoResize = true;
25 };
35 };
26
36
37+ fileSystems."/boot" = mkIf (cfg.efi || cfg.zfs.enable) {
38+ # The ZFS image uses a partition labeled ESP whether or not we're
39+ # booting with EFI.
40+ device = "/dev/disk/by-label/ESP";
41+ fsType = "vfat";
42+ };
43+
27 boot.growPartition = true;
44 boot.growPartition = true;
28− boot.kernelParams = [ "console=ttyS0" ];
45+ boot.kernelParams = [ "console=tty1" ];
29− boot.loader.grub.device = "/dev/vda";
46+ boot.loader.grub.device = if (!cfg.efi) then "/dev/vda" else "nodev";
47+ boot.loader.grub.efiSupport = cfg.efi;
48+ boot.loader.grub.efiInstallAsRemovable = cfg.efi;
30− boot.loader.timeout = 0;
49+ boot.loader.timeout = 1;
50+ boot.loader.grub.extraConfig = ''
51+ serial --unit=1 --speed=115200 --word=8 --parity=no --stop=1
52+ terminal_output console serial
53+ terminal_input console serial
54+ '';
55+
56+ services.zfs.expandOnBoot = mkIf cfg.zfs.enable (lib.mkDefault "all");
57+ boot.zfs.devNodes = mkIf cfg.zfs.enable "/dev/";
31
58
32 # Allow root logins
59 # Allow root logins
33 services.openssh = {
60 services.openssh = {
@@ -36,6 +63,11 @@ in
36 passwordAuthentication = mkDefault false;
63 passwordAuthentication = mkDefault false;
37 };
64 };
38
65
66+ users.users.root.initialPassword = "foobar";
67+
68+ # Enable the serial console on tty1
69+ systemd.services."serial-getty@tty1".enable = true;
70+
39 # Force getting the hostname from Openstack metadata.
71 # Force getting the hostname from Openstack metadata.
40 networking.hostName = mkDefault "";
72 networking.hostName = mkDefault "";
41
73
@@ -43,7 +75,7 @@ in
43 path = [ pkgs.wget ];
75 path = [ pkgs.wget ];
44 description = "Fetch Metadata on startup";
76 description = "Fetch Metadata on startup";
45 wantedBy = [ "multi-user.target" ];
77 wantedBy = [ "multi-user.target" ];
46− before = [ "apply-ec2-data.service" "amazon-init.service"];
78+ before = [ "apply-ec2-data.service" "amazon-init.service" ];
47 wants = [ "network-online.target" ];
79 wants = [ "network-online.target" ];
48 after = [ "network-online.target" ];
80 after = [ "network-online.target" ];
49 script = metadataFetcher;
81 script = metadataFetcher;
nixos/modules/virtualisation/openstack-metadata-fetcher.nix+3−3
@@ -14,9 +14,9 @@
14 wget ${wgetExtraOptions} "$@"
14 wget ${wgetExtraOptions} "$@"
15 }
15 }
16
16
17− wget_imds -O "$metaDir/ami-manifest-path" http://169.254.169.254/1.0/meta-data/ami-manifest-path
17+ wget_imds -O "$metaDir/ami-manifest-path" http://169.254.169.254/1.0/meta-data/ami-manifest-path || true
18 # When no user-data is provided, the OpenStack metadata server doesn't expose the user-data route.
18 # When no user-data is provided, the OpenStack metadata server doesn't expose the user-data route.
19 (umask 077 && wget_imds -O "$metaDir/user-data" http://169.254.169.254/1.0/user-data || rm -f "$metaDir/user-data")
19 (umask 077 && wget_imds -O "$metaDir/user-data" http://169.254.169.254/1.0/user-data || rm -f "$metaDir/user-data")
20− wget_imds -O "$metaDir/hostname" http://169.254.169.254/1.0/meta-data/hostname
20+ wget_imds -O "$metaDir/hostname" http://169.254.169.254/1.0/meta-data/hostname || true
21− wget_imds -O "$metaDir/public-keys-0-openssh-key" http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key
21+ wget_imds -O "$metaDir/public-keys-0-openssh-key" http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key || true
22''
22''
nixos/modules/virtualisation/openstack-options.nixnew file+71
@@ -0,0 +1,71 @@
1+{ config, lib, pkgs, ... }:
2+let
3+ inherit (lib) literalExpression types;
4+in
5+{
6+ options = {
7+ openstack = {
8+ zfs = {
9+ enable = lib.mkOption {
10+ default = false;
11+ internal = true;
12+ description = ''
13+ Whether the OpenStack instance uses a ZFS root.
14+ '';
15+ };
16+
17+ datasets = lib.mkOption {
18+ description = ''
19+ Datasets to create under the `tank` and `boot` zpools.
20+
21+ **NOTE:** This option is used only at image creation time, and
22+ does not attempt to declaratively create or manage datasets
23+ on an existing system.
24+ '';
25+
26+ default = { };
27+
28+ type = types.attrsOf (types.submodule {
29+ options = {
30+ mount = lib.mkOption {
31+ description = "Where to mount this dataset.";
32+ type = types.nullOr types.string;
33+ default = null;
34+ };
35+
36+ properties = lib.mkOption {
37+ description = "Properties to set on this dataset.";
38+ type = types.attrsOf types.string;
39+ default = { };
40+ };
41+ };
42+ });
43+ };
44+ };
45+
46+ efi = lib.mkOption {
47+ default = pkgs.stdenv.hostPlatform.isAarch64;
48+ defaultText = literalExpression "pkgs.stdenv.hostPlatform.isAarch64";
49+ internal = true;
50+ description = ''
51+ Whether the instance is using EFI.
52+ '';
53+ };
54+ };
55+ };
56+
57+ config = lib.mkIf config.openstack.zfs.enable {
58+ networking.hostId = lib.mkDefault "00000000";
59+
60+ fileSystems =
61+ let
62+ mountable = lib.filterAttrs (_: value: ((value.mount or null) != null)) config.openstack.zfs.datasets;
63+ in
64+ lib.mapAttrs'
65+ (dataset: opts: lib.nameValuePair opts.mount {
66+ device = dataset;
67+ fsType = "zfs";
68+ })
69+ mountable;
70+ };
71+}
nixos/modules/virtualisation/qemu-vm.nix+38−5
@@ -754,13 +754,13 @@ in
754 );
754 );
755 boot.loader.grub.gfxmodeBios = with cfg.resolution; "${toString x}x${toString y}";
755 boot.loader.grub.gfxmodeBios = with cfg.resolution; "${toString x}x${toString y}";
756
756
757− boot.initrd.extraUtilsCommands =
757+ boot.initrd.extraUtilsCommands = lib.mkIf (!config.boot.initrd.systemd.enable)
758 ''
758 ''
759 # We need mke2fs in the initrd.
759 # We need mke2fs in the initrd.
760 copy_bin_and_libs ${pkgs.e2fsprogs}/bin/mke2fs
760 copy_bin_and_libs ${pkgs.e2fsprogs}/bin/mke2fs
761 '';
761 '';
762
762
763− boot.initrd.postDeviceCommands =
763+ boot.initrd.postDeviceCommands = lib.mkIf (!config.boot.initrd.systemd.enable)
764 ''
764 ''
765 # If the disk image appears to be empty, run mke2fs to
765 # If the disk image appears to be empty, run mke2fs to
766 # initialise.
766 # initialise.
@@ -770,7 +770,7 @@ in
770 fi
770 fi
771 '';
771 '';
772
772
773− boot.initrd.postMountCommands =
773+ boot.initrd.postMountCommands = lib.mkIf (!config.boot.initrd.systemd.enable)
774 ''
774 ''
775 # Mark this as a NixOS machine.
775 # Mark this as a NixOS machine.
776 mkdir -p $targetRoot/etc
776 mkdir -p $targetRoot/etc
@@ -789,6 +789,11 @@ in
789 ''}
789 ''}
790 '';
790 '';
791
791
792+ systemd.tmpfiles.rules = lib.mkIf config.boot.initrd.systemd.enable [
793+ "f /etc/NIXOS 0644 root root -"
794+ "d /boot 0644 root root -"
795+ ];
796+
792 # After booting, register the closure of the paths in
797 # After booting, register the closure of the paths in
793 # `virtualisation.additionalPaths' in the Nix database in the VM. This
798 # `virtualisation.additionalPaths' in the Nix database in the VM. This
794 # allows Nix operations to work in the VM. The path to the
799 # allows Nix operations to work in the VM. The path to the
@@ -853,8 +858,12 @@ in
853 (mkIf (pkgs.stdenv.isAarch32 || pkgs.stdenv.isAarch64) [
858 (mkIf (pkgs.stdenv.isAarch32 || pkgs.stdenv.isAarch64) [
854 "-device virtio-gpu-pci" "-device usb-ehci,id=usb0" "-device usb-kbd" "-device usb-tablet"
859 "-device virtio-gpu-pci" "-device usb-ehci,id=usb0" "-device usb-kbd" "-device usb-tablet"
855 ])
860 ])
861+ (let
862+ alphaNumericChars = lowerChars ++ upperChars ++ (map toString (range 0 9));
863+ # Replace all non-alphanumeric characters with underscores
864+ sanitizeShellIdent = s: concatMapStrings (c: if builtins.elem c alphaNumericChars then c else "_") (stringToCharacters s);
856− (mkIf (!cfg.useBootLoader) [
865+ in mkIf (!cfg.useBootLoader) [
857− "-kernel ${config.system.build.toplevel}/kernel"
866+ "-kernel \${NIXPKGS_QEMU_KERNEL_${sanitizeShellIdent config.system.name}:-${config.system.build.toplevel}/kernel}"
858 "-initrd ${config.system.build.toplevel}/initrd"
867 "-initrd ${config.system.build.toplevel}/initrd"
859 ''-append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo}/registration ${consoles} $QEMU_KERNEL_PARAMS"''
868 ''-append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo}/registration ${consoles} $QEMU_KERNEL_PARAMS"''
860 ])
869 ])
@@ -923,6 +932,8 @@ in
923 mkVMOverride (cfg.fileSystems //
932 mkVMOverride (cfg.fileSystems //
924 {
933 {
925 "/".device = cfg.bootDevice;
934 "/".device = cfg.bootDevice;
935+ "/".fsType = "ext4";
936+ "/".autoFormat = true;
926
937
927 "/tmp" = mkIf config.boot.tmpOnTmpfs
938 "/tmp" = mkIf config.boot.tmpOnTmpfs
928 { device = "tmpfs";
939 { device = "tmpfs";
@@ -953,6 +964,28 @@ in
953 };
964 };
954 } // lib.mapAttrs' mkSharedDir cfg.sharedDirectories);
965 } // lib.mapAttrs' mkSharedDir cfg.sharedDirectories);
955
966
967+ boot.initrd.systemd = lib.mkIf (config.boot.initrd.systemd.enable && cfg.writableStore) {
968+ mounts = [{
969+ where = "/sysroot/nix/store";
970+ what = "overlay";
971+ type = "overlay";
972+ options = "lowerdir=/sysroot/nix/.ro-store,upperdir=/sysroot/nix/.rw-store/store,workdir=/sysroot/nix/.rw-store/work";
973+ wantedBy = ["local-fs.target"];
974+ before = ["local-fs.target"];
975+ requires = ["sysroot-nix-.ro\\x2dstore.mount" "sysroot-nix-.rw\\x2dstore.mount" "rw-store.service"];
976+ after = ["sysroot-nix-.ro\\x2dstore.mount" "sysroot-nix-.rw\\x2dstore.mount" "rw-store.service"];
977+ unitConfig.IgnoreOnIsolate = true;
978+ }];
979+ services.rw-store = {
980+ after = ["sysroot-nix-.rw\\x2dstore.mount"];
981+ unitConfig.DefaultDependencies = false;
982+ serviceConfig = {
983+ Type = "oneshot";
984+ ExecStart = "/bin/mkdir -p 0755 /sysroot/nix/.rw-store/store /sysroot/nix/.rw-store/work /sysroot/nix/store";
985+ };
986+ };
987+ };
988+
956 swapDevices = mkVMOverride [ ];
989 swapDevices = mkVMOverride [ ];
957 boot.initrd.luks.devices = mkVMOverride {};
990 boot.initrd.luks.devices = mkVMOverride {};
958
991
nixos/modules/virtualisation/vmware-host.nixnew file+166
@@ -0,0 +1,166 @@
1+{ config, pkgs, lib, ... }:
2+
3+let
4+ cfg = config.virtualisation.vmware.host;
5+ wrapperDir = "/run/vmware/bin"; # Perfectly fits as /usr/local/bin
6+ parentWrapperDir = dirOf wrapperDir;
7+ vmwareWrappers = # Needed as hardcoded paths workaround
8+ let mkVmwareSymlink =
9+ program:
10+ ''
11+ ln -s "${config.security.wrapperDir}/${program}" $wrapperDir/${program}
12+ '';
13+ in
14+ [
15+ (mkVmwareSymlink "pkexec")
16+ (mkVmwareSymlink "mount")
17+ (mkVmwareSymlink "umount")
18+ ];
19+in
20+{
21+ options = with lib; {
22+ virtualisation.vmware.host = {
23+ enable = mkEnableOption "VMware" // {
24+ description = ''
25+ This enables VMware host virtualisation for running VMs.
26+
27+ <important><para>
28+ <literal>vmware-vmx</literal> will cause kcompactd0 due to
29+ <literal>Transparent Hugepages</literal> feature in kernel.
30+ Apply <literal>[ "transparent_hugepage=never" ]</literal> in
31+ option <option>boot.kernelParams</option> to disable them.
32+ </para></important>
33+
34+ <note><para>
35+ If that didn't work disable <literal>TRANSPARENT_HUGEPAGE</literal>,
36+ <literal>COMPACTION</literal> configs and recompile kernel.
37+ </para></note>
38+ '';
39+ };
40+ package = mkOption {
41+ type = types.package;
42+ default = pkgs.vmware-workstation;
43+ defaultText = literalExpression "pkgs.vmware-workstation";
44+ description = "VMware host virtualisation package to use";
45+ };
46+ extraPackages = mkOption {
47+ type = with types; listOf package;
48+ default = with pkgs; [ ];
49+ description = "Extra packages to be used with VMware host.";
50+ example = "with pkgs; [ ntfs3g ]";
51+ };
52+ extraConfig = mkOption {
53+ type = types.lines;
54+ default = "";
55+ description = "Add extra config to /etc/vmware/config";
56+ example = ''
57+ # Allow unsupported device's OpenGL and Vulkan acceleration for guest vGPU
58+ mks.gl.allowUnsupportedDrivers = "TRUE"
59+ mks.vk.allowUnsupportedDevices = "TRUE"
60+ '';
61+ };
62+ };
63+ };
64+
65+ config = lib.mkIf cfg.enable {
66+ boot.extraModulePackages = [ config.boot.kernelPackages.vmware ];
67+ boot.extraModprobeConfig = "alias char-major-10-229 fuse";
68+ boot.kernelModules = [ "vmw_pvscsi" "vmw_vmci" "vmmon" "vmnet" "fuse" ];
69+
70+ environment.systemPackages = [ cfg.package ] ++ cfg.extraPackages;
71+ services.printing.drivers = [ cfg.package ];
72+
73+ environment.etc."vmware/config".text = ''
74+ ${builtins.readFile "${cfg.package}/etc/vmware/config"}
75+ ${cfg.extraConfig}
76+ '';
77+
78+ environment.etc."vmware/bootstrap".source = "${cfg.package}/etc/vmware/bootstrap";
79+ environment.etc."vmware/icu".source = "${cfg.package}/etc/vmware/icu";
80+ environment.etc."vmware-installer".source = "${cfg.package}/etc/vmware-installer";
81+
82+ # SUID wrappers
83+
84+ security.wrappers = {
85+ vmware-vmx = {
86+ setuid = true;
87+ owner = "root";
88+ group = "root";
89+ source = "${cfg.package}/lib/vmware/bin/.vmware-vmx-wrapped";
90+ };
91+ };
92+
93+ ###### wrappers activation script
94+
95+ system.activationScripts.vmwareWrappers =
96+ lib.stringAfter [ "specialfs" "users" ]
97+ ''
98+ mkdir -p "${parentWrapperDir}"
99+ chmod 755 "${parentWrapperDir}"
100+ # We want to place the tmpdirs for the wrappers to the parent dir.
101+ wrapperDir=$(mktemp --directory --tmpdir="${parentWrapperDir}" wrappers.XXXXXXXXXX)
102+ chmod a+rx "$wrapperDir"
103+ ${lib.concatStringsSep "\n" (vmwareWrappers)}
104+ if [ -L ${wrapperDir} ]; then
105+ # Atomically replace the symlink
106+ # See https://axialcorps.com/2013/07/03/atomically-replacing-files-and-directories/
107+ old=$(readlink -f ${wrapperDir})
108+ if [ -e "${wrapperDir}-tmp" ]; then
109+ rm --force --recursive "${wrapperDir}-tmp"
110+ fi
111+ ln --symbolic --force --no-dereference "$wrapperDir" "${wrapperDir}-tmp"
112+ mv --no-target-directory "${wrapperDir}-tmp" "${wrapperDir}"
113+ rm --force --recursive "$old"
114+ else
115+ # For initial setup
116+ ln --symbolic "$wrapperDir" "${wrapperDir}"
117+ fi
118+ '';
119+
120+ # Services
121+
122+ systemd.services."vmware-authdlauncher" = {
123+ description = "VMware Authentification Daemon";
124+ serviceConfig = {
125+ Type = "forking";
126+ ExecStart = [ "${cfg.package}/bin/vmware-authdlauncher" ];
127+ };
128+ wantedBy = [ "multi-user.target" ];
129+ };
130+
131+ systemd.services."vmware-networks-configuration" = {
132+ description = "VMware Networks Configuration Generation";
133+ unitConfig.ConditionPathExists = "!/etc/vmware/networking";
134+ serviceConfig = {
135+ UMask = "0077";
136+ ExecStart = [
137+ "${cfg.package}/bin/vmware-networks --postinstall vmware-player,0,1"
138+ ];
139+ Type = "oneshot";
140+ RemainAfterExit = "yes";
141+ };
142+ wantedBy = [ "multi-user.target" ];
143+ };
144+
145+ systemd.services."vmware-networks" = {
146+ description = "VMware Networks";
147+ after = [ "vmware-networks-configuration.service" ];
148+ requires = [ "vmware-networks-configuration.service" ];
149+ serviceConfig = {
150+ Type = "forking";
151+ ExecCondition = [ "${pkgs.kmod}/bin/modprobe vmnet" ];
152+ ExecStart = [ "${cfg.package}/bin/vmware-networks --start" ];
153+ ExecStop = [ "${cfg.package}/bin/vmware-networks --stop" ];
154+ };
155+ wantedBy = [ "multi-user.target" ];
156+ };
157+
158+ systemd.services."vmware-usbarbitrator" = {
159+ description = "VMware USB Arbitrator";
160+ serviceConfig = {
161+ ExecStart = [ "${cfg.package}/bin/vmware-usbarbitrator -f" ];
162+ };
163+ wantedBy = [ "multi-user.target" ];
164+ };
165+ };
166+}
nixos/release-combined.nix+2
@@ -132,12 +132,14 @@ in rec {
132 # fails with kernel >= 5.15 https://github.com/NixOS/nixpkgs/pull/152505#issuecomment-1005049314
132 # fails with kernel >= 5.15 https://github.com/NixOS/nixpkgs/pull/152505#issuecomment-1005049314
133 #(onFullSupported "nixos.tests.nfs3.simple")
133 #(onFullSupported "nixos.tests.nfs3.simple")
134 (onFullSupported "nixos.tests.nfs4.simple")
134 (onFullSupported "nixos.tests.nfs4.simple")
135+ (onSystems ["x86_64-linux"] "nixos.tests.oci-containers.podman")
135 (onFullSupported "nixos.tests.openssh")
136 (onFullSupported "nixos.tests.openssh")
136 (onFullSupported "nixos.tests.pantheon")
137 (onFullSupported "nixos.tests.pantheon")
137 (onFullSupported "nixos.tests.php.fpm")
138 (onFullSupported "nixos.tests.php.fpm")
138 (onFullSupported "nixos.tests.php.httpd")
139 (onFullSupported "nixos.tests.php.httpd")
139 (onFullSupported "nixos.tests.php.pcre")
140 (onFullSupported "nixos.tests.php.pcre")
140 (onFullSupported "nixos.tests.plasma5")
141 (onFullSupported "nixos.tests.plasma5")
142+ (onSystems ["x86_64-linux"] "nixos.tests.podman")
141 (onFullSupported "nixos.tests.predictable-interface-names.predictableNetworkd")
143 (onFullSupported "nixos.tests.predictable-interface-names.predictableNetworkd")
142 (onFullSupported "nixos.tests.predictable-interface-names.predictable")
144 (onFullSupported "nixos.tests.predictable-interface-names.predictable")
143 (onFullSupported "nixos.tests.predictable-interface-names.unpredictableNetworkd")
145 (onFullSupported "nixos.tests.predictable-interface-names.unpredictableNetworkd")
nixos/release.nix+2−2
@@ -150,13 +150,13 @@ in rec {
150 });
150 });
151
151
152 iso_plasma5 = forMatchingSystems [ "x86_64-linux" ] (system: makeIso {
152 iso_plasma5 = forMatchingSystems [ "x86_64-linux" ] (system: makeIso {
153− module = ./modules/installer/cd-dvd/installation-cd-graphical-plasma5.nix;
153+ module = ./modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma5.nix;
154 type = "plasma5";
154 type = "plasma5";
155 inherit system;
155 inherit system;
156 });
156 });
157
157
158 iso_gnome = forMatchingSystems [ "x86_64-linux" ] (system: makeIso {
158 iso_gnome = forMatchingSystems [ "x86_64-linux" ] (system: makeIso {
159− module = ./modules/installer/cd-dvd/installation-cd-graphical-gnome.nix;
159+ module = ./modules/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nix;
160 type = "gnome";
160 type = "gnome";
161 inherit system;
161 inherit system;
162 });
162 });
nixos/tests/all-terminfo.nixnew file+31
@@ -0,0 +1,31 @@
1+import ./make-test-python.nix ({ pkgs, ... }: rec {
2+ name = "all-terminfo";
3+ meta = with pkgs.lib.maintainers; {
4+ maintainers = [ jkarlson ];
5+ };
6+
7+ nodes.machine = { pkgs, config, lib, ... }:
8+ let
9+ infoFilter = name: drv:
10+ let
11+ o = builtins.tryEval drv;
12+ in
13+ o.success && lib.isDerivation o.value && o.value ? outputs && builtins.elem "terminfo" o.value.outputs;
14+ terminfos = lib.filterAttrs infoFilter pkgs;
15+ excludedTerminfos = lib.filterAttrs (_: drv: !(builtins.elem drv.terminfo config.environment.systemPackages)) terminfos;
16+ includedOuts = lib.filterAttrs (_: drv: builtins.elem drv.out config.environment.systemPackages) terminfos;
17+ in
18+ {
19+ environment = {
20+ enableAllTerminfo = true;
21+ etc."terminfo-missing".text = builtins.concatStringsSep "\n" (builtins.attrNames excludedTerminfos);
22+ etc."terminfo-extra-outs".text = builtins.concatStringsSep "\n" (builtins.attrNames includedOuts);
23+ };
24+ };
25+
26+ testScript =
27+ ''
28+ machine.fail("grep . /etc/terminfo-missing >&2")
29+ machine.fail("grep . /etc/terminfo-extra-outs >&2")
30+ '';
31+})
nixos/tests/all-tests.nix+21−3
@@ -35,6 +35,7 @@ in
35 agate = handleTest ./web-servers/agate.nix {};
35 agate = handleTest ./web-servers/agate.nix {};
36 agda = handleTest ./agda.nix {};
36 agda = handleTest ./agda.nix {};
37 airsonic = handleTest ./airsonic.nix {};
37 airsonic = handleTest ./airsonic.nix {};
38+ allTerminfo = handleTest ./all-terminfo.nix {};
38 amazon-init-shell = handleTest ./amazon-init-shell.nix {};
39 amazon-init-shell = handleTest ./amazon-init-shell.nix {};
39 apfs = handleTest ./apfs.nix {};
40 apfs = handleTest ./apfs.nix {};
40 apparmor = handleTest ./apparmor.nix {};
41 apparmor = handleTest ./apparmor.nix {};
@@ -142,6 +143,7 @@ in
142 engelsystem = handleTest ./engelsystem.nix {};
143 engelsystem = handleTest ./engelsystem.nix {};
143 enlightenment = handleTest ./enlightenment.nix {};
144 enlightenment = handleTest ./enlightenment.nix {};
144 env = handleTest ./env.nix {};
145 env = handleTest ./env.nix {};
146+ envoy = handleTest ./envoy.nix {};
145 ergo = handleTest ./ergo.nix {};
147 ergo = handleTest ./ergo.nix {};
146 ergochat = handleTest ./ergochat.nix {};
148 ergochat = handleTest ./ergochat.nix {};
147 etc = pkgs.callPackage ../modules/system/etc/test.nix { inherit evalMinimalConfig; };
149 etc = pkgs.callPackage ../modules/system/etc/test.nix { inherit evalMinimalConfig; };
@@ -194,8 +196,12 @@ in
194 hadoop_3_2 = import ./hadoop { inherit handleTestOn; package=pkgs.hadoop_3_2; };
196 hadoop_3_2 = import ./hadoop { inherit handleTestOn; package=pkgs.hadoop_3_2; };
195 hadoop2 = import ./hadoop { inherit handleTestOn; package=pkgs.hadoop2; };
197 hadoop2 = import ./hadoop { inherit handleTestOn; package=pkgs.hadoop2; };
196 haka = handleTest ./haka.nix {};
198 haka = handleTest ./haka.nix {};
199+ haste-server = handleTest ./haste-server.nix {};
197 haproxy = handleTest ./haproxy.nix {};
200 haproxy = handleTest ./haproxy.nix {};
198 hardened = handleTest ./hardened.nix {};
201 hardened = handleTest ./hardened.nix {};
202+ hbase1 = handleTest ./hbase.nix { package=pkgs.hbase1; };
203+ hbase2 = handleTest ./hbase.nix { package=pkgs.hbase2; };
204+ hbase3 = handleTest ./hbase.nix { package=pkgs.hbase3; };
199 hedgedoc = handleTest ./hedgedoc.nix {};
205 hedgedoc = handleTest ./hedgedoc.nix {};
200 herbstluftwm = handleTest ./herbstluftwm.nix {};
206 herbstluftwm = handleTest ./herbstluftwm.nix {};
201 installed-tests = pkgs.recurseIntoAttrs (handleTest ./installed-tests {});
207 installed-tests = pkgs.recurseIntoAttrs (handleTest ./installed-tests {});
@@ -206,6 +212,7 @@ in
206 # hibernation. This test happens to work on x86_64-linux but
212 # hibernation. This test happens to work on x86_64-linux but
207 # not on other platforms.
213 # not on other platforms.
208 hibernate = handleTestOn ["x86_64-linux"] ./hibernate.nix {};
214 hibernate = handleTestOn ["x86_64-linux"] ./hibernate.nix {};
215+ hibernate-systemd-stage-1 = handleTestOn ["x86_64-linux"] ./hibernate.nix { systemdStage1 = true; };
209 hitch = handleTest ./hitch {};
216 hitch = handleTest ./hitch {};
210 hledger-web = handleTest ./hledger-web.nix {};
217 hledger-web = handleTest ./hledger-web.nix {};
211 hocker-fetchdocker = handleTest ./hocker-fetchdocker {};
218 hocker-fetchdocker = handleTest ./hocker-fetchdocker {};
@@ -228,6 +235,7 @@ in
228 input-remapper = handleTest ./input-remapper.nix {};
235 input-remapper = handleTest ./input-remapper.nix {};
229 inspircd = handleTest ./inspircd.nix {};
236 inspircd = handleTest ./inspircd.nix {};
230 installer = handleTest ./installer.nix {};
237 installer = handleTest ./installer.nix {};
238+ installer-systemd-stage-1 = handleTest ./installer-systemd-stage-1.nix {};
231 invoiceplane = handleTest ./invoiceplane.nix {};
239 invoiceplane = handleTest ./invoiceplane.nix {};
232 iodine = handleTest ./iodine.nix {};
240 iodine = handleTest ./iodine.nix {};
233 ipfs = handleTest ./ipfs.nix {};
241 ipfs = handleTest ./ipfs.nix {};
@@ -274,8 +282,8 @@ in
274 login = handleTest ./login.nix {};
282 login = handleTest ./login.nix {};
275 logrotate = handleTest ./logrotate.nix {};
283 logrotate = handleTest ./logrotate.nix {};
276 loki = handleTest ./loki.nix {};
284 loki = handleTest ./loki.nix {};
285+ lvm2 = handleTest ./lvm2 {};
277 lxd = handleTest ./lxd.nix {};
286 lxd = handleTest ./lxd.nix {};
278− lxd-image = handleTest ./lxd-image.nix {};
279 lxd-nftables = handleTest ./lxd-nftables.nix {};
287 lxd-nftables = handleTest ./lxd-nftables.nix {};
280 lxd-image-server = handleTest ./lxd-image-server.nix {};
288 lxd-image-server = handleTest ./lxd-image-server.nix {};
281 #logstash = handleTest ./logstash.nix {};
289 #logstash = handleTest ./logstash.nix {};
@@ -360,8 +368,9 @@ in
360 nginx-sandbox = handleTestOn ["x86_64-linux"] ./nginx-sandbox.nix {};
368 nginx-sandbox = handleTestOn ["x86_64-linux"] ./nginx-sandbox.nix {};
361 nginx-sso = handleTest ./nginx-sso.nix {};
369 nginx-sso = handleTest ./nginx-sso.nix {};
362 nginx-variants = handleTest ./nginx-variants.nix {};
370 nginx-variants = handleTest ./nginx-variants.nix {};
371+ nifi = handleTestOn ["x86_64-linux"] ./web-apps/nifi.nix {};
363 nitter = handleTest ./nitter.nix {};
372 nitter = handleTest ./nitter.nix {};
364− nix-ld = handleTest ./nix-ld {};
373+ nix-ld = handleTest ./nix-ld.nix {};
365 nix-serve = handleTest ./nix-serve.nix {};
374 nix-serve = handleTest ./nix-serve.nix {};
366 nix-serve-ssh = handleTest ./nix-serve-ssh.nix {};
375 nix-serve-ssh = handleTest ./nix-serve-ssh.nix {};
367 nixops = handleTest ./nixops/default.nix {};
376 nixops = handleTest ./nixops/default.nix {};
@@ -396,9 +405,10 @@ in
396 pam-file-contents = handleTest ./pam/pam-file-contents.nix {};
405 pam-file-contents = handleTest ./pam/pam-file-contents.nix {};
397 pam-oath-login = handleTest ./pam/pam-oath-login.nix {};
406 pam-oath-login = handleTest ./pam/pam-oath-login.nix {};
398 pam-u2f = handleTest ./pam/pam-u2f.nix {};
407 pam-u2f = handleTest ./pam/pam-u2f.nix {};
408+ pam-ussh = handleTest ./pam/pam-ussh.nix {};
399 pantalaimon = handleTest ./matrix/pantalaimon.nix {};
409 pantalaimon = handleTest ./matrix/pantalaimon.nix {};
400 pantheon = handleTest ./pantheon.nix {};
410 pantheon = handleTest ./pantheon.nix {};
401− paperless-ng = handleTest ./paperless-ng.nix {};
411+ paperless = handleTest ./paperless.nix {};
402 parsedmarc = handleTest ./parsedmarc {};
412 parsedmarc = handleTest ./parsedmarc {};
403 pdns-recursor = handleTest ./pdns-recursor.nix {};
413 pdns-recursor = handleTest ./pdns-recursor.nix {};
404 peerflix = handleTest ./peerflix.nix {};
414 peerflix = handleTest ./peerflix.nix {};
@@ -514,6 +524,12 @@ in
514 systemd-confinement = handleTest ./systemd-confinement.nix {};
524 systemd-confinement = handleTest ./systemd-confinement.nix {};
515 systemd-cryptenroll = handleTest ./systemd-cryptenroll.nix {};
525 systemd-cryptenroll = handleTest ./systemd-cryptenroll.nix {};
516 systemd-escaping = handleTest ./systemd-escaping.nix {};
526 systemd-escaping = handleTest ./systemd-escaping.nix {};
527+ systemd-initrd-btrfs-raid = handleTest ./systemd-initrd-btrfs-raid.nix {};
528+ systemd-initrd-luks-keyfile = handleTest ./systemd-initrd-luks-keyfile.nix {};
529+ systemd-initrd-luks-password = handleTest ./systemd-initrd-luks-password.nix {};
530+ systemd-initrd-shutdown = handleTest ./systemd-shutdown.nix { systemdStage1 = true; };
531+ systemd-initrd-simple = handleTest ./systemd-initrd-simple.nix {};
532+ systemd-initrd-swraid = handleTest ./systemd-initrd-swraid.nix {};
517 systemd-journal = handleTest ./systemd-journal.nix {};
533 systemd-journal = handleTest ./systemd-journal.nix {};
518 systemd-machinectl = handleTest ./systemd-machinectl.nix {};
534 systemd-machinectl = handleTest ./systemd-machinectl.nix {};
519 systemd-networkd = handleTest ./systemd-networkd.nix {};
535 systemd-networkd = handleTest ./systemd-networkd.nix {};
@@ -522,6 +538,7 @@ in
522 systemd-networkd-ipv6-prefix-delegation = handleTest ./systemd-networkd-ipv6-prefix-delegation.nix {};
538 systemd-networkd-ipv6-prefix-delegation = handleTest ./systemd-networkd-ipv6-prefix-delegation.nix {};
523 systemd-networkd-vrf = handleTest ./systemd-networkd-vrf.nix {};
539 systemd-networkd-vrf = handleTest ./systemd-networkd-vrf.nix {};
524 systemd-nspawn = handleTest ./systemd-nspawn.nix {};
540 systemd-nspawn = handleTest ./systemd-nspawn.nix {};
541+ systemd-shutdown = handleTest ./systemd-shutdown.nix {};
525 systemd-timesyncd = handleTest ./systemd-timesyncd.nix {};
542 systemd-timesyncd = handleTest ./systemd-timesyncd.nix {};
526 systemd-misc = handleTest ./systemd-misc.nix {};
543 systemd-misc = handleTest ./systemd-misc.nix {};
527 taskserver = handleTest ./taskserver.nix {};
544 taskserver = handleTest ./taskserver.nix {};
@@ -582,6 +599,7 @@ in
582 xautolock = handleTest ./xautolock.nix {};
599 xautolock = handleTest ./xautolock.nix {};
583 xfce = handleTest ./xfce.nix {};
600 xfce = handleTest ./xfce.nix {};
584 xmonad = handleTest ./xmonad.nix {};
601 xmonad = handleTest ./xmonad.nix {};
602+ xmonad-xdg-autostart = handleTest ./xmonad-xdg-autostart.nix {};
585 xrdp = handleTest ./xrdp.nix {};
603 xrdp = handleTest ./xrdp.nix {};
586 xss-lock = handleTest ./xss-lock.nix {};
604 xss-lock = handleTest ./xss-lock.nix {};
587 xterm = handleTest ./xterm.nix {};
605 xterm = handleTest ./xterm.nix {};
nixos/tests/atop.nix−8
@@ -182,10 +182,6 @@ in
182 atopgpu = makeTest {
182 atopgpu = makeTest {
183 name = "atop-atopgpu";
183 name = "atop-atopgpu";
184 nodes.machine = {
184 nodes.machine = {
185− nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (getName pkg) [
186− "cudatoolkit"
187− ];
188−
189 programs.atop = {
185 programs.atop = {
190 enable = true;
186 enable = true;
191 atopgpu.enable = true;
187 atopgpu.enable = true;
@@ -205,10 +201,6 @@ in
205 everything = makeTest {
201 everything = makeTest {
206 name = "atop-everthing";
202 name = "atop-everthing";
207 nodes.machine = {
203 nodes.machine = {
208− nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (getName pkg) [
209− "cudatoolkit"
210− ];
211−
212 programs.atop = {
204 programs.atop = {
213 enable = true;
205 enable = true;
214 settings = {
206 settings = {
nixos/tests/bcachefs.nix+1−1
@@ -1,6 +1,6 @@
1import ./make-test-python.nix ({ pkgs, ... }: {
1import ./make-test-python.nix ({ pkgs, ... }: {
2 name = "bcachefs";
2 name = "bcachefs";
3− meta.maintainers = with pkgs.lib.maintainers; [ chiiruno ];
3+ meta.maintainers = with pkgs.lib.maintainers; [ Madouura ];
4
4
5 nodes.machine = { pkgs, ... }: {
5 nodes.machine = { pkgs, ... }: {
6 virtualisation.emptyDiskImages = [ 4096 ];
6 virtualisation.emptyDiskImages = [ 4096 ];
nixos/tests/boot.nix+3−3
@@ -42,7 +42,7 @@ let
42 nodes = { };
42 nodes = { };
43 testScript =
43 testScript =
44 ''
44 ''
45− nodes.machine = create_machine(${machineConfig})
45+ machine = create_machine(${machineConfig})
46 machine.start()
46 machine.start()
47 machine.wait_for_unit("multi-user.target")
47 machine.wait_for_unit("multi-user.target")
48 machine.succeed("nix store verify --no-trust -r --option experimental-features nix-command /run/current-system")
48 machine.succeed("nix store verify --no-trust -r --option experimental-features nix-command /run/current-system")
@@ -83,7 +83,7 @@ let
83 name = "boot-netboot-" + name;
83 name = "boot-netboot-" + name;
84 nodes = { };
84 nodes = { };
85 testScript = ''
85 testScript = ''
86− nodes.machine = create_machine(${machineConfig})
86+ machine = create_machine(${machineConfig})
87 machine.start()
87 machine.start()
88 machine.wait_for_unit("multi-user.target")
88 machine.wait_for_unit("multi-user.target")
89 machine.shutdown()
89 machine.shutdown()
@@ -138,7 +138,7 @@ in {
138 if os.system("qemu-img create -f qcow2 -F raw -b ${sdImage} ${mutableImage}") != 0:
138 if os.system("qemu-img create -f qcow2 -F raw -b ${sdImage} ${mutableImage}") != 0:
139 raise RuntimeError("Could not create mutable linked image")
139 raise RuntimeError("Could not create mutable linked image")
140
140
141− nodes.machine = create_machine(${machineConfig})
141+ machine = create_machine(${machineConfig})
142 machine.start()
142 machine.start()
143 machine.wait_for_unit("multi-user.target")
143 machine.wait_for_unit("multi-user.target")
144 machine.succeed("nix store verify -r --no-trust --option experimental-features nix-command /run/current-system")
144 machine.succeed("nix store verify -r --no-trust --option experimental-features nix-command /run/current-system")
nixos/tests/collectd.nix+6−1
@@ -3,11 +3,14 @@ import ./make-test-python.nix ({ pkgs, ... }: {
3 meta = { };
3 meta = { };
4
4
5 nodes.machine =
5 nodes.machine =
6− { pkgs, ... }:
6+ { pkgs, lib, ... }:
7
7
8 {
8 {
9 services.collectd = {
9 services.collectd = {
10 enable = true;
10 enable = true;
11+ extraConfig = lib.mkBefore ''
12+ Interval 30
13+ '';
11 plugins = {
14 plugins = {
12 rrdtool = ''
15 rrdtool = ''
13 DataDir "/var/lib/collectd/rrd"
16 DataDir "/var/lib/collectd/rrd"
@@ -26,6 +29,8 @@ import ./make-test-python.nix ({ pkgs, ... }: {
26 machine.succeed(f"rrdinfo {file} | logger")
29 machine.succeed(f"rrdinfo {file} | logger")
27 # check that this file contains a shortterm metric
30 # check that this file contains a shortterm metric
28 machine.succeed(f"rrdinfo {file} | grep -F 'ds[shortterm].min = '")
31 machine.succeed(f"rrdinfo {file} | grep -F 'ds[shortterm].min = '")
32+ # check that interval was set before the plugins
33+ machine.succeed(f"rrdinfo {file} | grep -F 'step = 30'")
29 # check that there are frequent updates
34 # check that there are frequent updates
30 machine.succeed(f"cp {file} before")
35 machine.succeed(f"cp {file} before")
31 machine.wait_until_fails(f"cmp before {file}")
36 machine.wait_until_fails(f"cmp before {file}")
nixos/tests/common/lxd/config.yamlnew file+24
@@ -0,0 +1,24 @@
1+storage_pools:
2+ - name: default
3+ driver: dir
4+ config:
5+ source: /var/lxd-pool
6+
7+networks:
8+ - name: lxdbr0
9+ type: bridge
10+ config:
11+ ipv4.address: auto
12+ ipv6.address: none
13+
14+profiles:
15+ - name: default
16+ devices:
17+ eth0:
18+ name: eth0
19+ network: lxdbr0
20+ type: nic
21+ root:
22+ path: /
23+ pool: default
24+ type: disk
nixos/tests/containers-ephemeral.nix+3−3
@@ -33,10 +33,10 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
33 machine.succeed("nixos-container start webserver")
33 machine.succeed("nixos-container start webserver")
34
34
35 with subtest("Container got its own root folder"):
35 with subtest("Container got its own root folder"):
36− machine.succeed("ls /run/containers/webserver")
36+ machine.succeed("ls /run/nixos-containers/webserver")
37
37
38 with subtest("Container persistent directory is not created"):
38 with subtest("Container persistent directory is not created"):
39− machine.fail("ls /var/lib/containers/webserver")
39+ machine.fail("ls /var/lib/nixos-containers/webserver")
40
40
41 # Since "start" returns after the container has reached
41 # Since "start" returns after the container has reached
42 # multi-user.target, we should now be able to access it.
42 # multi-user.target, we should now be able to access it.
@@ -49,6 +49,6 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
49 machine.fail(f"curl --fail --connect-timeout 2 http://{ip}/ > /dev/null")
49 machine.fail(f"curl --fail --connect-timeout 2 http://{ip}/ > /dev/null")
50
50
51 with subtest("Container's root folder was removed"):
51 with subtest("Container's root folder was removed"):
52− machine.fail("ls /run/containers/webserver")
52+ machine.fail("ls /run/nixos-containers/webserver")
53 '';
53 '';
54})
54})
nixos/tests/containers-imperative.nix+6−6
@@ -69,8 +69,8 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
69
69
70 with subtest(f"Put the root of {id2} into a bind mount"):
70 with subtest(f"Put the root of {id2} into a bind mount"):
71 machine.succeed(
71 machine.succeed(
72− f"mv /var/lib/containers/{id2} /id2-bindmount",
72+ f"mv /var/lib/nixos-containers/{id2} /id2-bindmount",
73− f"mount --bind /id2-bindmount /var/lib/containers/{id1}",
73+ f"mount --bind /id2-bindmount /var/lib/nixos-containers/{id1}",
74 )
74 )
75
75
76 ip1 = machine.succeed(f"nixos-container show-ip {id1}").rstrip()
76 ip1 = machine.succeed(f"nixos-container show-ip {id1}").rstrip()
@@ -88,7 +88,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
88 "Create a directory with a dummy file and bind-mount it into both containers."
88 "Create a directory with a dummy file and bind-mount it into both containers."
89 ):
89 ):
90 for id in id1, id2:
90 for id in id1, id2:
91− important_path = f"/var/lib/containers/{id}/very/important/data"
91+ important_path = f"/var/lib/nixos-containers/{id}/very/important/data"
92 machine.succeed(
92 machine.succeed(
93 f"mkdir -p {important_path}",
93 f"mkdir -p {important_path}",
94 f"mount --bind /nested-bindmount {important_path}",
94 f"mount --bind /nested-bindmount {important_path}",
@@ -154,13 +154,13 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
154 machine.succeed("grep -qF 'important data' /nested-bindmount/dummy")
154 machine.succeed("grep -qF 'important data' /nested-bindmount/dummy")
155
155
156 with subtest("Ensure that the container path is gone"):
156 with subtest("Ensure that the container path is gone"):
157− print(machine.succeed("ls -lsa /var/lib/containers"))
157+ print(machine.succeed("ls -lsa /var/lib/nixos-containers"))
158− machine.succeed(f"test ! -e /var/lib/containers/{id1}")
158+ machine.succeed(f"test ! -e /var/lib/nixos-containers/{id1}")
159
159
160 with subtest("Ensure that a failed container creation doesn'leave any state"):
160 with subtest("Ensure that a failed container creation doesn'leave any state"):
161 machine.fail(
161 machine.fail(
162 "nixos-container create b0rk --config-file ${brokenCfg}"
162 "nixos-container create b0rk --config-file ${brokenCfg}"
163 )
163 )
164− machine.succeed("test ! -e /var/lib/containers/b0rk")
164+ machine.succeed("test ! -e /var/lib/nixos-containers/b0rk")
165 '';
165 '';
166})
166})
nixos/tests/containers-tmpfs.nix+5−5
@@ -62,7 +62,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
62 machine.succeed(
62 machine.succeed(
63 tmpfs_cmd("touch /root/test.file"),
63 tmpfs_cmd("touch /root/test.file"),
64 tmpfs_cmd("ls -l /root | grep -q test.file"),
64 tmpfs_cmd("ls -l /root | grep -q test.file"),
65− "test -e /var/lib/containers/tmpfs/root/test.file",
65+ "test -e /var/lib/nixos-containers/tmpfs/root/test.file",
66 )
66 )
67
67
68 with subtest(
68 with subtest(
@@ -73,7 +73,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
73 tmpfs_cmd("touch /some/random/path/test.file"),
73 tmpfs_cmd("touch /some/random/path/test.file"),
74 tmpfs_cmd("test -e /some/random/path/test.file"),
74 tmpfs_cmd("test -e /some/random/path/test.file"),
75 )
75 )
76− machine.fail("test -e /var/lib/containers/tmpfs/some/random/path/test.file")
76+ machine.fail("test -e /var/lib/nixos-containers/tmpfs/some/random/path/test.file")
77
77
78 with subtest(
78 with subtest(
79 "files created in the hosts container dir in a path where a tmpfs "
79 "files created in the hosts container dir in a path where a tmpfs "
@@ -81,9 +81,9 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
81 + "the do not exist in the tmpfs"
81 + "the do not exist in the tmpfs"
82 ):
82 ):
83 machine.succeed(
83 machine.succeed(
84− "touch /var/lib/containers/tmpfs/var/test.file",
84+ "touch /var/lib/nixos-containers/tmpfs/var/test.file",
85− "test -e /var/lib/containers/tmpfs/var/test.file",
85+ "test -e /var/lib/nixos-containers/tmpfs/var/test.file",
86− "ls -l /var/lib/containers/tmpfs/var/ | grep -q test.file 2>/dev/null",
86+ "ls -l /var/lib/nixos-containers/tmpfs/var/ | grep -q test.file 2>/dev/null",
87 )
87 )
88 machine.fail(tmpfs_cmd("ls -l /var | grep -q test.file"))
88 machine.fail(tmpfs_cmd("ls -l /var | grep -q test.file"))
89 '';
89 '';
nixos/tests/custom-ca.nix+104−90
@@ -1,9 +1,14 @@
1# Checks that `security.pki` options are working in curl and the main browser
1# Checks that `security.pki` options are working in curl and the main browser
2−# engines: Gecko (via Firefox), Chromium, QtWebEngine (Falkon) and WebKitGTK
2+# engines: Gecko (via Firefox), Chromium, QtWebEngine (via qutebrowser) and
3−# (via Midori). The test checks that certificates issued by a custom trusted
3+# WebKitGTK (via Midori). The test checks that certificates issued by a custom
4−# CA are accepted but those from an unknown CA are rejected.
4+# trusted CA are accepted but those from an unknown CA are rejected.
5
5
6−import ./make-test-python.nix ({ pkgs, lib, ... }:
6+{ system ? builtins.currentSystem,
7+ config ? {},
8+ pkgs ? import ../.. { inherit system config; }
9+}:
10+
11+with import ../lib/testing-python.nix { inherit system pkgs; };
7
12
8let
13let
9 makeCert = { caName, domain }: pkgs.runCommand "example-cert"
14 makeCert = { caName, domain }: pkgs.runCommand "example-cert"
@@ -68,24 +73,8 @@ let
68 domain = "bad.example.com";
73 domain = "bad.example.com";
69 };
74 };
70
75
71−in
76+ webserverConfig =
72−
73−{
74− name = "custom-ca";
75− meta.maintainers = with lib.maintainers; [ rnhmjoj ];
76−
77− enableOCR = true;
78−
79− nodes.machine = { pkgs, ... }:
80− { imports = [ ./common/user-account.nix ./common/x11.nix ];
81−
82− # chromium-based browsers refuse to run as root
83− test-support.displayManager.auto.user = "alice";
84−
85− # browsers may hang with the default memory
86− virtualisation.memorySize = 600;
87−
88− networking.hosts."127.0.0.1" = [ "good.example.com" "bad.example.com" ];
77+ { networking.hosts."127.0.0.1" = [ "good.example.com" "bad.example.com" ];
89 security.pki.certificateFiles = [ "${example-good-cert}/ca.crt" ];
78 security.pki.certificateFiles = [ "${example-good-cert}/ca.crt" ];
90
79
91 services.nginx.enable = true;
80 services.nginx.enable = true;
@@ -107,73 +96,98 @@ in
107 return 200 'It does not work!';
96 return 200 'It does not work!';
108 '';
97 '';
109 };
98 };
110−
111− environment.systemPackages = with pkgs; [
112− xdotool
113− firefox
114− chromium
115− qutebrowser
116− midori
117− ];
118 };
99 };
119
100
101+ curlTest = makeTest {
102+ name = "custom-ca-curl";
103+ meta.maintainers = with lib.maintainers; [ rnhmjoj ];
104+ nodes.machine = { ... }: webserverConfig;
120− testScript = ''
105+ testScript = ''
106+ with subtest("Good certificate is trusted in curl"):
107+ machine.wait_for_unit("nginx")
108+ machine.wait_for_open_port(443)
109+ machine.succeed("curl -fv https://good.example.com")
110+
111+ with subtest("Unknown CA is untrusted in curl"):
112+ machine.fail("curl -fv https://bad.example.com")
113+ '';
114+ };
115+
116+ mkBrowserTest = browser: testParams: makeTest {
117+ name = "custom-ca-${browser}";
118+ meta.maintainers = with lib.maintainers; [ rnhmjoj ];
119+
120+ enableOCR = true;
121+
122+ nodes.machine = { pkgs, ... }:
123+ { imports =
124+ [ ./common/user-account.nix
125+ ./common/x11.nix
126+ webserverConfig
127+ ];
128+
129+ # chromium-based browsers refuse to run as root
130+ test-support.displayManager.auto.user = "alice";
131+
132+ # browsers may hang with the default memory
133+ virtualisation.memorySize = 600;
134+
135+ environment.systemPackages = [ pkgs.xdotool pkgs.${browser} ];
136+ };
137+
138+ testScript = ''
121− from typing import Tuple
139+ from typing import Tuple
122− def execute_as(user: str, cmd: str) -> Tuple[int, str]:
140+ def execute_as(user: str, cmd: str) -> Tuple[int, str]:
123− """
141+ """
124− Run a shell command as a specific user.
142+ Run a shell command as a specific user.
125− """
143+ """
126− return machine.execute(f"sudo -u {user} {cmd}")
144+ return machine.execute(f"sudo -u {user} {cmd}")
127−
145+
128−
146+
129− def wait_for_window_as(user: str, cls: str) -> None:
147+ def wait_for_window_as(user: str, cls: str) -> None:
130− """
148+ """
131− Wait until a X11 window of a given user appears.
149+ Wait until a X11 window of a given user appears.
132− """
150+ """
133−
151+
134− def window_is_visible(last_try: bool) -> bool:
152+ def window_is_visible(last_try: bool) -> bool:
135− ret, stdout = execute_as(user, f"xdotool search --onlyvisible --class {cls}")
153+ ret, stdout = execute_as(user, f"xdotool search --onlyvisible --class {cls}")
136− if last_try:
154+ if last_try:
137− machine.log(f"Last chance to match {cls} on the window list")
155+ machine.log(f"Last chance to match {cls} on the window list")
138− return ret == 0
156+ return ret == 0
139−
157+
140− with machine.nested("Waiting for a window to appear"):
158+ with machine.nested("Waiting for a window to appear"):
141− retry(window_is_visible)
159+ retry(window_is_visible)
142−
160+
143−
161+
144− machine.start()
162+ machine.start()
145−
163+ machine.wait_for_x()
164+
165+ command = "${browser} ${testParams.args or ""}"
146− with subtest("Good certificate is trusted in curl"):
166+ with subtest("Good certificate is trusted in ${browser}"):
147− machine.wait_for_unit("nginx")
167+ execute_as(
148− machine.wait_for_open_port(443)
168+ "alice", f"{command} https://good.example.com >&2 &"
149− machine.succeed("curl -fv https://good.example.com")
169+ )
150−
170+ wait_for_window_as("alice", "${browser}")
171+ machine.sleep(4)
172+ execute_as("alice", "xdotool key ctrl+r") # reload to be safe
173+ machine.wait_for_text("It works!")
174+ machine.screenshot("good${browser}")
175+ execute_as("alice", "xdotool key ctrl+w") # close tab
176+
151− with subtest("Unknown CA is untrusted in curl"):
177+ with subtest("Unknown CA is untrusted in ${browser}"):
152− machine.fail("curl -fv https://bad.example.com")
178+ execute_as("alice", f"{command} https://bad.example.com >&2 &")
153−
179+ machine.wait_for_text("${testParams.error}")
154− browsers = {
180+ machine.screenshot("bad${browser}")
181+ '';
182+ };
183+
184+in
185+
186+{
187+ curl = curlTest;
188+} // pkgs.lib.mapAttrs mkBrowserTest {
155− "firefox": "Security Risk",
189+ firefox = { error = "Security Risk"; };
156− "chromium": "not private",
190+ chromium = { error = "not private"; };
157− "qutebrowser -T": "Certificate error",
191+ qutebrowser = { args = "-T"; error = "Certificate error"; };
158− "midori": "Security"
192+ midori = { error = "Security"; };
159− }
160−
161− machine.wait_for_x()
162− for command, error in browsers.items():
163− browser = command.split()[0]
164− with subtest("Good certificate is trusted in " + browser):
165− execute_as(
166− "alice", f"{command} https://good.example.com >&2 &"
167− )
168− wait_for_window_as("alice", browser)
169− machine.wait_for_text("It works!")
170− machine.screenshot("good" + browser)
171− execute_as("alice", "xdotool key ctrl+w") # close tab
172−
173− with subtest("Unknown CA is untrusted in " + browser):
174− execute_as("alice", f"{command} https://bad.example.com >&2 &")
175− machine.wait_for_text(error)
176− machine.screenshot("bad" + browser)
177− machine.succeed("pkill -f " + browser)
178− '';
179−})
193+}
nixos/tests/docker-tools-cross.nix+2−2
@@ -7,7 +7,7 @@ import ./make-test-python.nix ({ pkgs, ... }:
7let
7let
8
8
9 remoteSystem =
9 remoteSystem =
10− if pkgs.system == "aarch64-linux"
10+ if pkgs.stdenv.hostPlatform.system == "aarch64-linux"
11 then "x86_64-linux"
11 then "x86_64-linux"
12 else "aarch64-linux";
12 else "aarch64-linux";
13
13
@@ -18,7 +18,7 @@ let
18
18
19 # NOTE: Since this file can't control where the test will be _run_ we don't
19 # NOTE: Since this file can't control where the test will be _run_ we don't
20 # cross-compile _to_ a different system but _from_ a different system
20 # cross-compile _to_ a different system but _from_ a different system
21− crossSystem = pkgs.system;
21+ crossSystem = pkgs.stdenv.hostPlatform.system;
22 };
22 };
23
23
24 hello1 = remoteCrossPkgs.dockerTools.buildImage {
24 hello1 = remoteCrossPkgs.dockerTools.buildImage {
nixos/tests/docker-tools.nix+1−1
@@ -315,7 +315,7 @@ import ./make-test-python.nix ({ pkgs, ... }: {
315 "docker inspect ${pkgs.dockerTools.examples.cross.imageName} "
315 "docker inspect ${pkgs.dockerTools.examples.cross.imageName} "
316 + "| ${pkgs.jq}/bin/jq -r .[].Architecture"
316 + "| ${pkgs.jq}/bin/jq -r .[].Architecture"
317 ).strip()
317 ).strip()
318− == "${if pkgs.system == "aarch64-linux" then "amd64" else "arm64"}"
318+ == "${if pkgs.stdenv.hostPlatform.system == "aarch64-linux" then "amd64" else "arm64"}"
319 )
319 )
320
320
321 with subtest("buildLayeredImage doesn't dereference /nix/store symlink layers"):
321 with subtest("buildLayeredImage doesn't dereference /nix/store symlink layers"):
nixos/tests/emacs-daemon.nix+1−1
@@ -33,7 +33,7 @@ import ./make-test-python.nix ({ pkgs, ...} : {
33 )
33 )
34
34
35 # connects to the daemon
35 # connects to the daemon
36− machine.succeed("emacsclient --create-frame $EDITOR >&2 &")
36+ machine.succeed("emacsclient --no-wait --frame-parameters='((display . \"'\"$DISPLAY\"'\"))' --create-frame $EDITOR >&2")
37
37
38 # checks that Emacs shows the edited filename
38 # checks that Emacs shows the edited filename
39 machine.wait_for_text("emacseditor")
39 machine.wait_for_text("emacseditor")
nixos/tests/envoy.nixnew file+33
@@ -0,0 +1,33 @@
1+import ./make-test-python.nix ({ pkgs, lib, ...} : {
2+ name = "envoy";
3+ meta = with pkgs.lib.maintainers; {
4+ maintainers = [ cameronnemo ];
5+ };
6+
7+ nodes.machine = { pkgs, ... }: {
8+ services.envoy.enable = true;
9+ services.envoy.settings = {
10+ admin = {
11+ access_log_path = "/dev/null";
12+ address = {
13+ socket_address = {
14+ protocol = "TCP";
15+ address = "127.0.0.1";
16+ port_value = 9901;
17+ };
18+ };
19+ };
20+ static_resources = {
21+ listeners = [];
22+ clusters = [];
23+ };
24+ };
25+ };
26+
27+ testScript = ''
28+ machine.start()
29+ machine.wait_for_unit("envoy.service")
30+ machine.wait_for_open_port(9901)
31+ machine.wait_until_succeeds("curl -fsS localhost:9901/ready")
32+ '';
33+})
nixos/tests/fenics.nix+1−1
@@ -44,6 +44,6 @@ in
44 { nodes, ... }:
44 { nodes, ... }:
45 ''
45 ''
46 start_all()
46 start_all()
47− node1.succeed("${fenicsScript}")
47+ fenicsnode.succeed("${fenicsScript}")
48 '';
48 '';
49})
49})
nixos/tests/gitlab.nix+298−25
@@ -1,9 +1,31 @@
1−# This test runs gitlab and checks if it works
1+# This test runs gitlab and performs the following tests:
2+# - Creating users
3+# - Pushing commits
4+# - over the API
5+# - over SSH
6+# - Creating Merge Requests and merging them
7+# - Opening and closing issues.
8+# - Downloading repository archives as tar.gz and tar.bz2
9+import ./make-test-python.nix ({ pkgs, lib, ... }:
10+
11+with lib;
2
12
3let
13let
14+ inherit (import ./ssh-keys.nix pkgs) snakeOilPrivateKey snakeOilPublicKey;
4 initialRootPassword = "notproduction";
15 initialRootPassword = "notproduction";
5−in
16+ rootProjectId = "2";
6−import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
17+
18+ aliceUsername = "alice";
19+ aliceUserId = "2";
20+ alicePassword = "alicepassword";
21+ aliceProjectId = "2";
22+ aliceProjectName = "test-alice";
23+
24+ bobUsername = "bob";
25+ bobUserId = "3";
26+ bobPassword = "bobpassword";
27+ bobProjectId = "3";
28+in {
7 name = "gitlab";
29 name = "gitlab";
8 meta = with pkgs.lib.maintainers; {
30 meta = with pkgs.lib.maintainers; {
9 maintainers = [ globin yayayayaka ];
31 maintainers = [ globin yayayayaka ];
@@ -31,6 +53,8 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
31 };
53 };
32 };
54 };
33
55
56+ services.openssh.enable = true;
57+
34 services.dovecot2 = {
58 services.dovecot2 = {
35 enable = true;
59 enable = true;
36 enableImap = true;
60 enableImap = true;
@@ -77,8 +101,43 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
77 password = initialRootPassword;
101 password = initialRootPassword;
78 });
102 });
79
103
104+ createUserAlice = pkgs.writeText "create-user-alice.json" (builtins.toJSON rec {
105+ username = aliceUsername;
106+ name = username;
107+ email = "alice@localhost";
108+ password = alicePassword;
109+ skip_confirmation = true;
110+ });
111+
112+ createUserBob = pkgs.writeText "create-user-bob.json" (builtins.toJSON rec {
113+ username = bobUsername;
114+ name = username;
115+ email = "bob@localhost";
116+ password = bobPassword;
117+ skip_confirmation = true;
118+ });
119+
120+ aliceAuth = pkgs.writeText "alice-auth.json" (builtins.toJSON {
121+ grant_type = "password";
122+ username = aliceUsername;
123+ password = alicePassword;
124+ });
125+
126+ bobAuth = pkgs.writeText "bob-auth.json" (builtins.toJSON {
127+ grant_type = "password";
128+ username = bobUsername;
129+ password = bobPassword;
130+ });
131+
132+ aliceAddSSHKey = pkgs.writeText "alice-add-ssh-key.json" (builtins.toJSON {
133+ id = aliceUserId;
134+ title = "snakeoil@nixos";
135+ key = snakeOilPublicKey;
136+ });
137+
80− createProject = pkgs.writeText "create-project.json" (builtins.toJSON {
138+ createProjectAlice = pkgs.writeText "create-project-alice.json" (builtins.toJSON {
81− name = "test";
139+ name = aliceProjectName;
140+ visibility = "public";
82 });
141 });
83
142
84 putFile = pkgs.writeText "put-file.json" (builtins.toJSON {
143 putFile = pkgs.writeText "put-file.json" (builtins.toJSON {
@@ -89,6 +148,23 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
89 commit_message = "create a new file";
148 commit_message = "create a new file";
90 });
149 });
91
150
151+ mergeRequest = pkgs.writeText "merge-request.json" (builtins.toJSON {
152+ id = bobProjectId;
153+ target_project_id = aliceProjectId;
154+ source_branch = "master";
155+ target_branch = "master";
156+ title = "Add some other file";
157+ });
158+
159+ newIssue = pkgs.writeText "new-issue.json" (builtins.toJSON {
160+ title = "useful issue title";
161+ });
162+
163+ closeIssue = pkgs.writeText "close-issue.json" (builtins.toJSON {
164+ issue_iid = 1;
165+ state_event = "close";
166+ });
167+
92 # Wait for all GitLab services to be fully started.
168 # Wait for all GitLab services to be fully started.
93 waitForServices = ''
169 waitForServices = ''
94 gitlab.wait_for_unit("gitaly.service")
170 gitlab.wait_for_unit("gitaly.service")
@@ -105,6 +181,8 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
105 # The actual test of GitLab. Only push data to GitLab if
181 # The actual test of GitLab. Only push data to GitLab if
106 # `doSetup` is is true.
182 # `doSetup` is is true.
107 test = doSetup: ''
183 test = doSetup: ''
184+ GIT_SSH_COMMAND = "ssh -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null"
185+
108 gitlab.succeed(
186 gitlab.succeed(
109 "curl -isSf http://gitlab | grep -i location | grep http://gitlab/users/sign_in"
187 "curl -isSf http://gitlab | grep -i location | grep http://gitlab/users/sign_in"
110 )
188 )
@@ -115,27 +193,222 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
115 "echo \"Authorization: Bearer $(curl -X POST -H 'Content-Type: application/json' -d @${auth} http://gitlab/oauth/token | ${pkgs.jq}/bin/jq -r '.access_token')\" >/tmp/headers"
193 "echo \"Authorization: Bearer $(curl -X POST -H 'Content-Type: application/json' -d @${auth} http://gitlab/oauth/token | ${pkgs.jq}/bin/jq -r '.access_token')\" >/tmp/headers"
116 )
194 )
117 '' + optionalString doSetup ''
195 '' + optionalString doSetup ''
196+ with subtest("Create user Alice"):
197+ gitlab.succeed(
198+ """[ "$(curl -o /dev/null -w '%{http_code}' -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${createUserAlice} http://gitlab/api/v4/users)" = "201" ]"""
199+ )
200+ gitlab.succeed(
201+ "echo \"Authorization: Bearer $(curl -X POST -H 'Content-Type: application/json' -d @${aliceAuth} http://gitlab/oauth/token | ${pkgs.jq}/bin/jq -r '.access_token')\" >/tmp/headers-alice"
202+ )
203+
204+ with subtest("Create user Bob"):
205+ gitlab.succeed(
206+ """ [ "$(curl -o /dev/null -w '%{http_code}' -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${createUserBob} http://gitlab/api/v4/users)" = "201" ]"""
207+ )
208+ gitlab.succeed(
209+ "echo \"Authorization: Bearer $(curl -X POST -H 'Content-Type: application/json' -d @${bobAuth} http://gitlab/oauth/token | ${pkgs.jq}/bin/jq -r '.access_token')\" >/tmp/headers-bob"
210+ )
211+
212+ with subtest("Setup Git and SSH for Alice"):
213+ gitlab.succeed("git config --global user.name Alice")
214+ gitlab.succeed("git config --global user.email alice@nixos.invalid")
215+ gitlab.succeed("mkdir -m 700 /root/.ssh")
216+ gitlab.succeed("cat ${snakeOilPrivateKey} > /root/.ssh/id_ecdsa")
217+ gitlab.succeed("chmod 600 /root/.ssh/id_ecdsa")
218+ gitlab.succeed(
219+ """
220+ [ "$(curl \
221+ -o /dev/null \
222+ -w '%{http_code}' \
223+ -X POST \
224+ -H 'Content-Type: application/json' \
225+ -H @/tmp/headers-alice -d @${aliceAddSSHKey} \
226+ http://gitlab/api/v4/user/keys)" = "201" ]
227+ """
228+ )
229+
230+ with subtest("Create a new repository"):
231+ # Alice creates a new repository
232+ gitlab.succeed(
233+ """
234+ [ "$(curl \
235+ -o /dev/null \
236+ -w '%{http_code}' \
237+ -X POST \
238+ -H 'Content-Type: application/json' \
239+ -H @/tmp/headers-alice \
240+ -d @${createProjectAlice} \
241+ http://gitlab/api/v4/projects)" = "201" ]
242+ """
243+ )
244+
245+ # Alice commits an initial commit
246+ gitlab.succeed(
247+ """
248+ [ "$(curl \
249+ -o /dev/null \
250+ -w '%{http_code}' \
251+ -X POST \
252+ -H 'Content-Type: application/json' \
253+ -H @/tmp/headers-alice \
254+ -d @${putFile} \
255+ http://gitlab/api/v4/projects/${aliceProjectId}/repository/files/some-file.txt)" = "201" ]"""
256+ )
257+
258+ with subtest("git clone over HTTP"):
259+ gitlab.succeed(
260+ """git clone http://gitlab/alice/${aliceProjectName}.git clone-via-http""",
261+ timeout=15
262+ )
263+
264+ with subtest("Push a commit via SSH"):
265+ gitlab.succeed(
266+ f"""GIT_SSH_COMMAND="{GIT_SSH_COMMAND}" git clone gitlab@gitlab:alice/${aliceProjectName}.git""",
267+ timeout=15
268+ )
269+ gitlab.succeed(
270+ """echo "a commit sent over ssh" > ${aliceProjectName}/ssh.txt"""
271+ )
272+ gitlab.succeed(
273+ """
274+ cd ${aliceProjectName} || exit 1
275+ git add .
276+ """
277+ )
278+ gitlab.succeed(
279+ """
280+ cd ${aliceProjectName} || exit 1
281+ git commit -m "Add a commit to be sent over ssh"
282+ """
283+ )
284+ gitlab.succeed(
285+ f"""
286+ cd ${aliceProjectName} || exit 1
287+ GIT_SSH_COMMAND="{GIT_SSH_COMMAND}" git push --set-upstream origin master
288+ """,
289+ timeout=15
290+ )
291+
292+ with subtest("Fork a project"):
293+ # Bob forks Alice's project
294+ gitlab.succeed(
295+ """
296+ [ "$(curl \
297+ -o /dev/null \
298+ -w '%{http_code}' \
299+ -X POST \
300+ -H 'Content-Type: application/json' \
301+ -H @/tmp/headers-bob \
302+ http://gitlab/api/v4/projects/${aliceProjectId}/fork)" = "201" ]
303+ """
304+ )
305+
306+ # Bob creates a commit
307+ gitlab.wait_until_succeeds(
308+ """
309+ [ "$(curl \
310+ -o /dev/null \
311+ -w '%{http_code}' \
312+ -X POST \
313+ -H 'Content-Type: application/json' \
314+ -H @/tmp/headers-bob \
315+ -d @${putFile} \
316+ http://gitlab/api/v4/projects/${bobProjectId}/repository/files/some-other-file.txt)" = "201" ]
317+ """
318+ )
319+
320+ with subtest("Create a Merge Request"):
321+ # Bob opens a merge request against Alice's repository
322+ gitlab.wait_until_succeeds(
323+ """
324+ [ "$(curl \
325+ -o /dev/null \
326+ -w '%{http_code}' \
327+ -X POST \
328+ -H 'Content-Type: application/json' \
329+ -H @/tmp/headers-bob \
330+ -d @${mergeRequest} \
331+ http://gitlab/api/v4/projects/${bobProjectId}/merge_requests)" = "201" ]
332+ """
333+ )
334+
335+ # Alice merges the MR
336+ gitlab.wait_until_succeeds(
337+ """
338+ [ "$(curl \
339+ -o /dev/null \
340+ -w '%{http_code}' \
341+ -X PUT \
342+ -H 'Content-Type: application/json' \
343+ -H @/tmp/headers-alice \
344+ -d @${mergeRequest} \
345+ http://gitlab/api/v4/projects/${aliceProjectId}/merge_requests/1/merge)" = "200" ]
346+ """
347+ )
348+
349+ with subtest("Create an Issue"):
350+ # Bob opens an issue on Alice's repository
118− gitlab.succeed(
351+ gitlab.succeed(
352+ """[ "$(curl \
353+ -o /dev/null \
354+ -w '%{http_code}' \
355+ -X POST \
119− """[ "$(curl -o /dev/null -w '%{http_code}' -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${createProject} http://gitlab/api/v4/projects)" = "201" ]"""
356+ -H 'Content-Type: application/json' \
357+ -H @/tmp/headers-bob \
358+ -d @${newIssue} \
359+ http://gitlab/api/v4/projects/${aliceProjectId}/issues)" = "201" ]
360+ """
120− )
361+ )
121− gitlab.succeed(
362+
122− """[ "$(curl -o /dev/null -w '%{http_code}' -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${putFile} http://gitlab/api/v4/projects/2/repository/files/some-file.txt)" = "201" ]"""
363+ # Alice closes the issue
364+ gitlab.wait_until_succeeds(
365+ """
366+ [ "$(curl \
367+ -o /dev/null \
368+ -w '%{http_code}' \
369+ -X PUT \
370+ -H 'Content-Type: application/json' \
371+ -H @/tmp/headers-alice -d @${closeIssue} http://gitlab/api/v4/projects/${aliceProjectId}/issues/1)" = "200" ]
372+ """
123− )
373+ )
124 '' + ''
374 '' + ''
375+ with subtest("Download archive.tar.gz"):
125− gitlab.succeed(
376+ gitlab.succeed(
377+ """
378+ [ "$(curl \
379+ -o /dev/null \
380+ -w '%{http_code}' \
381+ -H @/tmp/headers-alice \
126− """[ "$(curl -o /dev/null -w '%{http_code}' -H @/tmp/headers http://gitlab/api/v4/projects/2/repository/archive.tar.gz)" = "200" ]"""
382+ http://gitlab/api/v4/projects/${aliceProjectId}/repository/archive.tar.gz)" = "200" ]
383+ """
127− )
384+ )
128− gitlab.succeed(
385+ gitlab.succeed(
386+ """
387+ curl \
388+ -H @/tmp/headers-alice \
129− """curl -H @/tmp/headers http://gitlab/api/v4/projects/2/repository/archive.tar.gz > /tmp/archive.tar.gz"""
389+ http://gitlab/api/v4/projects/${aliceProjectId}/repository/archive.tar.gz > /tmp/archive.tar.gz
390+ """
130− )
391+ )
131− gitlab.succeed(
392+ gitlab.succeed("test -s /tmp/archive.tar.gz")
393+
394+ with subtest("Download archive.tar.bz2"):
395+ gitlab.succeed(
396+ """
397+ [ "$(curl \
398+ -o /dev/null \
399+ -w '%{http_code}' \
400+ -H @/tmp/headers-alice \
132− """[ "$(curl -o /dev/null -w '%{http_code}' -H @/tmp/headers http://gitlab/api/v4/projects/2/repository/archive.tar.bz2)" = "200" ]"""
401+ http://gitlab/api/v4/projects/${aliceProjectId}/repository/archive.tar.bz2)" = "200" ]
402+ """
133− )
403+ )
134− gitlab.succeed(
404+ gitlab.succeed(
405+ """
406+ curl \
407+ -H @/tmp/headers-alice \
135− """curl -o /dev/null -w '%{http_code}' -H @/tmp/headers http://gitlab/api/v4/projects/2/repository/archive.tar.bz2 > /tmp/archive.tar.bz2"""
408+ http://gitlab/api/v4/projects/${aliceProjectId}/repository/archive.tar.bz2 > /tmp/archive.tar.bz2
136− )
409+ """
137− gitlab.succeed("test -s /tmp/archive.tar.gz")
410+ )
138− gitlab.succeed("test -s /tmp/archive.tar.bz2")
411+ gitlab.succeed("test -s /tmp/archive.tar.bz2")
139 '';
412 '';
140
413
141 in ''
414 in ''
nixos/tests/haste-server.nixnew file+23
@@ -0,0 +1,23 @@
1+import ./make-test-python.nix ({ pkgs, lib, ... }:
2+ {
3+ name = "haste-server";
4+ meta.maintainers = with lib.maintainers; [ mkg20001 ];
5+
6+ nodes.machine = { pkgs, ... }: {
7+ environment.systemPackages = with pkgs; [
8+ curl
9+ jq
10+ ];
11+
12+ services.haste-server = {
13+ enable = true;
14+ };
15+ };
16+
17+ testScript = ''
18+ machine.wait_for_unit("haste-server")
19+ machine.wait_until_succeeds("curl -s localhost:7777")
20+ machine.succeed('curl -s -X POST http://localhost:7777/documents -d "Hello World!" > bla')
21+ machine.succeed('curl http://localhost:7777/raw/$(cat bla | jq -r .key) | grep "Hello World"')
22+ '';
23+ })
nixos/tests/hbase.nixnew file+30
@@ -0,0 +1,30 @@
1+import ./make-test-python.nix ({ pkgs, lib, package ? pkgs.hbase, ... }:
2+{
3+ name = "hbase";
4+
5+ meta = with lib.maintainers; {
6+ maintainers = [ illustris ];
7+ };
8+
9+ nodes = {
10+ hbase = { pkgs, ... }: {
11+ services.hbase = {
12+ enable = true;
13+ inherit package;
14+ # Needed for standalone mode in hbase 2+
15+ # This setting and standalone mode are not suitable for production
16+ settings."hbase.unsafe.stream.capability.enforce" = "false";
17+ };
18+ environment.systemPackages = with pkgs; [
19+ package
20+ ];
21+ };
22+ };
23+
24+ testScript = ''
25+ start_all()
26+ hbase.wait_for_unit("hbase.service")
27+ hbase.wait_until_succeeds("echo \"create 't1','f1'\" | sudo -u hbase hbase shell -n")
28+ assert "NAME => 'f1'" in hbase.succeed("echo \"describe 't1'\" | sudo -u hbase hbase shell -n")
29+ '';
30+})
nixos/tests/hibernate.nix+12−1
@@ -3,6 +3,7 @@
3{ system ? builtins.currentSystem
3{ system ? builtins.currentSystem
4, config ? {}
4, config ? {}
5, pkgs ? import ../.. { inherit system config; }
5, pkgs ? import ../.. { inherit system config; }
6+, systemdStage1 ? false
6}:
7}:
7
8
8with import ../lib/testing-python.nix { inherit system pkgs; };
9with import ../lib/testing-python.nix { inherit system pkgs; };
@@ -29,6 +30,11 @@ let
29 "/".device = "/dev/vda2";
30 "/".device = "/dev/vda2";
30 };
31 };
31 swapDevices = mkOverride 0 [ { device = "/dev/vda1"; } ];
32 swapDevices = mkOverride 0 [ { device = "/dev/vda1"; } ];
33+ boot.resumeDevice = mkIf systemdStage1 "/dev/vda1";
34+ boot.initrd.systemd = mkIf systemdStage1 {
35+ enable = true;
36+ emergencyAccess = true;
37+ };
32 };
38 };
33 installedSystem = (import ../lib/eval-config.nix {
39 installedSystem = (import ../lib/eval-config.nix {
34 inherit system;
40 inherit system;
@@ -39,7 +45,7 @@ in makeTest {
39
45
40 nodes = {
46 nodes = {
41 # System configuration used for installing the installedConfig from above.
47 # System configuration used for installing the installedConfig from above.
42− nodes.machine = { config, lib, pkgs, ... }: with lib; {
48+ machine = { config, lib, pkgs, ... }: with lib; {
43 imports = [
49 imports = [
44 ../modules/profiles/installation-device.nix
50 ../modules/profiles/installation-device.nix
45 ../modules/profiles/base.nix
51 ../modules/profiles/base.nix
@@ -117,6 +123,11 @@ in makeTest {
117 resume = create_named_machine("resume")
123 resume = create_named_machine("resume")
118 resume.start()
124 resume.start()
119 resume.succeed("grep 'not persisted to disk' /run/test/suspended")
125 resume.succeed("grep 'not persisted to disk' /run/test/suspended")
126+
127+ # Ensure we don't restore from hibernation when booting again
128+ resume.crash()
129+ resume.wait_for_unit("default.target")
130+ resume.fail("grep 'not persisted to disk' /run/test/suspended")
120 '';
131 '';
121
132
122}
133}
nixos/tests/installer-systemd-stage-1.nixnew file+33
@@ -0,0 +1,33 @@
1+{ system ? builtins.currentSystem
2+, config ? {}
3+, pkgs ? import ../.. { inherit system config; }
4+}:
5+
6+{
7+ # Some of these tests don't work with systemd stage 1 yet. Uncomment
8+ # them when fixed.
9+ inherit (import ./installer.nix { inherit system config pkgs; systemdStage1 = true; })
10+ # bcache
11+ # btrfsSimple
12+ # btrfsSubvolDefault
13+ # btrfsSubvols
14+ # encryptedFSWithKeyfile
15+ # grub1
16+ # luksroot
17+ # luksroot-format1
18+ # luksroot-format2
19+ # lvm
20+ separateBoot
21+ separateBootFat
22+ simple
23+ simpleLabels
24+ simpleProvided
25+ simpleSpecialised
26+ simpleUefiGrub
27+ simpleUefiGrubSpecialisation
28+ simpleUefiSystemdBoot
29+ # swraid
30+ # zfsroot
31+ ;
32+
33+}
nixos/tests/installer.nix+15−1
@@ -1,6 +1,7 @@
1{ system ? builtins.currentSystem,
1{ system ? builtins.currentSystem,
2 config ? {},
2 config ? {},
3− pkgs ? import ../.. { inherit system config; }
3+ pkgs ? import ../.. { inherit system config; },
4+ systemdStage1 ? false
4}:
5}:
5
6
6with import ../lib/testing-python.nix { inherit system pkgs; };
7with import ../lib/testing-python.nix { inherit system pkgs; };
@@ -23,6 +24,8 @@ let
23 # To ensure that we can rebuild the grub configuration on the nixos-rebuild
24 # To ensure that we can rebuild the grub configuration on the nixos-rebuild
24 system.extraDependencies = with pkgs; [ stdenvNoCC ];
25 system.extraDependencies = with pkgs; [ stdenvNoCC ];
25
26
27+ ${optionalString systemdStage1 "boot.initrd.systemd.enable = true;"}
28+
26 ${optionalString (bootLoader == "grub") ''
29 ${optionalString (bootLoader == "grub") ''
27 boot.loader.grub.version = ${toString grubVersion};
30 boot.loader.grub.version = ${toString grubVersion};
28 ${optionalString (grubVersion == 1) ''
31 ${optionalString (grubVersion == 1) ''
@@ -290,6 +293,8 @@ let
290 virtualisation.cores = 8;
293 virtualisation.cores = 8;
291 virtualisation.memorySize = 1536;
294 virtualisation.memorySize = 1536;
292
295
296+ boot.initrd.systemd.enable = systemdStage1;
297+
293 # Use a small /dev/vdb as the root disk for the
298 # Use a small /dev/vdb as the root disk for the
294 # installer. This ensures the target disk (/dev/vda) is
299 # installer. This ensures the target disk (/dev/vda) is
295 # the same during and after installation.
300 # the same during and after installation.
@@ -299,6 +304,13 @@ let
299 virtualisation.qemu.diskInterface =
304 virtualisation.qemu.diskInterface =
300 if grubVersion == 1 then "scsi" else "virtio";
305 if grubVersion == 1 then "scsi" else "virtio";
301
306
307+ # We don't want to have any networking in the guest whatsoever.
308+ # Also, if any vlans are enabled, the guest will reboot
309+ # (with a different configuration for legacy reasons),
310+ # and spend 5 minutes waiting for the vlan interface to show up
311+ # (which will never happen).
312+ virtualisation.vlans = [];
313+
302 boot.loader.systemd-boot.enable = mkIf (bootLoader == "systemd-boot") true;
314 boot.loader.systemd-boot.enable = mkIf (bootLoader == "systemd-boot") true;
303
315
304 hardware.enableAllFirmware = mkForce false;
316 hardware.enableAllFirmware = mkForce false;
@@ -312,6 +324,8 @@ let
312 desktop-file-utils
324 desktop-file-utils
313 docbook5
325 docbook5
314 docbook_xsl_ns
326 docbook_xsl_ns
327+ kmod.dev
328+ libarchive.dev
315 libxml2.bin
329 libxml2.bin
316 libxslt.bin
330 libxslt.bin
317 nixos-artwork.wallpapers.simple-dark-gray-bottom
331 nixos-artwork.wallpapers.simple-dark-gray-bottom
nixos/tests/kexec.nix+44−16
@@ -1,22 +1,50 @@
1−# Test whether fast reboots via kexec work.
2−
3−import ./make-test-python.nix ({ pkgs, lib, ...} : {
1+import ./make-test-python.nix ({ pkgs, lib, ... }: {
4 name = "kexec";
2 name = "kexec";
5 meta = with lib.maintainers; {
3 meta = with lib.maintainers; {
6− maintainers = [ eelco ];
4+ maintainers = [ flokli lassulus ];
5+ };
6+
7+ nodes = {
8+ node1 = { ... }: {
9+ virtualisation.vlans = [ ];
10+ virtualisation.memorySize = 4 * 1024;
11+ virtualisation.useBootLoader = true;
12+ virtualisation.useEFIBoot = true;
13+ boot.loader.systemd-boot.enable = true;
14+ boot.loader.efi.canTouchEfiVariables = true;
15+ };
16+
17+ node2 = { modulesPath, ... }: {
18+ virtualisation.vlans = [ ];
19+ environment.systemPackages = [ pkgs.hello ];
20+ imports = [
21+ "${modulesPath}/installer/kexec/kexec-boot.nix"
22+ "${modulesPath}/profiles/minimal.nix"
23+ ];
24+ };
7 };
25 };
8
26
9− nodes.machine = { ... }:
27+ testScript = { nodes, ... }: ''
10− { virtualisation.vlans = [ ]; };
28+ # Test whether reboot via kexec works.
29+ node1.wait_for_unit("multi-user.target")
30+ node1.succeed('kexec --load /run/current-system/kernel --initrd /run/current-system/initrd --command-line "$(</proc/cmdline)"')
31+ node1.execute("systemctl kexec >&2 &", check_return=False)
32+ node1.connected = False
33+ node1.connect()
34+ node1.wait_for_unit("multi-user.target")
35+
36+ # Check if the machine with kexec-boot.nix profile boots up
37+ node2.wait_for_unit("multi-user.target")
38+ node2.shutdown()
39+
40+ # Kexec node1 to the toplevel of node2 via the kexec-boot script
41+ node1.succeed('touch /run/foo')
42+ node1.fail('hello')
43+ node1.execute('${nodes.node2.config.system.build.kexecBoot}/kexec-boot', check_return=False)
44+ node1.succeed('! test -e /run/foo')
45+ node1.succeed('hello')
46+ node1.succeed('[ "$(hostname)" = "node2" ]')
11
47
12− testScript =
13− ''
14− machine.wait_for_unit("multi-user.target")
15− machine.succeed('kexec --load /run/current-system/kernel --initrd /run/current-system/initrd --command-line "$(</proc/cmdline)"')
16− machine.execute("systemctl kexec >&2 &", check_return=False)
17− machine.connected = False
18− machine.connect()
19− machine.wait_for_unit("multi-user.target")
20− machine.shutdown()
48+ node1.shutdown()
21− '';
49+ '';
22})
50})
nixos/tests/keycloak.nix+15−11
@@ -4,7 +4,7 @@
4
4
5let
5let
6 certs = import ./common/acme/server/snakeoil-certs.nix;
6 certs = import ./common/acme/server/snakeoil-certs.nix;
7− frontendUrl = "https://${certs.domain}/auth";
7+ frontendUrl = "https://${certs.domain}";
8 initialAdminPassword = "h4IhoJFnt2iQIR9";
8 initialAdminPassword = "h4IhoJFnt2iQIR9";
9
9
10 keycloakTest = import ./make-test-python.nix (
10 keycloakTest = import ./make-test-python.nix (
@@ -27,20 +27,23 @@ let
27
27
28 services.keycloak = {
28 services.keycloak = {
29 enable = true;
29 enable = true;
30+ settings = {
31+ hostname = certs.domain;
32+ };
30− inherit frontendUrl initialAdminPassword;
33+ inherit initialAdminPassword;
31− sslCertificate = certs.${certs.domain}.cert;
34+ sslCertificate = "${certs.${certs.domain}.cert}";
32− sslCertificateKey = certs.${certs.domain}.key;
35+ sslCertificateKey = "${certs.${certs.domain}.key}";
33 database = {
36 database = {
34 type = databaseType;
37 type = databaseType;
35 username = "bogus";
38 username = "bogus";
39+ name = "also bogus";
36− passwordFile = pkgs.writeText "dbPassword" "wzf6vOCbPp6cqTH";
40+ passwordFile = "${pkgs.writeText "dbPassword" "wzf6vOCbPp6cqTH"}";
37 };
41 };
38 plugins = with config.services.keycloak.package.plugins; [
42 plugins = with config.services.keycloak.package.plugins; [
39 keycloak-discord
43 keycloak-discord
40 keycloak-metrics-spi
44 keycloak-metrics-spi
41 ];
45 ];
42 };
46 };
43−
44 environment.systemPackages = with pkgs; [
47 environment.systemPackages = with pkgs; [
45 xmlstarlet
48 xmlstarlet
46 html-tidy
49 html-tidy
@@ -99,9 +102,9 @@ let
99 in ''
102 in ''
100 keycloak.start()
103 keycloak.start()
101 keycloak.wait_for_unit("keycloak.service")
104 keycloak.wait_for_unit("keycloak.service")
105+ keycloak.wait_for_open_port(443)
102 keycloak.wait_until_succeeds("curl -sSf ${frontendUrl}")
106 keycloak.wait_until_succeeds("curl -sSf ${frontendUrl}")
103
107
104−
105 ### Realm Setup ###
108 ### Realm Setup ###
106
109
107 # Get an admin interface access token
110 # Get an admin interface access token
@@ -117,8 +120,8 @@ let
117 # Register the metrics SPI
120 # Register the metrics SPI
118 keycloak.succeed(
121 keycloak.succeed(
119 "${pkgs.jre}/bin/keytool -import -alias snakeoil -file ${certs.ca.cert} -storepass aaaaaa -keystore cacert.jks -noprompt",
122 "${pkgs.jre}/bin/keytool -import -alias snakeoil -file ${certs.ca.cert} -storepass aaaaaa -keystore cacert.jks -noprompt",
120− "KC_OPTS='-Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=aaaaaa' ${pkgs.keycloak}/bin/kcadm.sh config credentials --server '${frontendUrl}' --realm master --user admin --password '${initialAdminPassword}'",
123+ "KC_OPTS='-Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=aaaaaa' kcadm.sh config credentials --server '${frontendUrl}' --realm master --user admin --password '${initialAdminPassword}'",
121− "KC_OPTS='-Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=aaaaaa' ${pkgs.keycloak}/bin/kcadm.sh update events/config -s 'eventsEnabled=true' -s 'adminEventsEnabled=true' -s 'eventsListeners+=metrics-listener'",
124+ "KC_OPTS='-Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=aaaaaa' kcadm.sh update events/config -s 'eventsEnabled=true' -s 'adminEventsEnabled=true' -s 'eventsListeners+=metrics-listener'",
122 "curl -sSf '${frontendUrl}/realms/master/metrics' | grep '^keycloak_admin_event_UPDATE'"
125 "curl -sSf '${frontendUrl}/realms/master/metrics' | grep '^keycloak_admin_event_UPDATE'"
123 )
126 )
124
127
@@ -143,7 +146,7 @@ let
143 # post url.
146 # post url.
144 keycloak.succeed(
147 keycloak.succeed(
145 "curl -sSf -c cookie '${frontendUrl}/realms/${realm.realm}/protocol/openid-connect/auth?client_id=${client.name}&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=openid+email&response_type=code&response_mode=query&nonce=qw4o89g3qqm' >login_form",
148 "curl -sSf -c cookie '${frontendUrl}/realms/${realm.realm}/protocol/openid-connect/auth?client_id=${client.name}&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=openid+email&response_type=code&response_mode=query&nonce=qw4o89g3qqm' >login_form",
146− "tidy -q -m login_form || true",
149+ "tidy -asxml -q -m login_form || true",
147 "xml sel -T -t -m \"_:html/_:body/_:div/_:div/_:div/_:div/_:div/_:div/_:form[@id='kc-form-login']\" -v @action login_form >form_post_url",
150 "xml sel -T -t -m \"_:html/_:body/_:div/_:div/_:div/_:div/_:div/_:div/_:form[@id='kc-form-login']\" -v @action login_form >form_post_url",
148 )
151 )
149
152
@@ -151,7 +154,7 @@ let
151 # the HTML, then extract the authorization code.
154 # the HTML, then extract the authorization code.
152 keycloak.succeed(
155 keycloak.succeed(
153 "curl -sSf -L -b cookie -d 'username=${user.username}' -d 'password=${password}' -d 'credentialId=' \"$(<form_post_url)\" >auth_code_html",
156 "curl -sSf -L -b cookie -d 'username=${user.username}' -d 'password=${password}' -d 'credentialId=' \"$(<form_post_url)\" >auth_code_html",
154− "tidy -q -m auth_code_html || true",
157+ "tidy -asxml -q -m auth_code_html || true",
155 "xml sel -T -t -m \"_:html/_:body/_:div/_:div/_:div/_:div/_:div/_:input[@id='code']\" -v @value auth_code_html >auth_code",
158 "xml sel -T -t -m \"_:html/_:body/_:div/_:div/_:div/_:div/_:div/_:input[@id='code']\" -v @value auth_code_html >auth_code",
156 )
159 )
157
160
@@ -172,5 +175,6 @@ let
172in
175in
173{
176{
174 postgres = keycloakTest { databaseType = "postgresql"; };
177 postgres = keycloakTest { databaseType = "postgresql"; };
178+ mariadb = keycloakTest { databaseType = "mariadb"; };
175 mysql = keycloakTest { databaseType = "mysql"; };
179 mysql = keycloakTest { databaseType = "mysql"; };
176}
180}
nixos/tests/lvm2/default.nixnew file+45
@@ -0,0 +1,45 @@
1+{ system ? builtins.currentSystem
2+, config ? { }
3+, pkgs ? import ../../.. { inherit system config; }
4+, lib ? pkgs.lib
5+, kernelVersionsToTest ? [ "4.19" "5.4" "5.10" "5.15" "latest" ]
6+}:
7+
8+# For quickly running a test, the nixosTests.lvm2.lvm-thinpool-linux-latest attribute is recommended
9+let
10+ tests = let callTest = p: lib.flip (import p) { inherit system pkgs; }; in {
11+ thinpool = { test = callTest ./thinpool.nix; kernelFilter = lib.id; };
12+ # we would like to test all versions, but the kernel module currently does not compile against the other versions
13+ vdo = { test = callTest ./vdo.nix; kernelFilter = lib.filter (v: v == "5.15"); };
14+
15+
16+ # systemd in stage 1
17+ raid-sd-stage-1 = {
18+ test = callTest ./systemd-stage-1.nix;
19+ kernelFilter = lib.id;
20+ flavour = "raid";
21+ };
22+ thinpool-sd-stage-1 = {
23+ test = callTest ./systemd-stage-1.nix;
24+ kernelFilter = lib.id;
25+ flavour = "thinpool";
26+ };
27+ vdo-sd-stage-1 = {
28+ test = callTest ./systemd-stage-1.nix;
29+ kernelFilter = lib.filter (v: v == "5.15");
30+ flavour = "vdo";
31+ };
32+ };
33+in
34+lib.listToAttrs (
35+ lib.filter (x: x.value != {}) (
36+ lib.flip lib.concatMap kernelVersionsToTest (version:
37+ let
38+ v' = lib.replaceStrings [ "." ] [ "_" ] version;
39+ in
40+ lib.flip lib.mapAttrsToList tests (name: t:
41+ lib.nameValuePair "lvm-${name}-linux-${v'}" (lib.optionalAttrs (builtins.elem version (t.kernelFilter kernelVersionsToTest)) (t.test ({ kernelPackages = pkgs."linuxPackages_${v'}"; } // builtins.removeAttrs t [ "test" "kernelFilter" ])))
42+ )
43+ )
44+ )
45+)
nixos/tests/lvm2/systemd-stage-1.nixnew file+104
@@ -0,0 +1,104 @@
1+{ kernelPackages ? null, flavour }: let
2+ preparationCode = {
3+ raid = ''
4+ machine.succeed("vgcreate test_vg /dev/vdc /dev/vdd")
5+ machine.succeed("lvcreate -L 512M --type raid0 test_vg -n test_lv")
6+ '';
7+
8+ thinpool = ''
9+ machine.succeed("vgcreate test_vg /dev/vdc")
10+ machine.succeed("lvcreate -L 512M -T test_vg/test_thin_pool")
11+ machine.succeed("lvcreate -n test_lv -V 16G --thinpool test_thin_pool test_vg")
12+ '';
13+
14+ vdo = ''
15+ machine.succeed("vgcreate test_vg /dev/vdc")
16+ machine.succeed("lvcreate --type vdo -n test_lv -L 6G -V 12G test_vg/vdo_pool_lv")
17+ '';
18+ }.${flavour};
19+
20+ extraConfig = {
21+ raid = {
22+ boot.initrd.kernelModules = [
23+ "dm-raid"
24+ "raid0"
25+ ];
26+ };
27+
28+ thinpool = {
29+ services.lvm = {
30+ boot.thin.enable = true;
31+ dmeventd.enable = true;
32+ };
33+ };
34+
35+ vdo = {
36+ services.lvm = {
37+ boot.vdo.enable = true;
38+ dmeventd.enable = true;
39+ };
40+ };
41+ }.${flavour};
42+
43+ extraCheck = {
44+ raid = ''
45+ "test_lv" in machine.succeed("lvs --select segtype=raid0")
46+ '';
47+
48+ thinpool = ''
49+ "test_lv" in machine.succeed("lvs --select segtype=thin-pool")
50+ '';
51+
52+ vdo = ''
53+ "test_lv" in machine.succeed("lvs --select segtype=vdo")
54+ '';
55+ }.${flavour};
56+
57+in import ../make-test-python.nix ({ pkgs, ... }: {
58+ name = "lvm2-${flavour}-systemd-stage-1";
59+ meta.maintainers = with pkgs.lib.maintainers; [ das_j ];
60+
61+ nodes.machine = { pkgs, lib, ... }: {
62+ imports = [ extraConfig ];
63+ # Use systemd-boot
64+ virtualisation = {
65+ emptyDiskImages = [ 8192 8192 ];
66+ useBootLoader = true;
67+ useEFIBoot = true;
68+ };
69+ boot.loader.systemd-boot.enable = true;
70+ boot.loader.efi.canTouchEfiVariables = true;
71+
72+ environment.systemPackages = with pkgs; [ e2fsprogs ]; # for mkfs.ext4
73+ boot = {
74+ initrd.systemd = {
75+ enable = true;
76+ emergencyAccess = true;
77+ };
78+ initrd.services.lvm.enable = true;
79+ kernelPackages = lib.mkIf (kernelPackages != null) kernelPackages;
80+ };
81+
82+ specialisation.boot-lvm.configuration.virtualisation.bootDevice = "/dev/test_vg/test_lv";
83+ };
84+
85+ testScript = ''
86+ machine.wait_for_unit("multi-user.target")
87+ # Create a VG for the root
88+ ${preparationCode}
89+ machine.succeed("mkfs.ext4 /dev/test_vg/test_lv")
90+ machine.succeed("mkdir -p /mnt && mount /dev/test_vg/test_lv /mnt && echo hello > /mnt/test && umount /mnt")
91+
92+ # Boot from LVM
93+ machine.succeed("bootctl set-default nixos-generation-1-specialisation-boot-lvm.conf")
94+ machine.succeed("sync")
95+ machine.crash()
96+ machine.wait_for_unit("multi-user.target")
97+
98+ # Ensure we have successfully booted from LVM
99+ assert "(initrd)" in machine.succeed("systemd-analyze") # booted with systemd in stage 1
100+ assert "/dev/mapper/test_vg-test_lv on / type ext4" in machine.succeed("mount")
101+ assert "hello" in machine.succeed("cat /test")
102+ ${extraCheck}
103+ '';
104+})
nixos/tests/lvm2/thinpool.nixnew file+32
@@ -0,0 +1,32 @@
1+{ kernelPackages ? null }:
2+import ../make-test-python.nix ({ pkgs, ... }: {
3+ name = "lvm2-thinpool";
4+ meta.maintainers = with pkgs.lib.maintainers; [ ajs124 ];
5+
6+ nodes.machine = { pkgs, lib, ... }: {
7+ virtualisation.emptyDiskImages = [ 4096 ];
8+ services.lvm = {
9+ boot.thin.enable = true;
10+ dmeventd.enable = true;
11+ };
12+ environment.systemPackages = with pkgs; [ xfsprogs ];
13+ environment.etc."lvm/lvm.conf".text = ''
14+ activation/thin_pool_autoextend_percent = 10
15+ activation/thin_pool_autoextend_threshold = 80
16+ '';
17+ boot = lib.mkIf (kernelPackages != null) { inherit kernelPackages; };
18+ };
19+
20+ testScript = ''
21+ machine.succeed("vgcreate test_vg /dev/vdb")
22+ machine.succeed("lvcreate -L 512M -T test_vg/test_thin_pool")
23+ machine.succeed("lvcreate -n test_lv -V 16G --thinpool test_thin_pool test_vg")
24+ machine.succeed("mkfs.xfs /dev/test_vg/test_lv")
25+ machine.succeed("mkdir /mnt; mount /dev/test_vg/test_lv /mnt")
26+ assert "/dev/mapper/test_vg-test_lv" == machine.succeed("findmnt -no SOURCE /mnt").strip()
27+ machine.succeed("dd if=/dev/zero of=/mnt/empty.file bs=1M count=1024")
28+ machine.succeed("journalctl -u dm-event.service | grep \"successfully resized\"")
29+ machine.succeed("umount /mnt")
30+ machine.succeed("vgchange -a n")
31+ '';
32+})
nixos/tests/lvm2/vdo.nixnew file+27
@@ -0,0 +1,27 @@
1+{ kernelPackages ? null }:
2+import ../make-test-python.nix ({ pkgs, ... }: {
3+ name = "lvm2-vdo";
4+ meta.maintainers = with pkgs.lib.maintainers; [ ajs124 ];
5+
6+ nodes.machine = { pkgs, lib, ... }: {
7+ # Minimum required size for VDO volume: 5063921664 bytes
8+ virtualisation.emptyDiskImages = [ 8192 ];
9+ services.lvm = {
10+ boot.vdo.enable = true;
11+ dmeventd.enable = true;
12+ };
13+ environment.systemPackages = with pkgs; [ xfsprogs ];
14+ boot = lib.mkIf (kernelPackages != null) { inherit kernelPackages; };
15+ };
16+
17+ testScript = ''
18+ machine.succeed("vgcreate test_vg /dev/vdb")
19+ machine.succeed("lvcreate --type vdo -n vdo_lv -L 6G -V 12G test_vg/vdo_pool_lv")
20+ machine.succeed("mkfs.xfs -K /dev/test_vg/vdo_lv")
21+ machine.succeed("mkdir /mnt; mount /dev/test_vg/vdo_lv /mnt")
22+ assert "/dev/mapper/test_vg-vdo_lv" == machine.succeed("findmnt -no SOURCE /mnt").strip()
23+ machine.succeed("umount /mnt")
24+ machine.succeed("vdostats")
25+ machine.succeed("vgchange -a n")
26+ '';
27+})
nixos/tests/lxd-image-server.nix+15−48
@@ -1,54 +1,21 @@
1−import ./make-test-python.nix ({ pkgs, ...} :
1+import ./make-test-python.nix ({ pkgs, lib, ... } :
2
2
3let
3let
4− # Since we don't have access to the internet during the tests, we have to
4+ lxd-image = import ../release.nix {
5− # pre-fetch lxd containers beforehand.
5+ configuration = {
6− #
6+ # Building documentation makes the test unnecessarily take a longer time:
7− # I've chosen to import Alpine Linux, because its image is turbo-tiny and,
7+ documentation.enable = lib.mkForce false;
8− # generally, sufficient for our tests.
9− alpine-meta = pkgs.fetchurl {
10− url = "https://tarballs.nixos.org/alpine/3.12/lxd.tar.xz";
11− hash = "sha256-1tcKaO9lOkvqfmG/7FMbfAEToAuFy2YMewS8ysBKuLA=";
12− };
8+ };
13−
14− alpine-rootfs = pkgs.fetchurl {
15− url = "https://tarballs.nixos.org/alpine/3.12/rootfs.tar.xz";
16− hash = "sha256-Tba9sSoaiMtQLY45u7p5DMqXTSDgs/763L/SQp0bkCA=";
17 };
9 };
18
10
19− lxd-config = pkgs.writeText "config.yaml" ''
11+ lxd-image-metadata = lxd-image.lxdMeta.${pkgs.system};
20− storage_pools:
12+ lxd-image-rootfs = lxd-image.lxdImage.${pkgs.system};
21− - name: default
22− driver: dir
23− config:
24− source: /var/lxd-pool
25−
26− networks:
27− - name: lxdbr0
28− type: bridge
29− config:
30− ipv4.address: auto
31− ipv6.address: none
32−
33− profiles:
34− - name: default
35− devices:
36− eth0:
37− name: eth0
38− network: lxdbr0
39− type: nic
40− root:
41− path: /
42− pool: default
43− type: disk
44− '';
45−
46
13
47in {
14in {
48 name = "lxd-image-server";
15 name = "lxd-image-server";
49
16
50 meta = with pkgs.lib.maintainers; {
17 meta = with pkgs.lib.maintainers; {
51− maintainers = [ mkg20001 ];
18+ maintainers = [ mkg20001 patryk27 ];
52 };
19 };
53
20
54 nodes.machine = { lib, ... }: {
21 nodes.machine = { lib, ... }: {
@@ -100,20 +67,20 @@ in {
100 # lxd expects the pool's directory to already exist
67 # lxd expects the pool's directory to already exist
101 machine.succeed("mkdir /var/lxd-pool")
68 machine.succeed("mkdir /var/lxd-pool")
102
69
103−
104 machine.succeed(
70 machine.succeed(
105− "cat ${lxd-config} | lxd init --preseed"
71+ "cat ${./common/lxd/config.yaml} | lxd init --preseed"
106 )
72 )
107
73
108 machine.succeed(
74 machine.succeed(
109− "lxc image import ${alpine-meta} ${alpine-rootfs} --alias alpine"
75+ "lxc image import ${lxd-image-metadata}/*/*.tar.xz ${lxd-image-rootfs}/*/*.tar.xz --alias nixos"
110 )
76 )
111
77
112− loc = "/var/www/simplestreams/images/iats/alpine/amd64/default/v1"
78+ loc = "/var/www/simplestreams/images/iats/nixos/amd64/default/v1"
113
79
114 with subtest("push image to server"):
80 with subtest("push image to server"):
115− machine.succeed("lxc launch alpine test")
81+ machine.succeed("lxc launch nixos test")
82+ machine.sleep(5)
116− machine.succeed("lxc stop test")
83+ machine.succeed("lxc stop -f test")
117 machine.succeed("lxc publish --public test --alias=testimg")
84 machine.succeed("lxc publish --public test --alias=testimg")
118 machine.succeed("lxc image export testimg")
85 machine.succeed("lxc image export testimg")
119 machine.succeed("ls >&2")
86 machine.succeed("ls >&2")
nixos/tests/lxd-image.nixdeleted−89
@@ -1,89 +0,0 @@
1−# This test ensures that the nixOS lxd images builds and functions properly
2−# It has been extracted from `lxd.nix` to seperate failures of just the image and the lxd software
3−
4−import ./make-test-python.nix ({ pkgs, ...} : let
5− release = import ../release.nix {
6− /* configuration = {
7− environment.systemPackages = with pkgs; [ stdenv ]; # inject stdenv so rebuild test works
8− }; */
9− };
10−
11− metadata = release.lxdMeta.${pkgs.system};
12− image = release.lxdImage.${pkgs.system};
13−
14− lxd-config = pkgs.writeText "config.yaml" ''
15− storage_pools:
16− - name: default
17− driver: dir
18− config:
19− source: /var/lxd-pool
20−
21− networks:
22− - name: lxdbr0
23− type: bridge
24− config:
25− ipv4.address: auto
26− ipv6.address: none
27−
28− profiles:
29− - name: default
30− devices:
31− eth0:
32− name: eth0
33− network: lxdbr0
34− type: nic
35− root:
36− path: /
37− pool: default
38− type: disk
39− '';
40−in {
41− name = "lxd-image";
42−
43− meta = with pkgs.lib.maintainers; {
44− maintainers = [ mkg20001 ];
45− };
46−
47− nodes.machine = { lib, ... }: {
48− virtualisation = {
49− # disk full otherwise
50− diskSize = 2048;
51−
52− lxc.lxcfs.enable = true;
53− lxd.enable = true;
54− };
55− };
56−
57− testScript = ''
58− machine.wait_for_unit("sockets.target")
59− machine.wait_for_unit("lxd.service")
60− machine.wait_for_file("/var/lib/lxd/unix.socket")
61−
62− # It takes additional second for lxd to settle
63− machine.sleep(1)
64−
65− # lxd expects the pool's directory to already exist
66− machine.succeed("mkdir /var/lxd-pool")
67−
68− machine.succeed(
69− "cat ${lxd-config} | lxd init --preseed"
70− )
71−
72− # TODO: test custom built container aswell
73−
74− with subtest("importing container works"):
75− machine.succeed("lxc image import ${metadata}/*/*.tar.xz ${image}/*/*.tar.xz --alias nixos")
76−
77− with subtest("launching container works"):
78− machine.succeed("lxc launch nixos machine -c security.nesting=true")
79− # make sure machine boots up properly
80− machine.sleep(5)
81−
82− with subtest("container shell works"):
83− machine.succeed("echo true | lxc exec machine /run/current-system/sw/bin/bash -")
84− machine.succeed("lxc exec machine /run/current-system/sw/bin/true")
85−
86− # with subtest("rebuilding works"):
87− # machine.succeed("lxc exec machine /run/current-system/sw/bin/nixos-rebuild switch")
88− '';
89−})
nixos/tests/lxd.nix+40−63
@@ -1,48 +1,18 @@
1−import ./make-test-python.nix ({ pkgs, ...} :
1+import ./make-test-python.nix ({ pkgs, lib, ... } :
2
2
3let
3let
4− # Since we don't have access to the internet during the tests, we have to
4+ lxd-image = import ../release.nix {
5− # pre-fetch lxd containers beforehand.
5+ configuration = {
6− #
6+ # Building documentation makes the test unnecessarily take a longer time:
7− # I've chosen to import Alpine Linux, because its image is turbo-tiny and,
7+ documentation.enable = lib.mkForce false;
8− # generally, sufficient for our tests.
9− alpine-meta = pkgs.fetchurl {
10− url = "https://tarballs.nixos.org/alpine/3.12/lxd.tar.xz";
11− hash = "sha256-1tcKaO9lOkvqfmG/7FMbfAEToAuFy2YMewS8ysBKuLA=";
12− };
13
8
14− alpine-rootfs = pkgs.fetchurl {
9+ # Our tests require `grep` & friends:
15− url = "https://tarballs.nixos.org/alpine/3.12/rootfs.tar.xz";
10+ environment.systemPackages = with pkgs; [ busybox ];
16− hash = "sha256-Tba9sSoaiMtQLY45u7p5DMqXTSDgs/763L/SQp0bkCA=";
11+ };
17 };
12 };
18
13
19− lxd-config = pkgs.writeText "config.yaml" ''
14+ lxd-image-metadata = lxd-image.lxdMeta.${pkgs.system};
20− storage_pools:
15+ lxd-image-rootfs = lxd-image.lxdImage.${pkgs.system};
21− - name: default
22− driver: dir
23− config:
24− source: /var/lxd-pool
25−
26− networks:
27− - name: lxdbr0
28− type: bridge
29− config:
30− ipv4.address: auto
31− ipv6.address: none
32−
33− profiles:
34− - name: default
35− devices:
36− eth0:
37− name: eth0
38− network: lxdbr0
39− type: nic
40− root:
41− path: /
42− pool: default
43− type: disk
44− '';
45−
46
16
47in {
17in {
48 name = "lxd";
18 name = "lxd";
@@ -53,6 +23,8 @@ in {
53
23
54 nodes.machine = { lib, ... }: {
24 nodes.machine = { lib, ... }: {
55 virtualisation = {
25 virtualisation = {
26+ diskSize = 2048;
27+
56 # Since we're testing `limits.cpu`, we've gotta have a known number of
28 # Since we're testing `limits.cpu`, we've gotta have a known number of
57 # cores to lean on
29 # cores to lean on
58 cores = 2;
30 cores = 2;
@@ -77,61 +49,66 @@ in {
77 machine.succeed("mkdir /var/lxd-pool")
49 machine.succeed("mkdir /var/lxd-pool")
78
50
79 machine.succeed(
51 machine.succeed(
80− "cat ${lxd-config} | lxd init --preseed"
52+ "cat ${./common/lxd/config.yaml} | lxd init --preseed"
81 )
53 )
82
54
83 machine.succeed(
55 machine.succeed(
84− "lxc image import ${alpine-meta} ${alpine-rootfs} --alias alpine"
56+ "lxc image import ${lxd-image-metadata}/*/*.tar.xz ${lxd-image-rootfs}/*/*.tar.xz --alias nixos"
85 )
57 )
86
58
87− with subtest("Containers can be launched and destroyed"):
59+ with subtest("Container can be managed"):
88− machine.succeed("lxc launch alpine test")
60+ machine.succeed("lxc launch nixos container")
89− machine.succeed("lxc exec test true")
61+ machine.sleep(5)
62+ machine.succeed("echo true | lxc exec container /run/current-system/sw/bin/bash -")
63+ machine.succeed("lxc exec container true")
90− machine.succeed("lxc delete -f test")
64+ machine.succeed("lxc delete -f container")
91
65
92− with subtest("Containers are being mounted with lxcfs inside"):
66+ with subtest("Container is mounted with lxcfs inside"):
93− machine.succeed("lxc launch alpine test")
67+ machine.succeed("lxc launch nixos container")
68+ machine.sleep(5)
94
69
95 ## ---------- ##
70 ## ---------- ##
96 ## limits.cpu ##
71 ## limits.cpu ##
97
72
98− machine.succeed("lxc config set test limits.cpu 1")
73+ machine.succeed("lxc config set container limits.cpu 1")
99− machine.succeed("lxc restart test")
74+ machine.succeed("lxc restart container")
75+ machine.sleep(5)
100
76
101− # Since Alpine doesn't have `nproc` pre-installed, we've gotta resort
102− # to the primal methods
103 assert (
77 assert (
104 "1"
78 "1"
105− == machine.succeed("lxc exec test grep -- -c ^processor /proc/cpuinfo").strip()
79+ == machine.succeed("lxc exec container grep -- -c ^processor /proc/cpuinfo").strip()
106 )
80 )
107
81
108− machine.succeed("lxc config set test limits.cpu 2")
82+ machine.succeed("lxc config set container limits.cpu 2")
109− machine.succeed("lxc restart test")
83+ machine.succeed("lxc restart container")
84+ machine.sleep(5)
110
85
111 assert (
86 assert (
112 "2"
87 "2"
113− == machine.succeed("lxc exec test grep -- -c ^processor /proc/cpuinfo").strip()
88+ == machine.succeed("lxc exec container grep -- -c ^processor /proc/cpuinfo").strip()
114 )
89 )
115
90
116 ## ------------- ##
91 ## ------------- ##
117 ## limits.memory ##
92 ## limits.memory ##
118
93
119− machine.succeed("lxc config set test limits.memory 64MB")
94+ machine.succeed("lxc config set container limits.memory 64MB")
120− machine.succeed("lxc restart test")
95+ machine.succeed("lxc restart container")
96+ machine.sleep(5)
121
97
122 assert (
98 assert (
123 "MemTotal: 62500 kB"
99 "MemTotal: 62500 kB"
124− == machine.succeed("lxc exec test grep -- MemTotal /proc/meminfo").strip()
100+ == machine.succeed("lxc exec container grep -- MemTotal /proc/meminfo").strip()
125 )
101 )
126
102
127− machine.succeed("lxc config set test limits.memory 128MB")
103+ machine.succeed("lxc config set container limits.memory 128MB")
128− machine.succeed("lxc restart test")
104+ machine.succeed("lxc restart container")
105+ machine.sleep(5)
129
106
130 assert (
107 assert (
131 "MemTotal: 125000 kB"
108 "MemTotal: 125000 kB"
132− == machine.succeed("lxc exec test grep -- MemTotal /proc/meminfo").strip()
109+ == machine.succeed("lxc exec container grep -- MemTotal /proc/meminfo").strip()
133 )
110 )
134
111
135− machine.succeed("lxc delete -f test")
112+ machine.succeed("lxc delete -f container")
136 '';
113 '';
137})
114})
nixos/tests/mailcatcher.nix+7−2
@@ -9,8 +9,13 @@ import ./make-test-python.nix ({ lib, ... }:
9 {
9 {
10 services.mailcatcher.enable = true;
10 services.mailcatcher.enable = true;
11
11
12+ programs.msmtp = {
12− services.ssmtp.enable = true;
13+ enable = true;
13− services.ssmtp.hostName = "localhost:1025";
14+ accounts.default = {
15+ host = "localhost";
16+ port = 1025;
17+ };
18+ };
14
19
15 environment.systemPackages = [ pkgs.mailutils ];
20 environment.systemPackages = [ pkgs.mailutils ];
16 };
21 };
nixos/tests/matrix-appservice-irc.nix+3
@@ -20,6 +20,9 @@ import ./make-test-python.nix ({ pkgs, ... }:
20
20
21 enable_registration = true;
21 enable_registration = true;
22
22
23+ # don't use this in production, always use some form of verification
24+ enable_registration_without_verification = true;
25+
23 listeners = [ {
26 listeners = [ {
24 # The default but tls=false
27 # The default but tls=false
25 bind_addresses = [
28 bind_addresses = [
nixos/tests/mongodb.nix+4
@@ -37,6 +37,8 @@ import ./make-test-python.nix ({ pkgs, ... }:
37 mongodb-3_6
37 mongodb-3_6
38 mongodb-4_0
38 mongodb-4_0
39 mongodb-4_2
39 mongodb-4_2
40+ mongodb-4_4
41+ mongodb-5_0
40 ];
42 ];
41 };
43 };
42 };
44 };
@@ -48,6 +50,8 @@ import ./make-test-python.nix ({ pkgs, ... }:
48 + runMongoDBTest pkgs.mongodb-3_6
50 + runMongoDBTest pkgs.mongodb-3_6
49 + runMongoDBTest pkgs.mongodb-4_0
51 + runMongoDBTest pkgs.mongodb-4_0
50 + runMongoDBTest pkgs.mongodb-4_2
52 + runMongoDBTest pkgs.mongodb-4_2
53+ + runMongoDBTest pkgs.mongodb-4_4
54+ + runMongoDBTest pkgs.mongodb-5_0
51 + ''
55 + ''
52 node.shutdown()
56 node.shutdown()
53 '';
57 '';
nixos/tests/nar-serve.nix+1−1
@@ -31,7 +31,7 @@ import ./make-test-python.nix (
31
31
32 # Create a fake cache with Nginx service the static files
32 # Create a fake cache with Nginx service the static files
33 server.succeed(
33 server.succeed(
34− "nix copy --to file:///var/www ${pkgs.hello}"
34+ "nix --experimental-features nix-command copy --to file:///var/www ${pkgs.hello}"
35 )
35 )
36 server.wait_for_unit("nginx.service")
36 server.wait_for_unit("nginx.service")
37 server.wait_for_open_port(80)
37 server.wait_for_open_port(80)
nixos/tests/nbd.nix+16
@@ -28,6 +28,11 @@ import ./make-test-python.nix ({ pkgs, ... }:
28 ## It's also a loopback device to test exporting /dev/...
28 ## It's also a loopback device to test exporting /dev/...
29 systemd.services.create-priv-file =
29 systemd.services.create-priv-file =
30 mkCreateSmallFileService { path = "/vault-priv.disk"; loop = true; };
30 mkCreateSmallFileService { path = "/vault-priv.disk"; loop = true; };
31+ ## `aaa.disk` is just here because "[aaa]" sorts before
32+ ## "[generic]" lexicographically, and nbd-server breaks if
33+ ## "[generic]" isn't the first section.
34+ systemd.services.create-aaa-file =
35+ mkCreateSmallFileService { path = "/aaa.disk"; };
31
36
32 # Needed only for nbd-client used in the tests.
37 # Needed only for nbd-client used in the tests.
33 environment.systemPackages = [ pkgs.nbd ];
38 environment.systemPackages = [ pkgs.nbd ];
@@ -39,6 +44,9 @@ import ./make-test-python.nix ({ pkgs, ... }:
39 services.nbd.server = {
44 services.nbd.server = {
40 enable = true;
45 enable = true;
41 exports = {
46 exports = {
47+ aaa = {
48+ path = "/aaa.disk";
49+ };
42 vault-pub = {
50 vault-pub = {
43 path = "/vault-pub.disk";
51 path = "/vault-pub.disk";
44 };
52 };
@@ -83,5 +91,13 @@ import ./make-test-python.nix ({ pkgs, ... }:
83 if foundString != testString:
91 if foundString != testString:
84 raise Exception(f"Read the wrong string from nbd disk. Expected: '{testString}'. Found: '{foundString}'")
92 raise Exception(f"Read the wrong string from nbd disk. Expected: '{testString}'. Found: '{foundString}'")
85 server.succeed("nbd-client -d /dev/nbd0")
93 server.succeed("nbd-client -d /dev/nbd0")
94+
95+ # Server: Successfully connect to the aaa disk
96+ server.succeed("nbd-client localhost ${toString listenPort} /dev/nbd0 -name aaa -persist")
97+ server.succeed(f"echo '{testString}' | dd of=/dev/nbd0 conv=notrunc")
98+ foundString = server.succeed(f"dd status=none if=/aaa.disk count={len(testString)}")[:len(testString)]
99+ if foundString != testString:
100+ raise Exception(f"Read the wrong string from nbd disk. Expected: '{testString}'. Found: '{foundString}'")
101+ server.succeed("nbd-client -d /dev/nbd0")
86 '';
102 '';
87 })
103 })
nixos/tests/ncdns.nix+6−9
@@ -29,10 +29,10 @@ in
29 };
29 };
30
30
31 nodes.server = { ... }: {
31 nodes.server = { ... }: {
32− networking.nameservers = [ "127.0.0.1" ];
32+ networking.nameservers = [ "::1" ];
33
33
34 services.namecoind.rpc = {
34 services.namecoind.rpc = {
35− address = "127.0.0.1";
35+ address = "::1";
36 user = "namecoin";
36 user = "namecoin";
37 password = "secret";
37 password = "secret";
38 port = 8332;
38 port = 8332;
@@ -45,7 +45,7 @@ in
45 script = ''
45 script = ''
46 while true; do
46 while true; do
47 echo -e "HTTP/1.1 200 OK\n\n $(<${fakeReply})\n" \
47 echo -e "HTTP/1.1 200 OK\n\n $(<${fakeReply})\n" \
48− | ${pkgs.netcat}/bin/nc -N -l 127.0.0.1 8332
48+ | ${pkgs.netcat}/bin/nc -N -l ::1 8332
49 done
49 done
50 '';
50 '';
51 };
51 };
@@ -58,14 +58,10 @@ in
58 identity.address = "1.0.0.1";
58 identity.address = "1.0.0.1";
59 };
59 };
60
60
61− services.pdns-recursor = {
61+ services.pdns-recursor.enable = true;
62− enable = true;
63− dns.allowFrom = [ "127.0.0.0/8" ];
64− resolveNamecoin = true;
62+ services.pdns-recursor.resolveNamecoin = true;
65− };
66
63
67 environment.systemPackages = [ pkgs.dnsutils ];
64 environment.systemPackages = [ pkgs.dnsutils ];
68−
69 };
65 };
70
66
71 testScript =
67 testScript =
@@ -91,6 +87,7 @@ in
91 assert "example.com" in server.succeed("dig SOA @localhost -p 5333 bit")
87 assert "example.com" in server.succeed("dig SOA @localhost -p 5333 bit")
92
88
93 with subtest("bit. zone forwarding works"):
89 with subtest("bit. zone forwarding works"):
90+ server.wait_for_unit("pdns-recursor")
94 assert "1.2.3.4" in server.succeed("host test.bit")
91 assert "1.2.3.4" in server.succeed("host test.bit")
95 '';
92 '';
96})
93})
nixos/tests/networking.nix+1−1
@@ -878,7 +878,7 @@ let
878 linkConfig.Name = "custom_name";
878 linkConfig.Name = "custom_name";
879 };
879 };
880 }
880 }
881− else { services.udev.initrdRules = ''
881+ else { boot.initrd.services.udev.rules = ''
882 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:12:01:01", KERNEL=="eth*", NAME="custom_name"
882 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:12:01:01", KERNEL=="eth*", NAME="custom_name"
883 '';
883 '';
884 });
884 });
nixos/tests/nextcloud/with-mysql-and-memcached.nix+1−22
@@ -26,6 +26,7 @@ in {
26 redis = false;
26 redis = false;
27 memcached = true;
27 memcached = true;
28 };
28 };
29+ database.createLocally = true;
29 config = {
30 config = {
30 dbtype = "mysql";
31 dbtype = "mysql";
31 dbname = "nextcloud";
32 dbname = "nextcloud";
@@ -38,28 +39,6 @@ in {
38 };
39 };
39 };
40 };
40
41
41− services.mysql = {
42− enable = true;
43− settings.mysqld = {
44− bind-address = "127.0.0.1";
45−
46− # FIXME(@Ma27) Nextcloud isn't compatible with mariadb 10.6,
47− # this is a workaround.
48− # See https://help.nextcloud.com/t/update-to-next-cloud-21-0-2-has-get-an-error/117028/22
49− innodb_read_only_compressed = 0;
50− };
51− package = pkgs.mariadb;
52−
53− initialScript = pkgs.writeText "mysql-init" ''
54− CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'hunter2';
55− CREATE DATABASE IF NOT EXISTS nextcloud;
56− GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER,
57− CREATE TEMPORARY TABLES ON nextcloud.* TO 'nextcloud'@'localhost'
58− IDENTIFIED BY 'hunter2';
59− FLUSH privileges;
60− '';
61− };
62−
63 systemd.services.nextcloud-setup= {
42 systemd.services.nextcloud-setup= {
64 requires = ["mysql.service"];
43 requires = ["mysql.service"];
65 after = ["mysql.service"];
44 after = ["mysql.service"];
nixos/tests/nixops/default.nix+1−1
@@ -97,7 +97,7 @@ let
97 derivations and all build dependency outputs, all the way down.
97 derivations and all build dependency outputs, all the way down.
98 */
98 */
99 allDrvOutputs = pkg:
99 allDrvOutputs = pkg:
100− let name = lib.strings.sanitizeDerivationName "allDrvOutputs-${pkg.pname or pkg.name or "unknown"}";
100+ let name = "allDrvOutputs-${pkg.pname or pkg.name or "unknown"}";
101 in
101 in
102 pkgs.runCommand name { refs = pkgs.writeReferencesToFile pkg.drvPath; } ''
102 pkgs.runCommand name { refs = pkgs.writeReferencesToFile pkg.drvPath; } ''
103 touch $out
103 touch $out
nixos/tests/openssh.nix+12−6
@@ -80,17 +80,21 @@ in {
80
80
81 client.wait_for_unit("network.target")
81 client.wait_for_unit("network.target")
82 client.succeed(
82 client.succeed(
83− "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server 'echo hello world' >&2"
83+ "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server 'echo hello world' >&2",
84+ timeout=30
84 )
85 )
85 client.succeed(
86 client.succeed(
86− "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server 'ulimit -l' | grep 1024"
87+ "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server 'ulimit -l' | grep 1024",
88+ timeout=30
87 )
89 )
88
90
89 client.succeed(
91 client.succeed(
90− "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server_lazy 'echo hello world' >&2"
92+ "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server_lazy 'echo hello world' >&2",
93+ timeout=30
91 )
94 )
92 client.succeed(
95 client.succeed(
93− "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server_lazy 'ulimit -l' | grep 1024"
96+ "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server_lazy 'ulimit -l' | grep 1024",
97+ timeout=30
94 )
98 )
95
99
96 with subtest("configured-authkey"):
100 with subtest("configured-authkey"):
@@ -99,10 +103,12 @@ in {
99 )
103 )
100 client.succeed("chmod 600 privkey.snakeoil")
104 client.succeed("chmod 600 privkey.snakeoil")
101 client.succeed(
105 client.succeed(
102− "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i privkey.snakeoil server true"
106+ "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i privkey.snakeoil server true",
107+ timeout=30
103 )
108 )
104 client.succeed(
109 client.succeed(
105− "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i privkey.snakeoil server_lazy true"
110+ "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i privkey.snakeoil server_lazy true",
111+ timeout=30
106 )
112 )
107
113
108 with subtest("localhost-only"):
114 with subtest("localhost-only"):
nixos/tests/pam/pam-oath-login.nix+1−1
@@ -7,7 +7,7 @@ let
7 # how many passwords have been made. In this env, we'll always be on
7 # how many passwords have been made. In this env, we'll always be on
8 # the 0th counter, so the password is static.
8 # the 0th counter, so the password is static.
9 #
9 #
10− # Generated in nix-shell -p oathToolkit
10+ # Generated in nix-shell -p oath-toolkit
11 # via: oathtool -v -d6 -w10 cdd4083ef8ff1fa9178c6d46bfb1a3
11 # via: oathtool -v -d6 -w10 cdd4083ef8ff1fa9178c6d46bfb1a3
12 # and picking a the first 4:
12 # and picking a the first 4:
13 oathSnakeOilPassword1 = "143349";
13 oathSnakeOilPassword1 = "143349";
nixos/tests/pam/pam-ussh.nixnew file+70
@@ -0,0 +1,70 @@
1+import ../make-test-python.nix ({ pkgs, lib, ... }:
2+
3+let
4+ testOnlySSHCredentials = pkgs.runCommand "pam-ussh-test-ca" {
5+ nativeBuildInputs = [ pkgs.openssh ];
6+ } ''
7+ mkdir $out
8+ ssh-keygen -t ed25519 -N "" -f $out/ca
9+
10+ ssh-keygen -t ed25519 -N "" -f $out/alice
11+ ssh-keygen -s $out/ca -I "alice user key" -n "alice,root" -V 19700101:forever $out/alice.pub
12+
13+ ssh-keygen -t ed25519 -N "" -f $out/bob
14+ ssh-keygen -s $out/ca -I "bob user key" -n "bob" -V 19700101:forever $out/bob.pub
15+ '';
16+ makeTestScript = user: pkgs.writeShellScript "pam-ussh-${user}-test-script" ''
17+ set -euo pipefail
18+
19+ eval $(${pkgs.openssh}/bin/ssh-agent)
20+
21+ mkdir -p $HOME/.ssh
22+ chmod 700 $HOME/.ssh
23+ cp ${testOnlySSHCredentials}/${user}{,.pub,-cert.pub} $HOME/.ssh
24+ chmod 600 $HOME/.ssh/${user}
25+ chmod 644 $HOME/.ssh/${user}{,-cert}.pub
26+
27+ set -x
28+
29+ ${pkgs.openssh}/bin/ssh-add $HOME/.ssh/${user}
30+ ${pkgs.openssh}/bin/ssh-add -l &>2
31+
32+ exec sudo id -u -n
33+ '';
34+in {
35+ name = "pam-ussh";
36+ meta.maintainers = with lib.maintainers; [ lukegb ];
37+
38+ machine =
39+ { ... }:
40+ {
41+ users.users.alice = { isNormalUser = true; extraGroups = [ "wheel" ]; };
42+ users.users.bob = { isNormalUser = true; extraGroups = [ "wheel" ]; };
43+
44+ security.pam.ussh = {
45+ enable = true;
46+ authorizedPrincipals = "root";
47+ caFile = "${testOnlySSHCredentials}/ca.pub";
48+ };
49+
50+ security.sudo = {
51+ enable = true;
52+ extraConfig = ''
53+ Defaults lecture="never"
54+ '';
55+ };
56+ };
57+
58+ testScript =
59+ ''
60+ with subtest("alice should be allowed to escalate to root"):
61+ machine.succeed(
62+ 'su -c "${makeTestScript "alice"}" -l alice | grep root'
63+ )
64+
65+ with subtest("bob should not be allowed to escalate to root"):
66+ machine.fail(
67+ 'su -c "${makeTestScript "bob"}" -l bob | grep root'
68+ )
69+ '';
70+})
nixos/tests/paperless-ng.nix → nixos/tests/paperless.nixrenamed+11−12
@@ -1,30 +1,32 @@
1import ./make-test-python.nix ({ lib, ... }: {
1import ./make-test-python.nix ({ lib, ... }: {
2− name = "paperless-ng";
2+ name = "paperless";
3 meta.maintainers = with lib.maintainers; [ earvstedt Flakebi ];
3 meta.maintainers = with lib.maintainers; [ earvstedt Flakebi ];
4
4
5 nodes.machine = { pkgs, ... }: {
5 nodes.machine = { pkgs, ... }: {
6 environment.systemPackages = with pkgs; [ imagemagick jq ];
6 environment.systemPackages = with pkgs; [ imagemagick jq ];
7− services.paperless-ng = {
7+ services.paperless = {
8 enable = true;
8 enable = true;
9 passwordFile = builtins.toFile "password" "admin";
9 passwordFile = builtins.toFile "password" "admin";
10 };
10 };
11 };
11 };
12
12
13 testScript = ''
13 testScript = ''
14− machine.wait_for_unit("paperless-ng-consumer.service")
14+ import json
15
15
16− with subtest("Create test doc"):
16+ machine.wait_for_unit("paperless-consumer.service")
17+
18+ with subtest("Add a document via the file system"):
17 machine.succeed(
19 machine.succeed(
18 "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black "
20 "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black "
19 "-annotate +5+20 'hello world 16-10-2005' /var/lib/paperless/consume/doc.png"
21 "-annotate +5+20 'hello world 16-10-2005' /var/lib/paperless/consume/doc.png"
20 )
22 )
21
23
22 with subtest("Web interface gets ready"):
24 with subtest("Web interface gets ready"):
23− machine.wait_for_unit("paperless-ng-web.service")
25+ machine.wait_for_unit("paperless-web.service")
24 # Wait until server accepts connections
26 # Wait until server accepts connections
25 machine.wait_until_succeeds("curl -fs localhost:28981")
27 machine.wait_until_succeeds("curl -fs localhost:28981")
26
28
27− with subtest("Create web test doc"):
29+ with subtest("Add a document via the web interface"):
28 machine.succeed(
30 machine.succeed(
29 "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black "
31 "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black "
30 "-annotate +5+20 'hello web 16-10-2005' /tmp/webdoc.png"
32 "-annotate +5+20 'hello web 16-10-2005' /tmp/webdoc.png"
@@ -35,11 +37,8 @@ import ./make-test-python.nix ({ lib, ... }: {
35 machine.wait_until_succeeds(
37 machine.wait_until_succeeds(
36 "(($(curl -u admin:admin -fs localhost:28981/api/documents/ | jq .count) == 2))"
38 "(($(curl -u admin:admin -fs localhost:28981/api/documents/ | jq .count) == 2))"
37 )
39 )
38− assert "2005-10-16" in machine.succeed(
39− "curl -u admin:admin -fs localhost:28981/api/documents/ | jq '.results | .[0] | .created'"
40+ docs = json.loads(machine.succeed("curl -u admin:admin -fs localhost:28981/api/documents/"))['results']
40− )
41+ assert "2005-10-16" in docs[0]['created']
41− assert "2005-10-16" in machine.succeed(
42+ assert "2005-10-16" in docs[1]['created']
42− "curl -u admin:admin -fs localhost:28981/api/documents/ | jq '.results | .[1] | .created'"
43− )
44 '';
43 '';
45})
44})
nixos/tests/pdns-recursor.nix+4−1
@@ -1,12 +1,15 @@
1import ./make-test-python.nix ({ pkgs, ... }: {
1import ./make-test-python.nix ({ pkgs, ... }: {
2− name = "powerdns";
2+ name = "powerdns-recursor";
3
3
4 nodes.server = { ... }: {
4 nodes.server = { ... }: {
5 services.pdns-recursor.enable = true;
5 services.pdns-recursor.enable = true;
6+ services.pdns-recursor.exportHosts= true;
7+ networking.hosts."192.0.2.1" = [ "example.com" ];
6 };
8 };
7
9
8 testScript = ''
10 testScript = ''
9 server.wait_for_unit("pdns-recursor")
11 server.wait_for_unit("pdns-recursor")
10 server.wait_for_open_port("53")
12 server.wait_for_open_port("53")
13+ assert "192.0.2.1" in server.succeed("host example.com localhost")
11 '';
14 '';
12})
15})
nixos/tests/pgadmin4.nix+37−47
@@ -1,52 +1,27 @@
1−import ./make-test-python.nix ({ pkgs, lib, ... }:
1+import ./make-test-python.nix ({ pkgs, lib, buildDeps ? [ ], pythonEnv ? [ ], ... }:
2+
3+ /*
4+ This test suite replaces the typical pytestCheckHook function in python
5+ packages. Pgadmin4 test suite needs a running and configured postgresql
6+ server. This is why this test exists.
7+
8+ To not repeat all the python dependencies needed, this test is called directly
9+ from the pgadmin4 derivation, which also passes the currently
10+ used propagatedBuildInputs and any python overrides.
11+
12+ Unfortunately, there doesn't seem to be an easy way to otherwise include
13+ the needed packages here.
14+
15+ Due the the needed parameters a direct call to "nixosTests.pgadmin4" fails
16+ and needs to be called as "pgadmin4.tests"
17+
18+ */
2
19
3 let
20 let
4 pgadmin4SrcDir = "/pgadmin";
21 pgadmin4SrcDir = "/pgadmin";
5 pgadmin4Dir = "/var/lib/pgadmin";
22 pgadmin4Dir = "/var/lib/pgadmin";
6 pgadmin4LogDir = "/var/log/pgadmin";
23 pgadmin4LogDir = "/var/log/pgadmin";
7
24
8− python-with-needed-packages = pkgs.python3.withPackages (ps: with ps; [
9− selenium
10− testtools
11− testscenarios
12− flask
13− flask-babelex
14− flask-babel
15− flask-gravatar
16− flask_login
17− flask_mail
18− flask_migrate
19− flask_sqlalchemy
20− flask_wtf
21− flask-compress
22− passlib
23− pytz
24− simplejson
25− six
26− sqlparse
27− wtforms
28− flask-paranoid
29− psutil
30− psycopg2
31− python-dateutil
32− sqlalchemy
33− itsdangerous
34− flask-security-too
35− bcrypt
36− cryptography
37− sshtunnel
38− ldap3
39− gssapi
40− flask-socketio
41− eventlet
42− httpagentparser
43− user-agents
44− wheel
45− authlib
46− qrcode
47− pillow
48− pyotp
49− ]);
50 in
25 in
51 {
26 {
52 name = "pgadmin4";
27 name = "pgadmin4";
@@ -54,12 +29,27 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
54
29
55 nodes.machine = { pkgs, ... }: {
30 nodes.machine = { pkgs, ... }: {
56 imports = [ ./common/x11.nix ];
31 imports = [ ./common/x11.nix ];
32+ # needed because pgadmin 6.8 will fail, if those dependencies get updated
33+ nixpkgs.overlays = [
34+ (self: super: {
35+ pythonPackages = pythonEnv;
36+ })
37+ ];
38+
57 environment.systemPackages = with pkgs; [
39 environment.systemPackages = with pkgs; [
58 pgadmin4
40 pgadmin4
59 postgresql
41 postgresql
60− python-with-needed-packages
61 chromedriver
42 chromedriver
62 chromium
43 chromium
44+ # include the same packages as in pgadmin minus speaklater3
45+ (python3.withPackages
46+ (ps: buildDeps ++
47+ [
48+ # test suite package requirements
49+ pythonPackages.testscenarios
50+ pythonPackages.selenium
51+ ])
52+ )
63 ];
53 ];
64 services.postgresql = {
54 services.postgresql = {
65 enable = true;
55 enable = true;
@@ -120,7 +110,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
120 with subtest("run browser test"):
110 with subtest("run browser test"):
121 machine.succeed(
111 machine.succeed(
122 'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
112 'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
123− && ${python-with-needed-packages.interpreter} regression/runtests.py --pkg browser --exclude \
113+ && python regression/runtests.py --pkg browser --exclude \
124 browser.tests.test_ldap_login.LDAPLoginTestCase,browser.tests.test_ldap_login'
114 browser.tests.test_ldap_login.LDAPLoginTestCase,browser.tests.test_ldap_login'
125 )
115 )
126
116
@@ -130,13 +120,13 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
130 machine.succeed(
120 machine.succeed(
131 'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
121 'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
132 && export FONTCONFIG_FILE=${pkgs.makeFontsConf { fontDirectories = [];}} \
122 && export FONTCONFIG_FILE=${pkgs.makeFontsConf { fontDirectories = [];}} \
133− && ${python-with-needed-packages.interpreter} regression/runtests.py --pkg feature_tests'
123+ && python regression/runtests.py --pkg feature_tests'
134 )
124 )
135
125
136 with subtest("run resql test"):
126 with subtest("run resql test"):
137 machine.succeed(
127 machine.succeed(
138 'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
128 'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
139− && ${python-with-needed-packages.interpreter} regression/runtests.py --pkg resql'
129+ && python regression/runtests.py --pkg resql'
140 )
130 )
141 '';
131 '';
142 })
132 })
nixos/tests/snapcast.nix+1
@@ -19,6 +19,7 @@ in {
19 port = port;
19 port = port;
20 tcp.port = tcpPort;
20 tcp.port = tcpPort;
21 http.port = httpPort;
21 http.port = httpPort;
22+ openFirewall = true;
22 buffer = bufferSize;
23 buffer = bufferSize;
23 streams = {
24 streams = {
24 mpd = {
25 mpd = {
nixos/tests/step-ca.nix+1
@@ -9,6 +9,7 @@ import ./make-test-python.nix ({ pkgs, ... }:
9 '';
9 '';
10 in
10 in
11 {
11 {
12+ name = "step-ca";
12 nodes =
13 nodes =
13 {
14 {
14 caserver =
15 caserver =
nixos/tests/systemd-initrd-btrfs-raid.nixnew file+45
@@ -0,0 +1,45 @@
1+import ./make-test-python.nix ({ lib, pkgs, ... }: {
2+ name = "systemd-initrd-btrfs-raid";
3+
4+ nodes.machine = { pkgs, ... }: {
5+ # Use systemd-boot
6+ virtualisation = {
7+ emptyDiskImages = [ 512 512 ];
8+ useBootLoader = true;
9+ useEFIBoot = true;
10+ };
11+ boot.loader.systemd-boot.enable = true;
12+ boot.loader.efi.canTouchEfiVariables = true;
13+
14+ environment.systemPackages = with pkgs; [ btrfs-progs ];
15+ boot.initrd.systemd = {
16+ enable = true;
17+ emergencyAccess = true;
18+ };
19+
20+ specialisation.boot-btrfs-raid.configuration = {
21+ fileSystems = lib.mkVMOverride {
22+ "/".fsType = lib.mkForce "btrfs";
23+ };
24+ virtualisation.bootDevice = "/dev/vdc";
25+ };
26+ };
27+
28+ testScript = ''
29+ # Create RAID
30+ machine.succeed("mkfs.btrfs -d raid0 /dev/vdc /dev/vdd")
31+ machine.succeed("mkdir -p /mnt && mount /dev/vdc /mnt && echo hello > /mnt/test && umount /mnt")
32+
33+ # Boot from the RAID
34+ machine.succeed("bootctl set-default nixos-generation-1-specialisation-boot-btrfs-raid.conf")
35+ machine.succeed("sync")
36+ machine.crash()
37+ machine.wait_for_unit("multi-user.target")
38+
39+ # Ensure we have successfully booted from the RAID
40+ assert "(initrd)" in machine.succeed("systemd-analyze") # booted with systemd in stage 1
41+ assert "/dev/vdc on / type btrfs" in machine.succeed("mount")
42+ assert "hello" in machine.succeed("cat /test")
43+ assert "Total devices 2" in machine.succeed("btrfs filesystem show")
44+ '';
45+})
nixos/tests/systemd-initrd-luks-keyfile.nixnew file+53
@@ -0,0 +1,53 @@
1+import ./make-test-python.nix ({ lib, pkgs, ... }: let
2+
3+ keyfile = pkgs.writeText "luks-keyfile" ''
4+ MIGHAoGBAJ4rGTSo/ldyjQypd0kuS7k2OSsmQYzMH6TNj3nQ/vIUjDn7fqa3slt2
5+ gV6EK3TmTbGc4tzC1v4SWx2m+2Bjdtn4Fs4wiBwn1lbRdC6i5ZYCqasTWIntWn+6
6+ FllUkMD5oqjOR/YcboxG8Z3B5sJuvTP9llsF+gnuveWih9dpbBr7AgEC
7+ '';
8+
9+in {
10+ name = "systemd-initrd-luks-keyfile";
11+
12+ nodes.machine = { pkgs, ... }: {
13+ # Use systemd-boot
14+ virtualisation = {
15+ emptyDiskImages = [ 512 ];
16+ useBootLoader = true;
17+ useEFIBoot = true;
18+ };
19+ boot.loader.systemd-boot.enable = true;
20+
21+ environment.systemPackages = with pkgs; [ cryptsetup ];
22+ boot.initrd.systemd = {
23+ enable = true;
24+ emergencyAccess = true;
25+ };
26+
27+ specialisation.boot-luks.configuration = {
28+ boot.initrd.luks.devices = lib.mkVMOverride {
29+ cryptroot = {
30+ device = "/dev/vdc";
31+ keyFile = "/etc/cryptroot.key";
32+ };
33+ };
34+ virtualisation.bootDevice = "/dev/mapper/cryptroot";
35+ boot.initrd.secrets."/etc/cryptroot.key" = keyfile;
36+ };
37+ };
38+
39+ testScript = ''
40+ # Create encrypted volume
41+ machine.wait_for_unit("multi-user.target")
42+ machine.succeed("cryptsetup luksFormat -q --iter-time=1 -d ${keyfile} /dev/vdc")
43+
44+ # Boot from the encrypted disk
45+ machine.succeed("bootctl set-default nixos-generation-1-specialisation-boot-luks.conf")
46+ machine.succeed("sync")
47+ machine.crash()
48+
49+ # Boot and decrypt the disk
50+ machine.wait_for_unit("multi-user.target")
51+ assert "/dev/mapper/cryptroot on / type ext4" in machine.succeed("mount")
52+ '';
53+})
nixos/tests/systemd-initrd-luks-password.nixnew file+48
@@ -0,0 +1,48 @@
1+import ./make-test-python.nix ({ lib, pkgs, ... }: {
2+ name = "systemd-initrd-luks-password";
3+
4+ nodes.machine = { pkgs, ... }: {
5+ # Use systemd-boot
6+ virtualisation = {
7+ emptyDiskImages = [ 512 512 ];
8+ useBootLoader = true;
9+ useEFIBoot = true;
10+ };
11+ boot.loader.systemd-boot.enable = true;
12+
13+ environment.systemPackages = with pkgs; [ cryptsetup ];
14+ boot.initrd.systemd = {
15+ enable = true;
16+ emergencyAccess = true;
17+ };
18+
19+ specialisation.boot-luks.configuration = {
20+ boot.initrd.luks.devices = lib.mkVMOverride {
21+ # We have two disks and only type one password - key reuse is in place
22+ cryptroot.device = "/dev/vdc";
23+ cryptroot2.device = "/dev/vdd";
24+ };
25+ virtualisation.bootDevice = "/dev/mapper/cryptroot";
26+ };
27+ };
28+
29+ testScript = ''
30+ # Create encrypted volume
31+ machine.wait_for_unit("multi-user.target")
32+ machine.succeed("echo -n supersecret | cryptsetup luksFormat -q --iter-time=1 /dev/vdc -")
33+ machine.succeed("echo -n supersecret | cryptsetup luksFormat -q --iter-time=1 /dev/vdd -")
34+
35+ # Boot from the encrypted disk
36+ machine.succeed("bootctl set-default nixos-generation-1-specialisation-boot-luks.conf")
37+ machine.succeed("sync")
38+ machine.crash()
39+
40+ # Boot and decrypt the disk
41+ machine.start()
42+ machine.wait_for_console_text("Please enter passphrase for disk cryptroot")
43+ machine.send_console("supersecret\n")
44+ machine.wait_for_unit("multi-user.target")
45+
46+ assert "/dev/mapper/cryptroot on / type ext4" in machine.succeed("mount")
47+ '';
48+})
nixos/tests/systemd-initrd-simple.nixnew file+44
@@ -0,0 +1,44 @@
1+import ./make-test-python.nix ({ lib, pkgs, ... }: {
2+ name = "systemd-initrd-simple";
3+
4+ nodes.machine = { pkgs, ... }: {
5+ boot.initrd.systemd = {
6+ enable = true;
7+ emergencyAccess = true;
8+ };
9+ fileSystems = lib.mkVMOverride {
10+ "/".autoResize = true;
11+ };
12+ };
13+
14+ testScript = ''
15+ import subprocess
16+
17+ with subtest("handover to stage-2 systemd works"):
18+ machine.wait_for_unit("multi-user.target")
19+ machine.succeed("systemd-analyze | grep -q '(initrd)'") # direct handover
20+ machine.succeed("touch /testfile") # / is writable
21+ machine.fail("touch /nix/store/testfile") # /nix/store is not writable
22+ # Special filesystems are mounted by systemd
23+ machine.succeed("[ -e /run/booted-system ]") # /run
24+ machine.succeed("[ -e /sys/class ]") # /sys
25+ machine.succeed("[ -e /dev/null ]") # /dev
26+ machine.succeed("[ -e /proc/1 ]") # /proc
27+ # stage-2-init mounted more special filesystems
28+ machine.succeed("[ -e /dev/shm ]") # /dev/shm
29+ machine.succeed("[ -e /dev/pts/ptmx ]") # /dev/pts
30+ machine.succeed("[ -e /run/keys ]") # /run/keys
31+
32+
33+ with subtest("growfs works"):
34+ oldAvail = machine.succeed("df --output=avail / | sed 1d")
35+ machine.shutdown()
36+
37+ subprocess.check_call(["qemu-img", "resize", "vm-state-machine/machine.qcow2", "+1G"])
38+
39+ machine.start()
40+ newAvail = machine.succeed("df --output=avail / | sed 1d")
41+
42+ assert int(oldAvail) < int(newAvail), "File system did not grow"
43+ '';
44+})
nixos/tests/systemd-initrd-swraid.nixnew file+50
@@ -0,0 +1,50 @@
1+import ./make-test-python.nix ({ lib, pkgs, ... }: {
2+ name = "systemd-initrd-swraid";
3+
4+ nodes.machine = { pkgs, ... }: {
5+ # Use systemd-boot
6+ virtualisation = {
7+ emptyDiskImages = [ 512 512 ];
8+ useBootLoader = true;
9+ useEFIBoot = true;
10+ };
11+ boot.loader.systemd-boot.enable = true;
12+ boot.loader.efi.canTouchEfiVariables = true;
13+
14+ environment.systemPackages = with pkgs; [ mdadm e2fsprogs ]; # for mdadm and mkfs.ext4
15+ boot.initrd = {
16+ systemd = {
17+ enable = true;
18+ emergencyAccess = true;
19+ };
20+ services.swraid = {
21+ enable = true;
22+ mdadmConf = ''
23+ ARRAY /dev/md0 devices=/dev/vdc,/dev/vdd
24+ '';
25+ };
26+ kernelModules = [ "raid0" ];
27+ };
28+
29+ specialisation.boot-swraid.configuration.virtualisation.bootDevice = "/dev/disk/by-label/testraid";
30+ };
31+
32+ testScript = ''
33+ # Create RAID
34+ machine.succeed("mdadm --create --force /dev/md0 -n 2 --level=raid0 /dev/vdc /dev/vdd")
35+ machine.succeed("mkfs.ext4 -L testraid /dev/md0")
36+ machine.succeed("mkdir -p /mnt && mount /dev/md0 /mnt && echo hello > /mnt/test && umount /mnt")
37+
38+ # Boot from the RAID
39+ machine.succeed("bootctl set-default nixos-generation-1-specialisation-boot-swraid.conf")
40+ machine.succeed("sync")
41+ machine.crash()
42+ machine.wait_for_unit("multi-user.target")
43+
44+ # Ensure we have successfully booted from the RAID
45+ assert "(initrd)" in machine.succeed("systemd-analyze") # booted with systemd in stage 1
46+ assert "/dev/md0 on / type ext4" in machine.succeed("mount")
47+ assert "hello" in machine.succeed("cat /test")
48+ assert "md0" in machine.succeed("cat /proc/mdstat")
49+ '';
50+})
nixos/tests/systemd-networkd.nix+10
@@ -8,6 +8,9 @@ let generateNodeConf = { lib, pkgs, config, privk, pubk, peerId, nodeId, ...}: {
8 environment.systemPackages = with pkgs; [ wireguard-tools ];
8 environment.systemPackages = with pkgs; [ wireguard-tools ];
9 systemd.network = {
9 systemd.network = {
10 enable = true;
10 enable = true;
11+ config = {
12+ routeTables.custom = 23;
13+ };
11 netdevs = {
14 netdevs = {
12 "90-wg0" = {
15 "90-wg0" = {
13 netdevConfig = { Kind = "wireguard"; Name = "wg0"; };
16 netdevConfig = { Kind = "wireguard"; Name = "wg0"; };
@@ -39,6 +42,7 @@ let generateNodeConf = { lib, pkgs, config, privk, pubk, peerId, nodeId, ...}: {
39 address = [ "10.0.0.${nodeId}/32" ];
42 address = [ "10.0.0.${nodeId}/32" ];
40 routes = [
43 routes = [
41 { routeConfig = { Gateway = "10.0.0.${nodeId}"; Destination = "10.0.0.0/24"; }; }
44 { routeConfig = { Gateway = "10.0.0.${nodeId}"; Destination = "10.0.0.0/24"; }; }
45+ { routeConfig = { Gateway = "10.0.0.${nodeId}"; Destination = "10.0.0.0/24"; Table = "custom"; }; }
42 ];
46 ];
43 };
47 };
44 "30-eth1" = {
48 "30-eth1" = {
@@ -87,6 +91,12 @@ testScript = ''
87 node1.wait_for_unit("systemd-networkd-wait-online.service")
91 node1.wait_for_unit("systemd-networkd-wait-online.service")
88 node2.wait_for_unit("systemd-networkd-wait-online.service")
92 node2.wait_for_unit("systemd-networkd-wait-online.service")
89
93
94+ # ================================
95+ # Networkd Config
96+ # ================================
97+ node1.succeed("grep RouteTable=custom:23 /etc/systemd/networkd.conf")
98+ node1.succeed("sudo ip route show table custom | grep '10.0.0.0/24 via 10.0.0.1 dev wg0 proto static'")
99+
90 # ================================
100 # ================================
91 # Wireguard
101 # Wireguard
92 # ================================
102 # ================================
nixos/tests/systemd-shutdown.nixnew file+26
@@ -0,0 +1,26 @@
1+import ./make-test-python.nix ({ pkgs, systemdStage1 ? false, ...} : let
2+ msg = "Shutting down NixOS";
3+in {
4+ name = "systemd-shutdown";
5+ meta = with pkgs.lib.maintainers; {
6+ maintainers = [ das_j ];
7+ };
8+
9+ nodes.machine = {
10+ imports = [ ../modules/profiles/minimal.nix ];
11+ systemd.shutdownRamfs.contents."/etc/systemd/system-shutdown/shutdown-message".source = pkgs.writeShellScript "shutdown-message" ''
12+ echo "${msg}"
13+ '';
14+ };
15+
16+ testScript = ''
17+ machine.wait_for_unit("multi-user.target")
18+ # .shutdown() would wait for the machine to power off
19+ machine.succeed("systemctl poweroff")
20+ # Message printed by systemd-shutdown
21+ machine.wait_for_console_text("Unmounting '/oldroot'")
22+ machine.wait_for_console_text("${msg}")
23+ # Don't try to sync filesystems
24+ machine.booted = False
25+ '';
26+})
nixos/tests/taskserver.nix+1
@@ -63,6 +63,7 @@ in {
63 server = {
63 server = {
64 services.taskserver.enable = true;
64 services.taskserver.enable = true;
65 services.taskserver.listenHost = "::";
65 services.taskserver.listenHost = "::";
66+ services.taskserver.openFirewall = true;
66 services.taskserver.fqdn = "server";
67 services.taskserver.fqdn = "server";
67 services.taskserver.organisations = {
68 services.taskserver.organisations = {
68 testOrganisation.users = [ "alice" "foo" ];
69 testOrganisation.users = [ "alice" "foo" ];
nixos/tests/vaultwarden.nix−1
@@ -113,7 +113,6 @@ let
113 driver.find_element_by_css_selector('input#masterPasswordRetype').send_keys(
113 driver.find_element_by_css_selector('input#masterPasswordRetype').send_keys(
114 '${userPassword}'
114 '${userPassword}'
115 )
115 )
116− driver.find_element_by_css_selector('input#acceptPolicies').click()
117
116
118 driver.find_element_by_xpath("//button[contains(., 'Submit')]").click()
117 driver.find_element_by_xpath("//button[contains(., 'Submit')]").click()
119
118
nixos/tests/web-apps/netbox.nix+1−1
@@ -5,7 +5,7 @@ import ../make-test-python.nix ({ lib, pkgs, ... }: {
5 maintainers = [ n0emis ];
5 maintainers = [ n0emis ];
6 };
6 };
7
7
8− machine = { ... }: {
8+ nodes.machine = { ... }: {
9 services.netbox = {
9 services.netbox = {
10 enable = true;
10 enable = true;
11 secretKeyFile = pkgs.writeText "secret" ''
11 secretKeyFile = pkgs.writeText "secret" ''
nixos/tests/web-apps/nifi.nixnew file+30
@@ -0,0 +1,30 @@
1+import ../make-test-python.nix ({pkgs, ...}:
2+{
3+ name = "nifi";
4+ meta.maintainers = with pkgs.lib.maintainers; [ izorkin ];
5+
6+ nodes = {
7+ nifi = { pkgs, ... }: {
8+ virtualisation = {
9+ memorySize = 2048;
10+ diskSize = 4096;
11+ };
12+ services.nifi = {
13+ enable = true;
14+ enableHTTPS = false;
15+ };
16+ };
17+ };
18+
19+ testScript = ''
20+ nifi.start()
21+
22+ nifi.wait_for_unit("nifi.service")
23+ nifi.wait_for_open_port(8080)
24+
25+ # Check if NiFi is running
26+ nifi.succeed("curl --fail http://127.0.0.1:8080/nifi/login 2> /dev/null | grep 'NiFi Login'")
27+
28+ nifi.shutdown()
29+ '';
30+})
nixos/tests/web-apps/peertube.nix+3−2
@@ -30,10 +30,11 @@ import ../make-test-python.nix ({pkgs, ...}:
30 '';
30 '';
31 };
31 };
32
32
33− services.redis = {
33+ services.redis.servers.peertube = {
34 enable = true;
34 enable = true;
35 bind = "0.0.0.0";
35 bind = "0.0.0.0";
36 requirePass = "turrQfaQwnanGbcsdhxy";
36 requirePass = "turrQfaQwnanGbcsdhxy";
37+ port = 6379;
37 };
38 };
38 };
39 };
39
40
@@ -109,7 +110,7 @@ import ../make-test-python.nix ({pkgs, ...}:
109 start_all()
110 start_all()
110
111
111 database.wait_for_unit("postgresql.service")
112 database.wait_for_unit("postgresql.service")
112− database.wait_for_unit("redis.service")
113+ database.wait_for_unit("redis-peertube.service")
113
114
114 database.wait_for_open_port(5432)
115 database.wait_for_open_port(5432)
115 database.wait_for_open_port(6379)
116 database.wait_for_open_port(6379)
nixos/tests/xmonad-xdg-autostart.nixnew file+35
@@ -0,0 +1,35 @@
1+import ./make-test-python.nix ({ lib, ... }: {
2+ name = "xmonad-xdg-autostart";
3+ meta.maintainers = with lib.maintainers; [ oxalica ];
4+
5+ nodes.machine = { pkgs, config, ... }: {
6+ imports = [ ./common/x11.nix ./common/user-account.nix ];
7+ test-support.displayManager.auto.user = "alice";
8+ services.xserver.displayManager.defaultSession = "none+xmonad";
9+ services.xserver.windowManager.xmonad.enable = true;
10+ services.xserver.desktopManager.runXdgAutostartIfNone = true;
11+
12+ environment.systemPackages = [
13+ (pkgs.writeTextFile {
14+ name = "test-xdg-autostart";
15+ destination = "/etc/xdg/autostart/test-xdg-autostart.desktop";
16+ text = ''
17+ [Desktop Entry]
18+ Name=test-xdg-autoatart
19+ Type=Application
20+ Terminal=false
21+ Exec=${pkgs.coreutils}/bin/touch ${config.users.users.alice.home}/xdg-autostart-executed
22+ '';
23+ })
24+ ];
25+ };
26+
27+ testScript = { nodes, ... }:
28+ let
29+ user = nodes.machine.config.users.users.alice;
30+ in
31+ ''
32+ machine.wait_for_x()
33+ machine.wait_for_file("${user.home}/xdg-autostart-executed")
34+ '';
35+})
nixos/tests/xmpp/xmpp-sendmessage.nix+1−4
@@ -51,11 +51,8 @@ class CthonTest(ClientXMPP):
51 log.info('Message sent')
51 log.info('Message sent')
52
52
53 # Test http upload (XEP_0363)
53 # Test http upload (XEP_0363)
54− def timeout_callback(arg):
55− log.error("ERROR: Cannot upload file. XEP_0363 seems broken")
56− sys.exit(1)
57 try:
54 try:
58− url = await self['xep_0363'].upload_file("${dummyFile}",timeout=10, timeout_callback=timeout_callback)
55+ url = await self['xep_0363'].upload_file("${dummyFile}",timeout=10)
59 except:
56 except:
60 log.error("ERROR: Cannot run upload command. XEP_0363 seems broken")
57 log.error("ERROR: Cannot run upload command. XEP_0363 seems broken")
61 sys.exit(1)
58 sys.exit(1)
nixos/tests/zfs.nix+50
@@ -127,4 +127,54 @@ in {
127 };
127 };
128
128
129 installer = (import ./installer.nix { }).zfsroot;
129 installer = (import ./installer.nix { }).zfsroot;
130+
131+ expand-partitions = makeTest {
132+ name = "multi-disk-zfs";
133+ nodes = {
134+ machine = { pkgs, ... }: {
135+ environment.systemPackages = [ pkgs.parted ];
136+ boot.supportedFilesystems = [ "zfs" ];
137+ networking.hostId = "00000000";
138+
139+ virtualisation = {
140+ emptyDiskImages = [ 20480 20480 20480 20480 20480 20480 ];
141+ };
142+
143+ specialisation.resize.configuration = {
144+ services.zfs.expandOnBoot = [ "tank" ];
145+ };
146+ };
147+ };
148+
149+ testScript = { nodes, ... }:
150+ ''
151+ start_all()
152+ machine.wait_for_unit("default.target")
153+ print(machine.succeed('mount'))
154+
155+ print(machine.succeed('parted --script /dev/vdb -- mklabel gpt'))
156+ print(machine.succeed('parted --script /dev/vdb -- mkpart primary 1M 70M'))
157+
158+ print(machine.succeed('parted --script /dev/vdc -- mklabel gpt'))
159+ print(machine.succeed('parted --script /dev/vdc -- mkpart primary 1M 70M'))
160+
161+ print(machine.succeed('zpool create tank mirror /dev/vdb1 /dev/vdc1 mirror /dev/vdd /dev/vde mirror /dev/vdf /dev/vdg'))
162+ print(machine.succeed('zpool list -v'))
163+ print(machine.succeed('mount'))
164+ start_size = int(machine.succeed('df -k --output=size /tank | tail -n1').strip())
165+
166+ print(machine.succeed("/run/current-system/specialisation/resize/bin/switch-to-configuration test >&2"))
167+ machine.wait_for_unit("zpool-expand-pools.service")
168+ machine.wait_for_unit("zpool-expand@tank.service")
169+
170+ print(machine.succeed('zpool list -v'))
171+ new_size = int(machine.succeed('df -k --output=size /tank | tail -n1').strip())
172+
173+ if (new_size - start_size) > 20000000:
174+ print("Disk grew appropriately.")
175+ else:
176+ print(f"Disk went from {start_size} to {new_size}, which doesn't seem right.")
177+ exit(1)
178+ '';
179+ };
130}
180}
pkgs/applications/accessibility/espeakup/default.nixnew file+46
@@ -0,0 +1,46 @@
1+{ stdenv
2+, lib
3+, meson
4+, ninja
5+, espeak-ng
6+, fetchFromGitHub
7+, pkg-config
8+, ronn
9+, alsa-lib
10+, systemd
11+}:
12+
13+stdenv.mkDerivation rec {
14+ pname = "espeakup";
15+ version = "0.90";
16+
17+ src = fetchFromGitHub {
18+ owner = "linux-speakup";
19+ repo = "espeakup";
20+ rev = "v${version}";
21+ sha256 = "0lmjwafvfxy07zn18v3dzjwwpnid2xffgvy2dzlwkbns8gb60ds2";
22+ };
23+
24+ nativeBuildInputs = [
25+ meson
26+ ninja
27+ pkg-config
28+ ronn
29+ ];
30+
31+ buildInputs = [
32+ espeak-ng
33+ alsa-lib
34+ systemd
35+ ];
36+
37+ PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "${placeholder "out"}/lib/systemd/system";
38+
39+ meta = with lib; {
40+ homepage = "https://github.com/linux-speakup/espeakup";
41+ description = "Lightweight connector for espeak-ng and speakup";
42+ license = licenses.gpl3Plus;
43+ maintainers = with maintainers; [ ethindp ];
44+ platforms = with platforms; linux;
45+ };
46+}
pkgs/applications/accessibility/wvkbd/default.nixnew file+36
@@ -0,0 +1,36 @@
1+{ stdenv
2+, lib
3+, fetchFromGitHub
4+, wayland-scanner
5+, wayland
6+, pango
7+, glib
8+, harfbuzz
9+, cairo
10+, pkg-config
11+, libxkbcommon
12+}:
13+
14+stdenv.mkDerivation rec {
15+ pname = "wvkbd";
16+ version = "0.7";
17+
18+ src = fetchFromGitHub {
19+ owner = "jjsullivan5196";
20+ repo = pname;
21+ rev = "v${version}";
22+ sha256 = "sha256-5UV2PMrLXtF3AxjfPxxwFRkgVef+Ap8nG1v795o0bWE=";
23+ };
24+
25+ nativeBuildInputs = [ pkg-config ];
26+ buildInputs = [ wayland-scanner wayland pango glib harfbuzz cairo libxkbcommon ];
27+ installFlags = [ "PREFIX=$(out)" ];
28+
29+ meta = with lib; {
30+ homepage = "https://github.com/jjsullivan5196/wvkbd";
31+ description = "On-screen keyboard for wlroots";
32+ maintainers = [ maintainers.elohmeier ];
33+ platforms = platforms.linux;
34+ license = licenses.gpl3Plus;
35+ };
36+}
pkgs/applications/audio/ChowPhaser/default.nixnew file+76
@@ -0,0 +1,76 @@
1+{ alsa-lib, at-spi2-core, cmake, curl, dbus, libepoxy, fetchFromGitHub, freeglut
2+, freetype, gcc-unwrapped, gtk3, lib, libGL, libXcursor, libXdmcp, libXext
3+, libXinerama, libXrandr, libXtst, libdatrie, libjack2, libpsl, libselinux
4+, libsepol, libsysprof-capture, libthai, libxkbcommon, pcre, pkg-config
5+, python3, sqlite, stdenv }:
6+
7+stdenv.mkDerivation rec {
8+ pname = "ChowPhaser";
9+ version = "1.1.1";
10+
11+ src = fetchFromGitHub {
12+ owner = "jatinchowdhury18";
13+ repo = "ChowPhaser";
14+ rev = "v${version}";
15+ fetchSubmodules = true;
16+ sha256 = "sha256-9wo7ZFMruG3QNvlpILSvrFh/Sx6J1qnlWc8+aQyS4tQ=";
17+ };
18+
19+ nativeBuildInputs = [ pkg-config cmake ];
20+
21+ buildInputs = [
22+ alsa-lib
23+ at-spi2-core
24+ curl
25+ dbus
26+ libepoxy
27+ freeglut
28+ freetype
29+ gtk3
30+ libGL
31+ libXcursor
32+ libXdmcp
33+ libXext
34+ libXinerama
35+ libXrandr
36+ libXtst
37+ libdatrie
38+ libjack2
39+ libpsl
40+ libselinux
41+ libsepol
42+ libsysprof-capture
43+ libthai
44+ libxkbcommon
45+ pcre
46+ python3
47+ sqlite
48+ gcc-unwrapped
49+ ];
50+
51+ cmakeFlags = [
52+ "-DCMAKE_AR=${gcc-unwrapped}/bin/gcc-ar"
53+ "-DCMAKE_RANLIB=${gcc-unwrapped}/bin/gcc-ranlib"
54+ "-DCMAKE_NM=${gcc-unwrapped}/bin/gcc-nm"
55+ ];
56+
57+ installPhase = ''
58+ mkdir -p $out/lib/lv2 $out/lib/vst3 $out/bin $out/share/doc/ChowPhaser/
59+ cd ChowPhaserMono_artefacts/Release
60+ cp libChowPhaserMono_SharedCode.a $out/lib
61+ cp -r VST3/ChowPhaserMono.vst3 $out/lib/vst3
62+ cp Standalone/ChowPhaserMono $out/bin
63+ cd ../../ChowPhaserStereo_artefacts/Release
64+ cp libChowPhaserStereo_SharedCode.a $out/lib
65+ cp -r VST3/ChowPhaserStereo.vst3 $out/lib/vst3
66+ cp Standalone/ChowPhaserStereo $out/bin
67+ '';
68+
69+ meta = with lib; {
70+ homepage = "https://github.com/jatinchowdhury18/ChowPhaser";
71+ description = "Phaser effect based loosely on the Schulte Compact Phasing 'A'";
72+ license = with licenses; [ bsd3 ];
73+ maintainers = with maintainers; [ magnetophon ];
74+ platforms = platforms.linux;
75+ };
76+}
pkgs/applications/audio/LibreArp/default.nixnew file+53
@@ -0,0 +1,53 @@
1+{ stdenv, lib, fetchFromGitLab, cmake, pkg-config, cairo, libxkbcommon
2+, xcbutilcursor, xcbutilkeysyms, xcbutil, libXrandr, libXinerama, libXcursor
3+, alsa-lib, libjack2, lv2, gcc-unwrapped, curl}:
4+
5+stdenv.mkDerivation rec {
6+ pname = "LibreArp";
7+ version = "2.2";
8+
9+ src = fetchFromGitLab {
10+ owner = "LibreArp";
11+ repo = "LibreArp";
12+ rev = version;
13+ hash = "sha256-jCUT/sflO9L57xRTqNR90RbwJ0uZ+xJVXnB3n+FhWBo=";
14+ fetchSubmodules = true;
15+ };
16+
17+ nativeBuildInputs = [ cmake pkg-config ];
18+ buildInputs = [
19+ cairo
20+ libxkbcommon
21+ xcbutilcursor
22+ xcbutilkeysyms
23+ xcbutil
24+ libXrandr
25+ libXinerama
26+ libXcursor
27+ alsa-lib
28+ libjack2
29+ lv2
30+ curl
31+ ];
32+
33+ cmakeFlags = [
34+ "-DCMAKE_AR=${gcc-unwrapped}/bin/gcc-ar"
35+ "-DCMAKE_RANLIB=${gcc-unwrapped}/bin/gcc-ranlib"
36+ "-DCMAKE_NM=${gcc-unwrapped}/bin/gcc-nm"
37+ ];
38+
39+ installPhase = ''
40+ mkdir -p $out/lib/vst3
41+ cd LibreArp_artefacts/Release
42+ cp -r VST3/LibreArp.vst3 $out/lib/vst3
43+ '';
44+
45+ meta = with lib; {
46+ description =
47+ "A pattern-based arpeggio generator plugin.";
48+ homepage = "https://librearp.gitlab.io/";
49+ license = licenses.gpl3Plus;
50+ platforms = [ "x86_64-linux" ];
51+ maintainers = with maintainers; [ magnetophon ];
52+ };
53+}
pkgs/applications/audio/LibreArp/lv2.nixnew file+53
@@ -0,0 +1,53 @@
1+{ stdenv, lib, fetchFromGitLab, cmake, pkg-config, cairo, libxkbcommon
2+, xcbutilcursor, xcbutilkeysyms, xcbutil, libXrandr, libXinerama, libXcursor
3+, alsa-lib, libjack2, lv2, gcc-unwrapped, curl}:
4+
5+stdenv.mkDerivation rec {
6+ pname = "LibreArp-lv2";
7+ version = "2.2";
8+
9+ src = fetchFromGitLab {
10+ owner = "LibreArp";
11+ repo = "LibreArp";
12+ rev = "${version}-lv2";
13+ hash = "sha256-j5SksuhC4ZXXILfOpwXNqIu5fO07a/6tiZ5qUo+p0Ug=";
14+ fetchSubmodules = true;
15+ };
16+
17+ nativeBuildInputs = [ cmake pkg-config ];
18+ buildInputs = [
19+ cairo
20+ libxkbcommon
21+ xcbutilcursor
22+ xcbutilkeysyms
23+ xcbutil
24+ libXrandr
25+ libXinerama
26+ libXcursor
27+ alsa-lib
28+ libjack2
29+ lv2
30+ curl
31+ ];
32+
33+ cmakeFlags = [
34+ "-DCMAKE_AR=${gcc-unwrapped}/bin/gcc-ar"
35+ "-DCMAKE_RANLIB=${gcc-unwrapped}/bin/gcc-ranlib"
36+ "-DCMAKE_NM=${gcc-unwrapped}/bin/gcc-nm"
37+ ];
38+
39+ installPhase = ''
40+ mkdir -p $out/lib/lv2
41+ cd LibreArp_artefacts/Release
42+ cp -r LV2/LibreArp.lv2 $out/lib/lv2
43+ '';
44+
45+ meta = with lib; {
46+ description =
47+ "A pattern-based arpeggio generator plugin.";
48+ homepage = "https://librearp.gitlab.io/";
49+ license = licenses.gpl3Plus;
50+ platforms = [ "x86_64-linux" ];
51+ maintainers = with maintainers; [ magnetophon ];
52+ };
53+}
pkgs/applications/audio/amberol/default.nixnew file+75
@@ -0,0 +1,75 @@
1+{ lib
2+, stdenv
3+, fetchFromGitLab
4+, rustPlatform
5+, desktop-file-utils
6+, appstream-glib
7+, meson
8+, ninja
9+, pkg-config
10+, reuse
11+, wrapGAppsHook4
12+, glib
13+, gtk4
14+, gst_all_1
15+, libadwaita
16+, dbus
17+}:
18+
19+stdenv.mkDerivation rec {
20+ pname = "amberol";
21+ version = "0.4.3";
22+
23+ src = fetchFromGitLab {
24+ domain = "gitlab.gnome.org";
25+ owner = "World";
26+ repo = pname;
27+ rev = version;
28+ sha256 = "sha256-4yW7rVlP9Zskyt4l/VQoX+9q3TUdEuLZrNQuQvziIf4=";
29+ };
30+
31+ cargoDeps = rustPlatform.fetchCargoTarball {
32+ inherit src;
33+ name = "${pname}-${version}";
34+ sha256 = "sha256-1ahEWLBmkT+B8qD0Qd1skXqk1wvP6yuFNAQBRdispC4=";
35+ };
36+
37+ postPatch = ''
38+ patchShebangs build-aux
39+ '';
40+
41+ nativeBuildInputs = [
42+ appstream-glib
43+ desktop-file-utils
44+ meson
45+ ninja
46+ pkg-config
47+ reuse
48+ wrapGAppsHook4
49+ ] ++ (with rustPlatform; [
50+ cargoSetupHook
51+ rust.cargo
52+ rust.rustc
53+ ]);
54+
55+ buildInputs = [
56+ glib
57+ gtk4
58+ libadwaita
59+ gst_all_1.gstreamer
60+ gst_all_1.gst-plugins-base
61+ gst_all_1.gst-plugins-good
62+ gst_all_1.gst-plugins-bad
63+ gst_all_1.gst-plugins-ugly
64+ gst_all_1.gst-libav
65+ dbus
66+ ];
67+
68+ meta = with lib; {
69+ homepage = "https://gitlab.gnome.org/ebassi/amberol";
70+ description = "A small and simple sound and music player";
71+ maintainers = with maintainers; [ linsui ];
72+ license = licenses.gpl3Plus;
73+ platforms = platforms.linux;
74+ };
75+}
pkgs/applications/audio/audacity/0001-Use-a-different-approach-to-estimate-the-disk-space-.patchdeleted−355
@@ -1,355 +0,0 @@
1−From deeb435829d73524df851f6f4c2d4be552c99230 Mon Sep 17 00:00:00 2001
2−From: Dmitry Vedenko <dmitry@crsib.me>
3−Date: Fri, 1 Oct 2021 16:21:22 +0300
4−Subject: [PATCH] Use a different approach to estimate the disk space usage
5−
6−New a approach is a bit less precise, but removes the requirement for the "private" SQLite3 table and allows Audacity to be built against system SQLite3.
7−---
8− cmake-proxies/sqlite/CMakeLists.txt | 5 -
9− src/DBConnection.h | 4 +-
10− src/ProjectFileIO.cpp | 269 +++++-----------------------
11− 3 files changed, 44 insertions(+), 234 deletions(-)
12−
13−diff --git a/cmake-proxies/sqlite/CMakeLists.txt b/cmake-proxies/sqlite/CMakeLists.txt
14−index 63d70637c..d7b9b95ef 100644
15−--- a/cmake-proxies/sqlite/CMakeLists.txt
16−+++ b/cmake-proxies/sqlite/CMakeLists.txt
17−@@ -19,11 +19,6 @@ list( APPEND INCLUDES
18−
19− list( APPEND DEFINES
20− PRIVATE
21−- #
22−- # We need the dbpage table for space calculations.
23−- #
24−- SQLITE_ENABLE_DBPAGE_VTAB=1
25−-
26− # Can't be set after a WAL mode database is initialized, so change
27− # the default here to ensure all project files get the same page
28− # size.
29−diff --git a/src/DBConnection.h b/src/DBConnection.h
30−index 16a7fc9d4..07d3af95e 100644
31−--- a/src/DBConnection.h
32−+++ b/src/DBConnection.h
33−@@ -75,8 +75,8 @@ public:
34− LoadSampleBlock,
35− InsertSampleBlock,
36− DeleteSampleBlock,
37−- GetRootPage,
38−- GetDBPage
39−+ GetSampleBlockSize,
40−+ GetAllSampleBlocksSize
41− };
42− sqlite3_stmt *Prepare(enum StatementID id, const char *sql);
43−
44−diff --git a/src/ProjectFileIO.cpp b/src/ProjectFileIO.cpp
45−index 3b3e2e1fd..c9bc45af4 100644
46−--- a/src/ProjectFileIO.cpp
47−+++ b/src/ProjectFileIO.cpp
48−@@ -35,6 +35,7 @@ Paul Licameli split from AudacityProject.cpp
49− #include "widgets/ProgressDialog.h"
50− #include "wxFileNameWrapper.h"
51− #include "xml/XMLFileReader.h"
52−+#include "MemoryX.h"`
53−
54− #undef NO_SHM
55− #if !defined(__WXMSW__)
56−@@ -2357,255 +2358,69 @@ int64_t ProjectFileIO::GetTotalUsage()
57− }
58−
59− //
60−-// Returns the amount of disk space used by the specified sample blockid or all
61−-// of the sample blocks if the blockid is 0. It does this by using the raw SQLite
62−-// pages available from the "sqlite_dbpage" virtual table to traverse the SQLite
63−-// table b-tree described here: https://www.sqlite.org/fileformat.html
64−+// Returns the estimation of disk space used by the specified sample blockid or all
65−+// of the sample blocks if the blockid is 0. This does not include small overhead
66−+// of the internal SQLite structures, only the size used by the data
67− //
68− int64_t ProjectFileIO::GetDiskUsage(DBConnection &conn, SampleBlockID blockid /* = 0 */)
69− {
70−- // Information we need to track our travels through the b-tree
71−- typedef struct
72−- {
73−- int64_t pgno;
74−- int currentCell;
75−- int numCells;
76−- unsigned char data[65536];
77−- } page;
78−- std::vector<page> stack;
79−-
80−- int64_t total = 0;
81−- int64_t found = 0;
82−- int64_t right = 0;
83−- int rc;
84−+ sqlite3_stmt* stmt = nullptr;
85−
86−- // Get the rootpage for the sampleblocks table.
87−- sqlite3_stmt *stmt =
88−- conn.Prepare(DBConnection::GetRootPage,
89−- "SELECT rootpage FROM sqlite_master WHERE tbl_name = 'sampleblocks';");
90−- if (stmt == nullptr || sqlite3_step(stmt) != SQLITE_ROW)
91−+ if (blockid == 0)
92− {
93−- return 0;
94−- }
95−-
96−- // And store it in our first stack frame
97−- stack.push_back({sqlite3_column_int64(stmt, 0)});
98−+ static const char* statement =
99−+R"(SELECT
100−+ sum(length(blockid) + length(sampleformat) +
101−+ length(summin) + length(summax) + length(sumrms) +
102−+ length(summary256) + length(summary64k) +
103−+ length(samples))
104−+FROM sampleblocks;)";
105−
106−- // All done with the statement
107−- sqlite3_clear_bindings(stmt);
108−- sqlite3_reset(stmt);
109−-
110−- // Prepare/retrieve statement to read raw database page
111−- stmt = conn.Prepare(DBConnection::GetDBPage,
112−- "SELECT data FROM sqlite_dbpage WHERE pgno = ?1;");
113−- if (stmt == nullptr)
114−- {
115−- return 0;
116−+ stmt = conn.Prepare(DBConnection::GetAllSampleBlocksSize, statement);
117− }
118−-
119−- // Traverse the b-tree until we've visited all of the leaf pages or until
120−- // we find the one corresponding to the passed in sample blockid. Because we
121−- // use an integer primary key for the sampleblocks table, the traversal will
122−- // be in ascending blockid sequence.
123−- do
124−+ else
125− {
126−- // Acces the top stack frame
127−- page &pg = stack.back();
128−+ static const char* statement =
129−+R"(SELECT
130−+ length(blockid) + length(sampleformat) +
131−+ length(summin) + length(summax) + length(sumrms) +
132−+ length(summary256) + length(summary64k) +
133−+ length(samples)
134−+FROM sampleblocks WHERE blockid = ?1;)";
135−
136−- // Read the page from the sqlite_dbpage table if it hasn't yet been loaded
137−- if (pg.numCells == 0)
138−- {
139−- // Bind the page number
140−- sqlite3_bind_int64(stmt, 1, pg.pgno);
141−+ stmt = conn.Prepare(DBConnection::GetSampleBlockSize, statement);
142−+ }
143−
144−- // And retrieve the page
145−- if (sqlite3_step(stmt) != SQLITE_ROW)
146−+ auto cleanup = finally(
147−+ [stmt]() {
148−+ // Clear statement bindings and rewind statement
149−+ if (stmt != nullptr)
150− {
151−- // REVIEW: Likely harmless failure - says size is zero on
152−- // this error.
153−- // LLL: Yea, but not much else we can do.
154−- return 0;
155−+ sqlite3_clear_bindings(stmt);
156−+ sqlite3_reset(stmt);
157− }
158−+ });
159−
160−- // Copy the page content to the stack frame
161−- memcpy(&pg.data,
162−- sqlite3_column_blob(stmt, 0),
163−- sqlite3_column_bytes(stmt, 0));
164−-
165−- // And retrieve the total number of cells within it
166−- pg.numCells = get2(&pg.data[3]);
167−-
168−- // Reset statement for next usage
169−- sqlite3_clear_bindings(stmt);
170−- sqlite3_reset(stmt);
171−- }
172−-
173−- //wxLogDebug("%*.*spgno %lld currentCell %d numCells %d", (stack.size() - 1) * 2, (stack.size() - 1) * 2, "", pg.pgno, pg.currentCell, pg.numCells);
174−-
175−- // Process an interior table b-tree page
176−- if (pg.data[0] == 0x05)
177−- {
178−- // Process the next cell if we haven't examined all of them yet
179−- if (pg.currentCell < pg.numCells)
180−- {
181−- // Remember the right-most leaf page number.
182−- right = get4(&pg.data[8]);
183−-
184−- // Iterate over the cells.
185−- //
186−- // If we're not looking for a specific blockid, then we always push the
187−- // target page onto the stack and leave the loop after a single iteration.
188−- //
189−- // Otherwise, we match the blockid against the highest integer key contained
190−- // within the cell and if the blockid falls within the cell, we stack the
191−- // page and stop the iteration.
192−- //
193−- // In theory, we could do a binary search for a specific blockid here, but
194−- // because our sample blocks are always large, we will get very few cells
195−- // per page...usually 6 or less.
196−- //
197−- // In both cases, the stacked page can be either an internal or leaf page.
198−- bool stacked = false;
199−- while (pg.currentCell < pg.numCells)
200−- {
201−- // Get the offset to this cell using the offset in the cell pointer
202−- // array.
203−- //
204−- // The cell pointer array starts immediately after the page header
205−- // at offset 12 and the retrieved offset is from the beginning of
206−- // the page.
207−- int celloff = get2(&pg.data[12 + (pg.currentCell * 2)]);
208−-
209−- // Bump to the next cell for the next iteration.
210−- pg.currentCell++;
211−-
212−- // Get the page number this cell describes
213−- int pagenum = get4(&pg.data[celloff]);
214−-
215−- // And the highest integer key, which starts at offset 4 within the cell.
216−- int64_t intkey = 0;
217−- get_varint(&pg.data[celloff + 4], &intkey);
218−-
219−- //wxLogDebug("%*.*sinternal - right %lld celloff %d pagenum %d intkey %lld", (stack.size() - 1) * 2, (stack.size() - 1) * 2, " ", right, celloff, pagenum, intkey);
220−-
221−- // Stack the described page if we're not looking for a specific blockid
222−- // or if this page contains the given blockid.
223−- if (!blockid || blockid <= intkey)
224−- {
225−- stack.push_back({pagenum, 0, 0});
226−- stacked = true;
227−- break;
228−- }
229−- }
230−-
231−- // If we pushed a new page onto the stack, we need to jump back up
232−- // to read the page
233−- if (stacked)
234−- {
235−- continue;
236−- }
237−- }
238−+ if (blockid != 0)
239−+ {
240−+ int rc = sqlite3_bind_int64(stmt, 1, blockid);
241−
242−- // We've exhausted all the cells with this page, so we stack the right-most
243−- // leaf page. Ensure we only process it once.
244−- if (right)
245−- {
246−- stack.push_back({right, 0, 0});
247−- right = 0;
248−- continue;
249−- }
250−- }
251−- // Process a leaf table b-tree page
252−- else if (pg.data[0] == 0x0d)
253−+ if (rc != SQLITE_OK)
254− {
255−- // Iterate over the cells
256−- //
257−- // If we're not looking for a specific blockid, then just accumulate the
258−- // payload sizes. We will be reading every leaf page in the sampleblocks
259−- // table.
260−- //
261−- // Otherwise we break out when we find the matching blockid. In this case,
262−- // we only ever look at 1 leaf page.
263−- bool stop = false;
264−- for (int i = 0; i < pg.numCells; i++)
265−- {
266−- // Get the offset to this cell using the offset in the cell pointer
267−- // array.
268−- //
269−- // The cell pointer array starts immediately after the page header
270−- // at offset 8 and the retrieved offset is from the beginning of
271−- // the page.
272−- int celloff = get2(&pg.data[8 + (i * 2)]);
273−-
274−- // Get the total payload size in bytes of the described row.
275−- int64_t payload = 0;
276−- int digits = get_varint(&pg.data[celloff], &payload);
277−-
278−- // Get the integer key for this row.
279−- int64_t intkey = 0;
280−- get_varint(&pg.data[celloff + digits], &intkey);
281−-
282−- //wxLogDebug("%*.*sleaf - celloff %4d intkey %lld payload %lld", (stack.size() - 1) * 2, (stack.size() - 1) * 2, " ", celloff, intkey, payload);
283−-
284−- // Add this payload size to the total if we're not looking for a specific
285−- // blockid
286−- if (!blockid)
287−- {
288−- total += payload;
289−- }
290−- // Otherwise, return the payload size for a matching row
291−- else if (blockid == intkey)
292−- {
293−- return payload;
294−- }
295−- }
296−+ conn.ThrowException(false);
297− }
298−+ }
299−
300−- // Done with the current branch, so pop back up to the previous one (if any)
301−- stack.pop_back();
302−- } while (!stack.empty());
303−-
304−- // Return the total used for all sample blocks
305−- return total;
306−-}
307−-
308−-// Retrieves a 2-byte big-endian integer from the page data
309−-unsigned int ProjectFileIO::get2(const unsigned char *ptr)
310−-{
311−- return (ptr[0] << 8) | ptr[1];
312−-}
313−-
314−-// Retrieves a 4-byte big-endian integer from the page data
315−-unsigned int ProjectFileIO::get4(const unsigned char *ptr)
316−-{
317−- return ((unsigned int) ptr[0] << 24) |
318−- ((unsigned int) ptr[1] << 16) |
319−- ((unsigned int) ptr[2] << 8) |
320−- ((unsigned int) ptr[3]);
321−-}
322−-
323−-// Retrieves a variable length integer from the page data. Returns the
324−-// number of digits used to encode the integer and the stores the
325−-// value at the given location.
326−-int ProjectFileIO::get_varint(const unsigned char *ptr, int64_t *out)
327−-{
328−- int64_t val = 0;
329−- int i;
330−+ int rc = sqlite3_step(stmt);
331−
332−- for (i = 0; i < 8; ++i)
333−+ if (rc != SQLITE_ROW)
334− {
335−- val = (val << 7) + (ptr[i] & 0x7f);
336−- if ((ptr[i] & 0x80) == 0)
337−- {
338−- *out = val;
339−- return i + 1;
340−- }
341−+ conn.ThrowException(false);
342− }
343−
344−- val = (val << 8) + (ptr[i] & 0xff);
345−- *out = val;
346−+ const int64_t size = sqlite3_column_int64(stmt, 0);
347−
348−- return 9;
349−+ return size;
350− }
351−
352− InvisibleTemporaryProject::InvisibleTemporaryProject()
353−--
354−2.33.1
355−
pkgs/applications/audio/audacity/default.nix+58−35
@@ -3,6 +3,7 @@
3, fetchFromGitHub
3, fetchFromGitHub
4, fetchpatch
4, fetchpatch
5, cmake
5, cmake
6+, makeWrapper
6, pkg-config
7, pkg-config
7, python3
8, python3
8, gettext
9, gettext
@@ -20,14 +21,17 @@
20, libsndfile
21, libsndfile
21, soxr
22, soxr
22, flac
23, flac
24+, lame
23, twolame
25, twolame
24, expat
26, expat
25, libid3tag
27, libid3tag
26, libopus
28, libopus
29+, libuuid
27, ffmpeg_4
30, ffmpeg_4
28, soundtouch
31, soundtouch
29, pcre
32, pcre
30−/*, portaudio - given up fighting their portaudio.patch */
33+, portaudio # given up fighting their portaudio.patch?
34+, portmidi
31, linuxHeaders
35, linuxHeaders
32, alsa-lib
36, alsa-lib
33, at-spi2-core
37, at-spi2-core
@@ -36,11 +40,14 @@
36, libXdmcp
40, libXdmcp
37, libXtst
41, libXtst
38, libpthreadstubs
42, libpthreadstubs
43+, libsbsms_2_3_0
39, libselinux
44, libselinux
40, libsepol
45, libsepol
41, libxkbcommon
46, libxkbcommon
42, util-linux
47, util-linux
43, wxGTK
48, wxGTK
49+, libpng
50+, libjpeg
44, AppKit ? null
51, AppKit ? null
45, AudioToolbox ? null
52, AudioToolbox ? null
46, AudioUnit ? null
53, AudioUnit ? null
@@ -58,12 +65,14 @@
58
65
59let
66let
60 inherit (lib) optionals;
67 inherit (lib) optionals;
68+ pname = "audacity";
69+ version = "3.1.3";
61
70
62 wxWidgets_src = fetchFromGitHub {
71 wxWidgets_src = fetchFromGitHub {
63− owner = "audacity";
72+ owner = pname;
64 repo = "wxWidgets";
73 repo = "wxWidgets";
65− rev = "07e7d832c7a337aedba3537b90b2c98c4d8e2985";
74+ rev = "v${version}-${pname}";
66− sha256 = "1mawnkcrmqj98jp0jxlnh9xkc950ca033ccb51c7035pzmi9if9a";
75+ sha256 = "sha256-KrmYYv23DHBYKIuxMYBioCQ2e4KWdgmuREnimtm0XNU=";
67 fetchSubmodules = true;
76 fetchSubmodules = true;
68 };
77 };
69
78
@@ -74,41 +83,20 @@ let
74 wxmac' = wxmac.overrideAttrs (oldAttrs: rec {
83 wxmac' = wxmac.overrideAttrs (oldAttrs: rec {
75 src = wxWidgets_src;
84 src = wxWidgets_src;
76 });
85 });
77−
78−in
79−stdenv.mkDerivation rec {
86+in stdenv.mkDerivation rec {
80− pname = "audacity";
81− # nixpkgs-update: no auto update
82− # Humans too! Let's wait to see how the situation with
83− # https://github.com/audacity/audacity/issues/1213 develops before
84− # pulling any updates that are subject to this privacy policy. We
85− # may wish to switch to a fork, but at the time of writing
86− # (2021-07-05) it's too early to tell how well any of the forks will
87− # be maintained.
88− version = "3.0.2";
87+ inherit pname version;
89
88
90 src = fetchFromGitHub {
89 src = fetchFromGitHub {
91− owner = "audacity";
90+ owner = pname;
92− repo = "audacity";
91+ repo = pname;
93 rev = "Audacity-${version}";
92 rev = "Audacity-${version}";
94− sha256 = "035qq2ff16cdl2cb9iply2bfjmhfl1dpscg79x6c9l0i9m8k41zj";
93+ sha256 = "sha256-sdI4paxIHDZgoWTCekjrkFR4JFpQC6OatcnJdVXCCZk=";
95 };
94 };
96
95
97− patches = [
98− (fetchpatch {
99− url = "https://github.com/audacity/audacity/commit/7f8135e112a0e1e8e906abab9339680d1e491441.patch";
100− sha256 = "0zp2iydd46analda9cfnbmzdkjphz5m7dynrdj5qdnmq6j3px9fw";
101− name = "audacity_xdg_paths.patch";
102− })
103− # This is required to make audacity work with nixpkgs’ sqlite
104− # https://github.com/audacity/audacity/pull/1802 rebased onto 3.0.2
105− ./0001-Use-a-different-approach-to-estimate-the-disk-space-.patch
106− ];
107−
108 postPatch = ''
96 postPatch = ''
109− touch src/RevisionIdent.h
97+ mkdir src/private
110 '' + lib.optionalString stdenv.isLinux ''
98 '' + lib.optionalString stdenv.isLinux ''
111− substituteInPlace src/FileNames.cpp \
99+ substituteInPlace libraries/lib-files/FileNames.cpp \
112 --replace /usr/include/linux/magic.h ${linuxHeaders}/include/linux/magic.h
100 --replace /usr/include/linux/magic.h ${linuxHeaders}/include/linux/magic.h
113 '';
101 '';
114
102
@@ -119,6 +107,7 @@ stdenv.mkDerivation rec {
119 python3
107 python3
120 ] ++ optionals stdenv.isLinux [
108 ] ++ optionals stdenv.isLinux [
121 linuxHeaders
109 linuxHeaders
110+ makeWrapper
122 ];
111 ];
123
112
124 buildInputs = [
113 buildInputs = [
@@ -126,15 +115,18 @@ stdenv.mkDerivation rec {
126 ffmpeg_4
115 ffmpeg_4
127 file
116 file
128 flac
117 flac
118+ lame
129 libid3tag
119 libid3tag
130 libjack2
120 libjack2
131 libmad
121 libmad
132 libopus
122 libopus
123+ libsbsms_2_3_0
133 libsndfile
124 libsndfile
134 libvorbis
125 libvorbis
135 lilv
126 lilv
136 lv2
127 lv2
137 pcre
128 pcre
129+ portmidi
138 serd
130 serd
139 sord
131 sord
140 soundtouch
132 soundtouch
@@ -143,6 +135,7 @@ stdenv.mkDerivation rec {
143 sratom
135 sratom
144 suil
136 suil
145 twolame
137 twolame
138+ portaudio
146 ] ++ optionals stdenv.isLinux [
139 ] ++ optionals stdenv.isLinux [
147 alsa-lib # for portaudio
140 alsa-lib # for portaudio
148 at-spi2-core
141 at-spi2-core
@@ -154,6 +147,7 @@ stdenv.mkDerivation rec {
154 libxkbcommon
147 libxkbcommon
155 libselinux
148 libselinux
156 libsepol
149 libsepol
150+ libuuid
157 util-linux
151 util-linux
158 wxGTK'
152 wxGTK'
159 wxGTK'.gtk
153 wxGTK'.gtk
@@ -163,20 +157,49 @@ stdenv.mkDerivation rec {
163 Cocoa
157 Cocoa
164 CoreAudioKit
158 CoreAudioKit
165 AudioUnit AudioToolbox CoreAudio CoreServices Carbon # for portaudio
159 AudioUnit AudioToolbox CoreAudio CoreServices Carbon # for portaudio
160+ libpng
161+ libjpeg
166 ];
162 ];
167
163
168 cmakeFlags = [
164 cmakeFlags = [
169− "-Daudacity_use_ffmpeg=linked"
165+ "-DAUDACITY_REV_LONG=nixpkgs"
166+ "-DAUDACITY_REV_TIME=nixpkgs"
170 "-DDISABLE_DYNAMIC_LOADING_FFMPEG=ON"
167 "-DDISABLE_DYNAMIC_LOADING_FFMPEG=ON"
168+ "-Daudacity_conan_enabled=Off"
169+ "-Daudacity_use_ffmpeg=loaded"
171 ];
170 ];
172
171
173 doCheck = false; # Test fails
172 doCheck = false; # Test fails
174
173
174+ # Replace audacity's wrapper, to:
175+ # - put it in the right place, it shouldn't be in "$out/audacity"
176+ # - Add the ffmpeg dynamic dependency
177+ postInstall = lib.optionalString stdenv.isLinux ''
178+ rm "$out/audacity"
179+ wrapProgram "$out/bin/audacity" \
180+ --prefix LD_LIBRARY_PATH : "$out/lib/audacity":${lib.makeLibraryPath [ ffmpeg_4 ]} \
181+ --suffix AUDACITY_MODULES_PATH : "$out/lib/audacity/modules" \
182+ --suffix AUDACITY_PATH : "$out/share/audacity"
183+ '';
184+
175 meta = with lib; {
185 meta = with lib; {
176 description = "Sound editor with graphical UI";
186 description = "Sound editor with graphical UI";
177− homepage = "https://www.audacityteam.org/";
187+ homepage = "https://www.audacityteam.org";
188+ changelog = "https://github.com/audacity/audacity/releases";
178− license = licenses.gpl2Plus;
189+ license = with licenses; [
190+ gpl2Plus
191+ # Must be GPL3 when building with "technologies that require it,
192+ # such as the VST3 audio plugin interface".
193+ # https://github.com/audacity/audacity/discussions/2142.
194+ gpl3
195+ # Documentation.
196+ cc-by-30
197+ ];
179 maintainers = with maintainers; [ lheckemann veprbl ];
198 maintainers = with maintainers; [ lheckemann veprbl ];
180 platforms = platforms.unix;
199 platforms = platforms.unix;
200+ # darwin-aarch due to qtbase broken for it.
201+ # darwin-x86_64 due to
202+ # https://logs.nix.ci/?attempt_id=5cbc4581-09b4-4148-82fe-0326411a56b3&key=nixos%2Fnixpkgs.152273.
203+ broken = stdenv.isDarwin;
181 };
204 };
182}
205}
pkgs/applications/audio/audio-recorder/default.nix+1−1
@@ -2,7 +2,7 @@
2, pkg-config, intltool
2, pkg-config, intltool
3, glib, dbus, gtk3, libappindicator-gtk3, gst_all_1
3, glib, dbus, gtk3, libappindicator-gtk3, gst_all_1
4, librsvg, wrapGAppsHook
4, librsvg, wrapGAppsHook
5−, pulseaudioSupport ? true, libpulseaudio ? null }:
5+, pulseaudioSupport ? true, libpulseaudio }:
6
6
7stdenv.mkDerivation rec {
7stdenv.mkDerivation rec {
8 pname = "audio-recorder";
8 pname = "audio-recorder";
pkgs/applications/audio/bespokesynth/default.nix+1
@@ -142,6 +142,7 @@ stdenv.mkDerivation rec {
142 gpl3Plus
142 gpl3Plus
143 ] ++ lib.optional enableVST2 unfree;
143 ] ++ lib.optional enableVST2 unfree;
144 maintainers = with maintainers; [ astro tobiasBora OPNA2608 ];
144 maintainers = with maintainers; [ astro tobiasBora OPNA2608 ];
145+ mainProgram = "BespokeSynth";
145 platforms = platforms.all;
146 platforms = platforms.all;
146 };
147 };
147}
148}
pkgs/applications/audio/bitwig-studio/bitwig-studio4.nix+2−2
@@ -6,11 +6,11 @@
6
6
7stdenv.mkDerivation rec {
7stdenv.mkDerivation rec {
8 pname = "bitwig-studio";
8 pname = "bitwig-studio";
9− version = "4.2.1";
9+ version = "4.2.3";
10
10
11 src = fetchurl {
11 src = fetchurl {
12 url = "https://downloads.bitwig.com/stable/${version}/${pname}-${version}.deb";
12 url = "https://downloads.bitwig.com/stable/${version}/${pname}-${version}.deb";
13− sha256 = "sha256-kkpb8tLuj4QO+TBW2yNDugS4c6dCQ9Lddv6Z8NS0uio=";
13+ sha256 = "sha256-UCafrjrEwwHkhPum7sTOjtXzy7PNeK5/aeKg+b3CGJU=";
14 };
14 };
15
15
16 nativeBuildInputs = [ dpkg makeWrapper wrapGAppsHook ];
16 nativeBuildInputs = [ dpkg makeWrapper wrapGAppsHook ];
pkgs/applications/audio/blanket/default.nix+7−7
@@ -9,21 +9,21 @@
9, appstream-glib
9, appstream-glib
10, python3Packages
10, python3Packages
11, glib
11, glib
12−, gtk3
12+, gtk4
13−, libhandy
13+, libadwaita
14, gobject-introspection
14, gobject-introspection
15, gst_all_1
15, gst_all_1
16}:
16}:
17
17
18python3Packages.buildPythonApplication rec {
18python3Packages.buildPythonApplication rec {
19 pname = "blanket";
19 pname = "blanket";
20− version = "0.5.0";
20+ version = "0.6.0";
21
21
22 src = fetchFromGitHub {
22 src = fetchFromGitHub {
23 owner = "rafaelmardojai";
23 owner = "rafaelmardojai";
24 repo = "blanket";
24 repo = "blanket";
25− rev = version;
25+ rev = "refs/tags/${version}";
26− sha256 = "00i821zqfbigxmc709322r16z75qsw4rg23yhv35gza9sl65bzkg";
26+ sha256 = "sha256-4gthT1x76IfXWkLaLMPtFS4TRlRGk5Enbu/k1jAHzwE=";
27 };
27 };
28
28
29 nativeBuildInputs = [
29 nativeBuildInputs = [
@@ -37,8 +37,8 @@ python3Packages.buildPythonApplication rec {
37
37
38 buildInputs = [
38 buildInputs = [
39 glib
39 glib
40− gtk3
40+ gtk4
41− libhandy
41+ libadwaita
42 gobject-introspection
42 gobject-introspection
43 gst_all_1.gstreamer
43 gst_all_1.gstreamer
44 gst_all_1.gst-plugins-base
44 gst_all_1.gst-plugins-base
pkgs/applications/audio/callaudiod/default.nix+2−2
@@ -11,14 +11,14 @@
11
11
12stdenv.mkDerivation rec {
12stdenv.mkDerivation rec {
13 pname = "callaudiod";
13 pname = "callaudiod";
14− version = "0.1.3";
14+ version = "0.1.4";
15
15
16 src = fetchFromGitLab {
16 src = fetchFromGitLab {
17 domain = "gitlab.com";
17 domain = "gitlab.com";
18 owner = "mobian1";
18 owner = "mobian1";
19 repo = pname;
19 repo = pname;
20 rev = version;
20 rev = version;
21− sha256 = "sha256-WZ23jacCsZiNeMJfnYMaGdHXY9OCIBbeU9dWGDroaHE=";
21+ sha256 = "sha256-71+9ALz55aqxXRBRwOcs9fwiQK31pJ9E72pGRmt0OkE=";
22 };
22 };
23
23
24 strictDeps = true;
24 strictDeps = true;
pkgs/applications/audio/cardinal/default.nix+2−11
@@ -23,23 +23,14 @@
23
23
24stdenv.mkDerivation rec {
24stdenv.mkDerivation rec {
25 pname = "cardinal";
25 pname = "cardinal";
26− version = "22.02";
26+ version = "22.04";
27
27
28 src = fetchurl {
28 src = fetchurl {
29 url =
29 url =
30 "https://github.com/DISTRHO/Cardinal/releases/download/${version}/cardinal-${version}.tar.xz";
30 "https://github.com/DISTRHO/Cardinal/releases/download/${version}/cardinal-${version}.tar.xz";
31− sha256 = "sha256-IVlAROFGFffTEU00NCmv74w1DRb7dNMp20FeBVoDrdM=";
31+ sha256 = "sha256-7As4CckwByrTynOOpwAXa1R9Bpp/ft537f+PvAgz/BE=";
32 };
32 };
33
33
34− patches = [
35− # see https://github.com/DISTRHO/Cardinal/issues/151#issuecomment-1041886260
36− (fetchpatch {
37− url =
38− "https://github.com/DISTRHO/Cardinal/commit/13e9ef37c5dd35d77a54b1cb006767be7a72ac69.patch";
39− sha256 = "sha256-NYUYLbLeBX1WEzjPi0s/T1N+EXQKyi0ifbPxgBYDjRs=";
40− })
41− ];
42−
43 prePatch = ''
34 prePatch = ''
44 patchShebangs ./dpf/utils/generate-ttl.sh
35 patchShebangs ./dpf/utils/generate-ttl.sh
45 '';
36 '';
pkgs/applications/audio/carla/default.nix+2−2
@@ -15,13 +15,13 @@ assert withGtk3 -> gtk3 != null;
15
15
16stdenv.mkDerivation rec {
16stdenv.mkDerivation rec {
17 pname = "carla";
17 pname = "carla";
18− version = "2.4.2";
18+ version = "2.4.3";
19
19
20 src = fetchFromGitHub {
20 src = fetchFromGitHub {
21 owner = "falkTX";
21 owner = "falkTX";
22 repo = pname;
22 repo = pname;
23 rev = "v${version}";
23 rev = "v${version}";
24− sha256 = "sha256-A0QmyphjsNU06kh2f9rXrR+GkDEI5HqXRA9J82E6qJU=";
24+ sha256 = "sha256-FAQTIM5NpcOhLNMf62qiKaxg6QtK5uIJF/XT6KJVnUc=";
25 };
25 };
26
26
27 nativeBuildInputs = [
27 nativeBuildInputs = [
pkgs/applications/audio/caudec/default.nix+2−2
@@ -1,4 +1,4 @@
1−{ lib, stdenv, fetchurl, makeWrapper, bash, bc, findutils, flac, lame, opusTools, procps, sox }:
1+{ lib, stdenv, fetchurl, makeWrapper, bc, findutils, flac, lame, opusTools, procps, sox }:
2
2
3stdenv.mkDerivation rec {
3stdenv.mkDerivation rec {
4 pname = "caudec";
4 pname = "caudec";
@@ -13,7 +13,7 @@ stdenv.mkDerivation rec {
13 patchShebangs ./install.sh
13 patchShebangs ./install.sh
14 '';
14 '';
15
15
16− nativeBuildInputs = [ bash makeWrapper ];
16+ nativeBuildInputs = [ makeWrapper ];
17
17
18 installPhase = ''
18 installPhase = ''
19 ./install.sh --prefix=$out/bin
19 ./install.sh --prefix=$out/bin
pkgs/applications/audio/cider/default.nix+3−3
@@ -2,11 +2,11 @@
2
2
3appimageTools.wrapType2 rec {
3appimageTools.wrapType2 rec {
4 pname = "cider";
4 pname = "cider";
5− version = "1.3.1308";
5+ version = "1.4.1.1680";
6
6
7 src = fetchurl {
7 src = fetchurl {
8− url = "https://1308-429851205-gh.circle-artifacts.com/0/%7E/Cider/dist/artifacts/Cider-${version}.AppImage";
8+ url = "https://github.com/ciderapp/cider-releases/releases/download/v${version}/Cider-${builtins.concatStringsSep "." (lib.take 3 (lib.splitVersion version))}-alpha.${builtins.elemAt (lib.splitVersion version) 3}.AppImage";
9− sha256 = "1lbyvn1c8155p039qfzx7jwad7km073phkmrzjm0w3ahdpwz3wgi";
9+ sha256 = "sha256-hEv+vfMMH+Trwa1UF5R8EtyYeyiRVLP0BrXOK2+1q8M=";
10 };
10 };
11
11
12 extraInstallCommands =
12 extraInstallCommands =
pkgs/applications/audio/clementine/default.nix+3−10
@@ -51,24 +51,17 @@ let
51 withCD = config.clementine.cd or true;
51 withCD = config.clementine.cd or true;
52 withCloud = config.clementine.cloud or true;
52 withCloud = config.clementine.cloud or true;
53
53
54− # On the update after all 1.4rc, qt5.15 and protobuf 3.15 will be supported.
54+ version = "unstable-2022-04-11";
55− version = "1.4.0rc1";
56
55
57 src = fetchFromGitHub {
56 src = fetchFromGitHub {
58 owner = "clementine-player";
57 owner = "clementine-player";
59 repo = "Clementine";
58 repo = "Clementine";
60− rev = version;
59+ rev = "250024e117fbe5fae7c62b9c8e655d66412a6ed7";
61− sha256 = "1rqk0hrsn8f8bjk0j0vq1af0ygy6xx7qi9fw0jjw2cmj6kzckyi2";
60+ sha256 = "06fcbs3wig3mh711iypyj49qm5246f7qhvgvv8brqfrd8cqyh6qf";
62 };
61 };
63
62
64 patches = [
63 patches = [
65 ./clementine-spotify-blob.patch
64 ./clementine-spotify-blob.patch
66− (fetchpatch {
67− # "short-term" fix for execution on wayland (1.4.0rc1-131-g2179027a6)
68− # for https://github.com/clementine-player/Clementine/issues/6587
69− url = "https://github.com/clementine-player/Clementine/commit/2179027a6d97530c857e43be873baacd696ff332.patch";
70− sha256 = "0344bfcyvjim5ph8w4km6zkg96rj5g9ybp9x14qgyw2gkdksimn6";
71− })
72 ];
65 ];
73
66
74 nativeBuildInputs = [
67 nativeBuildInputs = [
pkgs/applications/audio/cmus/default.nix+2−2
@@ -1,5 +1,5 @@
1{ config, lib, stdenv, fetchFromGitHub, runCommand, ncurses, pkg-config
1{ config, lib, stdenv, fetchFromGitHub, runCommand, ncurses, pkg-config
2−, libiconv, CoreAudio, AudioUnit
2+, libiconv, CoreAudio, AudioUnit, VideoToolbox
3
3
4, alsaSupport ? stdenv.isLinux, alsa-lib ? null
4, alsaSupport ? stdenv.isLinux, alsa-lib ? null
5# simple fallback for everyone else
5# simple fallback for everyone else
@@ -121,7 +121,7 @@ stdenv.mkDerivation rec {
121 nativeBuildInputs = [ pkg-config ];
121 nativeBuildInputs = [ pkg-config ];
122 buildInputs = [ ncurses ]
122 buildInputs = [ ncurses ]
123 ++ lib.optional stdenv.cc.isClang clangGCC
123 ++ lib.optional stdenv.cc.isClang clangGCC
124− ++ lib.optionals stdenv.isDarwin [ libiconv CoreAudio AudioUnit ]
124+ ++ lib.optionals stdenv.isDarwin [ libiconv CoreAudio AudioUnit VideoToolbox ]
125 ++ flatten (concatMap (a: a.deps) opts);
125 ++ flatten (concatMap (a: a.deps) opts);
126
126
127 makeFlags = [ "LD=$(CC)" ];
127 makeFlags = [ "LD=$(CC)" ];
pkgs/applications/audio/denemo/default.nix+2−2
@@ -6,11 +6,11 @@
6
6
7stdenv.mkDerivation rec {
7stdenv.mkDerivation rec {
8 pname = "denemo";
8 pname = "denemo";
9− version = "2.5.0";
9+ version = "2.6.0";
10
10
11 src = fetchurl {
11 src = fetchurl {
12 url = "https://ftp.gnu.org/gnu/denemo/denemo-${version}.tar.gz";
12 url = "https://ftp.gnu.org/gnu/denemo/denemo-${version}.tar.gz";
13− sha256 = "sha256-B6GbBL/o/z0emT+Iw6XvWmAsJCmIwSGCyV1DkhDyfBY=";
13+ sha256 = "sha256-S+WXDGmEf5fx+HYnXJdE5QNOfJg7EqEEX7IMI2SUtV0=";
14 };
14 };
15
15
16 buildInputs = [
16 buildInputs = [
pkgs/applications/audio/dragonfly-reverb/default.nix+2−2
@@ -2,13 +2,13 @@
2
2
3stdenv.mkDerivation rec {
3stdenv.mkDerivation rec {
4 pname = "dragonfly-reverb";
4 pname = "dragonfly-reverb";
5− version = "3.2.5";
5+ version = "3.2.6";
6
6
7 src = fetchFromGitHub {
7 src = fetchFromGitHub {
8 owner = "michaelwillis";
8 owner = "michaelwillis";
9 repo = "dragonfly-reverb";
9 repo = "dragonfly-reverb";
10 rev = version;
10 rev = version;
11− sha256 = "14kia9wjs0nqfx4psnr3vf4x6hihkf80gb0mjzmdnnnk4cnrdydm";
11+ sha256 = "sha256-hTapy/wXt1rRZVdkx2RDW8LS/DcY30p+WaAWgemGqVo=";
12 fetchSubmodules = true;
12 fetchSubmodules = true;
13 };
13 };
14
14
pkgs/applications/audio/faust/faust2.nix+2−2
@@ -20,13 +20,13 @@ with lib.strings;
20
20
21let
21let
22
22
23− version = "2.37.3";
23+ version = "2.40.0";
24
24
25 src = fetchFromGitHub {
25 src = fetchFromGitHub {
26 owner = "grame-cncm";
26 owner = "grame-cncm";
27 repo = "faust";
27 repo = "faust";
28 rev = version;
28 rev = version;
29− sha256 = "sha256-Jzauw8+vBjtbK73Bh4huhX1ql1cWmh80EzEET3x03rc=";
29+ sha256 = "sha256-IsrLaoMDwrDPxtqCXIy/7tZCdogTUkJ00obSco9SR/A=";
30 fetchSubmodules = true;
30 fetchSubmodules = true;
31 };
31 };
32
32
pkgs/applications/audio/faust/faustlive.nix+9−12
@@ -1,37 +1,34 @@
1{ lib, stdenv, fetchFromGitHub
1{ lib, stdenv, fetchFromGitHub
2, llvm_10, qt5, qrencode, libmicrohttpd, libjack2, alsa-lib, faust, curl
2, llvm_10, qt5, qrencode, libmicrohttpd, libjack2, alsa-lib, faust, curl
3−, bc, coreutils, which, libsndfile, pkg-config, libxcb
3+, bc, coreutils, which, libsndfile, flac, libogg, libvorbis, libopus, pkg-config, libxcb, cmake, gnutls, libtasn1, p11-kit
4}:
4}:
5
5
6stdenv.mkDerivation rec {
6stdenv.mkDerivation rec {
7 pname = "faustlive";
7 pname = "faustlive";
8− version = "2.5.5";
8+ version = "2.5.8";
9 src = fetchFromGitHub {
9 src = fetchFromGitHub {
10 owner = "grame-cncm";
10 owner = "grame-cncm";
11 repo = "faustlive";
11 repo = "faustlive";
12 rev = version;
12 rev = version;
13− sha256 = "0qbn05nq170ckycwalkk5fppklc4g457mapr7p7ryrhc1hwzffm9";
13+ sha256 = "sha256-dt5YlvaCZ6JiNGPwVXPrKzVGWxnhdyP4lnKgck7ZSF8=";
14 fetchSubmodules = true;
14 fetchSubmodules = true;
15 };
15 };
16
16
17− nativeBuildInputs = [ pkg-config qt5.wrapQtAppsHook ];
17+ nativeBuildInputs = [ pkg-config qt5.wrapQtAppsHook cmake ];
18
18
19 buildInputs = [
19 buildInputs = [
20 llvm_10 qt5.qtbase qrencode libmicrohttpd libjack2 alsa-lib faust curl
20 llvm_10 qt5.qtbase qrencode libmicrohttpd libjack2 alsa-lib faust curl
21− bc coreutils which libsndfile libxcb
21+ bc coreutils which libsndfile flac libogg libvorbis libopus libxcb gnutls libtasn1 p11-kit
22 ];
22 ];
23
23
24 makeFlags = [ "PREFIX=$(out)" ];
24 makeFlags = [ "PREFIX=$(out)" ];
25
25
26− postPatch = "cd Build";
26+ postInstall = ''
27−
27+ wrapProgram $out/bin/FaustLive --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ libmicrohttpd libsndfile faust llvm_10 ]}"
28− installPhase = ''
29− install -d "$out/bin"
30− install -d "$out/share/applications"
31− install FaustLive/FaustLive "$out/bin"
32− install rsrc/FaustLive.desktop "$out/share/applications"
33 '';
28 '';
34
29
30+ postPatch = "cd Build";
31+
35 meta = with lib; {
32 meta = with lib; {
36 description = "A standalone just-in-time Faust compiler";
33 description = "A standalone just-in-time Faust compiler";
37 longDescription = ''
34 longDescription = ''
pkgs/applications/audio/faustPhysicalModeling/default.nix+2−2
@@ -1,13 +1,13 @@
1{ stdenv, lib, fetchFromGitHub, faust2jaqt, faust2lv2 }:
1{ stdenv, lib, fetchFromGitHub, faust2jaqt, faust2lv2 }:
2stdenv.mkDerivation rec {
2stdenv.mkDerivation rec {
3 pname = "faustPhysicalModeling";
3 pname = "faustPhysicalModeling";
4− version = "2.37.3";
4+ version = "2.40.0";
5
5
6 src = fetchFromGitHub {
6 src = fetchFromGitHub {
7 owner = "grame-cncm";
7 owner = "grame-cncm";
8 repo = "faust";
8 repo = "faust";
9 rev = version;
9 rev = version;
10− sha256 = "sha256-h6L+qRkN2chnI4821WrjD3uRFw3J0sUYVLL8w57vR1U=";
10+ sha256 = "sha256-t3I3j5s2ACHfub+fxxaTwu+5ptEwH0JQpVdmHYOzbCA=";
11 };
11 };
12
12
13 buildInputs = [ faust2jaqt faust2lv2 ];
13 buildInputs = [ faust2jaqt faust2lv2 ];
pkgs/applications/audio/flac/default.nix+2−10
@@ -2,21 +2,13 @@
2
2
3stdenv.mkDerivation rec {
3stdenv.mkDerivation rec {
4 pname = "flac";
4 pname = "flac";
5− version = "1.3.3";
5+ version = "1.3.4";
6
6
7 src = fetchurl {
7 src = fetchurl {
8 url = "http://downloads.xiph.org/releases/flac/${pname}-${version}.tar.xz";
8 url = "http://downloads.xiph.org/releases/flac/${pname}-${version}.tar.xz";
9− sha256 = "0j0p9sf56a2fm2hkjnf7x3py5ir49jyavg4q5zdyd7bcf6yq4gi1";
9+ sha256 = "0dz7am8kbc97a6afml1h4yp085274prg8j7csryds8m3fmz61w4g";
10 };
10 };
11
11
12− patches = [
13− (fetchpatch {
14− name = "CVE-2020-0499.patch";
15− url = "https://github.com/xiph/flac/commit/2e7931c27eb15e387da440a37f12437e35b22dd4.patch";
16− sha256 = "160qzq9ms5addz7sx06pnyjjkqrffr54r4wd8735vy4x008z71ah";
17− })
18− ];
19−
20 buildInputs = [ libogg ];
12 buildInputs = [ libogg ];
21
13
22 #doCheck = true; # takes lots of time
14 #doCheck = true; # takes lots of time
pkgs/applications/audio/fluidsynth/default.nix+2−2
@@ -5,13 +5,13 @@
5
5
6stdenv.mkDerivation rec {
6stdenv.mkDerivation rec {
7 pname = "fluidsynth";
7 pname = "fluidsynth";
8− version = "2.2.3";
8+ version = "2.2.5";
9
9
10 src = fetchFromGitHub {
10 src = fetchFromGitHub {
11 owner = "FluidSynth";
11 owner = "FluidSynth";
12 repo = "fluidsynth";
12 repo = "fluidsynth";
13 rev = "v${version}";
13 rev = "v${version}";
14− sha256 = "0x5808d03ym23np17nl8gfbkx3c4y3d7jyyr2222wn2prswbb6x3";
14+ sha256 = "sha256-aR8TLxl6OziP+DMSNro0DB/UtvzXDeDYQ3o/iy70XD4=";
15 };
15 };
16
16
17 nativeBuildInputs = [ buildPackages.stdenv.cc pkg-config cmake ];
17 nativeBuildInputs = [ buildPackages.stdenv.cc pkg-config cmake ];
pkgs/applications/audio/foo-yc20/default.nixdeleted−29
@@ -1,29 +0,0 @@
1−{ lib, stdenv, fetchFromGitHub, libjack2, gtk2, lv2, faust, pkg-config }:
2−
3−stdenv.mkDerivation {
4− version = "unstable-2015-05-21";
5− pname = "foo-yc20";
6− src = fetchFromGitHub {
7− owner = "sampov2";
8− repo = "foo-yc20";
9− rev = "edd9d14c91229429b14270a181743e1046160ca8";
10− sha256 = "0i8261n95n4xic766h70xkrpbvw3sag96n1883ahmg6h7yb94avq";
11− };
12−
13− nativeBuildInputs = [ pkg-config ];
14− buildInputs = [ libjack2 gtk2 lv2 faust ];
15−
16− makeFlags = [ "PREFIX=$(out)" ];
17−
18− # remove lv2 until https://github.com/sampov2/foo-yc20/issues/6 is resolved
19− postInstallFixup = "rm -rf $out/lib/lv2";
20−
21− meta = with lib; {
22− broken = true; # see: https://github.com/sampov2/foo-yc20/issues/7
23− description = "A Faust implementation of a 1969 designed Yamaha combo organ, the YC-20";
24− homepage = "https://github.com/sampov2/foo-yc20";
25− license = with licenses; [ bsd3 lgpl21 mpl11 ];
26− maintainers = [ maintainers.magnetophon ];
27− platforms = platforms.linux;
28− };
29−}
pkgs/applications/audio/ft2-clone/default.nix+2−2
@@ -13,13 +13,13 @@
13
13
14stdenv.mkDerivation rec {
14stdenv.mkDerivation rec {
15 pname = "ft2-clone";
15 pname = "ft2-clone";
16− version = "1.52";
16+ version = "1.54";
17
17
18 src = fetchFromGitHub {
18 src = fetchFromGitHub {
19 owner = "8bitbubsy";
19 owner = "8bitbubsy";
20 repo = "ft2-clone";
20 repo = "ft2-clone";
21 rev = "v${version}";
21 rev = "v${version}";
22− sha256 = "sha256-RyZ3PV7jaTN3DEYMT0BqKDHbb+7/IgiRaCra1xA0h1A=";
22+ sha256 = "sha256-lNiQ0X2vvPGubb4Pde+eh0Z6ClCQgigIUM+PddaiVUg=";
23 };
23 };
24
24
25 # Adapt the linux-only CMakeLists to darwin (more reliable than make-macos.sh)
25 # Adapt the linux-only CMakeLists to darwin (more reliable than make-macos.sh)
pkgs/applications/audio/furnace/default.nix+2−2
@@ -1,7 +1,7 @@
1{ stdenv
1{ stdenv
2, lib
2, lib
3, gitUpdater
3, gitUpdater
4−, testVersion
4+, testers
5, furnace
5, furnace
6, fetchFromGitHub
6, fetchFromGitHub
7, cmake
7, cmake
@@ -83,7 +83,7 @@ stdenv.mkDerivation rec {
83 inherit pname version;
83 inherit pname version;
84 rev-prefix = "v";
84 rev-prefix = "v";
85 };
85 };
86− tests.version = testVersion {
86+ tests.version = testers.testVersion {
87 package = furnace;
87 package = furnace;
88 # The command always exits with code 1
88 # The command always exits with code 1
89 command = "(furnace --version || [ $? -eq 1 ])";
89 command = "(furnace --version || [ $? -eq 1 ])";
pkgs/applications/audio/greg/default.nix+3−3
@@ -2,15 +2,15 @@
2
2
3with pythonPackages; buildPythonApplication rec {
3with pythonPackages; buildPythonApplication rec {
4 pname = "greg";
4 pname = "greg";
5− version = "0.4.7";
5+ version = "0.4.8";
6
6
7 disabled = !isPy3k;
7 disabled = !isPy3k;
8
8
9 src = fetchFromGitHub {
9 src = fetchFromGitHub {
10 owner = "manolomartinez";
10 owner = "manolomartinez";
11 repo = pname;
11 repo = pname;
12− rev = "v" + version;
12+ rev = "refs/tags/v${version}";
13− sha256 = "0bdzgh2k1ppgcvqiasxwp3w89q44s4jgwjidlips3ixx1bzm822v";
13+ sha256 = "sha256-o4+tXVJTgT52JyJOC+Glr2cvZjbTaZL8TIsmz+A4vE4=";
14 };
14 };
15
15
16 propagatedBuildInputs = [ setuptools feedparser ];
16 propagatedBuildInputs = [ setuptools feedparser ];
pkgs/applications/audio/gspeech/default.nix+2−2
@@ -20,13 +20,13 @@
20
20
21python3.pkgs.buildPythonApplication rec {
21python3.pkgs.buildPythonApplication rec {
22 pname = "gSpeech";
22 pname = "gSpeech";
23− version = "0.10.1";
23+ version = "0.11.0";
24
24
25 src = fetchFromGitHub {
25 src = fetchFromGitHub {
26 owner = "mothsart";
26 owner = "mothsart";
27 repo = pname;
27 repo = pname;
28 rev = version;
28 rev = version;
29− sha256 = "1i0jwgxcn94nsi7c0ad0w77y04g04ka2szijzfqzqfnacdmdyrfc";
29+ sha256 = "0z11yxvgi8m2xjmmf56zla91jpmf0a4imwi9qqz6bp51pw4sk8gp";
30 };
30 };
31
31
32 nativeBuildInputs = [
32 nativeBuildInputs = [
pkgs/applications/audio/guitarix/default.nix+2
@@ -108,6 +108,8 @@ stdenv.mkDerivation rec {
108 "--install-roboto-font"
108 "--install-roboto-font"
109 ] ++ optional optimizationSupport "--optimization";
109 ] ++ optional optimizationSupport "--optimization";
110
110
111+ NIX_CFLAGS_COMPILE = [ "-fpermissive" ];
112+
111 meta = with lib; {
113 meta = with lib; {
112 description = "A virtual guitar amplifier for Linux running with JACK";
114 description = "A virtual guitar amplifier for Linux running with JACK";
113 longDescription = ''
115 longDescription = ''
pkgs/applications/audio/helio-workstation/default.nix+2−2
@@ -5,14 +5,14 @@
5
5
6stdenv.mkDerivation rec {
6stdenv.mkDerivation rec {
7 pname = "helio-workstation";
7 pname = "helio-workstation";
8− version = "3.8";
8+ version = "3.9";
9
9
10 src = fetchFromGitHub {
10 src = fetchFromGitHub {
11 owner = "helio-fm";
11 owner = "helio-fm";
12 repo = pname;
12 repo = pname;
13 rev = version;
13 rev = version;
14 fetchSubmodules = true;
14 fetchSubmodules = true;
15− sha256 = "sha256-uwRSOJ5WvDH4mfL9pCTCGzuSRT8SIBrI+Wsbumzejv0=";
15+ sha256 = "sha256-AtgKgw+F5lc0Ma3zOxmk3iaZQp2KZb2FP5F8QvvYTT4=";
16 };
16 };
17
17
18 buildInputs = [
18 buildInputs = [
pkgs/applications/audio/hivelytracker/default.nix+1−1
@@ -60,7 +60,7 @@ stdenv.mkDerivation rec {
60 # files passed as arguments anyway, so this works well enough until the
60 # files passed as arguments anyway, so this works well enough until the
61 # issue is fixed.
61 # issue is fixed.
62 wrapProgram $out/bin/hivelytracker \
62 wrapProgram $out/bin/hivelytracker \
63− --run "cd $out/share/hivelytracker"
63+ --chdir "$out/share/hivelytracker"
64
64
65 # Also install the hvl2wav tool
65 # Also install the hvl2wav tool
66 install -Dm755 hvl2wav/hvl2wav $out/bin/hvl2wav
66 install -Dm755 hvl2wav/hvl2wav $out/bin/hvl2wav
pkgs/applications/audio/hqplayer-desktop/default.nix+1
@@ -86,6 +86,7 @@ mkDerivation rec {
86 homepage = "https://www.signalyst.com/custom.html";
86 homepage = "https://www.signalyst.com/custom.html";
87 description = "High-end upsampling multichannel software HD-audio player";
87 description = "High-end upsampling multichannel software HD-audio player";
88 license = licenses.unfree;
88 license = licenses.unfree;
89+ platforms = [ "x86_64-linux" ];
89 maintainers = with maintainers; [ lovesegfault ];
90 maintainers = with maintainers; [ lovesegfault ];
90 };
91 };
91}
92}
pkgs/applications/audio/jacktrip/default.nixnew file+61
@@ -0,0 +1,61 @@
1+{ lib, mkDerivation, fetchFromGitHub
2+, pkg-config
3+, help2man
4+, qmake
5+, alsa-lib
6+, libjack2
7+, dbus
8+, qtbase
9+, qttools
10+, qtx11extras
11+, meson
12+, python3
13+, rtaudio
14+, ninja
15+}:
16+
17+mkDerivation rec {
18+ version = "1.5.3";
19+ pname = "jacktrip";
20+
21+ src = fetchFromGitHub {
22+ owner = "jacktrip";
23+ repo = "jacktrip";
24+ rev = "v${version}";
25+ sha256 = "sha256-sfAYMTnBjT4LkgksyzDGGy97NLX5ljjhNDFioQnTzLs=";
26+ };
27+
28+ preConfigure = ''
29+ rm build
30+ '';
31+
32+ buildInputs = [
33+ rtaudio
34+ qtbase
35+ qtx11extras
36+ libjack2
37+ dbus
38+ ];
39+
40+ nativeBuildInputs = [
41+ python3
42+ python3.pkgs.pyaml
43+ python3.pkgs.jinja2
44+ ninja
45+ help2man
46+ meson
47+ qmake
48+ qttools
49+ pkg-config
50+ ];
51+
52+ qmakeFlags = [ "jacktrip.pro" ];
53+
54+ meta = with lib; {
55+ description = "Multi-machine audio network performance over the Internet";
56+ homepage = "https://jacktrip.github.io/jacktrip/";
57+ license = with licenses; [ gpl3 lgpl3 mit ];
58+ maintainers = [ maintainers.iwanb ];
59+ platforms = platforms.linux;
60+ };
61+}
pkgs/applications/audio/jamesdsp/default.nix+40−5

This diff is too big to show here.

pkgs/applications/audio/jmusicbot/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/libopenmpt/default.nixdeleted−42

This diff is too big to show here.

pkgs/applications/audio/lollypop/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/losslessaudiochecker/default.nix+1−1

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/moc/default.nix+5−3

This diff is too big to show here.

pkgs/applications/audio/mopidy/mopidy.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/musikcube/default.nix+5−3

This diff is too big to show here.

pkgs/applications/audio/ncspot/default.nix+3−7

This diff is too big to show here.

pkgs/applications/audio/ncspot/rust_1_57_support.patchdeleted−21

This diff is too big to show here.

pkgs/applications/audio/noise-repellent/default.nix+11−9

This diff is too big to show here.

pkgs/applications/audio/ocenaudio/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/odin2/default.nixnew file+79

This diff is too big to show here.

pkgs/applications/audio/osdlyrics/default.nixnew file+87

This diff is too big to show here.

pkgs/applications/audio/parlatype/default.nixdeleted−66

This diff is too big to show here.

pkgs/applications/audio/pianobar/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pipecontrol/default.nixnew file+50

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/praat/default.nix+2−2

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/puddletag/default.nix+1

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-modules-bt/default.nixdeleted−91

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-modules-bt/fix-install-path.patchdeleted−11

This diff is too big to show here.

pkgs/applications/audio/pyradio/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/qpwgraph/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/sfizz/default.nix+6−1

This diff is too big to show here.

pkgs/applications/audio/sfxr-qt/default.nix+7

This diff is too big to show here.

pkgs/applications/audio/shortwave/default.nix+9−12

This diff is too big to show here.

pkgs/applications/audio/sonixd/default.nixnew file+27

This diff is too big to show here.

pkgs/applications/audio/soundwireserver/default.nix+1

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-tui/default.nix+1

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/strawberry/default.nix+1

This diff is too big to show here.

pkgs/applications/audio/viper4linux-gui/default.nixnew file+82

This diff is too big to show here.

pkgs/applications/audio/viper4linux/default.nixnew file+61

This diff is too big to show here.

pkgs/applications/audio/whipper/default.nix+8

This diff is too big to show here.

pkgs/applications/audio/x42-plugins/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/bisq-desktop/default.nix+1−2

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/btcpayserver/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/btcpayserver/deps.nix+29−29

This diff is too big to show here.

pkgs/applications/blockchains/chia-plotter/default.nix+13−6

This diff is too big to show here.

pkgs/applications/blockchains/chia-plotter/dont_fetch_dependencies.patch+24−11

This diff is too big to show here.

pkgs/applications/blockchains/clightning/default.nix+2−2

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/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/lnd/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/lndmanage/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/monero-cli/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/monero-gui/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/namecoin/default.nix+5−6

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/deps.nix+15

This diff is too big to show here.

pkgs/applications/blockchains/nearcore/default.nixnew file+42

This diff is too big to show here.

pkgs/applications/blockchains/openethereum/default.nix+3−3

This diff is too big to show here.

pkgs/applications/blockchains/polkadot/default.nix+2−1

This diff is too big to show here.

pkgs/applications/blockchains/solana/default.nix+9−4

This diff is too big to show here.

pkgs/applications/blockchains/solana/pin.jsonnew file+5

This diff is too big to show here.

pkgs/applications/blockchains/solana/update.shnew file+33

This diff is too big to show here.

pkgs/applications/blockchains/stellar-core/default.nix+7−3

This diff is too big to show here.

pkgs/applications/blockchains/wasabibackend/default.nix+1−1

This diff is too big to show here.

pkgs/applications/blockchains/zcash/default.nix+6−6

This diff is too big to show here.

pkgs/applications/editors/android-studio/common.nix+5−3

This diff is too big to show here.

pkgs/applications/editors/android-studio/default.nix+8−7

This diff is too big to show here.

pkgs/applications/editors/apostrophe/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/bluej/default.nix+35−8

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+12−12

This diff is too big to show here.

pkgs/applications/editors/eclipse/default.nix+13−13

This diff is too big to show here.

pkgs/applications/editors/eclipse/plugins.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/emacs/27.nixdeleted−11

This diff is too big to show here.

pkgs/applications/editors/emacs/28.nixnew file+5

This diff is too big to show here.

pkgs/applications/editors/emacs/at-fdcwd.patchdeleted−15

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/cedet/default.nixdeleted−52

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/control-lock/default.nixnew file+23

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix+124−45

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ement/default.nix+11−3

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/header-file-mode/default.nixnew file+30

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/manual-packages.nix+7−1

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/nongnu-generated.nix+26−32

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/recipes-archive-melpa.json+2254−1744

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/default-grammars.jsonnew file+32

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/default.nixnew file+44

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/update-defaults.pynew file+74

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tsc/default.nixnew file+89

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tsc/src.jsonnew file+10

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tsc/update.pynew file+122

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/updatenew file+10

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-manualnew file+7

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-manual.nixnew file+11

This diff is too big to show here.

pkgs/applications/editors/emacs/generic.nix+9−5

This diff is too big to show here.

pkgs/applications/editors/gnome-builder/default.nix+2−13

This diff is too big to show here.

pkgs/applications/editors/helix/default.nix+13−10

This diff is too big to show here.

pkgs/applications/editors/jetbrains/default.nix+20−17

This diff is too big to show here.

pkgs/applications/editors/jetbrains/update.py+17−14

This diff is too big to show here.

pkgs/applications/editors/jetbrains/versions.json+132−132

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/octave/kernel.nix+4−6

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/wolfram/default.nixnew file+22

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/wolfram/kernel.nixnew file+32

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/default.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/kakoune-plugin-names+20−19

This diff is too big to show here.

pkgs/applications/editors/lapce/default.nix+23−7

This diff is too big to show here.

pkgs/applications/editors/lapce/fix-version.patchdeleted−31

This diff is too big to show here.

pkgs/applications/editors/lifeograph/default.nix+5−5

This diff is too big to show here.

pkgs/applications/editors/marker/default.nix+4−1

This diff is too big to show here.

pkgs/applications/editors/mg/default.nix+4

This diff is too big to show here.

pkgs/applications/editors/mle/default.nix+11−1

This diff is too big to show here.

pkgs/applications/editors/neovim/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/neovim/neovide/default.nix+6−6

This diff is too big to show here.

pkgs/applications/editors/neovim/ruby_provider/Gemfile.lock+2−2

This diff is too big to show here.

pkgs/applications/editors/neovim/ruby_provider/gemset.nix+5−5

This diff is too big to show here.

pkgs/applications/editors/oed/default.nix+9

This diff is too big to show here.

pkgs/applications/editors/okteta/default.nix+2

This diff is too big to show here.

pkgs/applications/editors/oni2/common.nix−1

This diff is too big to show here.

pkgs/applications/editors/pinegrow/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/poke/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/rstudio/default.nix+1−1

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/texmaker/default.nix+2−2

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/tiled/default.nix+2−2

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/plugins/build-vim-plugin.nix+2

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/default.nix+8−3

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/generated.nix+1344−1308

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/overrides.nix+4−5

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/update.py+47−16

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/vim-command-check-hook.shnew file+25

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/vim-plugin-names+1014−1010

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/vim-utils.nix+18−2

This diff is too big to show here.

pkgs/applications/editors/vscode/extensions/default.nix+27−15

This diff is too big to show here.

pkgs/applications/editors/vscode/extensions/ms-vsliveshare-vsliveshare/default.nix−1

This diff is too big to show here.

pkgs/applications/editors/vscode/extensions/remote-ssh/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/vscode/generic.nix+9−3

This diff is too big to show here.

pkgs/applications/editors/vscode/update-vscodium.sh+16−12

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+10−13

This diff is too big to show here.

pkgs/applications/editors/xedit/default.nix+2−2

This diff is too big to show here.

pkgs/applications/emulators/basiliskii/default.nixnew file+28

This diff is too big to show here.

pkgs/applications/emulators/basiliskii/remove-redhat-6-workaround-for-scsi-sg.h.patchnew file+10

This diff is too big to show here.

pkgs/applications/emulators/ares/default.nix → pkgs/applications/emulators/bsnes/ares/default.nixrenamed

The content is the same.

pkgs/applications/emulators/ares/fix-ruby.patch → pkgs/applications/emulators/bsnes/ares/fix-ruby.patchrenamed

The content is the same.

pkgs/applications/emulators/bsnes-hd/default.nix → pkgs/applications/emulators/bsnes/bsnes-hd/default.nixrenamed

The content is the same.

pkgs/applications/emulators/bsnes-hd/macos-copy-app-to-prefix.patch → pkgs/applications/emulators/bsnes/bsnes-hd/macos-copy-app-to-prefix.patchrenamed

The content is the same.

pkgs/applications/emulators/bsnes-hd/macos-replace-sips-with-png2icns.patch → pkgs/applications/emulators/bsnes/bsnes-hd/macos-replace-sips-with-png2icns.patchrenamed

The content is the same.

pkgs/applications/emulators/higan/001-include-cmath.patch → pkgs/applications/emulators/bsnes/higan/001-include-cmath.patchrenamed

The content is the same.

pkgs/applications/emulators/higan/002-sips-to-png2icns.patch → pkgs/applications/emulators/bsnes/higan/002-sips-to-png2icns.patchrenamed

The content is the same.

pkgs/applications/emulators/higan/default.nix → pkgs/applications/emulators/bsnes/higan/default.nixrenamed

The content is the same.

pkgs/applications/emulators/commanderx16/emulator.nix+7−5

This diff is too big to show here.

pkgs/applications/emulators/commanderx16/rom.nix+12−6

This diff is too big to show here.

pkgs/applications/emulators/dolphin-emu/master.nix+4−4

This diff is too big to show here.

pkgs/applications/emulators/dolphin-emu/primehack.nix+2−2

This diff is too big to show here.

pkgs/applications/emulators/epsxe/default.nixdeleted−52

This diff is too big to show here.

pkgs/applications/emulators/fakenes/build.patchdeleted−84

This diff is too big to show here.

pkgs/applications/emulators/fakenes/default.nixdeleted−34

This diff is too big to show here.

pkgs/applications/emulators/flycast/default.nix+2−2

This diff is too big to show here.

pkgs/applications/emulators/mame/0001-Revert-Added-PDF-documentation-to-dist.mak.patchnew file+37

This diff is too big to show here.

pkgs/applications/emulators/mame/default.nix+64−14

This diff is too big to show here.

pkgs/applications/emulators/proton-caller/default.nix+4−3

This diff is too big to show here.

pkgs/applications/emulators/qmc2/default.nixdeleted−41

This diff is too big to show here.

pkgs/applications/emulators/retroarch/cores.nix+16−43

This diff is too big to show here.

pkgs/applications/emulators/retroarch/default.nix+25−8

This diff is too big to show here.

pkgs/applications/emulators/retroarch/disable-menu-show-core-updater.patchdeleted−13

This diff is too big to show here.

pkgs/applications/emulators/retroarch/0001-Disable-menu_show_core_updater.patch → pkgs/applications/emulators/retroarch/disable-menu_show_core_updater.patchrenamed+1−1

This diff is too big to show here.

pkgs/applications/emulators/retroarch/hashes.json+139−150

This diff is too big to show here.

pkgs/applications/emulators/retroarch/update.py → pkgs/applications/emulators/retroarch/update_cores.pyrenamed+7−13

This diff is too big to show here.

pkgs/applications/emulators/retroarch/0002-Use-fixed-paths-on-libretro_info_path.patch → pkgs/applications/emulators/retroarch/use-fixed-paths-on-libretro_info_path.patchrenamed+21−17

This diff is too big to show here.

pkgs/applications/emulators/retroarch/wrapper.nix+10−6

This diff is too big to show here.

pkgs/applications/emulators/ripes/default.nixnew file+50

This diff is too big to show here.

pkgs/applications/emulators/ryujinx/default.nix+7−3

This diff is too big to show here.

pkgs/applications/emulators/ryujinx/deps.nix+9−10

This diff is too big to show here.

pkgs/applications/emulators/ryujinx/updater.sh+51−24

This diff is too big to show here.

pkgs/applications/emulators/snes9x-gtk/default.nixdeleted−37

This diff is too big to show here.

pkgs/applications/emulators/snes9x/default.nixnew file+130

This diff is too big to show here.

pkgs/applications/emulators/tinyemu/default.nix+6−1

This diff is too big to show here.

pkgs/applications/emulators/yuzu/base.nixdeleted−86

This diff is too big to show here.

pkgs/applications/emulators/yuzu/compatibility-list.jsonnew file+1

This diff is too big to show here.

pkgs/applications/emulators/yuzu/default.nix+22−10

This diff is too big to show here.

pkgs/applications/emulators/yuzu/generic.nixnew file+157

This diff is too big to show here.

pkgs/applications/emulators/yuzu/update.shnew file+102

This diff is too big to show here.

pkgs/applications/emulators/zesarux/default.nix+8

This diff is too big to show here.

pkgs/applications/finance/irpf/default.nix+10−3

This diff is too big to show here.

pkgs/applications/gis/grass/default.nix+10−36

This diff is too big to show here.

pkgs/applications/gis/qgis/unwrapped-ltr.nix+2−2

This diff is too big to show here.

pkgs/applications/gis/qgis/unwrapped.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/ImageMagick/7.0.nix+6−11

This diff is too big to show here.

pkgs/applications/graphics/apitrace/default.nix+6

This diff is too big to show here.

pkgs/applications/graphics/apitrace/glibc-2.34-compat.patchnew file+13

This diff is too big to show here.

pkgs/applications/graphics/awesomebump/default.nix+1−1

This diff is too big to show here.

pkgs/applications/graphics/cloudcompare/default.nix+47−12

This diff is too big to show here.

pkgs/applications/graphics/cq-editor/default.nix+1−1

This diff is too big to show here.

pkgs/applications/graphics/darktable/default.nix+2

This diff is too big to show here.

pkgs/applications/graphics/digikam/default.nix+14−3

This diff is too big to show here.

pkgs/applications/graphics/drawing/default.nix+11

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/foxotron/default.nix+1−1

This diff is too big to show here.

pkgs/applications/graphics/geeqie/default.nix+4−4

This diff is too big to show here.

pkgs/applications/graphics/gimp/plugins/default.nix+40−1

This diff is too big to show here.

pkgs/applications/graphics/graphicsmagick/default.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/gscan2pdf/default.nix+2−4

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/hydrus/default.nix+3−3

This diff is too big to show here.

pkgs/applications/graphics/imgbrd-grabber/default.nix+1−1

This diff is too big to show here.

pkgs/applications/graphics/inkscape/default.nix+1

This diff is too big to show here.

pkgs/applications/graphics/jpegrescan/default.nix+5−1

This diff is too big to show here.

pkgs/applications/graphics/mypaint/default.nix+10

This diff is too big to show here.

pkgs/applications/graphics/ocrfeeder/default.nix+5−8

This diff is too big to show here.

pkgs/applications/graphics/openboard/default.nix+3−4

This diff is too big to show here.

pkgs/applications/graphics/openscad/default.nix+4

This diff is too big to show here.

pkgs/applications/graphics/ovito/default.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/photivo/default.nixdeleted−54

This diff is too big to show here.

pkgs/applications/graphics/photivo/gcc6.patchdeleted−13

This diff is too big to show here.

pkgs/applications/graphics/pixeluvo/default.nix+1

This diff is too big to show here.

pkgs/applications/graphics/rawtherapee/default.nix+3

This diff is too big to show here.

pkgs/applications/graphics/rawtherapee/fix-6324.patchnew file+356

This diff is too big to show here.

pkgs/applications/graphics/sane/backends/brscan4/default.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/sane/backends/brscan5/default.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/shotwell/default.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/synfigstudio/default.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/tesseract/default.nix+6

This diff is too big to show here.

pkgs/applications/graphics/tesseract/fetch-language-hashes+2−2

This diff is too big to show here.

pkgs/applications/graphics/tesseract/languages.nix+245−245

This diff is too big to show here.

pkgs/applications/graphics/tesseract/tesseract3.nix+14−3

This diff is too big to show here.

pkgs/applications/graphics/tesseract/tesseract4.nix+15−3

This diff is too big to show here.

pkgs/applications/graphics/tesseract/tesseract5.nixnew file+39

This diff is too big to show here.

pkgs/applications/graphics/tesseract/wrapper.nix+29−3

This diff is too big to show here.

pkgs/applications/graphics/unigine-sanctuary/default.nixnew file+97

This diff is too big to show here.

pkgs/applications/graphics/unigine-tropics/default.nixnew file+95

This diff is too big to show here.

pkgs/applications/graphics/unigine-valley/default.nix+120−99

This diff is too big to show here.

pkgs/applications/graphics/yed/default.nix+2−2

This diff is too big to show here.

pkgs/applications/kde/default.nix+4−1

This diff is too big to show here.

pkgs/applications/networking/browsers/falkon/default.nix → pkgs/applications/kde/falkon.nixrenamed+4−13

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/kaddressbook.nix+4

This diff is too big to show here.

pkgs/applications/kde/kalarm.nix+2−2

This diff is too big to show here.

pkgs/applications/kde/kalarmcal.nixdeleted−19

This diff is too big to show here.

pkgs/applications/office/kalendar/default.nix → pkgs/applications/kde/kalendar.nixrenamed+1−10

This diff is too big to show here.

pkgs/applications/kde/kdegraphics-thumbnailers.nix+2−2

This diff is too big to show here.

pkgs/applications/kde/kdepim-addons.nix+2−2

This diff is too big to show here.

pkgs/applications/kde/kdepim-runtime/default.nix+2−2

This diff is too big to show here.

pkgs/applications/kde/kitinerary.nix+1−10

This diff is too big to show here.

pkgs/applications/kde/kmousetool.nixnew file+35

This diff is too big to show here.

pkgs/applications/kde/picmi.nix+1−11

This diff is too big to show here.

pkgs/applications/kde/pimcommon.nix+2−2

This diff is too big to show here.

pkgs/applications/graphics/skanpage/default.nix → pkgs/applications/kde/skanpage.nixrenamed+3−7

This diff is too big to show here.

pkgs/applications/kde/srcs.nix+937−921

This diff is too big to show here.

pkgs/applications/kde/yakuake.nix+2

This diff is too big to show here.

pkgs/applications/logging/sosreport/default.nixnew file+51

This diff is too big to show here.

pkgs/applications/misc/1password-gui/beta.nixnew file+132

This diff is too big to show here.

pkgs/applications/misc/1password-gui/default.nix+3−3

This diff is too big to show here.

pkgs/applications/misc/1password/default.nix+5−5

This diff is too big to show here.

pkgs/applications/misc/ArchiSteamFarm/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/ArchiSteamFarm/deps-aarch64-linux.nix+17−18

This diff is too big to show here.

pkgs/applications/misc/ArchiSteamFarm/deps-x86_64-linux.nix+17−18

This diff is too big to show here.

pkgs/applications/misc/ablog/default.nix+2−2

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/archivy/default.nix+9−3

This diff is too big to show here.

pkgs/applications/misc/audio/wavesurfer/default.nixdeleted−30

This diff is too big to show here.

pkgs/applications/misc/authy/default.nix+30−7

This diff is too big to show here.

pkgs/applications/misc/autospotting/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/azuredatastudio/default.nix+3−3

This diff is too big to show here.

pkgs/applications/misc/barrier/default.nix+12−1

This diff is too big to show here.

pkgs/applications/misc/bikeshed/default.nixnew file+77

This diff is too big to show here.

pkgs/applications/misc/blender/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/bottles/default.nix+7−17

This diff is too big to show here.

pkgs/applications/misc/bottles/update.pydeleted−65

This diff is too big to show here.

pkgs/applications/misc/buku/default.nix+2−1

This diff is too big to show here.

pkgs/applications/misc/calcoo/0001-javac-encoding.diffnew file+21

This diff is too big to show here.

pkgs/applications/misc/calcoo/default.nixnew file+58

This diff is too big to show here.

pkgs/applications/misc/calcurse/default.nix+4−3

This diff is too big to show here.

pkgs/applications/misc/calibre/default.nix+5−1

This diff is too big to show here.

pkgs/applications/misc/catclock/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/charm/default.nix+3−5

This diff is too big to show here.

pkgs/applications/misc/copyq/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/cubiomes-viewer/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+3−3

This diff is too big to show here.

pkgs/applications/misc/debian-goodies/default.nixnew file+70

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/electrum-grs/default.nix+3−21

This diff is too big to show here.

pkgs/applications/misc/evtest/default.nix+1−1

This diff is too big to show here.

pkgs/applications/misc/faircamp/default.nix+4−4

This diff is too big to show here.

pkgs/applications/misc/ff2mpv/default.nixnew file+34

This diff is too big to show here.

pkgs/applications/misc/firestarter/default.nix+3−1

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/foxitreader/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/fspy/default.nix+2−3

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/globe-cli/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/gnome-firmware-updater/default.nixdeleted−75

This diff is too big to show here.

pkgs/applications/misc/gnome-firmware/default.nixnew file+63

This diff is too big to show here.

pkgs/applications/misc/gnome-secrets/default.nix+4−10

This diff is too big to show here.

pkgs/applications/misc/gnome-solanum/default.nix+10

This diff is too big to show here.

pkgs/applications/misc/gpsprune/default.nix+2−2

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/gsctl/default.nix+13−7

This diff is too big to show here.

pkgs/applications/misc/hello/default.nix+11−9

This diff is too big to show here.

pkgs/applications/misc/hello/test.nixnew file+8

This diff is too big to show here.

pkgs/applications/misc/hubstaff/default.nix+1−1

This diff is too big to show here.

pkgs/applications/misc/hugo/default.nix+6−6

This diff is too big to show here.

pkgs/applications/misc/index-fm/default.nix−2

This diff is too big to show here.

pkgs/applications/misc/ipmiview/default.nix+3−3

This diff is too big to show here.

pkgs/applications/misc/join-desktop/default.nixnew file+73

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/josm/default.nix+4−4

This diff is too big to show here.

pkgs/applications/misc/k4dirstat/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/keylight-controller-mschneider82/default.nixnew file+53

This diff is too big to show here.

pkgs/applications/misc/kiln/default.nix+3−3

This diff is too big to show here.

pkgs/applications/misc/kjv/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/kratos/default.nix+3−3

This diff is too big to show here.

pkgs/applications/misc/libosmocore/default.nix+21−6

This diff is too big to show here.

pkgs/applications/misc/lighthouse/default.nixdeleted−35

This diff is too big to show here.

pkgs/applications/misc/lutris/default.nix+14−12

This diff is too big to show here.

pkgs/applications/misc/lutris/fixes.patchdeleted−67

This diff is too big to show here.

pkgs/applications/misc/marktext/default.nix+5−6

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/mediainfo/default.nix+2−2

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+34−8

This diff is too big to show here.

pkgs/applications/misc/metadata-cleaner/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/minigalaxy/default.nix+4

This diff is too big to show here.

pkgs/applications/misc/mob/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/moonlight-qt/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/mop/default.nix+7−8

This diff is too big to show here.

pkgs/applications/misc/mop/deps.nixdeleted−11

This diff is too big to show here.

pkgs/applications/misc/multibootusb/default.nix+1−1

This diff is too big to show here.

pkgs/applications/misc/nnn/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/notejot/default.nix+4−11

This diff is too big to show here.

pkgs/applications/misc/nut/default.nix+2

This diff is too big to show here.

pkgs/applications/misc/obsidian/default.nix+25−25

This diff is too big to show here.

pkgs/applications/misc/octoprint/default.nix+7−245

This diff is too big to show here.

pkgs/applications/misc/opencpn/default.nix+85−16

This diff is too big to show here.

pkgs/applications/misc/organicmaps/default.nix+7−12

This diff is too big to show here.

pkgs/applications/misc/osmscout-server/default.nix+3−24

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/pdfslicer/default.nix+6

This diff is too big to show here.

pkgs/applications/misc/pdfstudio/default.nix+4−4

This diff is too big to show here.

pkgs/applications/misc/phwmon/default.nix+1−1

This diff is too big to show here.

pkgs/applications/misc/polybar/default.nix+12−2

This diff is too big to show here.

pkgs/applications/misc/polybar/remove-hardcoded-etc.diffnew file+13

This diff is too big to show here.

pkgs/applications/misc/portfolio-filemanager/default.nix+6−2

This diff is too big to show here.

pkgs/applications/misc/prusa-slicer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/prusa-slicer/super-slicer.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/pure-maps/default.nix+3−2

This diff is too big to show here.

pkgs/applications/misc/pytrainer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/ranger/default.nix+13−4

This diff is too big to show here.

pkgs/applications/misc/rm-improved/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/sampler/default.nix+5−2

This diff is too big to show here.

pkgs/applications/misc/seatd/default.nix+7−3

This diff is too big to show here.

pkgs/applications/misc/sigal/default.nix+17−13

This diff is too big to show here.

pkgs/applications/misc/sigi/default.nix+7−10

This diff is too big to show here.

pkgs/applications/misc/sioyek/default.nixnew file+56

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/skytemple/default.nix+5−2

This diff is too big to show here.

pkgs/applications/misc/slides/default.nix+5−4

This diff is too big to show here.

pkgs/applications/misc/solaar/default.nix+3−2

This diff is too big to show here.

pkgs/applications/misc/sqls/default.nix+5−3

This diff is too big to show here.

pkgs/applications/misc/stork/default.nix+3−3

This diff is too big to show here.

pkgs/applications/misc/taskwarrior/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/terminal-typeracer/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/timewarrior/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/toipe/default.nixnew file+20

This diff is too big to show here.

pkgs/applications/misc/trenchbroom/default.nix+13

This diff is too big to show here.

pkgs/applications/misc/tty-solitaire/default.nix+1

This diff is too big to show here.

pkgs/applications/misc/tut/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/tvbrowser/bin.nix+1−1

This diff is too big to show here.

pkgs/applications/misc/udiskie/default.nix+30−25

This diff is too big to show here.

pkgs/applications/misc/udiskie/locale-path.patchnew file+17

This diff is too big to show here.

pkgs/applications/misc/upwork/default.nix+14−4

This diff is too big to show here.

pkgs/applications/misc/veracrypt/default.nix+2−2

This diff is too big to show here.

pkgs/applications/misc/vit/default.nix+3−5

This diff is too big to show here.

pkgs/applications/misc/wlclock/default.nixnew file+46

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+2−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/xteddy/default.nix+1−1

This diff is too big to show here.

pkgs/applications/misc/ydict/default.nixnew file+28

This diff is too big to show here.

pkgs/applications/misc/zathura/core/default.nix+2−2

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/zola/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/alpnpass/default.nixnew file+34

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/bee/bee.nix+1−3

This diff is too big to show here.

pkgs/applications/networking/browsers/brave/default.nix+72−53

This diff is too big to show here.

pkgs/applications/networking/browsers/chromium/common.nix+16−9

This diff is too big to show here.

pkgs/applications/networking/browsers/chromium/default.nix+1−3

This diff is too big to show here.

pkgs/applications/networking/browsers/chromium/get-commit-message.py+3−3

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/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+3−14

This diff is too big to show here.

pkgs/applications/networking/browsers/firefox/librewolf/src.json+5−5

This diff is too big to show here.

pkgs/applications/networking/browsers/firefox/packages.nix+4−4

This diff is too big to show here.

pkgs/applications/networking/browsers/google-chrome/default.nix+1−1

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/links2/default.nix+1

This diff is too big to show here.

pkgs/applications/networking/browsers/microsoft-edge/default.nix+6−6

This diff is too big to show here.

pkgs/applications/networking/browsers/palemoon/default.nix+4−4

This diff is too big to show here.

pkgs/applications/networking/browsers/qtchan/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/browsers/qutebrowser/default.nix+6−3

This diff is too big to show here.

pkgs/applications/networking/browsers/tor-browser-bundle-bin/default.nix+11−4

This diff is too big to show here.

pkgs/applications/networking/browsers/vieb/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/browsers/vivaldi/default.nix+2−2

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/widevine.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/c14/default.nixdeleted−22

This diff is too big to show here.

pkgs/applications/networking/cloudflare-dyndns/default.nixnew file+53

This diff is too big to show here.

pkgs/applications/networking/cloudflared/default.nix+17−6

This diff is too big to show here.

pkgs/applications/networking/cluster/argo/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/cluster/argocd-autopilot/default.nix+4−5

This diff is too big to show here.

pkgs/applications/networking/cluster/argocd/default.nix+7−11

This diff is too big to show here.

pkgs/applications/networking/cluster/arkade/default.nix+4−4

This diff is too big to show here.

pkgs/applications/networking/cluster/atlantis/default.nix+8−5

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+1

This diff is too big to show here.

pkgs/applications/networking/cluster/cmctl/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/cluster/driftctl/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/cluster/flink/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/cluster/fluxcd/default.nix+5−5

This diff is too big to show here.

pkgs/applications/networking/cluster/fluxcd/update.sh+38−31

This diff is too big to show here.

pkgs/applications/networking/cluster/hadoop/default.nix+5

This diff is too big to show here.

pkgs/applications/networking/cluster/helm-docs/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/cluster/helm/default.nix+21−9

This diff is too big to show here.

pkgs/applications/networking/cluster/helmfile/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/cluster/istioctl/default.nix+9−6

This diff is too big to show here.

pkgs/applications/networking/cluster/k3s/default.nix+23−8

This diff is too big to show here.

pkgs/applications/networking/cluster/k3s/patches/0002-Don-t-build-a-static-binary-in-package-cli.patchdeleted−37

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/kompose/default.nix+17−7

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/Gemfile.lock+12−12

This diff is too big to show here.

pkgs/applications/networking/cluster/krane/gemset.nix+20−20

This diff is too big to show here.

pkgs/applications/networking/cluster/kube3d/default.nix+29−12

This diff is too big to show here.

pkgs/applications/networking/cluster/kubecfg/default.nix+7−7

This diff is too big to show here.

pkgs/applications/networking/cluster/kubeless/default.nixdeleted−38

This diff is too big to show here.

pkgs/applications/networking/cluster/kubernetes/kubectl.nix+1

This diff is too big to show here.

pkgs/applications/networking/cluster/kubeseal/default.nix−2

This diff is too big to show here.

pkgs/applications/networking/cluster/kuttl/default.nix+1

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/nomad-pack/default.nix+4−4

This diff is too big to show here.

pkgs/applications/networking/cluster/nomad/1.1.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/cluster/ocm/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/cluster/odo/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/cluster/openshift/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/cluster/pachyderm/default.nix+1

This diff is too big to show here.

pkgs/applications/networking/cluster/pgo-client/default.nix+1

This diff is too big to show here.

pkgs/applications/networking/cluster/popeye/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+6−2

This diff is too big to show here.

pkgs/applications/networking/cluster/ssm-session-manager-plugin/default.nix+9−4

This diff is too big to show here.

pkgs/applications/networking/cluster/starboard/default.nix+15−9

This diff is too big to show here.

pkgs/applications/networking/cluster/talosctl/default.nix+11−9

This diff is too big to show here.

pkgs/applications/networking/cluster/tanka/default.nix+1

This diff is too big to show here.

pkgs/applications/networking/cluster/tektoncd-cli/default.nix+2−1

This diff is too big to show here.

pkgs/applications/networking/cluster/terraform-providers/default.nix+6−2

This diff is too big to show here.

pkgs/applications/networking/cluster/terraform-providers/providers.json+303−278

This diff is too big to show here.

pkgs/applications/networking/cluster/terraform/default.nix+5−4

This diff is too big to show here.

pkgs/applications/networking/cluster/waypoint/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/cluster/werf/default.nix+11−4

This diff is too big to show here.

pkgs/applications/networking/feedreaders/rss2email/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/firewalld/default.nixnew file+104

This diff is too big to show here.

pkgs/applications/networking/firewalld/respect-xml-catalog-files-var.patchnew file+13

This diff is too big to show here.

pkgs/applications/networking/flexget/default.nix+6−3

This diff is too big to show here.

pkgs/applications/networking/gmailctl/default.nix+4−6

This diff is too big to show here.

pkgs/applications/networking/gns3/default.nix+7−8

This diff is too big to show here.

pkgs/applications/networking/gns3/gui.nix+29−7

This diff is too big to show here.

pkgs/applications/networking/gns3/server.nix+36−22

This diff is too big to show here.

pkgs/applications/networking/ids/zeek/default.nix+2−2

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/bitlbee-discord/default.nix+1−1

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/caprine-bin/build-from-appimage.nixnew file+50

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/caprine-bin/build-from-dmg.nixnew file+35

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/caprine-bin/default.nixnew file+25

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/chatty/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/deltachat-desktop/default.nix+6−5

This diff is too big to show here.

pkgs/development/libraries/libdeltachat/darwin-dylib.patch → pkgs/applications/networking/instant-messengers/deltachat-desktop/libdeltachat-darwin-dylib.patchrenamed

The content is the same.

pkgs/applications/networking/instant-messengers/deltachat-desktop/package.json+2−2

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/discord/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/element/element-desktop-package.json+2−1

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/ferdi/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/franz/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/gajim/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/gotktrix/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/gtmess/default.nixdeleted−20

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/jitsi-meet-electron/default.nix+4−3

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/kaidan/default.nix+2

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/linphone/default.nix+40−13

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/linphone/do-not-build-linphone-sdk.patch+56−31

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/linphone/no-store-path-in-autostart.patchnew file+27

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/linphone/remove-bc_compute_full_version-usage.patch+6−6

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/pond/default.nix+1−1

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/ripcord/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/rocketchat-desktop/default.nix+3−3

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+2−2

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/skypeforlinux/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/slack/default.nix+7−7

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/teams/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix+1−21

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kf594.patchnew file+57

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kotato-10.12-sdk.patch+31−22

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt-10.12-sdk.patch+17−4

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix+15−7

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/with-webkit.nixnew file+23

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/tdesktop/default.nix+8

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/telegram/tdesktop/kf594.diffnew file+57

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/threema-desktop/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/torchat/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/wire-desktop/default.nix+6−5

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/zoom-us/default.nix+47−8

This diff is too big to show here.

pkgs/applications/networking/instant-messengers/zulip/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/ipfs-cluster/default.nix+3−12

This diff is too big to show here.

pkgs/applications/networking/ipfs/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/irc/senpai/default.nix+4−4

This diff is too big to show here.

pkgs/applications/networking/irc/weechat/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/mailreaders/aerc/default.nix+23−14

This diff is too big to show here.

pkgs/applications/networking/mailreaders/aerc/runtime-sharedir.patch+86−56

This diff is too big to show here.

pkgs/applications/networking/mailreaders/claws-mail/default.nix+6−14

This diff is too big to show here.

pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/mailreaders/evolution/evolution/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/mailreaders/mailspring/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/mailreaders/meli/default.nix+1−2

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/neomutt/default.nix+2−12

This diff is too big to show here.

pkgs/applications/networking/mailreaders/notbit/default.nixdeleted−30

This diff is too big to show here.

pkgs/applications/networking/mailreaders/notmuch-bower/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/mailreaders/notmuch/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/mailreaders/thunderbird-bin/default.nix+2−2

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+2−2

This diff is too big to show here.

pkgs/applications/networking/modem-manager-gui/default.nix+15

This diff is too big to show here.

pkgs/applications/networking/n8n/node-packages.nix+706−774

This diff is too big to show here.

pkgs/applications/networking/newsreaders/liferea/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/nextcloud-client/default.nix+26−3

This diff is too big to show here.

pkgs/applications/networking/nextdns/default.nix+3−5

This diff is too big to show here.

pkgs/applications/networking/owncloud-client/default.nix+2−2

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/tools/networking/p2p/jesec-rtorrent/rtorrent.nix → pkgs/applications/networking/p2p/jesec-rtorrent/default.nixrenamed+3−3

This diff is too big to show here.

pkgs/tools/networking/p2p/jesec-rtorrent/libtorrent.nix → pkgs/applications/networking/p2p/jesec-rtorrent/libtorrent.nixrenamed+7−3

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/tools/networking/p2p/rakshasa-rtorrent/rtorrent.nix → pkgs/applications/networking/p2p/rakshasa-rtorrent/default.nixrenamed

The content is the same.

pkgs/tools/networking/p2p/rakshasa-rtorrent/libtorrent.nix → pkgs/applications/networking/p2p/rakshasa-rtorrent/libtorrent.nixrenamed

The content is the same.

pkgs/applications/networking/p2p/tribler/default.nix+2−2

This diff is too big to show here.

pkgs/applications/networking/p2p/twister/default.nixdeleted−70

This diff is too big to show here.

pkgs/applications/networking/ping/default.nixdeleted−76

This diff is too big to show here.

pkgs/applications/networking/pjsip/default.nix+7−1

This diff is too big to show here.

pkgs/applications/networking/protonvpn-gui/default.nix+3−3

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/rustdesk/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/remote/vmware-horizon-client/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/resilio-sync/default.nix+19−19

This diff is too big to show here.

pkgs/applications/networking/seafile-client/default.nix+5−3

This diff is too big to show here.

pkgs/applications/networking/seahub/default.nix+12−5

This diff is too big to show here.

pkgs/applications/networking/seaweedfs/default.nix+6−5

This diff is too big to show here.

pkgs/applications/networking/shellhub-agent/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/sniffers/wireshark/default.nix+20−5

This diff is too big to show here.

pkgs/applications/networking/soju/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+3−3

This diff is too big to show here.

pkgs/applications/networking/syncplay/default.nix+6−4

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/synology-drive-client/default.nix+4−4

This diff is too big to show here.

pkgs/applications/networking/termius/default.nix+3−3

This diff is too big to show here.

pkgs/applications/networking/tetrd/default.nix+1−1

This diff is too big to show here.

pkgs/applications/networking/zerobin/default.nix+1−1

This diff is too big to show here.

pkgs/applications/office/banking/default.nix+10−8

This diff is too big to show here.

pkgs/applications/office/beamerpresenter/default.nix+45−22

This diff is too big to show here.

pkgs/applications/office/bookworm/default.nix−2

This diff is too big to show here.

pkgs/applications/office/buho/default.nixnew file+58

This diff is too big to show here.

pkgs/applications/office/calligra/default.nix+16

This diff is too big to show here.

pkgs/applications/office/fava/default.nix+15−3

This diff is too big to show here.

pkgs/applications/office/foliate/default.nix−1

This diff is too big to show here.

pkgs/applications/office/gnumeric/default.nix+3−2

This diff is too big to show here.

pkgs/applications/office/jameica/default.nix+1−1

This diff is too big to show here.

pkgs/applications/office/khronos/default.nix+2−9

This diff is too big to show here.

pkgs/applications/office/ledger/default.nix+2−2

This diff is too big to show here.

pkgs/applications/office/libreoffice/soffice-template.desktopnew file+6

This diff is too big to show here.

pkgs/applications/office/libreoffice/wrapper.nix+25−12

This diff is too big to show here.

pkgs/applications/office/morgen/default.nix+2−2

This diff is too big to show here.

pkgs/applications/office/paperless-ng/default.nix → pkgs/applications/office/paperless-ngx/default.nixrenamed+16−34

This diff is too big to show here.

pkgs/applications/office/paperwork/paperwork-gtk.nix+1−1

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/qownnotes/default.nix+2−2

This diff is too big to show here.

pkgs/applications/office/trilium/default.nix+3−3

This diff is too big to show here.

pkgs/applications/office/tusk/default.nix+3−2

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/zotero/default.nix+2−2

This diff is too big to show here.

pkgs/applications/radio/cubicsdr/default.nix+3−21

This diff is too big to show here.

pkgs/applications/radio/flex-ncat/default.nix+1

This diff is too big to show here.

pkgs/applications/radio/flrig/default.nix+4−2

This diff is too big to show here.

pkgs/applications/radio/gnss-sdr/default.nix+6

This diff is too big to show here.

pkgs/applications/radio/gnuradio/3.9.nix+8−2

This diff is too big to show here.

pkgs/applications/radio/gnuradio/default.nix+10−3

This diff is too big to show here.

pkgs/applications/radio/gnuradio/wrapper.nix+1−1

This diff is too big to show here.

pkgs/applications/radio/gqrx/default.nix+2−2

This diff is too big to show here.

pkgs/applications/radio/kalibrate-rtl/default.nix+5−5

This diff is too big to show here.

pkgs/applications/radio/rtl-ais/default.nix+1

This diff is too big to show here.

pkgs/applications/radio/rtl-sdr/default.nix+11−7

This diff is too big to show here.

pkgs/applications/radio/splat/default.nixnew file+55

This diff is too big to show here.

pkgs/applications/radio/uhd/default.nix+2

This diff is too big to show here.

pkgs/applications/science/astronomy/astrolabe-generator/default.nix+1

This diff is too big to show here.

pkgs/applications/science/astronomy/openspace/assets.patchdeleted−100

This diff is too big to show here.

pkgs/applications/science/astronomy/openspace/config.patchdeleted−49

This diff is too big to show here.

pkgs/applications/science/astronomy/openspace/constexpr.patchdeleted−91

This diff is too big to show here.

pkgs/applications/science/astronomy/openspace/default.nixdeleted−90

This diff is too big to show here.

pkgs/applications/science/astronomy/openspace/vrpn.patchdeleted−13

This diff is too big to show here.

pkgs/applications/science/astronomy/stellarium/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/biology/bayescan/default.nix+1

This diff is too big to show here.

pkgs/applications/science/biology/blast/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/biology/bwa/default.nix+2

This diff is too big to show here.

pkgs/applications/science/biology/clustal-omega/default.nix+1

This diff is too big to show here.

pkgs/applications/science/biology/cmtk/default.nix+4−1

This diff is too big to show here.

pkgs/applications/science/biology/dcm2niix/default.nix+42−7

This diff is too big to show here.

pkgs/applications/science/biology/dcm2niix/dont-fetch-external-libs.patchnew file+36

This diff is too big to show here.

pkgs/applications/science/biology/eggnog-mapper/default.nix+30−16

This diff is too big to show here.

pkgs/applications/science/biology/megahit/default.nix+3

This diff is too big to show here.

pkgs/applications/science/biology/ncbi-tools/default.nixdeleted−34

This diff is too big to show here.

pkgs/applications/science/biology/picard-tools/default.nix+1

This diff is too big to show here.

pkgs/applications/science/biology/quast/default.nix+1−3

This diff is too big to show here.

pkgs/applications/science/biology/samtools/default.nix+8−1

This diff is too big to show here.

pkgs/applications/science/biology/tebreak/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/chemistry/jmol/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/computer-architecture/qtrvsim/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/electronics/eagle/eagle7.nixdeleted−97

This diff is too big to show here.

pkgs/applications/science/electronics/verilator/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/engineering/brmodelo/default.nixnew file+109

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/coq/default.nix+14−14

This diff is too big to show here.

pkgs/applications/science/logic/cvc5/default.nixnew file+34

This diff is too big to show here.

pkgs/applications/science/logic/easycrypt/default.nixnew file+50

This diff is too big to show here.

pkgs/applications/science/logic/easycrypt/runtest.nixnew file+24

This diff is too big to show here.

pkgs/applications/science/logic/elan/default.nix+3−3

This diff is too big to show here.

pkgs/applications/science/logic/fast-downward/default.nix+19−12

This diff is too big to show here.

pkgs/applications/science/logic/isabelle/default.nix+31−2

This diff is too big to show here.

pkgs/applications/science/logic/jonprl/default.nixdeleted−35

This diff is too big to show here.

pkgs/applications/science/logic/key/default.nix+2−3

This diff is too big to show here.

pkgs/applications/science/logic/lean2/default.nixdeleted−37

This diff is too big to show here.

pkgs/applications/science/logic/naproche/default.nix+3−3

This diff is too big to show here.

pkgs/applications/science/logic/otter/default.nixdeleted−53

This diff is too big to show here.

pkgs/applications/science/logic/potassco/clingcon.nix+5

This diff is too big to show here.

pkgs/applications/science/logic/symbiyosys/default.nix+1

This diff is too big to show here.

pkgs/applications/science/logic/symfpu/default.nixnew file+26

This diff is too big to show here.

pkgs/applications/science/logic/tlaplus/toolbox.nix+1−1

This diff is too big to show here.

pkgs/applications/science/logic/z3/default.nix+66−66

This diff is too big to show here.

pkgs/applications/science/machine-learning/finalfusion-utils/default.nix+1

This diff is too big to show here.

pkgs/applications/science/math/adolc/default.nixnew file+23

This diff is too big to show here.

pkgs/applications/science/math/caffe/default.nix+9−4

This diff is too big to show here.

pkgs/applications/science/math/calc/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/math/calculix/calculix.patch+10−9

This diff is too big to show here.

pkgs/applications/science/math/calculix/default.nix+6−3

This diff is too big to show here.

pkgs/applications/science/math/cntk/default.nix+6−2

This diff is too big to show here.

pkgs/applications/science/math/giac/default.nix+12−16

This diff is too big to show here.

pkgs/applications/science/math/mxnet/default.nix+14−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/sage/patches/docutils-0.18.1-deprecation.patchnew file+13

This diff is too big to show here.

pkgs/applications/science/math/sage/sage-env.nix+2

This diff is too big to show here.

pkgs/applications/science/math/sage/sage-src.nix+51−11

This diff is too big to show here.

pkgs/applications/science/math/sage/sagelib.nix+8−3

This diff is too big to show here.

pkgs/applications/science/math/wolfram-engine/default.nixnew file+143

This diff is too big to show here.

pkgs/applications/science/math/wolfram-engine/l10ns.nixnew file+51

This diff is too big to show here.

pkgs/applications/science/math/wolfram-engine/notebook.nixnew file+9

This diff is too big to show here.

pkgs/applications/science/math/wxmaxima/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/medicine/xmedcon/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/misc/bada-bib/default.nix+3−3

This diff is too big to show here.

pkgs/applications/science/misc/colmap/default.nix+22−6

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/fityk/default.nix+4

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/openmvs/default.nixdeleted−77

This diff is too big to show here.

pkgs/applications/science/misc/root/5.nix+5

This diff is too big to show here.

pkgs/applications/science/misc/snakemake/default.nix+27−13

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/xfitter/default.nix+34−30

This diff is too big to show here.

pkgs/applications/science/physics/xfitter/undefined_behavior.patchdeleted−454

This diff is too big to show here.

pkgs/applications/science/programming/jflap/default.nixnew file+32

This diff is too big to show here.

pkgs/applications/science/robotics/mavproxy/default.nix+2−2

This diff is too big to show here.

pkgs/applications/science/robotics/sumorobot-manager/default.nix+1−1

This diff is too big to show here.

pkgs/applications/terminal-emulators/alacritty/default.nix−2

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/hyper/default.nix+2−2

This diff is too big to show here.

pkgs/applications/terminal-emulators/syncterm/default.nix+2

This diff is too big to show here.

pkgs/applications/terminal-emulators/wezterm/default.nix+21−10

This diff is too big to show here.

pkgs/applications/version-management/bitkeeper/default.nixdeleted−56

This diff is too big to show here.

pkgs/applications/version-management/commit-formatter/default.nix+1

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/bfg-repo-cleaner/default.nix+1

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/bitbucket-server-cli/default.nix+1

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/gh/default.nix+2−2

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/ghorg/default.nix+2−2

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/git-annex-utils/default.nix+1

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-crypt/default.nix+17−7

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/git-dit/default.nixdeleted−58

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/git-extras/default.nix+2−2

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/git-interactive-rebase-tool/default.nix+5−12

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/git-machete/default.nix+3−3

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/git/default.nix+27−18

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/gitbatch/default.nix+12−10

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/gitbatch/deps.nixdeleted−543

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/glab/default.nix+10−1

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/hut/default.nix+5−8

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/scmpuff/default.nix+14−9

This diff is too big to show here.

pkgs/applications/version-management/git-and-tools/scmpuff/deps.nixdeleted−273

This diff is too big to show here.

pkgs/applications/version-management/git-lfs/default.nix+2−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−2

This diff is too big to show here.

pkgs/applications/version-management/git-sizer/default.nix+15−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+4−4

This diff is too big to show here.

pkgs/applications/version-management/gitlab/data.json+7−7

This diff is too big to show here.

pkgs/applications/version-management/gitlab/gitaly/Gemfile+1−1

This diff is too big to show here.

pkgs/applications/version-management/gitlab/gitaly/Gemfile.lock+13−13

This diff is too big to show here.

pkgs/applications/version-management/gitlab/gitaly/default.nix+4−4

This diff is too big to show here.

pkgs/applications/version-management/gitlab/gitaly/gemset.nix+16−16

This diff is too big to show here.

pkgs/applications/version-management/gitlab/gitlab-shell/default.nix+3−3

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/rubyEnv/Gemfile+10−9

This diff is too big to show here.

pkgs/applications/version-management/gitlab/rubyEnv/Gemfile.lock+87−83

This diff is too big to show here.

pkgs/applications/version-management/gitlab/rubyEnv/gemset.nix+75−64

This diff is too big to show here.

pkgs/applications/version-management/gitoxide/default.nix+3−3

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/jujutsu/default.nix+3−2

This diff is too big to show here.

pkgs/applications/version-management/mercurial/default.nix+3−8

This diff is too big to show here.

pkgs/applications/version-management/mercurial/fix-rhg-type-aarch64.patchdeleted−12

This diff is too big to show here.

pkgs/applications/version-management/monotone/default.nix+2

This diff is too big to show here.

pkgs/applications/version-management/p4/default.nix+1−1

This diff is too big to show here.

pkgs/applications/version-management/pijul/default.nix+3−3

This diff is too big to show here.

pkgs/applications/version-management/rcs/default.nix+1−1

This diff is too big to show here.

pkgs/applications/version-management/redmine/Gemfile+2−2

This diff is too big to show here.

pkgs/applications/version-management/redmine/Gemfile.lock+48−50

This diff is too big to show here.

pkgs/applications/version-management/redmine/default.nix+4−6

This diff is too big to show here.

pkgs/applications/version-management/redmine/gemset.nix+39−49

This diff is too big to show here.

pkgs/applications/version-management/redmine/update.shnew file+17

This diff is too big to show here.

pkgs/applications/version-management/subversion/default.nix+4−9

This diff is too big to show here.

pkgs/applications/version-management/yadm/default.nix+2−2

This diff is too big to show here.

pkgs/applications/video/ani-cli/default.nix+2−2

This diff is too big to show here.

pkgs/applications/video/celluloid/default.nix+2−4

This diff is too big to show here.

pkgs/applications/video/clickshare-csc1/default.nix−2

This diff is too big to show here.

pkgs/applications/video/davinci-resolve/default.nix+2−2

This diff is too big to show here.

pkgs/applications/video/epgstation/default.nix+3−5

This diff is too big to show here.

pkgs/applications/video/epgstation/update.nix+2−4

This diff is too big to show here.

pkgs/applications/video/f1viewer/default.nix+2−2

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/handbrake/default.nix+2−2

This diff is too big to show here.

pkgs/applications/video/hdhomerun-config-gui/default.nix+3−1

This diff is too big to show here.

pkgs/applications/video/hyperion-ng/default.nixnew file+50

This diff is too big to show here.

pkgs/applications/video/kodi/add-KODI_WEBSERVER_EXTRA_WHITELIST.patchnew file+88

This diff is too big to show here.

pkgs/applications/video/kodi/unwrapped.nix+17−2

This diff is too big to show here.

pkgs/applications/video/kodi/wrapper.nix−6

This diff is too big to show here.

pkgs/applications/video/lightworks/default.nix+4−4

This diff is too big to show here.

pkgs/applications/video/mirakurun/default.nix+4−6

This diff is too big to show here.

pkgs/applications/video/mirakurun/update.nix+3−7

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/mpv/scripts/autocrop.nixnew file+19

This diff is too big to show here.

pkgs/applications/video/mpv/scripts/autodeint.nixnew file+19

This diff is too big to show here.

pkgs/applications/video/obs-studio/default.nix+2−2

This diff is too big to show here.

pkgs/applications/video/obs-studio/plugins/default.nix+1

This diff is too big to show here.

pkgs/applications/video/obs-studio/plugins/obs-vkcapture.nixnew file+35

This diff is too big to show here.

pkgs/applications/video/peek/default.nix−2

This diff is too big to show here.

pkgs/applications/video/pitivi/default.nix+8

This diff is too big to show here.

pkgs/applications/video/quvi/library.nix+1

This diff is too big to show here.

pkgs/applications/video/quvi/scripts.nix+1

This diff is too big to show here.

pkgs/applications/video/quvi/tool.nix+1

This diff is too big to show here.

pkgs/applications/video/vdr/plugins.nix+5−80

This diff is too big to show here.

pkgs/applications/video/vlc/default.nix+2−2

This diff is too big to show here.

pkgs/applications/video/webcamoid/default.nix+4−9

This diff is too big to show here.

pkgs/applications/video/webtorrent_desktop/default.nix+68−87

This diff is too big to show here.

pkgs/applications/virtualization/cloud-hypervisor/default.nix+3−3

This diff is too big to show here.

pkgs/applications/virtualization/containerd/default.nix+2−2

This diff is too big to show here.

pkgs/applications/virtualization/crosvm/Cargo.lock+31−22

This diff is too big to show here.

pkgs/applications/virtualization/crosvm/generate-cargo.shnew file+7

This diff is too big to show here.

pkgs/applications/virtualization/crosvm/update.py+10−2

This diff is too big to show here.

pkgs/applications/virtualization/crosvm/upstream-info.json+5−5

This diff is too big to show here.

pkgs/applications/virtualization/crun/default.nix+2−2

This diff is too big to show here.

pkgs/applications/virtualization/distrobox/default.nix+2−2

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/ecs-agent/default.nix+1

This diff is too big to show here.

pkgs/applications/virtualization/firectl/default.nix+6−6

This diff is too big to show here.

pkgs/applications/virtualization/firectl/gomod.patchdeleted−15

This diff is too big to show here.

pkgs/applications/virtualization/imgcrypt/default.nix+2−2

This diff is too big to show here.

pkgs/applications/virtualization/kvmtool/default.nixnew file+23

This diff is too big to show here.

pkgs/applications/virtualization/lima/default.nix+8−3

This diff is too big to show here.

pkgs/applications/virtualization/podman-tui/default.nix+4−4

This diff is too big to show here.

pkgs/applications/virtualization/podman/default.nix+1

This diff is too big to show here.

pkgs/applications/virtualization/qemu/allow-virtfs-on-darwin.patchdeleted−77

This diff is too big to show here.

pkgs/applications/virtualization/qemu/default.nix+18−70

This diff is too big to show here.

pkgs/applications/virtualization/qemu/provide-fallback-for-utimensat.patch+4−4

This diff is too big to show here.

pkgs/applications/virtualization/qemu/rename-9p-util.patchdeleted−54

This diff is too big to show here.

pkgs/applications/virtualization/qemu/revert-ui-cocoa-add-clipboard-support.patchnew file+208

This diff is too big to show here.

pkgs/applications/virtualization/virt-manager/default.nix+12−2

This diff is too big to show here.

pkgs/applications/virtualization/virtualbox/guest-additions/default.nix+3−7

This diff is too big to show here.

pkgs/applications/virtualization/vmware-workstation/default.nixnew file+341

This diff is too big to show here.

pkgs/applications/virtualization/vmware-workstation/vmware-bootstrapnew file+11

This diff is too big to show here.

pkgs/applications/virtualization/vmware-workstation/vmware-confignew file+21

This diff is too big to show here.

pkgs/applications/virtualization/vmware-workstation/vmware-installer-bootstrapnew file+5

This diff is too big to show here.

pkgs/applications/virtualization/vmware-workstation/vmware-modconfignew file+8

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/window-managers/afterstep/default.nix+13−1

This diff is too big to show here.

pkgs/applications/window-managers/berry/default.nix+2−2

This diff is too big to show here.

pkgs/applications/window-managers/clfswm/default.nixdeleted−51

This diff is too big to show here.

pkgs/applications/window-managers/clfswm/require-clx.patchdeleted−13

This diff is too big to show here.

pkgs/applications/window-managers/herbstluftwm/default.nix+9−4

This diff is too big to show here.

pkgs/applications/window-managers/i3/status-rust.nix+3−3

This diff is too big to show here.

pkgs/applications/window-managers/phosh/default.nix+2−2

This diff is too big to show here.

pkgs/applications/window-managers/sway/idle.nix+2

This diff is too big to show here.

pkgs/applications/window-managers/sway/lock-effects.nix+8

This diff is too big to show here.

pkgs/applications/window-managers/wmfs/default.nix+1−5

This diff is too big to show here.

pkgs/applications/window-managers/wmii-hg/default.nixdeleted−46

This diff is too big to show here.

pkgs/applications/window-managers/wmii/default.nixnew file+72

This diff is too big to show here.

pkgs/build-support/build-fhs-userenv-bubblewrap/env.nix+1−1

This diff is too big to show here.

pkgs/build-support/build-graalvm-native-image/default.nix+2

This diff is too big to show here.

pkgs/build-support/docker/default.nix+17−25

This diff is too big to show here.

pkgs/build-support/docker/examples.nix+1−1

This diff is too big to show here.

pkgs/build-support/dotnet/build-dotnet-module/default.nix+10−5

This diff is too big to show here.

pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh+2−1

This diff is too big to show here.

pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-check-hook.sh+2−1

This diff is too big to show here.

pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-configure-hook.sh+5−1

This diff is too big to show here.

pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh+5−4

This diff is too big to show here.

pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh+2−1

This diff is too big to show here.

pkgs/build-support/dotnet/make-nuget-source/default.nix+26−18

This diff is too big to show here.

pkgs/build-support/dotnet/nuget-to-nix/default.nix+25−3

This diff is too big to show here.

pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh+3−1

This diff is too big to show here.

pkgs/build-support/emacs/wrapper.nix+16−2

This diff is too big to show here.

pkgs/build-support/emacs/wrapper.sh+1−1

This diff is too big to show here.

pkgs/build-support/fake-nss/default.nixnew file+24

This diff is too big to show here.

pkgs/build-support/fetchfirefoxaddon/default.nix+2−2

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/fetchnextcloudapp/default.nix+1−6

This diff is too big to show here.

pkgs/build-support/fetchurl/default.nix+1−1

This diff is too big to show here.

pkgs/build-support/fetchurl/mirrors.nix+1

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd-ng-tool.nixnew file+16

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd-ng.nixnew file+93

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd-ng/Cargo.locknew file+5

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd-ng/Cargo.tomlnew file+9

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd-ng/README.mdnew file+79

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd-ng/src/main.rsnew file+216

This diff is too big to show here.

pkgs/build-support/kernel/make-initrd.nix+2−2

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/make-darwin-bundle/default.nix+4−4

This diff is too big to show here.

pkgs/build-support/make-desktopitem/default.nix+3−8

This diff is too big to show here.

pkgs/build-support/ocaml/dune.nix+2−2

This diff is too big to show here.

pkgs/build-support/ocaml/oasis.nix+1−1

This diff is too big to show here.

pkgs/build-support/rust/build-rust-crate/build-crate.nix+3−2

This diff is too big to show here.

pkgs/build-support/rust/build-rust-crate/configure-crate.nix+2−1

This diff is too big to show here.

pkgs/build-support/rust/build-rust-crate/default.nix+11−4

This diff is too big to show here.

pkgs/build-support/rust/default-crate-overrides.nix+1−1

This diff is too big to show here.

pkgs/build-support/setup-hooks/auto-patchelf.py+23−17

This diff is too big to show here.

pkgs/build-support/setup-hooks/auto-patchelf.sh+9−1

This diff is too big to show here.

pkgs/build-support/setup-hooks/copy-desktop-items.sh+5−4

This diff is too big to show here.

pkgs/build-support/setup-hooks/desktop-to-darwin-bundle.sh+26−6

This diff is too big to show here.

pkgs/build-support/setup-hooks/make-wrapper.sh+5

This diff is too big to show here.

pkgs/build-support/setup-hooks/postgresql-test-hook/default.nixnew file+9

This diff is too big to show here.

pkgs/build-support/setup-hooks/postgresql-test-hook/postgresql-test-hook.shnew file+79

This diff is too big to show here.

pkgs/build-support/setup-hooks/postgresql-test-hook/test.nixnew file+27

This diff is too big to show here.

pkgs/build-support/setup-hooks/wrap-gapps-hook/wrap-gapps-hook.sh−4

This diff is too big to show here.

pkgs/build-support/testers/default.nixnew file+18

This diff is too big to show here.

pkgs/build-support/test-equal-derivation.nix → pkgs/build-support/testers/test-equal-derivation.nixrenamed+1−18

This diff is too big to show here.

pkgs/build-support/trivial-builders.nix+9−39

This diff is too big to show here.

pkgs/build-support/trivial-builders/test/write-text-file.nixnew file+34

This diff is too big to show here.

pkgs/build-support/writers/default.nix+3−3

This diff is too big to show here.

pkgs/common-updater/git-updater.nix+6−2

This diff is too big to show here.

pkgs/common-updater/scripts/list-git-tags+1−1

This diff is too big to show here.

pkgs/data/documentation/rnrs/r3rs.nixdeleted−7

This diff is too big to show here.

pkgs/data/documentation/scheme-manpages/default.nix+3−3

This diff is too big to show here.

pkgs/data/fonts/amiri/default.nix+2−2

This diff is too big to show here.

pkgs/data/fonts/annapurna-sil/default.nixnew file+29

This diff is too big to show here.

pkgs/data/fonts/comic-mono/comic-mono-weight.confnew file+14

This diff is too big to show here.

pkgs/data/fonts/comic-mono/default.nixnew file+35

This diff is too big to show here.

pkgs/data/fonts/ezra-sil/default.nixnew file+26

This diff is too big to show here.

pkgs/data/fonts/galatia-sil/default.nixnew file+29

This diff is too big to show here.

pkgs/data/fonts/iosevka/bin.nix+3−2

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/kacst/default.nixnew file+22

This diff is too big to show here.

pkgs/data/fonts/lao/default.nixnew file+22

This diff is too big to show here.

pkgs/data/fonts/material-design-icons/default.nix+3−6

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/sudo/default.nix+2−2

This diff is too big to show here.

pkgs/data/fonts/times-newer-roman/default.nix+1−1

This diff is too big to show here.

pkgs/data/fonts/uni-vga/default.nix+4−6

This diff is too big to show here.

pkgs/data/fonts/unifont/default.nix+4−6

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/icons/comixcursors/default.nix+5−25

This diff is too big to show here.

pkgs/data/icons/elementary-xfce-icon-theme/default.nix+3−3

This diff is too big to show here.

pkgs/data/icons/hicolor-icon-theme/default.nix+3−2

This diff is too big to show here.

pkgs/data/icons/luna-icons/default.nix+5−2

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/cacert/update.sh+7−10

This diff is too big to show here.

pkgs/data/misc/cldr-annotations/default.nixnew file+24

This diff is too big to show here.

pkgs/data/misc/cldr-emoji-annotation/default.nixdeleted−27

This diff is too big to show here.

pkgs/data/misc/dns-root-data/default.nix+2−1

This diff is too big to show here.

pkgs/data/misc/freepats/default.nix+3−2

This diff is too big to show here.

pkgs/data/misc/hackage/default.nix+2−1

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/iana-etc/default.nix+2−3

This diff is too big to show here.

pkgs/data/misc/nixos-artwork/wallpapers.nix+16

This diff is too big to show here.

pkgs/data/misc/shared-mime-info/default.nix+1

This diff is too big to show here.

pkgs/data/misc/tzdata/default.nix+3−3

This diff is too big to show here.

pkgs/data/misc/unicode-emoji/default.nix+4−12

This diff is too big to show here.

pkgs/data/misc/wireless-regdb/default.nix+2−2

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook-ebnf/default.nix+4−3

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook/4.1.2.nix+3−8

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook/4.2.nix+2−5

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook/4.3.nix+2−5

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook/4.4.nix+2−5

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook/4.5.nix+2−5

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/docbook/generic.nix+6−4

This diff is too big to show here.

pkgs/data/sgml+xml/schemas/xml-dtd/xhtml1/default.nix+3−2

This diff is too big to show here.

pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/default.nix+5−1

This diff is too big to show here.

pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/fix-man-options-duplication.patchnew file+11

This diff is too big to show here.

pkgs/data/themes/arc/default.nix+2−2

This diff is too big to show here.

pkgs/data/themes/flat-remix-gnome/default.nix+4−4

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.nixdeleted−29

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/vimix/default.nix+12−4

This diff is too big to show here.

pkgs/data/themes/yaru/default.nix+2−5

This diff is too big to show here.

pkgs/desktops/cdesktopenv/default.nix+15−2

This diff is too big to show here.

pkgs/desktops/enlightenment/econnman/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/enlightenment/ecrire/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/enlightenment/efl/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/enlightenment/enlightenment/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/enlightenment/ephoto/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/enlightenment/evisum/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/enlightenment/rage/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/enlightenment/terminology/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/gnome-2/bindings/gnome-python/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/gnome-2/desktop/scrollkeeper/default.nix+6−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/ORBit2/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/gnome-common/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/gnome-mime-data/default.nix+5−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/gnome-vfs/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/gtkhtml/default.nix+4−3

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libIDL/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libart_lgpl/default.nix+4−3

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libbonobo/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libbonoboui/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libglade/default.nix+6−8

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnome/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnomecanvas/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnomecanvasmm/default.nix+5−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnomecups/default.nix+4−3

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnomeprint/default.nix+3−2

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnomeprintui/default.nix+5−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgnomeui/default.nix+4−4

This diff is too big to show here.

pkgs/desktops/gnome-2/platform/libgtkhtml/default.nix+5−4

This diff is too big to show here.

pkgs/desktops/gnome/apps/gedit/default.nix+5−2

This diff is too big to show here.

pkgs/desktops/gnome/apps/ghex/default.nix+8−27

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-boxes/default.nix+7

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-boxes/fix-gir-lib-path.patchnew file+22

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-calendar/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-connections/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-maps/default.nix+2−13

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-music/default.nix+4−5

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-nettool/default.nix+61−11

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-text-editor/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/apps/gnome-todo/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/gnome/core/eog/default.nix+9−2

This diff is too big to show here.

pkgs/desktops/gnome/core/eog/fix-gir-lib-path.patchnew file+13

This diff is too big to show here.

pkgs/desktops/gnome/core/epiphany/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/evince/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/evolution-data-server/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/gnome-initial-setup/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/gnome-remote-desktop/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/gnome-software/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/mutter/3.38/default.nix+3−1

This diff is too big to show here.

pkgs/desktops/gnome/core/mutter/default.nix+3−1

This diff is too big to show here.

pkgs/desktops/gnome/core/nautilus/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/simple-scan/default.nix+3−4

This diff is too big to show here.

pkgs/desktops/gnome/core/sushi/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/core/zenity/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/gnome/default.nix+1−16

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+32

This diff is too big to show here.

pkgs/desktops/gnome/extensions/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/gnome/extensions/extensionRenames.nix+15−12

This diff is too big to show here.

pkgs/desktops/gnome/extensions/extensions.json+248−223

This diff is too big to show here.

pkgs/desktops/gnome/extensions/impatience/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/gnome/extensions/manuallyPackaged.nix−1

This diff is too big to show here.

pkgs/desktops/gnome/extensions/night-theme-switcher/default.nixdeleted−35

This diff is too big to show here.

pkgs/desktops/gnome/extensions/system-monitor/default.nix+11−24

This diff is too big to show here.

pkgs/desktops/gnome/extensions/update-extensions.py+66−47

This diff is too big to show here.

pkgs/desktops/gnome/games/hitori/default.nix+2−14

This diff is too big to show here.

pkgs/desktops/gnome/games/swell-foop/default.nix+3−4

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/lumina/lumina-calculator/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lumina/lumina-pdf/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lumina/lumina/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lxqt/compton-conf/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lxqt/default.nix+2−5

This diff is too big to show here.

pkgs/desktops/lxqt/libfm-qt/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/liblxqt/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/libqtxdg/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/libsysstat/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lxqt/lximage-qt/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-about/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-admin/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-archiver/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-build-tools/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-config/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-globalkeys/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-notificationd/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-openssh-askpass/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-panel/default.nix+4−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-policykit/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-powermanagement/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-qtplugin/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-runner/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-session/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-sudo/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/lxqt-themes/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/obconf-qt/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lxqt/pavucontrol-qt/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/pcmanfm-qt/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/qlipper/default.nix+1−1

This diff is too big to show here.

pkgs/desktops/lxqt/qps/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/qterminal/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/qtermwidget/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/screengrab/default.nix+3−3

This diff is too big to show here.

pkgs/desktops/lxqt/xdg-desktop-portal-lxqt/default.nixnew file+41

This diff is too big to show here.

pkgs/desktops/mate/caja-extensions/default.nix+17−1

This diff is too big to show here.

pkgs/desktops/mate/caja-extensions/hardcode-gsettings.patchnew file+169

This diff is too big to show here.

pkgs/desktops/mate/default.nix+2

This diff is too big to show here.

pkgs/desktops/mate/mate-control-center/default.nix+3−1

This diff is too big to show here.

pkgs/desktops/mate/mate-panel/default.nix+7

This diff is too big to show here.

pkgs/desktops/mate/mate-settings-daemon/wrapped.nixnew file+22

This diff is too big to show here.

pkgs/desktops/pantheon/apps/elementary-code/default.nix+2−12

This diff is too big to show here.

pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/pantheon/apps/switchboard/default.nix+2−15

This diff is too big to show here.

pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix+12−5

This diff is too big to show here.

pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix+6−6

This diff is too big to show here.

pkgs/desktops/pantheon/default.nix+3−1

This diff is too big to show here.

pkgs/desktops/pantheon/desktop/gala/default.nix+4−15

This diff is too big to show here.

pkgs/desktops/pantheon/granite/7/default.nixnew file+73

This diff is too big to show here.

pkgs/desktops/pantheon/services/elementary-notifications/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix+2−2

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/kwin/scripts/dynamic-workspaces.nix+1−1

This diff is too big to show here.

pkgs/desktops/plasma-5/default.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/kscreen.nix+2−2

This diff is too big to show here.

pkgs/desktops/plasma-5/srcs.nix+214−214

This diff is too big to show here.

pkgs/desktops/xfce/applications/mousepad/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/xfce/applications/xfce4-screensaver/default.nixnew file+49

This diff is too big to show here.

pkgs/desktops/xfce/applications/xfce4-terminal/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/xfce/core/thunar/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/xfce/core/xfce4-panel/default.nix+2−2

This diff is too big to show here.

pkgs/desktops/xfce/default.nix+3−1

This diff is too big to show here.

pkgs/desktops/xfce/panel-plugins/xfce4-eyes-plugin/default.nix+2−2

This diff is too big to show here.

pkgs/development/beam-modules/elvis-erlang/default.nix+2−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+8−7

This diff is too big to show here.

pkgs/development/compilers/abcl/default.nix+6−1

This diff is too big to show here.

pkgs/development/compilers/adoptopenjdk-bin/generate-sources.py+1

This diff is too big to show here.

pkgs/development/compilers/adoptopenjdk-bin/jdk-darwin-base.nix+4−3

This diff is too big to show here.

pkgs/development/compilers/adoptopenjdk-bin/jdk-linux-base.nix+3−3

This diff is too big to show here.

pkgs/development/compilers/adoptopenjdk-bin/sources.json+244−100

This diff is too big to show here.

pkgs/development/compilers/alan/2.nixnew file+31

This diff is too big to show here.

pkgs/development/compilers/alan/default.nixnew file+48

This diff is too big to show here.

pkgs/development/compilers/aldor/default.nixdeleted−54

This diff is too big to show here.

pkgs/development/compilers/algol68g/default.nix+1

This diff is too big to show here.

pkgs/development/compilers/aliceml/default.nixdeleted−59

This diff is too big to show here.

pkgs/development/compilers/aliceml/make.patchdeleted−20

This diff is too big to show here.

pkgs/development/compilers/aliceml/seam.patchdeleted−13

This diff is too big to show here.

pkgs/development/compilers/bluespec/default.nix+13−5

This diff is too big to show here.

pkgs/development/compilers/bupc/default.nix−1

This diff is too big to show here.

pkgs/development/compilers/chez/default.nix+3−3

This diff is too big to show here.

pkgs/development/compilers/chicken/5/chicken.nix+6−1

This diff is too big to show here.

pkgs/development/compilers/chicken/5/eggs.nix+464−4

This diff is too big to show here.

pkgs/development/compilers/chicken/5/eggs.scm+8

This diff is too big to show here.

pkgs/development/compilers/coreclr/default.nixdeleted−100

This diff is too big to show here.

pkgs/development/compilers/crystal/build-package.nix+5−1

This diff is too big to show here.

pkgs/development/compilers/crystal/default.nix+1−1

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/auto-add-opengl-runpath-hook.shnew file+14

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/common.nix+1

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/default.nixdeleted−90

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/extension.nixnew file+15

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/redist/build-cuda-redist-package.nixnew file+51

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/redist/extension.nixnew file+32

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/redist/manifests/redistrib_11.4.4.jsonnew file+862

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/redist/manifests/redistrib_11.5.2.jsonnew file+873

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/redist/manifests/redistrib_11.6.2.jsonnew file+873

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/redist/overrides.nixnew file+72

This diff is too big to show here.

pkgs/development/compilers/cudatoolkit/versions.tomlnew file+61

This diff is too big to show here.

pkgs/development/compilers/dmd/binary.nix+3−2

This diff is too big to show here.

pkgs/development/compilers/dotnet/default.nix+27−27

This diff is too big to show here.

pkgs/development/compilers/elm/default.nix+12

This diff is too big to show here.

pkgs/development/compilers/fennel/default.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/gcc/10/default.nix+11−10

This diff is too big to show here.

pkgs/development/compilers/gcc/10/gcc10-asan-glibc-2.34.patchnew file+70

This diff is too big to show here.

pkgs/development/compilers/gcc/11/default.nix+2−7

This diff is too big to show here.

pkgs/development/compilers/gcc/4.8/default.nix+3−8

This diff is too big to show here.

pkgs/development/compilers/gcc/4.9/default.nix+3−8

This diff is too big to show here.

pkgs/development/compilers/gcc/6/default.nix+4−7

This diff is too big to show here.

pkgs/development/compilers/gcc/6/gnat-glibc234.patchnew file+30

This diff is too big to show here.

pkgs/development/compilers/gcc/7/default.nix+6−7

This diff is too big to show here.

pkgs/development/compilers/gcc/7/gcc8-asan-glibc-2.34.patchnew file+70

This diff is too big to show here.

pkgs/development/compilers/gcc/8/default.nix+3−7

This diff is too big to show here.

pkgs/development/compilers/gcc/9/default.nix+9−8

This diff is too big to show here.

pkgs/development/compilers/gcc/9/gcc9-asan-glibc-2.34.patchnew file+70

This diff is too big to show here.

pkgs/development/compilers/gcc/builder.sh+4

This diff is too big to show here.

pkgs/development/compilers/ghc/8.10.2-binary.nix+14

This diff is too big to show here.

pkgs/development/compilers/ghc/8.10.7-binary.nix+14−1

This diff is too big to show here.

pkgs/development/compilers/ghc/8.10.7.nix+1−1

This diff is too big to show here.

pkgs/development/compilers/ghc/9.0.2.nix+21

This diff is too big to show here.

pkgs/development/compilers/ghc/head.nix+3−3

This diff is too big to show here.

pkgs/development/compilers/ghcjs/8.10/common-overrides.nix+32−3

This diff is too big to show here.

pkgs/development/compilers/ghcjs/8.10/default.nix+2−1

This diff is too big to show here.

pkgs/development/compilers/glslang/default.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/go-jsonnet/default.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/go/1.16.nix+1−2

This diff is too big to show here.

pkgs/development/compilers/go/1.17.nix+3−4

This diff is too big to show here.

pkgs/development/compilers/go/1.18.nix+3−4

This diff is too big to show here.

pkgs/development/compilers/go/2-dev.nixdeleted−276

This diff is too big to show here.

pkgs/development/compilers/go/ssl-cert-file-2-dev.patchdeleted−54

This diff is too big to show here.

pkgs/development/compilers/graalvm/community-edition/default.nix+16−29

This diff is too big to show here.

pkgs/development/compilers/graalvm/community-edition/graalvm11-ce-sources.json+24−56

This diff is too big to show here.

pkgs/development/compilers/graalvm/community-edition/graalvm17-ce-sources.json+28−42

This diff is too big to show here.

pkgs/development/compilers/graalvm/community-edition/mkGraal.nix+94−71

This diff is too big to show here.

pkgs/development/compilers/graalvm/community-edition/update.nix+11−9

This diff is too big to show here.

pkgs/development/compilers/graalvm/enterprise-edition.nixdeleted−183

This diff is too big to show here.

pkgs/development/compilers/hare/config-template.mknew file+27

This diff is too big to show here.

pkgs/development/compilers/hare/hare.nixnew file+93

This diff is too big to show here.

pkgs/development/compilers/hare/harec.nixnew file+45

This diff is too big to show here.

pkgs/development/compilers/hhvm/default.nixdeleted−68

This diff is too big to show here.

pkgs/development/compilers/hhvm/flexible-array-members-gcc6.patchdeleted−20

This diff is too big to show here.

pkgs/development/compilers/inklecate/default.nix+1−1

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/jasmin-compiler/default.nixnew file+41

This diff is too big to show here.

pkgs/development/compilers/julia/1.6-bin.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/kotlin/default.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/kotlin/native.nix+4−4

This diff is too big to show here.

pkgs/development/compilers/ldc/binary.nix+3−2

This diff is too big to show here.

pkgs/development/compilers/llvm/10/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/11/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/12/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/13/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/14/clang/default.nix+1

This diff is too big to show here.

pkgs/development/compilers/llvm/14/default.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/llvm/14/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/5/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/6/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/7/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/8/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/9/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/git/llvm/default.nix+6

This diff is too big to show here.

pkgs/development/compilers/llvm/multi.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/mruby/default.nix+9−1

This diff is too big to show here.

pkgs/development/compilers/mrustc/default.nix+1

This diff is too big to show here.

pkgs/development/compilers/muon/default.nix → pkgs/development/compilers/muonlang/default.nixrenamed

The content is the same.

pkgs/development/compilers/ocaml/4.00.1.nix+7−1

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.01.0.nix+7−1

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.02.nix+7−1

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.03.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.04.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.05.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.06.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.07.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.08.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.09.nix+6

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.10.nix+3

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.11.nix+3

This diff is too big to show here.

pkgs/development/compilers/ocaml/4.12.nix+5

This diff is too big to show here.

pkgs/development/compilers/ocaml/Makefile.nixpkgsnew file+16

This diff is too big to show here.

pkgs/development/compilers/ocaml/generic.nix+24−12

This diff is too big to show here.

pkgs/development/compilers/ocaml/glibc-2.34-for-ocaml-4.10-and-11.patchnew file+37

This diff is too big to show here.

pkgs/development/compilers/ocaml/metaocaml-3.09.nixdeleted−34

This diff is too big to show here.

pkgs/development/compilers/open-watcom/v2.nix+3−3

This diff is too big to show here.

pkgs/development/compilers/opendylan/bin.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/openjdk/11.nix+8−4

This diff is too big to show here.

pkgs/development/compilers/openjdk/16.nix+1

This diff is too big to show here.

pkgs/development/compilers/openjdk/17.nix+3−3

This diff is too big to show here.

pkgs/development/compilers/openjdk/8.nix+2−1

This diff is too big to show here.

pkgs/development/compilers/openjdk/darwin/8.nix+6

This diff is too big to show here.

pkgs/development/compilers/openjdk/fix-glibc-2.34.patchnew file+24

This diff is too big to show here.

pkgs/development/compilers/openjdk/fix-library-path-jdk11.patch+21−3

This diff is too big to show here.

pkgs/development/compilers/polyml/5.6.nix+9−1

This diff is too big to show here.

pkgs/development/compilers/polyml/5.7.nix+10−2

This diff is too big to show here.

pkgs/development/compilers/polyml/default.nix+7−1

This diff is too big to show here.

pkgs/development/compilers/ponyc/default.nix+2−11

This diff is too big to show here.

pkgs/development/compilers/ponyc/disable-tests.patch+9−7

This diff is too big to show here.

pkgs/development/compilers/ponyc/make-safe-for-sandbox.patch+17−12

This diff is too big to show here.

pkgs/development/compilers/ponyc/pony-corral.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/purescript/purescript/default.nix+5−7

This diff is too big to show here.

pkgs/development/compilers/purescript/purescript/test-minimal-module/Main.js+1−1

This diff is too big to show here.

pkgs/development/compilers/purescript/purescript/test-minimal-module/default.nix+2−2

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/rust/1_58.nixdeleted−63

This diff is too big to show here.

pkgs/development/compilers/rust/1_60.nixnew file+64

This diff is too big to show here.

pkgs/development/compilers/rust/binary.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/rust/cargo.nix+1−1

This diff is too big to show here.

pkgs/development/compilers/rust/rustfmt.nix+4−4

This diff is too big to show here.

pkgs/development/compilers/sbcl/2.2.4.nixnew file+4

This diff is too big to show here.

pkgs/development/compilers/scryer-prolog/cargo.patch+27−74

This diff is too big to show here.

pkgs/development/compilers/scryer-prolog/default.nix+19−6

This diff is too big to show here.

pkgs/development/compilers/scryer-prolog/fix-tests.patchnew file+29

This diff is too big to show here.

pkgs/development/compilers/solc/default.nix+34−11

This diff is too big to show here.

pkgs/development/compilers/squeak/default.nix+1−3

This diff is too big to show here.

pkgs/development/compilers/swift/default.nix−6

This diff is too big to show here.

pkgs/development/compilers/tinygo/default.nix+1−1

This diff is too big to show here.

pkgs/development/compilers/uasm/default.nix+31−18

This diff is too big to show here.

pkgs/development/compilers/vlang/default.nix+1−1

This diff is too big to show here.

pkgs/development/compilers/yosys/default.nix+2−2

This diff is too big to show here.

pkgs/development/compilers/zulu/8.nix+9−3

This diff is too big to show here.

pkgs/development/compilers/zulu/default.nix+7−1

This diff is too big to show here.

pkgs/development/coq-modules/CoLoR/default.nix+2−1

This diff is too big to show here.

pkgs/development/coq-modules/Verdi/default.nix+3

This diff is too big to show here.

pkgs/development/coq-modules/aac-tactics/default.nix+6−2

This diff is too big to show here.

pkgs/development/coq-modules/coqprime/default.nix+2−1

This diff is too big to show here.

pkgs/development/coq-modules/coqtail-math/default.nix+6−1

This diff is too big to show here.

pkgs/development/coq-modules/flocq/default.nix+2−2

This diff is too big to show here.

pkgs/development/coq-modules/gappalib/default.nix+2−1

This diff is too big to show here.

pkgs/development/coq-modules/mathcomp-word/default.nix+2−1

This diff is too big to show here.

pkgs/development/coq-modules/metacoq/default.nixnew file+76

This diff is too big to show here.

pkgs/development/coq-modules/metalib/default.nix+7−3

This diff is too big to show here.

pkgs/development/coq-modules/parsec/default.nix+6−2

This diff is too big to show here.

pkgs/development/coq-modules/relation-algebra/default.nix+8−1

This diff is too big to show here.

pkgs/development/coq-modules/simple-io/default.nix+10−3

This diff is too big to show here.

pkgs/development/coq-modules/smtcoq/default.nixnew file+26

This diff is too big to show here.

pkgs/development/coq-modules/tlc/default.nix+2

This diff is too big to show here.

pkgs/development/coq-modules/trakt/default.nixnew file+24

This diff is too big to show here.

pkgs/development/embedded/fpga/apio/default.nix+5−4

This diff is too big to show here.

pkgs/development/embedded/openocd/default.nix+11

This diff is too big to show here.

pkgs/development/embedded/platformio/core.nix+2−1

This diff is too big to show here.

pkgs/development/embedded/stm32/betaflight/default.nixdeleted−64

This diff is too big to show here.

pkgs/development/embedded/stm32/inav/default.nixdeleted−56

This diff is too big to show here.

pkgs/development/embedded/stm32/stm32flash/default.nix+2−2

This diff is too big to show here.

pkgs/development/gnuradio-modules/osmosdr/default.nix+2

This diff is too big to show here.

pkgs/development/go-modules/generic/default.nix+12−5

This diff is too big to show here.

pkgs/development/go-packages/generic/default.nix+11−3

This diff is too big to show here.

pkgs/development/haskell-modules/HACKING.md+1−1

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-arm.nix−1

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-common.nix+119−64

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-darwin.nix+6−9

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghc-8.10.x.nix+25−9

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghc-8.6.x.nix+6

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghc-8.8.x.nix+23−8

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix+10

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix+14−2

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghc-head.nix+14−4

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-ghcjs.nix+1−1

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-hackage2nix/broken.yaml+30−4

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-hackage2nix/main.yaml+19−2

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-hackage2nix/stackage.yaml+167−159

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-hackage2nix/transitive-broken.yaml+18−10

This diff is too big to show here.

pkgs/development/haskell-modules/configuration-nix.nix+16−3

This diff is too big to show here.

pkgs/development/haskell-modules/generic-builder.nix+9−6

This diff is too big to show here.

pkgs/development/haskell-modules/hackage-packages.nix+2961−3147

This diff is too big to show here.

pkgs/development/haskell-modules/non-hackage-packages.nix+1

This diff is too big to show here.

pkgs/development/haskell-modules/patches/graphql-engine-mapkeys.patchdeleted−33

This diff is too big to show here.

pkgs/development/haskell-modules/with-packages-wrapper.nix+4−4

This diff is too big to show here.

pkgs/development/idris-modules/default.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+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/dart/default.nix+6−1

This diff is too big to show here.

pkgs/development/interpreters/duktape/default.nix+1

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/gnu-apl/default.nix+3−1

This diff is too big to show here.

pkgs/development/interpreters/guile/1.8.nix−1

This diff is too big to show here.

pkgs/development/interpreters/guile/2.0.nix−1

This diff is too big to show here.

pkgs/development/interpreters/guile/2.2.nix−1

This diff is too big to show here.

pkgs/development/interpreters/guile/3.0.nix−1

This diff is too big to show here.

pkgs/development/interpreters/janet/default.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/joker/default.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/lolcode/default.nix+1

This diff is too big to show here.

pkgs/development/interpreters/luajit/2.0.nix+3−3

This diff is too big to show here.

pkgs/development/interpreters/luajit/2.1.nix+3−3

This diff is too big to show here.

pkgs/development/interpreters/luajit/default.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/maude/default.nix+4

This diff is too big to show here.

pkgs/development/interpreters/nickel/default.nixnew file+33

This diff is too big to show here.

pkgs/development/interpreters/octave/default.nix+3−10

This diff is too big to show here.

pkgs/development/interpreters/perl/default.nix+21−18

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/php/generic.nix+5−1

This diff is too big to show here.

pkgs/development/interpreters/pixie/default.nixdeleted−94

This diff is too big to show here.

pkgs/development/interpreters/pixie/dust.nixdeleted−46

This diff is too big to show here.

pkgs/development/interpreters/pixie/load_paths.patchdeleted−25

This diff is too big to show here.

pkgs/development/interpreters/pixie/make-paths-configurable.patchdeleted−119

This diff is too big to show here.

pkgs/development/interpreters/pure/default.nixdeleted−46

This diff is too big to show here.

pkgs/development/interpreters/python/cpython/3.11/python-3.x-distutils-C++.patchnew file+257

This diff is too big to show here.

pkgs/development/interpreters/python/cpython/default.nix+16−10

This diff is too big to show here.

pkgs/development/interpreters/python/default.nix+7−12

This diff is too big to show here.

pkgs/development/interpreters/python/graalpython/default.nixdeleted−21

This diff is too big to show here.

pkgs/development/interpreters/python/hooks/default.nix+6

This diff is too big to show here.

pkgs/development/interpreters/python/hooks/setuptools-build-hook.sh+3

This diff is too big to show here.

pkgs/development/interpreters/python/hooks/sphinx-hook.shnew file+57

This diff is too big to show here.

pkgs/development/interpreters/python/update-python-libraries/update-python-libraries.py+10−8

This diff is too big to show here.

pkgs/development/interpreters/python/wrapper.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/racket/default.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/racket/minimal.nix+1−1

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+12−2

This diff is too big to show here.

pkgs/development/interpreters/ruby/default.nix+26−30

This diff is too big to show here.

pkgs/development/interpreters/ruby/patchsets.nix+3−3

This diff is too big to show here.

pkgs/development/interpreters/ruby/rbinstall-new-rubygems-compat.patchnew file+87

This diff is too big to show here.

pkgs/development/interpreters/ruby/rubygems/default.nix+1−1

This diff is too big to show here.

pkgs/development/interpreters/scsh/default.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/sollya/default.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/spidermonkey/91.nix+2−2

This diff is too big to show here.

pkgs/development/interpreters/starlark/default.nixnew file+23

This diff is too big to show here.

pkgs/development/interpreters/supercollider/default.nix+36−13

This diff is too big to show here.

pkgs/development/interpreters/supercollider/plugins/sc3-plugins.nixnew file+33

This diff is too big to show here.

pkgs/development/interpreters/supercollider/supercollider-3.12.0-env-dirs.patchnew file+65

This diff is too big to show here.

pkgs/development/interpreters/supercollider/wrapper.nixnew file+18

This diff is too big to show here.

pkgs/development/interpreters/trealla/default.nix+1

This diff is too big to show here.

pkgs/development/interpreters/wasmtime/default.nix+19−9

This diff is too big to show here.

pkgs/development/interpreters/yex-lang/default.nix+1

This diff is too big to show here.

pkgs/development/interpreters/zuo/default.nixnew file+23

This diff is too big to show here.

pkgs/development/java-modules/liquibase_redshift_extension/default.nixnew file+27

This diff is too big to show here.

pkgs/development/java-modules/redshift_jdbc/default.nixnew file+28

This diff is too big to show here.

pkgs/development/libraries/CoinMP/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/SDL2/default.nix+13−1

This diff is too big to show here.

pkgs/development/libraries/SDL2/find-headers.patch+34

This diff is too big to show here.

pkgs/development/libraries/SDL_audiolib/default.nix+53

This diff is too big to show here.

pkgs/development/libraries/amdvlk/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/apache-activemq/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/applet-window-buttons/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/argagg/0001-catch.diff+20

This diff is too big to show here.

pkgs/development/libraries/argagg/default.nix+46

This diff is too big to show here.

pkgs/development/libraries/armadillo/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/aspell/default.nix+19−2

This diff is too big to show here.

pkgs/development/libraries/at-spi2-core/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/audio/libopenmpt/default.nix+66

This diff is too big to show here.

pkgs/development/libraries/audio/libopenmpt/update.sh+31

This diff is too big to show here.

pkgs/development/libraries/audio/libspecbleach/default.nix+26

This diff is too big to show here.

pkgs/development/libraries/audio/lilv/default.nix+1

This diff is too big to show here.

pkgs/development/libraries/audio/lv2/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/audio/sratom/default.nix+1

This diff is too big to show here.

pkgs/development/libraries/avahi/default.nix+5−1

This diff is too big to show here.

pkgs/development/libraries/avro-c/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/aws-c-sdkutils/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/aws-sdk-cpp/default.nix+41−12

This diff is too big to show here.

pkgs/development/libraries/bash/bash-preexec/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/bashup-events/generic.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/bc-decaf/default.nix+36

This diff is too big to show here.

pkgs/development/libraries/bctoolbox/default.nix+19−7

This diff is too big to show here.

pkgs/development/libraries/belcard/default.nix+4−3

This diff is too big to show here.

pkgs/development/libraries/belle-sip/default.nix+10−9

This diff is too big to show here.

pkgs/development/libraries/belr/default.nix+4−3

This diff is too big to show here.

pkgs/development/libraries/boost/1.69.nix+2

This diff is too big to show here.

pkgs/development/libraries/boost/1.70.nix+2

This diff is too big to show here.

pkgs/development/libraries/boost/1.72.nix+2

This diff is too big to show here.

pkgs/development/libraries/boost/1.78.nix+15

This diff is too big to show here.

pkgs/development/libraries/boost/default.nix+1

This diff is too big to show here.

pkgs/development/libraries/boost/generic.nix+23−5

This diff is too big to show here.

pkgs/development/libraries/boost/pthread-stack-min-fix.patch+15

This diff is too big to show here.

pkgs/development/libraries/botan/default.nix−17

This diff is too big to show here.

pkgs/development/libraries/bullet/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/bzrtp/default.nix+5−6

This diff is too big to show here.

pkgs/development/libraries/catch/default.nix+6

This diff is too big to show here.

pkgs/development/libraries/cgreen/default.nix+6

This diff is too big to show here.

pkgs/development/libraries/civetweb/default.nix+2−1

This diff is too big to show here.

pkgs/development/libraries/clucene-core/2.x.nix+4−1

This diff is too big to show here.

pkgs/development/libraries/clucene-core/default.nix+4

This diff is too big to show here.

pkgs/development/libraries/cpp-hocon/default.nix+4

This diff is too big to show here.

pkgs/development/libraries/cpp-ipfs-api/default.nix+4

This diff is too big to show here.

pkgs/development/libraries/cpp-utilities/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/cutelyst/default.nix+13−4

This diff is too big to show here.

pkgs/development/libraries/cwiid/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/cxxopts/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/cyrus-sasl/cyrus-sasl-ac-try-run-fix.patch+12−11

This diff is too big to show here.

pkgs/development/libraries/cyrus-sasl/default.nix+12−13

This diff is too big to show here.

pkgs/development/libraries/cyrus-sasl/missing-size_t.patch−13

This diff is too big to show here.

pkgs/development/libraries/dav1d/default.nix+4−2

This diff is too big to show here.

pkgs/development/libraries/dbus/default.nix+7

This diff is too big to show here.

pkgs/development/libraries/docopt_cpp/default.nix+10−2

This diff is too big to show here.

pkgs/development/libraries/doctest/default.nix+5−5

This diff is too big to show here.

pkgs/development/libraries/dotconf/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/duckdb/default.nix+36−3

This diff is too big to show here.

pkgs/development/libraries/entt/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/expat/default.nix+3−2

This diff is too big to show here.

pkgs/development/libraries/faudio/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/fcft/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/ffmpeg/0001-fate-ffmpeg-add-missing-samples-dependency-to-fate-s.patch−27

This diff is too big to show here.

pkgs/development/libraries/ffmpeg/5.nix+2−4

This diff is too big to show here.

pkgs/development/libraries/ffmpegthumbnailer/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/flatcc/default.nix+5

This diff is too big to show here.

pkgs/development/libraries/flint/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/fltk/common.nix+2−9

This diff is too big to show here.

pkgs/development/libraries/freeimage/default.nix+4−4

This diff is too big to show here.

pkgs/development/libraries/freeimage/unbundle.diff+39−39

This diff is too big to show here.

pkgs/development/libraries/freetype/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gcc/libgcc/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/gdal/2.4.nix+11−1

This diff is too big to show here.

pkgs/development/libraries/gdal/default.nix+40

This diff is too big to show here.

pkgs/development/libraries/gdata-sharp/default.nix−42

This diff is too big to show here.

pkgs/development/libraries/gdcm/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gecode/3.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gensio/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/geos/3.9.nix+25

This diff is too big to show here.

pkgs/development/libraries/geos/default.nix+15−6

This diff is too big to show here.

pkgs/development/libraries/ggz_base_libs/default.nix+2−3

This diff is too big to show here.

pkgs/development/libraries/ghc_filesystem/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/glfw/3.x.nix+4−5

This diff is too big to show here.

pkgs/development/libraries/glib/default.nix+8−2

This diff is too big to show here.

pkgs/development/libraries/glib/elementary-terminal-support.patch+16

This diff is too big to show here.

pkgs/development/libraries/glib/gnome-console-support.patch+55

This diff is too big to show here.

pkgs/development/libraries/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch+131

This diff is too big to show here.

pkgs/development/libraries/glibc/2.33-master.patch.gz

This diff is too big to show here.

pkgs/development/libraries/glibc/2.34-master.patch.gz

This diff is too big to show here.

pkgs/development/libraries/glibc/common.nix+21−8

This diff is too big to show here.

pkgs/development/libraries/glibc/default.nix+15−7

This diff is too big to show here.

pkgs/development/libraries/glibc/nix-locale-archive.patch+24−21

This diff is too big to show here.

pkgs/development/libraries/glibmm/2.68.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/glibmm/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/glm/default.nix+5

This diff is too big to show here.

pkgs/development/libraries/globalplatform/default.nix−21

This diff is too big to show here.

pkgs/development/libraries/globalplatform/gppcscconnectionplugin.nix−21

This diff is too big to show here.

pkgs/development/libraries/glog/default.nix+5−14

This diff is too big to show here.

pkgs/development/libraries/gmp/6.x.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/gnutls-kdh/3.5.nix−12

This diff is too big to show here.

pkgs/development/libraries/gnutls-kdh/generic.nix−95

This diff is too big to show here.

pkgs/development/libraries/goffice/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/goocanvas/2.x.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/graphene-hardened-malloc/default.nix+15−8

This diff is too big to show here.

pkgs/development/libraries/graphene/0001-meson-add-options-for-tests-installation-dirs.patch+13−59

This diff is too big to show here.

pkgs/development/libraries/graphene/default.nix+14−3

This diff is too big to show here.

pkgs/development/libraries/grpc/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gsettings-desktop-schemas/default.nix+9−3

This diff is too big to show here.

pkgs/development/libraries/gspell/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/bad/default.nix+5−3

This diff is too big to show here.

pkgs/development/libraries/gstreamer/base/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/core/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/devtools/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/ges/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/good/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/libav/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/rtsp-server/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/ugly/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/vaapi/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gstreamer/viperfx/default.nix+41

This diff is too big to show here.

pkgs/development/libraries/gtk-frdp/default.nix+3−5

This diff is too big to show here.

pkgs/development/libraries/gtk/4.x.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gtkmathview/default.nix−29

This diff is too big to show here.

pkgs/development/libraries/gtkmathview/gcc-4.3-build-fixes.patch−74

This diff is too big to show here.

pkgs/development/libraries/gtkmathview/gcc-4.4-build-fixes.patch−21

This diff is too big to show here.

pkgs/development/libraries/gtkmm/2.x.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/gtksourceview/5.x.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gusb/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/gvfs/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/hivex/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/hspell/dicts.nix+4−4

This diff is too big to show here.

pkgs/development/libraries/htmlcxx/c++17.patch+24

This diff is too big to show here.

pkgs/development/libraries/htmlcxx/default.nix+7−4

This diff is too big to show here.

pkgs/development/libraries/http-parser/default.nix+9−2

This diff is too big to show here.

pkgs/development/libraries/hunspell/dictionaries.nix+2−3

This diff is too big to show here.

pkgs/development/libraries/hwloc/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/hyperscan/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/igraph/default.nix+10−6

This diff is too big to show here.

pkgs/development/libraries/ijs/default.nix+2−3

This diff is too big to show here.

pkgs/development/libraries/ilixi/default.nix−35

This diff is too big to show here.

pkgs/development/libraries/imath/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/inih/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/intel-media-driver/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/intel-media-sdk/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/isl/generic.nix+2−1

This diff is too big to show here.

pkgs/development/libraries/jarowinkler-cpp/default.nix+41

This diff is too big to show here.

pkgs/development/libraries/java/commons/daemon/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/jcal/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/jellyfin-ffmpeg/default.nix+30

This diff is too big to show here.

pkgs/development/libraries/jsoncpp/default.nix+27−3

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/attica.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/baloo.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/bluez-qt.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/breeze-icons.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/default.nix+4−5

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/extra-cmake-modules/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/fetch.sh+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/frameworkintegration.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kactivities-stats.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kactivities.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kapidox.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/karchive.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kauth/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kbookmarks.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcalendarcore.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcmutils/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcodecs.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcompletion.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kconfig.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kconfigwidgets/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcontacts.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcoreaddons.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kcrash.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdav.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdbusaddons.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdeclarative.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kded.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdelibs4support/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdesignerplugin.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdesu/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdewebkit.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdnssd.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kdoctools/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kemoticons.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kfilemetadata/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kglobalaccel.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kguiaddons.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kholidays.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/khtml.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/ki18n.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kiconthemes/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kidletime.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kimageformats.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kinit/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kio/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kirigami2.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kitemmodels.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kitemviews.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kjobwidgets.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kjs.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kjsembed.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kmediaplayer.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/knewstuff/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/knotifications.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/knotifyconfig.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kpackage/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kparts.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kpeople.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kplotting.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kpty.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kquickcharts.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kross.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/krunner.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kservice/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/ktexteditor.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/ktextwidgets.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kunitconversion.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kwallet.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kwayland.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kwidgetsaddons.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kwindowsystem/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kxmlgui.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/kxmlrpcclient.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/modemmanager-qt.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/networkmanager-qt.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/oxygen-icons5.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/plasma-framework.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/prison.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/purpose.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/qqc2-desktop-style.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/solid.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/sonnet.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/srcs.nix+332−332

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/syndication.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/syntax-highlighting.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kde-frameworks/threadweaver.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kerberos/krb5.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/khronos-ocl-icd-loader/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/kpmcore/default.nix+10−18

This diff is too big to show here.

pkgs/development/libraries/languagemachines/frog.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/frogdata.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/libfolia.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/mbt.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/ticcutils.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/timbl.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/timblserver.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/ucto.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/languagemachines/uctodata.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/lasso/default.nix+35−9

This diff is too big to show here.

pkgs/development/libraries/leatherman/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/leveldb/default.nix+1−5

This diff is too big to show here.

pkgs/development/libraries/libadwaita/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libappindicator/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libarchive/default.nix+74−32

This diff is too big to show here.

pkgs/development/libraries/libargon2/default.nix+3−1

This diff is too big to show here.

pkgs/development/libraries/libargs/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libavif/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libcbor/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libcef/default.nix+6−6

This diff is too big to show here.

pkgs/development/libraries/libcollectdclient/default.nix+2−1

This diff is too big to show here.

pkgs/development/libraries/libdeltachat/default.nix+3−5

This diff is too big to show here.

pkgs/development/libraries/libdvbcsa/default.nix+22

This diff is too big to show here.

pkgs/development/libraries/libe57format/default.nix+9

This diff is too big to show here.

pkgs/development/libraries/libechonest/default.nix+3

This diff is too big to show here.

pkgs/development/libraries/libepoxy/default.nix+2−3

This diff is too big to show here.

pkgs/development/libraries/libevdev/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libfido2/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libfive/default.nix+1

This diff is too big to show here.

pkgs/development/libraries/libgcrypt/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libguestfs/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libhandy/default.nix+5−2

This diff is too big to show here.

pkgs/development/libraries/libinjection/default.nix+12−4

This diff is too big to show here.

pkgs/development/libraries/libinput/default.nix+17−7

This diff is too big to show here.

pkgs/development/libraries/libixp-hg/default.nix−27

This diff is too big to show here.

pkgs/development/libraries/libixp/default.nix+28

This diff is too big to show here.

pkgs/development/libraries/libjcat/default.nix+4−3

This diff is too big to show here.

pkgs/development/libraries/libjpeg-turbo/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libjson/default.nix+1

This diff is too big to show here.

pkgs/development/libraries/libjxl/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/libkqueue/default.nix+23

This diff is too big to show here.

pkgs/development/libraries/liblastfm/default.nix+5

This diff is too big to show here.

pkgs/development/libraries/liblinphone/default.nix+23−9

This diff is too big to show here.

pkgs/development/libraries/liblinphone/use-normal-jsoncpp.patch+57

This diff is too big to show here.

pkgs/development/libraries/libmnl/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libnet/default.nix+14−6

This diff is too big to show here.

pkgs/development/libraries/libnet/fix-includes.patch−29

This diff is too big to show here.

pkgs/development/libraries/libnetfilter_conntrack/default.nix+11−3

This diff is too big to show here.

pkgs/development/libraries/libnfc/default.nix+10−7

This diff is too big to show here.

pkgs/development/libraries/libnfnetlink/Use-stdlib-uint-instead-of-u_int.patch−499

This diff is too big to show here.

pkgs/development/libraries/libnfnetlink/default.nix+2−6

This diff is too big to show here.

pkgs/development/libraries/libnftnl/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/libngspice/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libosmscout/default.nix+11−8

This diff is too big to show here.

pkgs/development/libraries/libotr/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/libotr/fix-regtest-client.patch+11

This diff is too big to show here.

pkgs/development/libraries/libowfat/default.nix+3

This diff is too big to show here.

pkgs/development/libraries/libpinyin/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/libpostal/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/libpqxx/6.nix+4−4

This diff is too big to show here.

pkgs/development/libraries/libpqxx/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libqalculate/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libraspberrypi/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/libraw/default.nix+4−4

This diff is too big to show here.

pkgs/development/libraries/libraw/unstable.nix+12

This diff is too big to show here.

pkgs/development/libraries/librealsense/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/libressl/fix-build-with-glibc.patch+92

This diff is too big to show here.

pkgs/development/libraries/libsecret/default.nix+25−10

This diff is too big to show here.

pkgs/development/libraries/libslirp/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libsoup/3.x.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libspf2/default.nix+9−1

This diff is too big to show here.

pkgs/development/libraries/libsystemtap/default.nix+9−6

This diff is too big to show here.

pkgs/development/libraries/libtiff/default.nix+30

This diff is too big to show here.

pkgs/development/libraries/libuldaq/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libunistring/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libunwind/default.nix+9−1

This diff is too big to show here.

pkgs/development/libraries/libusb1/default.nix+4−10

This diff is too big to show here.

pkgs/development/libraries/libuv/default.nix+3−2

This diff is too big to show here.

pkgs/development/libraries/libva/1.0.0.nix−37

This diff is too big to show here.

pkgs/development/libraries/libva/1.nix+50

This diff is too big to show here.

pkgs/development/libraries/libva/default.nix+4−4

This diff is too big to show here.

pkgs/development/libraries/libva/utils.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/libvdpau/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libviperfx/default.nix+30

This diff is too big to show here.

pkgs/development/libraries/libvirt/default.nix+7−1

This diff is too big to show here.

pkgs/development/libraries/libvmaf/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libwacom/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/libwebsockets/default.nix+14−3

This diff is too big to show here.

pkgs/development/libraries/libxcrypt/default.nix+6−2

This diff is too big to show here.

pkgs/development/libraries/libxmlb/default.nix+4−12

This diff is too big to show here.

pkgs/development/libraries/libxsmm/default.nix+1−3

This diff is too big to show here.

pkgs/development/libraries/libyang/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/lime/default.nix+15−5

This diff is too big to show here.

pkgs/development/libraries/liquid-dsp/default.nix+4−5

This diff is too big to show here.

pkgs/development/libraries/log4shib/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/mapbox-gl-native/default.nix+5

This diff is too big to show here.

pkgs/development/libraries/mapbox-gl-qml/default.nix+4−7

This diff is too big to show here.

pkgs/development/libraries/maplibre-gl-native/default.nix+66

This diff is too big to show here.

pkgs/development/libraries/mediastreamer/default.nix+22−15

This diff is too big to show here.

pkgs/development/libraries/mediastreamer/msopenh264.nix+6−7

This diff is too big to show here.

pkgs/development/libraries/mesa/default.nix+8−5

This diff is too big to show here.

pkgs/development/libraries/mimetic/default.nix+8−2

This diff is too big to show here.

pkgs/development/libraries/mlt/qt-5.nix+1

This diff is too big to show here.

pkgs/development/libraries/mpich/default.nix+5−2

This diff is too big to show here.

pkgs/development/libraries/mustache-hpp/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/mvapich/default.nix+1

This diff is too big to show here.

pkgs/development/libraries/netcdf-fortran/default.nix+3

This diff is too big to show here.

pkgs/development/libraries/netcdf/default.nix+6−18

This diff is too big to show here.

pkgs/development/libraries/nghttp2/default.nix+63−43

This diff is too big to show here.

pkgs/development/libraries/nghttp3/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/ngtcp2/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/nlopt/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/notcurses/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/nss/85_security_load_3.77+.patch+76

This diff is too big to show here.

pkgs/development/libraries/nss/esr.nix+4

This diff is too big to show here.

pkgs/development/libraries/nss/generic.nix+11−11

This diff is too big to show here.

pkgs/development/libraries/nss/latest.nix+10

This diff is too big to show here.

pkgs/development/libraries/ntdb/default.nix−51

This diff is too big to show here.

pkgs/development/libraries/openal-soft/default.nix+14−8

This diff is too big to show here.

pkgs/development/libraries/openal-soft/search-out.patch+2−2

This diff is too big to show here.

pkgs/development/libraries/opendht/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/openfst/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/openjpeg/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/openmpi/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/openssl/1.0.2/darwin64-arm64.patch−12

This diff is too big to show here.

pkgs/development/libraries/openssl/1.0.2/nix-ssl-cert-file.patch−16

This diff is too big to show here.

pkgs/development/libraries/openssl/1.0.2/use-etc-ssl-certs-darwin.patch−13

This diff is too big to show here.

pkgs/development/libraries/openssl/1.0.2/use-etc-ssl-certs.patch−13

This diff is too big to show here.

pkgs/development/libraries/openssl/chacha.nix−82

This diff is too big to show here.

pkgs/development/libraries/openssl/default.nix+8−16

This diff is too big to show here.

pkgs/development/libraries/opensubdiv/default.nix+9−2

This diff is too big to show here.

pkgs/development/libraries/openvino/default.nix+3−1

This diff is too big to show here.

pkgs/development/libraries/ortp/default.nix+5−4

This diff is too big to show here.

pkgs/development/libraries/pcmsolver/default.nix+9−2

This diff is too big to show here.

pkgs/development/libraries/pcre/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/pcre2/default.nix+1−3

This diff is too big to show here.

pkgs/development/libraries/pdal/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/phash/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/physics/cernlib/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/physics/lhapdf/maintainer.sh+2−2

This diff is too big to show here.

pkgs/development/libraries/physics/lhapdf/pdf_sets.nix+431−129

This diff is too big to show here.

pkgs/development/libraries/physics/qcdnum/default.nix+4

This diff is too big to show here.

pkgs/development/libraries/pmdk/default.nix+4−2

This diff is too big to show here.

pkgs/development/libraries/pocketsphinx/default.nix−48

This diff is too big to show here.

pkgs/development/libraries/polkit-qt-1/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/polkit/default.nix+6

This diff is too big to show here.

pkgs/development/libraries/poppler/0.61-CVE-2019-9959.patch−20

This diff is too big to show here.

pkgs/development/libraries/poppler/0.61.nix−94

This diff is too big to show here.

pkgs/development/libraries/proj/default.nix+17−8

This diff is too big to show here.

pkgs/development/libraries/protobuf/2.5.nix−10

This diff is too big to show here.

pkgs/development/libraries/protobuf/generic.nix−61

This diff is too big to show here.

pkgs/development/libraries/protolock/default.nix−2

This diff is too big to show here.

pkgs/development/libraries/ptex/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/qca-qt5/2.3.2.nix+30

This diff is too big to show here.

pkgs/development/libraries/qca-qt5/default.nix+5−10

This diff is too big to show here.

pkgs/development/libraries/qrupdate/default.nix+8−6

This diff is too big to show here.

pkgs/development/libraries/qt-5/5.12/default.nix+9−1

This diff is too big to show here.

pkgs/development/libraries/qt-5/5.14/default.nix+8−2

This diff is too big to show here.

pkgs/development/libraries/qt-5/5.14/qtwayland-libdrm-build.patch−56

This diff is too big to show here.

pkgs/development/libraries/qt-5/5.15/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/qt-5/5.15/srcs-generated.json+63−63

This diff is too big to show here.

pkgs/development/libraries/qt-5/modules/qtbase.nix+9−5

This diff is too big to show here.

pkgs/development/libraries/qt-5/modules/qtmultimedia.nix+3−2

This diff is too big to show here.

pkgs/development/libraries/qt-5/modules/qtwayland-app_id.patch+36

This diff is too big to show here.

pkgs/development/libraries/qt-5/modules/qtwayland.nix+6

This diff is too big to show here.

pkgs/development/libraries/qt-5/modules/qtwebengine.nix+22−6

This diff is too big to show here.

pkgs/development/libraries/qt-5/qtModule.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/qtutilities/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/quictls/default.nix+3−8

This diff is too big to show here.

pkgs/development/libraries/qwt/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/qxt/default.nix−34

This diff is too big to show here.

pkgs/development/libraries/rapidcheck/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/rapidfuzz-cpp/default.nix+41

This diff is too big to show here.

pkgs/development/libraries/re2/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/recastnavigation/default.nix+7−1

This diff is too big to show here.

pkgs/development/libraries/redis-plus-plus/default.nix+38

This diff is too big to show here.

pkgs/development/libraries/rlottie/default.nix+16−1

This diff is too big to show here.

pkgs/development/libraries/robin-map/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/rocclr/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/rocm-comgr/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/rocm-device-libs/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/rocm-runtime/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/rocm-thunk/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/s2n-tls/default.nix+3

This diff is too big to show here.

pkgs/development/libraries/science/astronomy/indilib/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/science/astronomy/wcslib/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/science/biology/htslib/default.nix+18−2

This diff is too big to show here.

pkgs/development/libraries/science/math/blis/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/science/math/caffe2/default.nix−147

This diff is too big to show here.

pkgs/development/libraries/science/math/caffe2/fix_compilation_on_gcc7.patch−46

This diff is too big to show here.

pkgs/development/libraries/science/math/caffe2/update_clang_cvtsh_bugfix.patch−55

This diff is too big to show here.

pkgs/development/libraries/science/math/cudnn/default.nix−118

This diff is too big to show here.

pkgs/development/libraries/science/math/cudnn/extension.nix+116

This diff is too big to show here.

pkgs/development/libraries/science/math/cudnn/generic.nix+62−43

This diff is too big to show here.

pkgs/development/libraries/science/math/cutensor/default.nix−49

This diff is too big to show here.

pkgs/development/libraries/science/math/cutensor/generic.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/science/math/liblapack/default.nix+2−11

This diff is too big to show here.

pkgs/development/libraries/science/math/libtorch/test/default.nix+3−2

This diff is too big to show here.

pkgs/development/libraries/science/math/magma/default.nix+7−20

This diff is too big to show here.

pkgs/development/libraries/science/math/nccl/default.nix+6−2

This diff is too big to show here.

pkgs/development/libraries/science/math/petsc/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/science/math/scalapack/default.nix+8−1

This diff is too big to show here.

pkgs/development/libraries/science/math/tensorflow/bin.nix+4−1

This diff is too big to show here.

pkgs/development/libraries/science/math/zn_poly/default.nix+4−14

This diff is too big to show here.

pkgs/development/libraries/seasocks/default.nix+7−1

This diff is too big to show here.

pkgs/development/libraries/simgear/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/simpleitk/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/skalibs/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/slang/default.nix+7

This diff is too big to show here.

pkgs/development/libraries/smesh/default.nix+2

This diff is too big to show here.

pkgs/development/libraries/snack/default.nix−36

This diff is too big to show here.

pkgs/development/libraries/soci/bc-soci.nix+53

This diff is too big to show here.

pkgs/development/libraries/soci/default.nix+1−1

This diff is too big to show here.

pkgs/development/libraries/spdlog/default.nix+7−3

This diff is too big to show here.

pkgs/development/libraries/sphinxbase/default.nix−40

This diff is too big to show here.

pkgs/development/libraries/spirv-headers/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/sqlite/default.nix+4−2

This diff is too big to show here.

pkgs/development/libraries/sqlite/tools.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/sundials/default.nix+13

This diff is too big to show here.

pkgs/development/libraries/symengine/default.nix+5

This diff is too big to show here.

pkgs/development/libraries/tachyon/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/talloc/default.nix+2−1

This diff is too big to show here.

pkgs/development/libraries/taskflow/default.nix+50

This diff is too big to show here.

pkgs/development/libraries/taskflow/unvendor-doctest.patch+21

This diff is too big to show here.

pkgs/development/libraries/tdlib/default.nix+3−3

This diff is too big to show here.

pkgs/development/libraries/template-glib/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/tomlc99/default.nix+30

This diff is too big to show here.

pkgs/development/libraries/tomlcpp/0001-missing-headers.diff+15

This diff is too big to show here.

pkgs/development/libraries/tomlcpp/default.nix+35

This diff is too big to show here.

pkgs/development/libraries/tpm2-tss/default.nix+7−3

This diff is too big to show here.

pkgs/development/libraries/umockdev/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/unixODBCDrivers/default.nix+46−3

This diff is too big to show here.

pkgs/development/libraries/utmps/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/valhalla/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/vapoursynth/default.nix+4−7

This diff is too big to show here.

pkgs/development/libraries/vigra/default.nix+3−15

This diff is too big to show here.

pkgs/development/libraries/vulkan-headers/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/vulkan-loader/default.nix+6−3

This diff is too big to show here.

pkgs/development/libraries/vulkan-loader/fix-pkgconfig.patch+14

This diff is too big to show here.

pkgs/development/libraries/wasilibc/default.nix+19−14

This diff is too big to show here.

pkgs/development/libraries/waylandpp/default.nix+4−3

This diff is too big to show here.

pkgs/development/libraries/webkitgtk/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/wolfssl/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/wxwidgets/wxGTK28.nix−2

This diff is too big to show here.

pkgs/development/libraries/wxwidgets/wxGTK29.nix−1

This diff is too big to show here.

pkgs/development/libraries/wxwidgets/wxGTK30.nix+2−3

This diff is too big to show here.

pkgs/development/libraries/wxwidgets/wxGTK31.nix+3−5

This diff is too big to show here.

pkgs/development/libraries/wxwidgets/wxmac30.nix+7−5

This diff is too big to show here.

pkgs/development/libraries/xdg-desktop-portal-gnome/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/xdg-desktop-portal-gtk/default.nix+2−2

This diff is too big to show here.

pkgs/development/libraries/xdg-desktop-portal/default.nix+18−12

This diff is too big to show here.

pkgs/development/libraries/xdg-desktop-portal/fix-paths.patch−13

This diff is too big to show here.

pkgs/development/libraries/xgboost/default.nix+5−5

This diff is too big to show here.

pkgs/development/libraries/zeroc-ice/3.6.nix−59

This diff is too big to show here.

pkgs/development/libraries/zeroc-ice/default.nix+13

This diff is too big to show here.

pkgs/development/libraries/zeroc-ice/uninitialized-variable-warning.patch−20

This diff is too big to show here.

pkgs/development/libraries/zlib/CVE-2018-25032-1.patch+346

This diff is too big to show here.

pkgs/development/libraries/zlib/CVE-2018-25032-2.patch+27

This diff is too big to show here.

pkgs/development/libraries/zlib/default.nix+6−4

This diff is too big to show here.

pkgs/development/libraries/zlib/disable-cygwin-widechar.patch−13

This diff is too big to show here.

pkgs/development/libraries/zlib/fix-configure-issue-cross.patch+24

This diff is too big to show here.

pkgs/development/lisp-modules-new/.gitattributes+1

This diff is too big to show here.

pkgs/development/lisp-modules-new/.gitignore+3

This diff is too big to show here.

pkgs/development/lisp-modules-new/doc/api.md+197

This diff is too big to show here.

pkgs/development/lisp-modules-new/doc/nix-cl.md+98

This diff is too big to show here.

pkgs/development/lisp-modules-new/doc/quicklisp.md+54

This diff is too big to show here.

pkgs/development/lisp-modules-new/doc/quirks.md+5

This diff is too big to show here.

pkgs/development/lisp-modules-new/examples/abcl-package-set.nix+24

This diff is too big to show here.

pkgs/development/lisp-modules-new/examples/abcl-with-packages.nix+23

This diff is too big to show here.

pkgs/development/lisp-modules-new/examples/bordeaux-threads.nix+43

This diff is too big to show here.

pkgs/development/lisp-modules-new/examples/sbcl-with-bt.nix+31

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/api.lisp+18

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/database/sqlite.lisp+134

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/init.sql+41

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/main.lisp+40

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/nix.lisp+81

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/org.lispbuilds.nix.asd+24

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/repository/quicklisp.lisp+199

This diff is too big to show here.

pkgs/development/lisp-modules-new/import/util.lisp+16

This diff is too big to show here.

pkgs/development/lisp-modules-new/imported.nix+65675

This diff is too big to show here.

pkgs/development/lisp-modules-new/lisp-packages.nix+432

This diff is too big to show here.

pkgs/development/lisp-modules-new/old-make-wrapper.sh+155

This diff is too big to show here.

pkgs/development/lisp-modules-new/packages.nix+369

This diff is too big to show here.

pkgs/development/lisp-modules-new/patches/swank-pure-paths.patch+28

This diff is too big to show here.

pkgs/development/lisp-modules-new/ql-import.lisp+6

This diff is too big to show here.

pkgs/development/lisp-modules-new/ql.nix+140

This diff is too big to show here.

pkgs/development/lisp-modules-new/readme.md+34

This diff is too big to show here.

pkgs/development/lisp-modules-new/shell.nix+7

This diff is too big to show here.

pkgs/development/lisp-modules-new/test/lispPackagesToTest.txt+395

This diff is too big to show here.

pkgs/development/lisp-modules-new/test/test.lisp+94

This diff is too big to show here.

pkgs/development/lua-modules/generated-packages.nix+42−9

This diff is too big to show here.

pkgs/development/lua-modules/luaexpat.patch−36

This diff is too big to show here.

pkgs/development/lua-modules/overrides.nix+8−7

This diff is too big to show here.

pkgs/development/misc/breakpad/default.nix+5

This diff is too big to show here.

pkgs/development/misc/datafusion/default.nix+34

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/ekg-core.nix+8−9

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/ekg-json.nix+6−3

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/graphql-engine.nix+70−50

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/graphql-parser.nix+16−12

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/kriti-lang.nix+41

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/pg-client.nix+18−17

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/pool.nix+1−1

This diff is too big to show here.

pkgs/development/misc/haskell/hasura/update.sh+11−1

This diff is too big to show here.

pkgs/development/misc/msp430/mspds/binary.nix+2−1

This diff is too big to show here.

pkgs/development/misc/resholve/README.md+111−58

This diff is too big to show here.

pkgs/development/misc/resholve/default.nix+5−37

This diff is too big to show here.

pkgs/development/misc/resholve/resholve-package.nix−37

This diff is too big to show here.

pkgs/development/misc/resholve/resholve-utils.nix+149−20

This diff is too big to show here.

pkgs/development/misc/resholve/resholve.nix+7−6

This diff is too big to show here.

pkgs/development/misc/resholve/source.nix+2−2

This diff is too big to show here.

pkgs/development/misc/resholve/test.nix+18−57

This diff is too big to show here.

pkgs/development/mobile/androidenv/build-tools.nix+2−2

This diff is too big to show here.

pkgs/development/mobile/androidenv/platform-tools.nix+1−2

This diff is too big to show here.

pkgs/development/nim-packages/tempfile/default.nix+1

This diff is too big to show here.

pkgs/development/node-packages/composition.nix+1−1

This diff is too big to show here.

pkgs/development/node-packages/default.nix+24−42

This diff is too big to show here.

pkgs/development/node-packages/node-env.nix+21−11

This diff is too big to show here.

pkgs/development/node-packages/node-packages.json+4−2

This diff is too big to show here.

pkgs/development/node-packages/node-packages.nix+7383−6986

This diff is too big to show here.

pkgs/development/ocaml-modules/alcotest/default.nix+6−4

This diff is too big to show here.

pkgs/development/ocaml-modules/asn1-combinators/default.nix+1−3

This diff is too big to show here.

pkgs/development/ocaml-modules/atd/default.nix+6−14

This diff is too big to show here.

pkgs/development/ocaml-modules/atdgen/codec-runtime.nix+18

This diff is too big to show here.

pkgs/development/ocaml-modules/atdgen/default.nix+8−17

This diff is too big to show here.

pkgs/development/ocaml-modules/atdgen/runtime.nix+15

This diff is too big to show here.

pkgs/development/ocaml-modules/bap/default.nix+5−4

This diff is too big to show here.

pkgs/development/ocaml-modules/batteries/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/bitstring/ppx.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/bitv/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/bjack/default.nix+25

This diff is too big to show here.

pkgs/development/ocaml-modules/brisk-reconciler/default.nix+33

This diff is too big to show here.

pkgs/development/ocaml-modules/bz2/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/camlp-streams/default.nix+20

This diff is too big to show here.

pkgs/development/ocaml-modules/camlpdf/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/caqti/default.nix+9−4

This diff is too big to show here.

pkgs/development/ocaml-modules/cmdliner/default.nix+15−23

This diff is too big to show here.

pkgs/development/ocaml-modules/coin/default.nix+6−9

This diff is too big to show here.

pkgs/development/ocaml-modules/cpdf/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/cstruct/lwt.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/cstruct/ppx.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/cstruct/sexp.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/cstruct/unix.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/csv/lwt.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ctypes/default.nix+3−3

This diff is too big to show here.

pkgs/development/ocaml-modules/dssi/default.nix+25

This diff is too big to show here.

pkgs/development/ocaml-modules/dune-action-plugin/default.nix+4

This diff is too big to show here.

pkgs/development/ocaml-modules/dune-glob/default.nix+4

This diff is too big to show here.

pkgs/development/ocaml-modules/dune-private-libs/default.nix+4

This diff is too big to show here.

pkgs/development/ocaml-modules/dune-rpc/default.nix+23

This diff is too big to show here.

pkgs/development/ocaml-modules/dune-site/default.nix+4

This diff is too big to show here.

pkgs/development/ocaml-modules/eliom/default.nix+9−3

This diff is too big to show here.

pkgs/development/ocaml-modules/erm_xml/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/expat/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/farfadet/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ffmpeg/base.nix+2−2

This diff is too big to show here.

pkgs/development/ocaml-modules/fiber/default.nix+23

This diff is too big to show here.

pkgs/development/ocaml-modules/flex/default.nix+22

This diff is too big to show here.

pkgs/development/ocaml-modules/fmt/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/fpath/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/frontc/default.nix+8−25

This diff is too big to show here.

pkgs/development/ocaml-modules/gen_js_api/default.nix+41

This diff is too big to show here.

pkgs/development/ocaml-modules/gen_js_api/ojs.nix+21

This diff is too big to show here.

pkgs/development/ocaml-modules/hacl-star/raw.nix+3

This diff is too big to show here.

pkgs/development/ocaml-modules/javalib/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/lablgl/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/lablgtk-extras/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ladspa/default.nix+25

This diff is too big to show here.

pkgs/development/ocaml-modules/lastfm/default.nix+32

This diff is too big to show here.

pkgs/development/ocaml-modules/llvm/default.nix+2−2

This diff is too big to show here.

pkgs/development/ocaml-modules/logs/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/lua-ml/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/lwt/default.nix+3−3

This diff is too big to show here.

pkgs/development/ocaml-modules/nocrypto/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/notty/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ocaml-lsp/default.nix+7−8

This diff is too big to show here.

pkgs/development/ocaml-modules/ocaml-lsp/jsonrpc.nix+8−4

This diff is too big to show here.

pkgs/development/ocaml-modules/ocaml-lsp/lsp.nix+25−5

This diff is too big to show here.

pkgs/development/ocaml-modules/ocamlformat-rpc-lib/default.nix+15−3

This diff is too big to show here.

pkgs/development/ocaml-modules/ocp-ocamlres/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsigen-deriving/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsigen-ppx-rpc/default.nix+23

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsigen-server/default.nix+4−4

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsigen-start/default.nix+4−2

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsigen-toolkit/default.nix+2−2

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsipersist/default.nix+20

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsipersist/lib.nix+27

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsipersist/pgsql.nix+24

This diff is too big to show here.

pkgs/development/ocaml-modules/ocsipersist/sqlite.nix+23

This diff is too big to show here.

pkgs/development/ocaml-modules/phylogenetics/default.nix+2−4

This diff is too big to show here.

pkgs/development/ocaml-modules/ppxlib/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/ptime/default.nix+5−5

This diff is too big to show here.

pkgs/development/ocaml-modules/pure-splitmix/default.nix+22

This diff is too big to show here.

pkgs/development/ocaml-modules/reactivedata/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/rebez/default.nix+22

This diff is too big to show here.

pkgs/development/ocaml-modules/reperf/default.nix+41

This diff is too big to show here.

pkgs/development/ocaml-modules/samplerate/default.nix+25

This diff is too big to show here.

pkgs/development/ocaml-modules/sawja/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/sedlex/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/sosa/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/sqlite3EZ/default.nix−36

This diff is too big to show here.

pkgs/development/ocaml-modules/stdune/default.nix+6−2

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/010-PtGRANAD-test-helpers.nix−39

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/011-PtHangz2-test-helpers.nix−35

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/base-test-helpers.nix−32

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/base.nix−37

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/clic.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/client-010-PtGRANAD.nix−38

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/client-011-PtHangz2.nix−44

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/client-base.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/context.nix−34

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/crypto.nix−42

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/embedded-protocol-010-PtGRANAD.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/embedded-protocol-demo-noops.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/error-monad.nix−35

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/event-logging-test-helpers.nix−25

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/event-logging.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/hacl-glue-unix.nix−26

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/hacl-glue.nix−17

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/legacy-store.nix−42

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/lmdb.nix−51

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/lwt-result-stdlib.nix−31

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/micheline.nix−32

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/mockup-proxy.nix−27

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/mockup-registration.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/p2p-services.nix−19

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/p2p.nix−38

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-010-PtGRANAD-parameters.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-010-PtGRANAD.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-011-PtHangz2-parameters.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-011-PtHangz2.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-alpha.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-compiler.nix−34

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-demo-noops.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-environment-packer.nix−18

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-environment-sigs.nix−42

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-environment-structs.nix−25

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-environment.nix−43

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-plugin-010-PtGRANAD.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-plugin-011-PtHangz2.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-plugin-alpha.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/protocol-updater.nix−26

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/proxy.nix−36

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/requester.nix−34

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/rpc-http-client-unix.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/rpc-http-client.nix−23

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/rpc-http.nix−25

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/rpc.nix−25

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/sapling.nix−35

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/shell-context.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/shell-services-test-helpers.nix−32

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/shell-services.nix−30

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/shell.nix−44

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/signer-backends.nix−30

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/signer-services.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/stdlib-unix.nix−33

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/stdlib.nix−64

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/store.nix−50

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/test-helpers.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/validation.nix−28

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/version.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/tezos/workers.nix−21

This diff is too big to show here.

pkgs/development/ocaml-modules/toml/default.nix+2−4

This diff is too big to show here.

pkgs/development/ocaml-modules/torch/default.nix+1

This diff is too big to show here.

pkgs/development/ocaml-modules/tsdl/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/type_conv/108.08.00.nix−31

This diff is too big to show here.

pkgs/development/ocaml-modules/type_conv/109.60.01.nix−32

This diff is too big to show here.

pkgs/development/ocaml-modules/type_conv/112.01.01.nix−26

This diff is too big to show here.

pkgs/development/ocaml-modules/uri/sexp.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/uucp/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/uunf/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/uuuu/default.nix+6−9

This diff is too big to show here.

pkgs/development/ocaml-modules/vg/default.nix+2−2

This diff is too big to show here.

pkgs/development/ocaml-modules/wasm/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/xdg/default.nix+17

This diff is too big to show here.

pkgs/development/ocaml-modules/xmlm/default.nix+1−1

This diff is too big to show here.

pkgs/development/ocaml-modules/xmlplaylist/default.nix+25

This diff is too big to show here.

pkgs/development/ocaml-modules/z3/default.nix+1−6

This diff is too big to show here.

pkgs/development/ocaml-modules/z3/ocamlfind.patch−13

This diff is too big to show here.

pkgs/development/ocaml-modules/zarith/default.nix+1−1

This diff is too big to show here.

pkgs/development/octave-modules/octproj/default.nix+1

This diff is too big to show here.

pkgs/development/php-packages/composer/default.nix+2−2

This diff is too big to show here.

pkgs/development/php-packages/datadog_trace/default.nix+22

This diff is too big to show here.

pkgs/development/php-packages/openswoole/default.nix+22

This diff is too big to show here.

pkgs/development/php-packages/pdepend/default.nix+41

This diff is too big to show here.

pkgs/development/php-packages/phpstan/default.nix+2−2

This diff is too big to show here.

pkgs/development/php-packages/xdebug/default.nix+2−2

This diff is too big to show here.

pkgs/development/pure-modules/audio/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/avahi/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/csv/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/doc/default.nix−23

This diff is too big to show here.

pkgs/development/pure-modules/fastcgi/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/faust/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/ffi/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/gen/default.nix−26

This diff is too big to show here.

pkgs/development/pure-modules/generic-setup-hook.sh−2

This diff is too big to show here.

pkgs/development/pure-modules/gl/default.nix−27

This diff is too big to show here.

pkgs/development/pure-modules/glpk/default.nix−40

This diff is too big to show here.

pkgs/development/pure-modules/gplot/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/gsl/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/gtk/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/liblo/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/lilv/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/lv2/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/midi/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/mpfr/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/octave/default.nix−26

This diff is too big to show here.

pkgs/development/pure-modules/odbc/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/pandoc/default.nix−28

This diff is too big to show here.

pkgs/development/pure-modules/rational/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/readline/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/sockets/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/sql3/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/stldict/default.nix−30

This diff is too big to show here.

pkgs/development/pure-modules/stllib/default.nix−30

This diff is too big to show here.

pkgs/development/pure-modules/tk/default.nix−24

This diff is too big to show here.

pkgs/development/pure-modules/xml/default.nix−24

This diff is too big to show here.

pkgs/development/python-modules/Cython/default.nix+2−9

This diff is too big to show here.

pkgs/development/python-modules/Mako/default.nix+31−4

This diff is too big to show here.

pkgs/development/python-modules/Nikola/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/Theano/default.nix+10−4

This diff is too big to show here.

pkgs/development/python-modules/XlsxWriter/default.nix+25−13

This diff is too big to show here.

pkgs/development/python-modules/adafruit-io/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/adafruit-platformdetect/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/adb-shell/default.nix+12−3

This diff is too big to show here.

pkgs/development/python-modules/adblock/default.nix+4−4

This diff is too big to show here.

pkgs/development/python-modules/add-trailing-comma/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/advocate/default.nix+45

This diff is too big to show here.

pkgs/development/python-modules/aenum/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aesara/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aesedb/default.nix+45

This diff is too big to show here.

pkgs/development/python-modules/afdko/default.nix+5−9

This diff is too big to show here.

pkgs/development/python-modules/afsapi/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/ailment/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aio-geojson-generic-client/default.nix+51

This diff is too big to show here.

pkgs/development/python-modules/aio-georss-client/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aio-georss-gdacs/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aioairzone/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aiobotocore/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aioconsole/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/aiodiscover/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aioftp/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aioguardian/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aioh2/default.nix−24

This diff is too big to show here.

pkgs/development/python-modules/aiohomekit/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aiohttp-apispec/default.nix+2−7

This diff is too big to show here.

pkgs/development/python-modules/aiohttp-remotes/default.nix+6

This diff is too big to show here.

pkgs/development/python-modules/aiohttp-swagger/default.nix+10−2

This diff is too big to show here.

pkgs/development/python-modules/aiohttp/default.nix+4

This diff is too big to show here.

pkgs/development/python-modules/aiolifx/default.nix+8−5

This diff is too big to show here.

pkgs/development/python-modules/aiomysql/default.nix+17−27

This diff is too big to show here.

pkgs/development/python-modules/aionotify/default.nix+5

This diff is too big to show here.

pkgs/development/python-modules/aiooncue/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aioqsw/default.nix+40

This diff is too big to show here.

pkgs/development/python-modules/aioshelly/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aioslimproto/default.nix+41

This diff is too big to show here.

pkgs/development/python-modules/aioswitcher/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aiotractive/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/alembic/default.nix+2−6

This diff is too big to show here.

pkgs/development/python-modules/amazon-ion/default.nix+27−9

This diff is too big to show here.

pkgs/development/python-modules/amberelectric/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/amply/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/amqp/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/androidtv/default.nix+12−4

This diff is too big to show here.

pkgs/development/python-modules/angr/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/angrop/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/ansi/default.nix+20−8

This diff is too big to show here.

pkgs/development/python-modules/ansi2html/default.nix+3−2

This diff is too big to show here.

pkgs/development/python-modules/ansible-compat/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/ansible-doctor/default.nix+32−25

This diff is too big to show here.

pkgs/development/python-modules/ansible-later/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/ansible-lint/default.nix−4

This diff is too big to show here.

pkgs/development/python-modules/ansible-runner/default.nix+8−3

This diff is too big to show here.

pkgs/development/python-modules/ansible/base.nix−88

This diff is too big to show here.

pkgs/development/python-modules/ansible/core.nix+5−14

This diff is too big to show here.

pkgs/development/python-modules/ansible/default.nix+15−8

This diff is too big to show here.

pkgs/development/python-modules/ansible/legacy.nix−55

This diff is too big to show here.

pkgs/development/python-modules/anybadge/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/anyconfig/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/anyio/default.nix+11−2

This diff is too big to show here.

pkgs/development/python-modules/apache-airflow/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/apache-beam/default.nix+16−19

This diff is too big to show here.

pkgs/development/python-modules/apache-beam/fix-cython.patch−41

This diff is too big to show here.

pkgs/development/python-modules/apache-beam/relax-deps.patch−20

This diff is too big to show here.

pkgs/development/python-modules/apispec/default.nix+13−9

This diff is too big to show here.

pkgs/development/python-modules/aplpy/default.nix+5−25

This diff is too big to show here.

pkgs/development/python-modules/apprise/default.nix+4−4

This diff is too big to show here.

pkgs/development/python-modules/approvaltests/default.nix+33−11

This diff is too big to show here.

pkgs/development/python-modules/appthreat-vulnerability-db/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/aprslib/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/apsw/default.nix+10−25

This diff is too big to show here.

pkgs/development/python-modules/apycula/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/archinfo/default.nix+4−14

This diff is too big to show here.

pkgs/development/python-modules/arris-tg2492lg/default.nix+43

This diff is too big to show here.

pkgs/development/python-modules/arrow/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/asana/default.nix+26−16

This diff is too big to show here.

pkgs/development/python-modules/asciimatics/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/asdf-standard/default.nix+43

This diff is too big to show here.

pkgs/development/python-modules/asdf-transform-schemas/default.nix+46

This diff is too big to show here.

pkgs/development/python-modules/asdf/default.nix+18−7

This diff is too big to show here.

pkgs/development/python-modules/asgiref/default.nix+14−4

This diff is too big to show here.

pkgs/development/python-modules/asn1crypto/default.nix+13−7

This diff is too big to show here.

pkgs/development/python-modules/astroid/default.nix+6−2

This diff is too big to show here.

pkgs/development/python-modules/astropy-extension-helpers/default.nix+15−4

This diff is too big to show here.

pkgs/development/python-modules/astropy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/astroquery/default.nix+30−8

This diff is too big to show here.

pkgs/development/python-modules/asttokens/default.nix+6−1

This diff is too big to show here.

pkgs/development/python-modules/async-lru/default.nix+4

This diff is too big to show here.

pkgs/development/python-modules/async-upnp-client/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/async_generator/default.nix−2

This diff is too big to show here.

pkgs/development/python-modules/asyncssh/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/atlassian-python-api/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/atom/default.nix+35−9

This diff is too big to show here.

pkgs/development/python-modules/aurorapy/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/authcaptureproxy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/authheaders/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/autobahn/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/autograd/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/av/default.nix+130−16

This diff is too big to show here.

pkgs/development/python-modules/awesomeversion/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/aws-adfs/default.nix+33−25

This diff is too big to show here.

pkgs/development/python-modules/aws-lambda-builders/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/awscrt/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/awsiotpythonsdk/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/azure-common/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-core/default.nix+5−3

This diff is too big to show here.

pkgs/development/python-modules/azure-eventgrid/default.nix+10−3

This diff is too big to show here.

pkgs/development/python-modules/azure-identity/default.nix+15−13

This diff is too big to show here.

pkgs/development/python-modules/azure-keyvault-keys/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-containerservice/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-core/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-datafactory/default.nix+6−6

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-kusto/azure-mgmt-apimanagement/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix−2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-msi/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-reservations/default.nix+6−6

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-servicelinker/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-storage/default.nix+12−6

This diff is too big to show here.

pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix+4−2

This diff is too big to show here.

pkgs/development/python-modules/azure-servicebus/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/azure-synapse-artifacts/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/backports-zoneinfo/default.nix+3

This diff is too big to show here.

pkgs/development/python-modules/basemap/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bc-python-hcl2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bcrypt/default.nix+33−8

This diff is too big to show here.

pkgs/development/python-modules/beautifulsoup4/default.nix+9−3

This diff is too big to show here.

pkgs/development/python-modules/beautifultable/default.nix+6−1

This diff is too big to show here.

pkgs/development/python-modules/behave/default.nix+4−4

This diff is too big to show here.

pkgs/development/python-modules/bimmer-connected/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bip_utils/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bitarray/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bitbox02/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bitcoin-price-api/default.nix−24

This diff is too big to show here.

pkgs/development/python-modules/bitstruct/default.nix+15−4

This diff is too big to show here.

pkgs/development/python-modules/bjoern/default.nix+10−5

This diff is too big to show here.

pkgs/development/python-modules/black/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bleach/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bleak/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/blessed/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/blinker/default.nix+8−3

This diff is too big to show here.

pkgs/development/python-modules/blspy/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/boltztrap2/default.nix+26−13

This diff is too big to show here.

pkgs/development/python-modules/boschshcpy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/boto3/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/botocore/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/bottleneck/default.nix+31−16

This diff is too big to show here.

pkgs/development/python-modules/boxx/default.nix+11−4

This diff is too big to show here.

pkgs/development/python-modules/bpython/default.nix+16−2

This diff is too big to show here.

pkgs/development/python-modules/breezy/default.nix+20−5

This diff is too big to show here.

pkgs/development/python-modules/brother/default.nix+16−15

This diff is too big to show here.

pkgs/development/python-modules/browser-cookie3/default.nix+6−5

This diff is too big to show here.

pkgs/development/python-modules/bsblan/default.nix+24−16

This diff is too big to show here.

pkgs/development/python-modules/build/default.nix−2

This diff is too big to show here.

pkgs/development/python-modules/buildbot/default.nix+5−2

This diff is too big to show here.

pkgs/development/python-modules/buildbot/pkg.nix+1−1

This diff is too big to show here.

pkgs/development/python-modules/buildbot/plugins.nix+5−5

This diff is too big to show here.

pkgs/development/python-modules/buildbot/worker.nix+41−7

This diff is too big to show here.

pkgs/development/python-modules/caldav/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/can/default.nix+9−4

This diff is too big to show here.

pkgs/development/python-modules/canonicaljson/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/casbin/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/cattrs/default.nix+5

This diff is too big to show here.

pkgs/development/python-modules/cbor2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/celery/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/cert-chain-resolver/default.nix+22−7

This diff is too big to show here.

pkgs/development/python-modules/certbot/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/certomancer/default.nix+71

This diff is too big to show here.

pkgs/development/python-modules/cffi/default.nix+5−4

This diff is too big to show here.

pkgs/development/python-modules/chainer/default.nix+4−2

This diff is too big to show here.

pkgs/development/python-modules/chalice/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/cherrypy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/chex/default.nix+3−5

This diff is too big to show here.

pkgs/development/python-modules/chiavdf/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/ciscoconfparse/default.nix+1

This diff is too big to show here.

pkgs/development/python-modules/ckcc-protocol/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/claripy/default.nix+7−5

This diff is too big to show here.

pkgs/development/python-modules/cle/default.nix+5−3

This diff is too big to show here.

pkgs/development/python-modules/click-log/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/click/default.nix+3−8

This diff is too big to show here.

pkgs/development/python-modules/clickhouse-driver/default.nix−2

This diff is too big to show here.

pkgs/development/python-modules/clize/default.nix+26−9

This diff is too big to show here.

pkgs/development/python-modules/clldutils/default.nix+8−2

This diff is too big to show here.

pkgs/development/python-modules/cloudflare/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/cma/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/cmd2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/codepy/default.nix+35

This diff is too big to show here.

pkgs/development/python-modules/collections-extended/default.nix+10−5

This diff is too big to show here.

pkgs/development/python-modules/commoncode/default.nix+8−3

This diff is too big to show here.

pkgs/development/python-modules/connexion/default.nix+10−16

This diff is too big to show here.

pkgs/development/python-modules/construct/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/contexttimer/default.nix+42

This diff is too big to show here.

pkgs/development/python-modules/convertdate/default.nix+10−7

This diff is too big to show here.

pkgs/development/python-modules/coqpit/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/coverage/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/cppy/default.nix+12−7

This diff is too big to show here.

pkgs/development/python-modules/cryptography/default.nix+24−26

This diff is too big to show here.

pkgs/development/python-modules/cryptography/vectors.nix+9−6

This diff is too big to show here.

pkgs/development/python-modules/crytic-compile/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/cssselect2/default.nix+8−2

This diff is too big to show here.

pkgs/development/python-modules/cupy/default.nix+13−4

This diff is too big to show here.

pkgs/development/python-modules/cx_freeze/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/cyclonedx-python-lib/default.nix+15−6

This diff is too big to show here.

pkgs/development/python-modules/cypherpunkpay/default.nix+97

This diff is too big to show here.

pkgs/development/python-modules/dask-mpi/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/dask-yarn/default.nix+47

This diff is too big to show here.

pkgs/development/python-modules/dask/default.nix+2−4

This diff is too big to show here.

pkgs/development/python-modules/databricks-connect/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/datadog/default.nix+8−2

This diff is too big to show here.

pkgs/development/python-modules/dataset/default.nix+11−5

This diff is too big to show here.

pkgs/development/python-modules/datasets/default.nix+20−7

This diff is too big to show here.

pkgs/development/python-modules/datasette/default.nix+12−12

This diff is too big to show here.

pkgs/development/python-modules/datashader/default.nix−1

This diff is too big to show here.

pkgs/development/python-modules/datatable/default.nix+3−9

This diff is too big to show here.

pkgs/development/python-modules/dateparser/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/db-dtypes/default.nix+39

This diff is too big to show here.

pkgs/development/python-modules/debtcollector/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/debugpy/default.nix−1

This diff is too big to show here.

pkgs/development/python-modules/deepdiff/default.nix+6−3

This diff is too big to show here.

pkgs/development/python-modules/deezer-python/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/deltachat/default.nix+7−3

This diff is too big to show here.

pkgs/development/python-modules/denonavr/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/detect-secrets/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/devito/default.nix+100

This diff is too big to show here.

pkgs/development/python-modules/devolo-home-control-api/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/devtools/default.nix+7

This diff is too big to show here.

pkgs/development/python-modules/dictpath/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/diff-cover/default.nix+4−2

This diff is too big to show here.

pkgs/development/python-modules/diskcache/default.nix−4

This diff is too big to show here.

pkgs/development/python-modules/distributed/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/distro/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django-allauth/default.nix+25−11

This diff is too big to show here.

pkgs/development/python-modules/django-appconf/default.nix+45

This diff is too big to show here.

pkgs/development/python-modules/django-hijack-admin/default.nix+3

This diff is too big to show here.

pkgs/development/python-modules/django-hijack/default.nix+22−22

This diff is too big to show here.

pkgs/development/python-modules/django-raster/default.nix+1−3

This diff is too big to show here.

pkgs/development/python-modules/django-statici18n/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django-taggit/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django-widget-tweaks/default.nix+32−9

This diff is too big to show here.

pkgs/development/python-modules/django/1.10-gis-libs.template.patch−24

This diff is too big to show here.

pkgs/development/python-modules/django/2.nix−39

This diff is too big to show here.

pkgs/development/python-modules/django/3.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django/4.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django_appconf/default.nix−35

This diff is too big to show here.

pkgs/development/python-modules/django_compressor/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django_contrib_comments/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/django_modelcluster/default.nix+27−9

This diff is too big to show here.

pkgs/development/python-modules/django_reversion/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/dm-haiku/default.nix+10−3

This diff is too big to show here.

pkgs/development/python-modules/dm-sonnet/default.nix−91

This diff is too big to show here.

pkgs/development/python-modules/dnspython/default.nix+14−6

This diff is too big to show here.

pkgs/development/python-modules/doc8/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/dockerfile-parse/default.nix+27−9

This diff is too big to show here.

pkgs/development/python-modules/docstring-parser/default.nix+25−11

This diff is too big to show here.

pkgs/development/python-modules/docutils/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/doit/default.nix+7−4

This diff is too big to show here.

pkgs/development/python-modules/dotmap/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/dragonfly/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/dropbox/default.nix+41−12

This diff is too big to show here.

pkgs/development/python-modules/duckdb-engine/default.nix+40

This diff is too big to show here.

pkgs/development/python-modules/dugong/default.nix+5

This diff is too big to show here.

pkgs/development/python-modules/dunamai/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/dungeon-eos/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/durus/default.nix+28

This diff is too big to show here.

pkgs/development/python-modules/dynalite-devices/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/eagle100/default.nix+37

This diff is too big to show here.

pkgs/development/python-modules/easyprocess/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/editables/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/elementpath/default.nix+4−4

This diff is too big to show here.

pkgs/development/python-modules/elkm1-lib/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/enaml/default.nix+6−3

This diff is too big to show here.

pkgs/development/python-modules/entrypoint2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/entrypoints/default.nix+17−12

This diff is too big to show here.

pkgs/development/python-modules/env-canada/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/envs/default.nix+15−11

This diff is too big to show here.

pkgs/development/python-modules/ephemeral-port-reserve/default.nix+42

This diff is too big to show here.

pkgs/development/python-modules/exceptiongroup/default.nix+39

This diff is too big to show here.

pkgs/development/python-modules/exchangelib/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/faker/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/fakeredis/default.nix+5

This diff is too big to show here.

pkgs/development/python-modules/falcon/default.nix+46−33

This diff is too big to show here.

pkgs/development/python-modules/faraday-agent-parameters-types/default.nix+6−1

This diff is too big to show here.

pkgs/development/python-modules/faraday-plugins/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/fastapi/default.nix+17−3

This diff is too big to show here.

pkgs/development/python-modules/fastavro/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/fastbencode/default.nix+26

This diff is too big to show here.

pkgs/development/python-modules/fastcore/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/fasteners/default.nix+11−24

This diff is too big to show here.

pkgs/development/python-modules/fastjsonschema/default.nix+3−14

This diff is too big to show here.

pkgs/development/python-modules/fastparquet/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/fenics/default.nix+12−20

This diff is too big to show here.

pkgs/development/python-modules/ffcv/default.nix+3−2

This diff is too big to show here.

pkgs/development/python-modules/filelock/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/filetype/default.nix+26−6

This diff is too big to show here.

pkgs/development/python-modules/findpython/default.nix+53

This diff is too big to show here.

pkgs/development/python-modules/fints/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/fipy/default.nix+8

This diff is too big to show here.

pkgs/development/python-modules/fipy/gmsh.patch+182

This diff is too big to show here.

pkgs/development/python-modules/fitbit/default.nix+24−16

This diff is too big to show here.

pkgs/development/python-modules/fivem-api/default.nix+42

This diff is too big to show here.

pkgs/development/python-modules/flake8-blind-except/default.nix+5

This diff is too big to show here.

pkgs/development/python-modules/flake8-bugbear/default.nix+9−4

This diff is too big to show here.

pkgs/development/python-modules/flake8-debugger/default.nix+23−14

This diff is too big to show here.

pkgs/development/python-modules/flake8/default.nix+1−1

This diff is too big to show here.

pkgs/development/python-modules/flask-admin/default.nix+5

This diff is too big to show here.

pkgs/development/python-modules/flask-appbuilder/default.nix+4−13

This diff is too big to show here.

pkgs/development/python-modules/flask-bcrypt/default.nix+9−3

This diff is too big to show here.

pkgs/development/python-modules/flask-compress/default.nix+26−8

This diff is too big to show here.

pkgs/development/python-modules/flask-httpauth/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/flask-jwt-extended/default.nix+31−10

This diff is too big to show here.

pkgs/development/python-modules/flask-login/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/flask-paranoid/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/flask-restful/default.nix+4

This diff is too big to show here.

pkgs/development/python-modules/flask-restful/werkzeug-2.1.0-compat.patch+114

This diff is too big to show here.

pkgs/development/python-modules/flask-restx/default.nix+15

This diff is too big to show here.

pkgs/development/python-modules/flask-seasurf/default.nix+13−3

This diff is too big to show here.

pkgs/development/python-modules/flask-security-too/default.nix+66−32

This diff is too big to show here.

pkgs/development/python-modules/flask-socketio/default.nix+6−2

This diff is too big to show here.

pkgs/development/python-modules/flask-talisman/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/flask-testing/default.nix+41−15

This diff is too big to show here.

pkgs/development/python-modules/flask/default.nix+6−8

This diff is too big to show here.

pkgs/development/python-modules/flatbuffers/default.nix+1

This diff is too big to show here.

pkgs/development/python-modules/flatdict/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/flax/default.nix+7−3

This diff is too big to show here.

pkgs/development/python-modules/flickrapi/default.nix+50−19

This diff is too big to show here.

pkgs/development/python-modules/flit-core/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/flit/default.nix+10−11

This diff is too big to show here.

pkgs/development/python-modules/flux-led/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/fn/default.nix+22−8

This diff is too big to show here.

pkgs/development/python-modules/fontmake/default.nix+42

This diff is too big to show here.

pkgs/development/python-modules/fontparts/default.nix+5−3

This diff is too big to show here.

pkgs/development/python-modules/fonttools/default.nix+8−5

This diff is too big to show here.

pkgs/development/python-modules/fqdn/default.nix+36

This diff is too big to show here.

pkgs/development/python-modules/freezegun/default.nix+21−10

This diff is too big to show here.

pkgs/development/python-modules/frozendict/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/fs/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/ftfy/default.nix+8−2

This diff is too big to show here.

pkgs/development/python-modules/funcparserlib/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/furo/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/fuse-python/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/garminconnect/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/gattlib/default.nix+68

This diff is too big to show here.

pkgs/development/python-modules/gattlib/setup.patch+18

This diff is too big to show here.

pkgs/development/python-modules/gb-io/default.nix+45

This diff is too big to show here.

pkgs/development/python-modules/gbulb/default.nix+43

This diff is too big to show here.

pkgs/development/python-modules/gcal-sync/default.nix+46

This diff is too big to show here.

pkgs/development/python-modules/gehomesdk/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/genshi/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/gensim/default.nix+37−20

This diff is too big to show here.

pkgs/development/python-modules/geoalchemy2/default.nix+13−2

This diff is too big to show here.

pkgs/development/python-modules/geocachingapi/default.nix+10−4

This diff is too big to show here.

pkgs/development/python-modules/geopandas/default.nix+14−1

This diff is too big to show here.

pkgs/development/python-modules/ghapi/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/ghp-import/default.nix+12−4

This diff is too big to show here.

pkgs/development/python-modules/gidgethub/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/gipc/default.nix−2

This diff is too big to show here.

pkgs/development/python-modules/git-annex-adapter/default.nix+4

This diff is too big to show here.

pkgs/development/python-modules/github3_py/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/glad/default.nix+18

This diff is too big to show here.

pkgs/development/python-modules/glances-api/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/glcontext/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/glean-parser/default.nix+6−5

This diff is too big to show here.

pkgs/development/python-modules/glfw/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/globus-sdk/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/glyphslib/default.nix+59

This diff is too big to show here.

pkgs/development/python-modules/goodwe/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-api-core/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-api-python-client/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-auth-oauthlib/default.nix+13−3

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix+48

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-bigquery/default.nix+15−4

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-bigtable/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-dataproc/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-error-reporting/default.nix+6−7

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-pubsub/default.nix+8−3

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-secret-manager/default.nix+6−2

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-testutils/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-cloud-videointelligence/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-nest-sdm/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/google-re2/default.nix+22−7

This diff is too big to show here.

pkgs/development/python-modules/gradient/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/graph_nets/default.nix−45

This diff is too big to show here.

pkgs/development/python-modules/graphene-django/default.nix+7−3

This diff is too big to show here.

pkgs/development/python-modules/graphene-django/graphene-3_2_0.patch+150

This diff is too big to show here.

pkgs/development/python-modules/graphene/default.nix+17

This diff is too big to show here.

pkgs/development/python-modules/graphql-relay/default.nix+19−4

This diff is too big to show here.

pkgs/development/python-modules/graphql-subscription-manager/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/graphviz/default.nix+4

This diff is too big to show here.

pkgs/development/python-modules/graspologic/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/greeclimate/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/gremlinpython/default.nix+3−9

This diff is too big to show here.

pkgs/development/python-modules/grip/default.nix+2−11

This diff is too big to show here.

pkgs/development/python-modules/grpcio-status/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/grpcio-tools/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/gspread/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/gssapi/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/gtts/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/h11/default.nix+5−2

This diff is too big to show here.

pkgs/development/python-modules/h3/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/ha-av/default.nix−43

This diff is too big to show here.

pkgs/development/python-modules/hachoir/default.nix+9−3

This diff is too big to show here.

pkgs/development/python-modules/hahomematic/default.nix+4−4

This diff is too big to show here.

pkgs/development/python-modules/hangups/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/hass-nabucasa/default.nix+2−1

This diff is too big to show here.

pkgs/development/python-modules/hatasmota/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/hatchling/default.nix+79

This diff is too big to show here.

pkgs/development/python-modules/hg-evolve/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/hg-git/default.nix+15−5

This diff is too big to show here.

pkgs/development/python-modules/hid/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/hidapi/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/hkavr/default.nix+37

This diff is too big to show here.

pkgs/development/python-modules/hmmlearn/default.nix+9−8

This diff is too big to show here.

pkgs/development/python-modules/homeconnect/default.nix+11−4

This diff is too big to show here.

pkgs/development/python-modules/howdoi/default.nix+16−2

This diff is too big to show here.

pkgs/development/python-modules/hpack/default.nix+19−6

This diff is too big to show here.

pkgs/development/python-modules/html-sanitizer/default.nix+3−1

This diff is too big to show here.

pkgs/development/python-modules/http-message-signatures/default.nix+56

This diff is too big to show here.

pkgs/development/python-modules/http-sfv/default.nix+39

This diff is too big to show here.

pkgs/development/python-modules/httpbin/default.nix+10

This diff is too big to show here.

pkgs/development/python-modules/httpcore/default.nix+9−2

This diff is too big to show here.

pkgs/development/python-modules/httplib2/default.nix+9−5

This diff is too big to show here.

pkgs/development/python-modules/httptools/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/httpx-ntlm/default.nix+7−1

This diff is too big to show here.

pkgs/development/python-modules/httpx/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/huggingface-hub/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/humanize/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/hwi/default.nix+11−8

This diff is too big to show here.

pkgs/development/python-modules/hydra-check/default.nix+12−19

This diff is too big to show here.

pkgs/development/python-modules/hyperframe/default.nix+4−1

This diff is too big to show here.

pkgs/development/python-modules/hyperion-py/default.nix+4−3

This diff is too big to show here.

pkgs/development/python-modules/hypothesis/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/hypothesmith/default.nix+32−4

This diff is too big to show here.

pkgs/development/python-modules/hypothesmith/remove-black.patch+88

This diff is too big to show here.

pkgs/development/python-modules/hyppo/default.nix+6−4

This diff is too big to show here.

pkgs/development/python-modules/ibis-framework/default.nix+34−47

This diff is too big to show here.

pkgs/development/python-modules/identify/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/igraph/default.nix+3−2

This diff is too big to show here.

pkgs/development/python-modules/ihatemoney/default.nix+36−34

This diff is too big to show here.

pkgs/development/python-modules/imageio/default.nix+24−15

This diff is too big to show here.

pkgs/development/python-modules/imageio/libgl-path.patch+13

This diff is too big to show here.

pkgs/development/python-modules/imap-tools/default.nix+3−2

This diff is too big to show here.

pkgs/development/python-modules/img2pdf/default.nix+2−12

This diff is too big to show here.

pkgs/development/python-modules/immutables/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/impacket/default.nix+31−5

This diff is too big to show here.

pkgs/development/python-modules/importlib-metadata/default.nix+4−2

This diff is too big to show here.

pkgs/development/python-modules/importlib-resources/default.nix+3−2

This diff is too big to show here.

pkgs/development/python-modules/inquirer/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/installer/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix+26

This diff is too big to show here.

pkgs/development/python-modules/intbitset/default.nix+6−19

This diff is too big to show here.

pkgs/development/python-modules/intbitset/remove-impure-tuning.patch−24

This diff is too big to show here.

pkgs/development/python-modules/intellifire4py/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/intensity-normalization/default.nix+6−3

This diff is too big to show here.

pkgs/development/python-modules/invocations/default.nix+15−4

This diff is too big to show here.

pkgs/development/python-modules/ipykernel/default.nix+9−7

This diff is too big to show here.

pkgs/development/python-modules/ipympl/default.nix+4−3

This diff is too big to show here.

pkgs/development/python-modules/ipython-sql/default.nix+58

This diff is too big to show here.

pkgs/development/python-modules/ipython/default.nix+3−5

This diff is too big to show here.

pkgs/development/python-modules/ipywidgets/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/islpy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/ismartgate/default.nix+12−2

This diff is too big to show here.

pkgs/development/python-modules/iso4217/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/iso8601/default.nix+6−1

This diff is too big to show here.

pkgs/development/python-modules/isoduration/default.nix+50

This diff is too big to show here.

pkgs/development/python-modules/iterm2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/itsdangerous/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jaraco_itertools/default.nix+3−2

This diff is too big to show here.

pkgs/development/python-modules/jaraco_text/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jarowinkler/default.nix+54

This diff is too big to show here.

pkgs/development/python-modules/jax/default.nix+21−8

This diff is too big to show here.

pkgs/development/python-modules/jaxlib/bin.nix+8−4

This diff is too big to show here.

pkgs/development/python-modules/jaxlib/default.nix+7−7

This diff is too big to show here.

pkgs/development/python-modules/jc/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jedi-language-server/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/jeepney/default.nix+10−3

This diff is too big to show here.

pkgs/development/python-modules/jenkins-job-builder/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jinja2/default.nix+4−3

This diff is too big to show here.

pkgs/development/python-modules/jira/default.nix+21−10

This diff is too big to show here.

pkgs/development/python-modules/jmespath/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/joblib/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/josepy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jsbeautifier/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/json-home-client/default.nix+40

This diff is too big to show here.

pkgs/development/python-modules/json-schema-for-humans/default.nix+7−8

This diff is too big to show here.

pkgs/development/python-modules/jsondiff/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jsonpickle/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jsonrpc-async/default.nix+25−4

This diff is too big to show here.

pkgs/development/python-modules/jsonrpc-base/default.nix+9−1

This diff is too big to show here.

pkgs/development/python-modules/jug/default.nix+31−18

This diff is too big to show here.

pkgs/development/python-modules/junos-eznc/default.nix+49−15

This diff is too big to show here.

pkgs/development/python-modules/jupyter-client/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jupyter-packaging/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jupyter_console/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jupyter_core/default.nix+28−7

This diff is too big to show here.

pkgs/development/python-modules/jupyterlab-git/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jupyterlab/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/jupyterlab_server/default.nix+7−5

This diff is too big to show here.

pkgs/development/python-modules/jupytext/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/jwcrypto/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/kaldi-active-grammar/default.nix+7−1

This diff is too big to show here.

pkgs/development/python-modules/karton-core/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/kbcstorage/default.nix+69

This diff is too big to show here.

pkgs/development/python-modules/keepalive/default.nix+1

This diff is too big to show here.

pkgs/development/python-modules/keras/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/kiss-headers/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/kivy-garden/default.nix+11−9

This diff is too big to show here.

pkgs/development/python-modules/kiwisolver/default.nix+21−9

This diff is too big to show here.

pkgs/development/python-modules/kubernetes/default.nix+4−3

This diff is too big to show here.

pkgs/development/python-modules/labelbox/default.nix+3−3

This diff is too big to show here.

pkgs/development/python-modules/labgrid/default.nix+2

This diff is too big to show here.

pkgs/development/python-modules/ledgerblue/default.nix+29−6

This diff is too big to show here.

pkgs/development/python-modules/lektor/default.nix+54−25

This diff is too big to show here.

pkgs/development/python-modules/levenshtein/default.nix+15−7

This diff is too big to show here.

pkgs/development/python-modules/libcst/default.nix+21−4

This diff is too big to show here.

pkgs/development/python-modules/libevdev/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/libgpuarray/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/libtmux/default.nix+7−5

This diff is too big to show here.

pkgs/development/python-modules/lightwave2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/limits/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/limnoria/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/lmnotify/default.nix+17−6

This diff is too big to show here.

pkgs/development/python-modules/loopy/default.nix+28−24

This diff is too big to show here.

pkgs/development/python-modules/losant-rest/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/lru-dict/default.nix+34

This diff is too big to show here.

pkgs/development/python-modules/luxtronik/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/lxmf/default.nix+39

This diff is too big to show here.

pkgs/development/python-modules/lxml/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/lz4/default.nix+9−8

This diff is too big to show here.

pkgs/development/python-modules/magicgui/default.nix+12−3

This diff is too big to show here.

pkgs/development/python-modules/mailchecker/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/manticore/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/mariadb/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/markupsafe/default.nix+5−3

This diff is too big to show here.

pkgs/development/python-modules/marshmallow-dataclass/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/mat2/default.nix+2−2

This diff is too big to show here.

pkgs/development/python-modules/matchpy/default.nix+29−23

This diff is too big to show here.

pkgs/development/python-modules/matrix-nio/default.nix+1

This diff is too big to show here.

2223 more files changed are not listed.