Merge branch 'master' into bravado-core-fix
This commit is contained in:
@@ -30,3 +30,6 @@
|
||||
|
||||
# nixos: fix module paths in rename.nix
|
||||
d08ede042b74b8199dc748323768227b88efcf7c
|
||||
|
||||
# fix indentation in mk-python-derivation.nix
|
||||
d1c1a0c656ccd8bd3b25d3c4287f2d075faf3cf3
|
||||
|
||||
@@ -22,7 +22,7 @@ For new packages please briefly describe the package or provide a link to its ho
|
||||
- made sure NixOS tests are [linked](https://nixos.org/manual/nixpkgs/unstable/#ssec-nixos-tests-linking) to the relevant packages
|
||||
- [ ] Tested compilation of all packages that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD"`. Note: all changes have to be committed, also see [nixpkgs-review usage](https://github.com/Mic92/nixpkgs-review#usage)
|
||||
- [ ] Tested basic functionality of all binary files (usually in `./result/bin/`)
|
||||
- [22.05 Release Notes (or backporting 21.11 Release notes)](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#generating-2205-release-notes)
|
||||
- [22.11 Release Notes (or backporting 22.05 Release notes)](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#generating-2211-release-notes)
|
||||
- [ ] (Package updates) Added a release notes entry if the change is major or breaking
|
||||
- [ ] (Module updates) Added a release notes entry if the change is significant
|
||||
- [ ] (Module addition) Added a release notes entry if adding a new NixOS module
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# Stale bot information
|
||||
|
||||
- Thanks for your contribution!
|
||||
- Our stale bot will never close an issue or PR.
|
||||
- To remove the stale label, just leave a new comment.
|
||||
- _How to find the right people to ping?_ → [`git blame`](https://git-scm.com/docs/git-blame) to the rescue! (or GitHub's history and blame buttons.)
|
||||
- You can always ask for help on [our Discourse Forum](https://discourse.nixos.org/), [our Matrix room](https://matrix.to/#/#nix:nixos.org), or on the [#nixos IRC channel](https://web.libera.chat/#nixos).
|
||||
|
||||
+1
-2
@@ -5,6 +5,5 @@ exemptLabels:
|
||||
- "1.severity: security"
|
||||
- "2.status: never-stale"
|
||||
staleLabel: "2.status: stale"
|
||||
markComment: |
|
||||
I marked this as stale due to inactivity. → [More info](https://github.com/NixOS/nixpkgs/blob/master/.github/STALE-BOT.md)
|
||||
markComment: false
|
||||
closeComment: false
|
||||
|
||||
+11
-7
@@ -97,6 +97,12 @@ git push origin $(git branch --show-current) --force-with-lease
|
||||
|
||||
Follow 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).
|
||||
|
||||
You can add a label such as `backport release-22.05` to a PR, so that merging it will
|
||||
automatically create a backport (via [a GitHub Action](.github/workflows/backport.yml)).
|
||||
This also works for PR's that have already been merged, and might take a couple of minutes to trigger.
|
||||
|
||||
You can also create the backport manually:
|
||||
|
||||
1. Take note of the commits in which the change was introduced into `master` branch.
|
||||
2. Check out the target _release branch_, e.g. `release-21.11`. Do not use a _channel branch_ like `nixos-21.11` or `nixpkgs-21.11-darwin`.
|
||||
3. Create a branch for your change, e.g. `git checkout -b backport`.
|
||||
@@ -113,17 +119,15 @@ Anything that does not cause user or downstream dependency regressions can be ba
|
||||
- Services which require a client to be up-to-date regardless. (E.g. `spotify`, `steam`, or `discord`)
|
||||
- Security critical applications (E.g. `firefox`)
|
||||
|
||||
## Generating 22.05 Release Notes
|
||||
|
||||
(This section also applies to backporting 21.11 release notes: substitute "rl-2205" for "rl-2111".)
|
||||
## Generating 22.11 Release Notes
|
||||
|
||||
Documentation in nixpkgs is transitioning to a markdown-centric workflow. Release notes now require a translation step to convert from markdown to a compatible docbook document.
|
||||
|
||||
Steps for updating 22.05 Release notes:
|
||||
Steps for updating 22.11 Release notes:
|
||||
|
||||
1. Edit `nixos/doc/manual/release-notes/rl-2205.section.md` with the desired changes
|
||||
2. Run `./nixos/doc/manual/md-to-db.sh` to render `nixos/doc/manual/from_md/release-notes/rl-2205.section.xml`
|
||||
3. Include changes to `rl-2205.section.md` and `rl-2205.section.xml` in the same commit.
|
||||
1. Edit `nixos/doc/manual/release-notes/rl-2211.section.md` with the desired changes
|
||||
2. Run `./nixos/doc/manual/md-to-db.sh` to render `nixos/doc/manual/from_md/release-notes/rl-2211.section.xml`
|
||||
3. Include changes to `rl-2211.section.md` and `rl-2211.section.xml` in the same commit.
|
||||
|
||||
## Reviewing contributions
|
||||
|
||||
|
||||
@@ -51,9 +51,9 @@ Nixpkgs and NixOS are built and tested by our continuous integration
|
||||
system, [Hydra](https://hydra.nixos.org/).
|
||||
|
||||
* [Continuous package builds for unstable/master](https://hydra.nixos.org/jobset/nixos/trunk-combined)
|
||||
* [Continuous package builds for the NixOS 21.11 release](https://hydra.nixos.org/jobset/nixos/release-21.11)
|
||||
* [Continuous package builds for the NixOS 22.05 release](https://hydra.nixos.org/jobset/nixos/release-22.05)
|
||||
* [Tests for unstable/master](https://hydra.nixos.org/job/nixos/trunk-combined/tested#tabs-constituents)
|
||||
* [Tests for the NixOS 21.11 release](https://hydra.nixos.org/job/nixos/release-21.11/tested#tabs-constituents)
|
||||
* [Tests for the NixOS 22.05 release](https://hydra.nixos.org/job/nixos/release-22.05/tested#tabs-constituents)
|
||||
|
||||
Artifacts successfully built with Hydra are published to cache at
|
||||
https://cache.nixos.org/. When successful build and test criteria are
|
||||
|
||||
@@ -26,8 +26,20 @@ stdenv.mkDerivation {
|
||||
|
||||
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.
|
||||
|
||||
## `fetchpatch` {#fetchpatch}
|
||||
|
||||
`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.
|
||||
|
||||
- `relative`: Similar to using `git-diff`'s `--relative` flag, only keep changes inside the specified directory, making paths relative to it.
|
||||
- `stripLen`: Remove the first `stripLen` components of pathnames in the patch.
|
||||
- `extraPrefix`: Prefix pathnames by this string.
|
||||
- `excludes`: Exclude files matching these patterns (applies after the above arguments).
|
||||
- `includes`: Include only files matching these patterns (applies after the above arguments).
|
||||
- `revert`: Revert the patch.
|
||||
|
||||
Note that because the checksum is computed after applying these effects, using or modifying these arguments will have no effect unless the `sha256` argument is changed as well.
|
||||
|
||||
|
||||
Most other fetchers return a directory rather than a single file.
|
||||
|
||||
## `fetchsvn` {#fetchsvn}
|
||||
|
||||
@@ -26,10 +26,14 @@ The `wrapFirefox` function allows to pass policies, preferences and extensions t
|
||||
Pocket = false;
|
||||
Snippets = false;
|
||||
};
|
||||
UserMessaging = {
|
||||
ExtensionRecommendations = false;
|
||||
SkipOnboarding = true;
|
||||
};
|
||||
UserMessaging = {
|
||||
ExtensionRecommendations = false;
|
||||
SkipOnboarding = true;
|
||||
};
|
||||
SecurityDevices = {
|
||||
# Use a proxy module rather than `nixpkgs.config.firefox.smartcardSupport = true`
|
||||
"PKCS#11 Proxy Module" = "${pkgs.p11-kit}/lib/p11-kit-proxy.so";
|
||||
};
|
||||
};
|
||||
|
||||
extraPrefs = ''
|
||||
|
||||
@@ -511,6 +511,8 @@ patches = [
|
||||
|
||||
Otherwise, you can add a `.patch` file to the `nixpkgs` repository. In the interest of keeping our maintenance burden to a minimum, only patches that are unique to `nixpkgs` should be added in this way.
|
||||
|
||||
If a patch is available online but does not cleanly apply, it can be modified in some fixed ways by using additional optional arguments for `fetchpatch`. Check [](#fetchpatch) for details.
|
||||
|
||||
```nix
|
||||
patches = [ ./0001-changes.patch ];
|
||||
```
|
||||
@@ -538,17 +540,6 @@ If you do need to do create this sort of patch file, one way to do so is with gi
|
||||
$ git diff -a > nixpkgs/pkgs/the/package/0001-changes.patch
|
||||
```
|
||||
|
||||
If a patch is available online but does not cleanly apply, it can be modified in some fixed ways by using additional optional arguments for `fetchpatch`:
|
||||
|
||||
- `relative`: Similar to using `git-diff`'s `--relative` flag, only keep changes inside the specified directory, making paths relative to it.
|
||||
- `stripLen`: Remove the first `stripLen` components of pathnames in the patch.
|
||||
- `extraPrefix`: Prefix pathnames by this string.
|
||||
- `excludes`: Exclude files matching these patterns (applies after the above arguments).
|
||||
- `includes`: Include only files matching these patterns (applies after the above arguments).
|
||||
- `revert`: Revert the patch.
|
||||
|
||||
Note that because the checksum is computed after applying these effects, using or modifying these arguments will have no effect unless the `sha256` argument is changed as well.
|
||||
|
||||
## Package tests {#sec-package-tests}
|
||||
|
||||
Tests are important to ensure quality and make reviews and automatic updates easy.
|
||||
|
||||
@@ -663,6 +663,70 @@ However, this is done in it's own phase, and not dependent on whether `doCheck =
|
||||
This can also be useful in verifying that the package doesn't assume commonly
|
||||
present packages (e.g. `setuptools`)
|
||||
|
||||
#### Using pythonRelaxDepsHook {#using-pythonrelaxdepshook}
|
||||
|
||||
It is common for upstream to specify a range of versions for its package
|
||||
dependencies. This makes sense, since it ensures that the package will be built
|
||||
with a subset of packages that is well tested. However, this commonly causes
|
||||
issues when packaging in Nixpkgs, because the dependencies that this package
|
||||
may need are too new or old for the package to build correctly. We also cannot
|
||||
package multiple versions of the same package since this may cause conflicts
|
||||
in `PYTHONPATH`.
|
||||
|
||||
One way to side step this issue is to relax the dependencies. This can be done
|
||||
by either removing the package version range or by removing the package
|
||||
declaration entirely. This can be done using the `pythonRelaxDepsHook` hook. For
|
||||
example, given the following `requirements.txt` file:
|
||||
|
||||
```
|
||||
pkg1<1.0
|
||||
pkg2
|
||||
pkg3>=1.0,<=2.0
|
||||
```
|
||||
|
||||
we can do:
|
||||
|
||||
```
|
||||
nativeBuildInputs = [ pythonRelaxDepsHook ];
|
||||
pythonRelaxDeps = [ "pkg1" "pkg3" ];
|
||||
pythonRemoveDeps = [ "pkg2" ];
|
||||
```
|
||||
|
||||
which would result in the following `requirements.txt` file:
|
||||
|
||||
```
|
||||
pkg1
|
||||
pkg3
|
||||
```
|
||||
|
||||
Another option is to pass `true`, that will relax/remove all dependencies, for
|
||||
example:
|
||||
|
||||
```
|
||||
nativeBuildInputs = [ pythonRelaxDepsHook ];
|
||||
pythonRelaxDeps = true;
|
||||
```
|
||||
|
||||
which would result in the following `requirements.txt` file:
|
||||
|
||||
```
|
||||
pkg1
|
||||
pkg2
|
||||
pkg3
|
||||
```
|
||||
|
||||
In general you should always use `pythonRelaxDeps`, because `pythonRemoveDeps`
|
||||
will convert build errors in runtime errors. However `pythonRemoveDeps` may
|
||||
still be useful in exceptional cases, and also to remove dependencies wrongly
|
||||
declared by upstream (for example, declaring `black` as a runtime dependency
|
||||
instead of a dev dependency).
|
||||
|
||||
Keep in mind that while the examples above are done with `requirements.txt`,
|
||||
`pythonRelaxDepsHook` works by modifying the resulting wheel file, so it should
|
||||
work in any of the formats supported by `buildPythonPackage` currently,
|
||||
with the exception of `other` (see `format` in
|
||||
[`buildPythonPackage` parameters](#buildpythonpackage-parameters) for more details).
|
||||
|
||||
### Develop local package {#develop-local-package}
|
||||
|
||||
As a Python developer you're likely aware of [development mode](http://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode)
|
||||
@@ -1197,6 +1261,8 @@ are used in `buildPythonPackage`.
|
||||
to run commands only after venv is first created.
|
||||
- `wheelUnpackHook` to move a wheel to the correct folder so it can be installed
|
||||
with the `pipInstallHook`.
|
||||
- `pythonRelaxDepsHook` will relax Python dependencies restrictions for the package.
|
||||
See [example usage](#using-pythonrelaxdepshook).
|
||||
|
||||
### Development mode {#development-mode}
|
||||
|
||||
|
||||
@@ -249,3 +249,31 @@ Unfree package that cannot be redistributed. You can build it yourself, but you
|
||||
### `lib.licenses.unfreeRedistributableFirmware`, `"unfree-redistributable-firmware"` {#lib.licenses.unfreeredistributablefirmware-unfree-redistributable-firmware}
|
||||
|
||||
This package supplies unfree, redistributable firmware. This is a separate value from `unfree-redistributable` because not everybody cares whether firmware is free.
|
||||
|
||||
## Source provenance {#sec-meta-sourceProvenance}
|
||||
|
||||
The value of a package's `meta.sourceProvenance` attribute specifies the provenance of the package's derivation outputs.
|
||||
|
||||
If a package contains elements that are not built from the original source by a nixpkgs derivation, the `meta.sourceProvenance` attribute should be a list containing one or more value from `lib.sourceTypes` defined in [`nixpkgs/lib/source-types.nix`](https://github.com/NixOS/nixpkgs/blob/master/lib/source-types.nix).
|
||||
|
||||
Adding this information helps users who have needs related to build transparency and supply-chain security to gain some visibility into their installed software or set policy to allow or disallow installation based on source provenance.
|
||||
|
||||
The presence of a particular `sourceType` in a package's `meta.sourceProvenance` list indicates that the package contains some components falling into that category, though the *absence* of that `sourceType` does not *guarantee* the absence of that category of `sourceType` in the package's contents. A package with no `meta.sourceProvenance` set implies it has no *known* `sourceType`s other than `fromSource`.
|
||||
|
||||
The meaning of the `meta.sourceProvenance` attribute does not depend on the value of the `meta.license` attribute.
|
||||
|
||||
### `lib.sourceTypes.fromSource` {#lib.sourceTypes.fromSource}
|
||||
|
||||
Package elements which are produced by a nixpkgs derivation which builds them from source code.
|
||||
|
||||
### `lib.sourceTypes.binaryNativeCode` {#lib.sourceTypes.binaryNativeCode}
|
||||
|
||||
Native code to be executed on the target system's CPU, built by a third party. This includes packages which wrap a downloaded AppImage or Debian package.
|
||||
|
||||
### `lib.sourceTypes.binaryFirmware` {#lib.sourceTypes.binaryFirmware}
|
||||
|
||||
Code to be executed on a peripheral device or embedded controller, built by a third party.
|
||||
|
||||
### `lib.sourceTypes.binaryBytecode` {#lib.sourceTypes.binaryBytecode}
|
||||
|
||||
Code to run on a VM interpreter or JIT compiled into bytecode by a third party. This includes packages which download Java `.jar` files from another source.
|
||||
|
||||
@@ -77,7 +77,7 @@ There is a special handling of the `debug` output, described at [](#stdenv-separ
|
||||
|
||||
A commonly adopted convention in `nixpkgs` is that executables provided by the package are contained within its first output. This convention allows the dependent packages to reference the executables provided by packages in a uniform manner. For instance, provided with the knowledge that the `perl` package contains a `perl` executable it can be referenced as `${pkgs.perl}/bin/perl` within a Nix derivation that needs to execute a Perl script.
|
||||
|
||||
The `glibc` package is a deliberate single exception to the “binaries first” convention. The `glibc` has `libs` as its first output allowing the libraries provided by `glibc` to be referenced directly (e.g. `${stdenv.glibc}/lib/ld-linux-x86-64.so.2`). The executables provided by `glibc` can be accessed via its `bin` attribute (e.g. `${stdenv.glibc.bin}/bin/ldd`).
|
||||
The `glibc` package is a deliberate single exception to the “binaries first” convention. The `glibc` has `libs` as its first output allowing the libraries provided by `glibc` to be referenced directly (e.g. `${glibc}/lib/ld-linux-x86-64.so.2`). The executables provided by `glibc` can be accessed via its `bin` attribute (e.g. `${lib.getBin stdenv.cc.libc}/bin/ldd`).
|
||||
|
||||
The reason for why `glibc` deviates from the convention is because referencing a library provided by `glibc` is a very common operation among Nix packages. For instance, third-party executables packaged by Nix are typically patched and relinked with the relevant version of `glibc` libraries from Nix packages (please see the documentation on [patchelf](https://github.com/NixOS/patchelf) for more details).
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ let
|
||||
|
||||
# constants
|
||||
licenses = callLibs ./licenses.nix;
|
||||
sourceTypes = callLibs ./source-types.nix;
|
||||
systems = callLibs ./systems;
|
||||
|
||||
# serialization
|
||||
|
||||
+1
-1
@@ -507,7 +507,7 @@ rec {
|
||||
compareLists compare [ "a" ] []
|
||||
=> 1
|
||||
compareLists compare [ "a" "b" ] [ "a" "c" ]
|
||||
=> 1
|
||||
=> -1
|
||||
*/
|
||||
compareLists = cmp: a: b:
|
||||
if a == []
|
||||
|
||||
+1
-1
@@ -120,7 +120,7 @@ rec {
|
||||
Example:
|
||||
mkPackageOption pkgs "GHC" {
|
||||
default = [ "ghc" ];
|
||||
example = "pkgs.haskell.package.ghc922.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
example = "pkgs.haskell.package.ghc923.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
}
|
||||
=> { _type = "option"; default = «derivation /nix/store/jxx55cxsjrf8kyh3fp2ya17q99w7541r-ghc-8.10.7.drv»; defaultText = { ... }; description = "The GHC package to use."; example = { ... }; type = { ... }; }
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{ lib }:
|
||||
|
||||
let
|
||||
defaultSourceType = tname: {
|
||||
shortName = tname;
|
||||
isSource = false;
|
||||
};
|
||||
in lib.mapAttrs (tname: tset: defaultSourceType tname // tset) {
|
||||
|
||||
fromSource = {
|
||||
isSource = true;
|
||||
};
|
||||
|
||||
binaryNativeCode = {};
|
||||
|
||||
binaryBytecode = {};
|
||||
|
||||
binaryFirmware = {};
|
||||
}
|
||||
@@ -79,8 +79,6 @@ rec {
|
||||
useLLVM = true;
|
||||
};
|
||||
|
||||
scaleway-c1 = armv7l-hf-multiplatform // platforms.scaleway-c1;
|
||||
|
||||
pogoplug4 = {
|
||||
config = "armv5tel-unknown-linux-gnueabi";
|
||||
} // platforms.pogoplug4;
|
||||
|
||||
@@ -242,13 +242,6 @@ rec {
|
||||
};
|
||||
};
|
||||
|
||||
scaleway-c1 = armv7l-hf-multiplatform // {
|
||||
gcc = {
|
||||
cpu = "cortex-a9";
|
||||
fpu = "vfpv3";
|
||||
};
|
||||
};
|
||||
|
||||
utilite = {
|
||||
linux-kernel = {
|
||||
name = "utilite";
|
||||
|
||||
+124
-11
@@ -1170,6 +1170,12 @@
|
||||
githubId = 706854;
|
||||
name = "Etienne Laurin";
|
||||
};
|
||||
atry = {
|
||||
name = "Bo Yang";
|
||||
email = "atry@fb.com";
|
||||
github = "Atry";
|
||||
githubId = 601530;
|
||||
};
|
||||
attila-lendvai = {
|
||||
name = "Attila Lendvai";
|
||||
email = "attila@lendvai.name";
|
||||
@@ -1712,6 +1718,17 @@
|
||||
githubId = 50839;
|
||||
name = "Brian Jones";
|
||||
};
|
||||
booklearner = {
|
||||
name = "booklearner";
|
||||
email = "hey@booklearner.org";
|
||||
matrix = "@booklearner:matrix.org";
|
||||
github = "booklearner";
|
||||
githubId = 103979114;
|
||||
keys = [{
|
||||
longkeyid = "ed25519/0x0C61C4E5907F76C8";
|
||||
fingerprint = "17C7 95D4 871C 2F87 83C8 053D 0C61 C4E5 907F 76C8";
|
||||
}];
|
||||
};
|
||||
bootstrap-prime = {
|
||||
email = "bootstrap.prime@gmail.com";
|
||||
github = "bootstrap-prime";
|
||||
@@ -3753,11 +3770,12 @@
|
||||
githubId = 57923898;
|
||||
name = "Elyhaka";
|
||||
};
|
||||
em0lar = {
|
||||
email = "nix@em0lar.dev";
|
||||
github = "em0lar";
|
||||
githubId = 11006031;
|
||||
name = "Leo Maroni";
|
||||
emmabastas = {
|
||||
email = "emma.bastas@protonmail.com";
|
||||
matrix = "@emmabastas:matrix.org";
|
||||
github = "emmabastas";
|
||||
githubId = 22533224;
|
||||
name = "Emma Bastås";
|
||||
};
|
||||
emmanuelrosa = {
|
||||
email = "emmanuelrosa@protonmail.com";
|
||||
@@ -5061,6 +5079,12 @@
|
||||
githubId = 2405974;
|
||||
name = "Sébastian Méric de Bellefon";
|
||||
};
|
||||
helium = {
|
||||
email = "helium.dev@tuta.io";
|
||||
github = "helium18";
|
||||
githubId = 86223025;
|
||||
name = "helium";
|
||||
};
|
||||
henkkalkwater = {
|
||||
email = "chris+nixpkgs@netsoj.nl";
|
||||
github = "HenkKalkwater";
|
||||
@@ -6395,6 +6419,13 @@
|
||||
githubId = 1189739;
|
||||
name = "Julio Borja Barra";
|
||||
};
|
||||
jugendhacker = {
|
||||
name = "j.r";
|
||||
email = "j.r@jugendhacker.de";
|
||||
github = "jugendhacker";
|
||||
githubId = 12773748;
|
||||
matrix = "@j.r:chaos.jetzt";
|
||||
};
|
||||
juliendehos = {
|
||||
email = "dehos@lisic.univ-littoral.fr";
|
||||
github = "juliendehos";
|
||||
@@ -6680,7 +6711,7 @@
|
||||
};
|
||||
khushraj = {
|
||||
email = "khushraj.rathod@gmail.com";
|
||||
github = "KhushrajRathod";
|
||||
github = "khrj";
|
||||
githubId = 44947946;
|
||||
name = "Khushraj Rathod";
|
||||
keys = [{
|
||||
@@ -7251,6 +7282,12 @@
|
||||
githubId = 8355305;
|
||||
name = "leo60228";
|
||||
};
|
||||
leona = {
|
||||
email = "nix@leona.is";
|
||||
github = "leona-ya";
|
||||
githubId = 11006031;
|
||||
name = "Leona Maroni";
|
||||
};
|
||||
leonardoce = {
|
||||
email = "leonardo.cecchi@gmail.com";
|
||||
github = "leonardoce";
|
||||
@@ -7894,6 +7931,12 @@
|
||||
githubId = 65531;
|
||||
name = "Mario Rodas";
|
||||
};
|
||||
marsupialgutz = {
|
||||
email = "mars@possums.xyz";
|
||||
github = "marsupialgutz";
|
||||
githubId = 33522919;
|
||||
name = "Marshall Arruda";
|
||||
};
|
||||
martijnvermaat = {
|
||||
email = "martijn@vermaat.name";
|
||||
github = "martijnvermaat";
|
||||
@@ -7976,6 +8019,12 @@
|
||||
githubId = 19036;
|
||||
name = "Matthew Bauer";
|
||||
};
|
||||
matthiasbenaets = {
|
||||
email = "matthias.benaets@gmail.com";
|
||||
github = "MatthiasBenaets";
|
||||
githubId = 89214559;
|
||||
name = "Matthias Benaets";
|
||||
};
|
||||
matthiasbeyer = {
|
||||
email = "mail@beyermatthias.de";
|
||||
matrix = "@musicmatze:beyermatthi.as";
|
||||
@@ -8458,6 +8507,17 @@
|
||||
fingerprint = "3196 83D3 9A1B 4DE1 3DC2 51FD FEA8 88C9 F5D6 4F62";
|
||||
}];
|
||||
};
|
||||
minion3665 = {
|
||||
name = "Skyler Grey";
|
||||
email = "skyler3665@gmail.com";
|
||||
matrix = "@minion3665:matrix.org";
|
||||
github = "Minion3665";
|
||||
githubId = 34243578;
|
||||
keys = [{
|
||||
longkeyid = "rsa4096/0x1AFD10256B3C714D";
|
||||
fingerprint = "D520 AC8D 7C96 9212 5B2B BD3A 1AFD 1025 6B3C 714D";
|
||||
}];
|
||||
};
|
||||
mir06 = {
|
||||
email = "armin.leuprecht@uni-graz.at";
|
||||
github = "mir06";
|
||||
@@ -9796,6 +9856,12 @@
|
||||
githubId = 6931743;
|
||||
name = "pasqui23";
|
||||
};
|
||||
patricksjackson = {
|
||||
email = "patrick@jackson.dev";
|
||||
github = "patricksjackson";
|
||||
githubId = 160646;
|
||||
name = "Patrick Jackson";
|
||||
};
|
||||
patryk27 = {
|
||||
email = "pwychowaniec@pm.me";
|
||||
github = "Patryk27";
|
||||
@@ -9854,6 +9920,12 @@
|
||||
githubId = 8641;
|
||||
name = "Pierre Carrier";
|
||||
};
|
||||
pedrohlc = {
|
||||
email = "root@pedrohlc.com";
|
||||
github = "PedroHLC";
|
||||
githubId = 1368952;
|
||||
name = "Pedro Lara Campos";
|
||||
};
|
||||
penguwin = {
|
||||
email = "penguwin@penguwin.eu";
|
||||
github = "penguwin";
|
||||
@@ -10169,6 +10241,18 @@
|
||||
githubId = 10473184;
|
||||
name = "Jia Xiaodong";
|
||||
};
|
||||
pogobanane = {
|
||||
email = "mail@peter-okelmann.de";
|
||||
github = "pogobanane";
|
||||
githubId = 38314551;
|
||||
name = "Peter Okelmann";
|
||||
};
|
||||
polarmutex = {
|
||||
email = "brian@brianryall.xyz";
|
||||
github = "polarmutex";
|
||||
githubId = 115141;
|
||||
name = "Brian Ryall";
|
||||
};
|
||||
polendri = {
|
||||
email = "paul@ijj.li";
|
||||
github = "polendri";
|
||||
@@ -11391,7 +11475,7 @@
|
||||
longkeyid = "rsa2048/0x8E8FF66E2AE8D970";
|
||||
fingerprint = "30BB FF3F AB0B BB3E 0435 F83C 8E8F F66E 2AE8 D970";
|
||||
}];
|
||||
};
|
||||
};
|
||||
scode = {
|
||||
email = "peter.schuller@infidyne.com";
|
||||
github = "scode";
|
||||
@@ -11934,6 +12018,12 @@
|
||||
githubId = 26806;
|
||||
name = "Scott Olson";
|
||||
};
|
||||
somasis = {
|
||||
email = "kylie@somas.is";
|
||||
github = "somasis";
|
||||
githubId = 264788;
|
||||
name = "Kylie McClain";
|
||||
};
|
||||
SomeoneSerge = {
|
||||
email = "sergei.kozlukov@aalto.fi";
|
||||
matrix = "@ss:someonex.net";
|
||||
@@ -12080,10 +12170,10 @@
|
||||
name = "Steve Elliott";
|
||||
};
|
||||
stehessel = {
|
||||
email = "stephan@stehessel.de";
|
||||
github = "stehessel";
|
||||
githubId = 55607356;
|
||||
name = "Stephan Heßelmann";
|
||||
email = "stephan@stehessel.de";
|
||||
github = "stehessel";
|
||||
githubId = 55607356;
|
||||
name = "Stephan Heßelmann";
|
||||
};
|
||||
steinybot = {
|
||||
name = "Jason Pickens";
|
||||
@@ -12203,6 +12293,12 @@
|
||||
githubId = 48666;
|
||||
name = "Matthew \"strager\" Glazar";
|
||||
};
|
||||
strikerlulu = {
|
||||
email = "strikerlulu7@gmail.com";
|
||||
github = "strikerlulu";
|
||||
githubId = 38893265;
|
||||
name = "StrikerLulu";
|
||||
};
|
||||
stumoss = {
|
||||
email = "samoss@gmail.com";
|
||||
github = "stumoss";
|
||||
@@ -13593,6 +13689,17 @@
|
||||
email = "kirill.wedens@gmail.com";
|
||||
name = "wedens";
|
||||
};
|
||||
WeebSorceress = {
|
||||
name = "WeebSorceress";
|
||||
email = "hello@weebsorceress.anonaddy.me";
|
||||
matrix = "@weebsorceress:matrix.org";
|
||||
github = "WeebSorceress";
|
||||
githubId = 106774777;
|
||||
keys = [{
|
||||
longkeyid = "rsa4096/0x7F57344317F0FA43";
|
||||
fingerprint = "659A 9BC3 F904 EC24 1461 2EFE 7F57 3443 17F0 FA43";
|
||||
}];
|
||||
};
|
||||
wegank = {
|
||||
name = "Weijia Wang";
|
||||
email = "contact@weijia.wang";
|
||||
@@ -14665,4 +14772,10 @@
|
||||
github = "snpschaaf";
|
||||
githubId = 105843013;
|
||||
};
|
||||
jali-clarke = {
|
||||
email = "jinnah.ali-clarke@outlook.com";
|
||||
name = "Jinnah Ali-Clarke";
|
||||
github = "jali-clarke";
|
||||
githubId = 17733984;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ for bin in $(find $binaryDist -executable -type f) :; do
|
||||
uniq;
|
||||
)
|
||||
|
||||
if test "$names" = "glibc"; then names="stdenv.glibc"; fi
|
||||
if test "$names" = "glibc"; then names="glibc"; fi
|
||||
if echo $names | grep -c "gcc" &> /dev/null; then names="stdenv.cc.cc"; fi
|
||||
|
||||
if test $lib != $libPath; then
|
||||
|
||||
@@ -355,6 +355,16 @@ with lib.maintainers; {
|
||||
shortName = "Linux Kernel";
|
||||
};
|
||||
|
||||
lumiguide = {
|
||||
# Verify additions by approval of an already existing member of the team.
|
||||
members = [
|
||||
roelvandijk
|
||||
lucus16
|
||||
];
|
||||
scope = "Group registration for LumiGuide employees who collectively maintain packages.";
|
||||
shortName = "Lumiguide employees";
|
||||
};
|
||||
|
||||
lumina = {
|
||||
members = [
|
||||
romildo
|
||||
|
||||
@@ -120,14 +120,14 @@ lib.mkOption {
|
||||
```nix
|
||||
lib.mkPackageOption pkgs "GHC" {
|
||||
default = [ "ghc" ];
|
||||
example = "pkgs.haskell.package.ghc922.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
example = "pkgs.haskell.package.ghc923.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
}
|
||||
# is like
|
||||
lib.mkOption {
|
||||
type = lib.types.package;
|
||||
default = pkgs.ghc;
|
||||
defaultText = lib.literalExpression "pkgs.ghc";
|
||||
example = lib.literalExpression "pkgs.haskell.package.ghc922.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
example = lib.literalExpression "pkgs.haskell.package.ghc923.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
description = "The GHC package to use.";
|
||||
}
|
||||
```
|
||||
|
||||
@@ -308,6 +308,10 @@ The option set can be defined directly
|
||||
([Example: Directly defined submodule](#ex-submodule-direct)) or as reference
|
||||
([Example: Submodule defined as a reference](#ex-submodule-reference)).
|
||||
|
||||
Note that even if your submodule’s options all have a default value,
|
||||
you will still need to provide a default value (e.g. an empty attribute set)
|
||||
if you want to allow users to leave it undefined.
|
||||
|
||||
::: {#ex-submodule-direct .example}
|
||||
::: {.title}
|
||||
**Example: Directly defined submodule**
|
||||
|
||||
@@ -332,6 +332,19 @@ repository):
|
||||
'';
|
||||
```
|
||||
|
||||
Similarly, the type checking of test scripts can be disabled in the following
|
||||
way:
|
||||
|
||||
```nix
|
||||
import ./make-test-python.nix {
|
||||
skipTypeCheck = true;
|
||||
nodes.machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ configuration…
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## Failing tests early {#ssec-failing-tests-early}
|
||||
|
||||
To fail tests early when certain invariables are no longer met (instead of waiting for the build to time out), the decorator `polling_condition` is provided. For example, if we are testing a program `foo` that should not quit after being started, we might write the following:
|
||||
@@ -380,3 +393,25 @@ with foo_running:
|
||||
def foo_running():
|
||||
machine.succeed("pgrep -x foo")
|
||||
```
|
||||
|
||||
## Adding Python packages to the test script {#ssec-python-packages-in-test-script}
|
||||
|
||||
When additional Python libraries are required in the test script, they can be
|
||||
added using the parameter `extraPythonPackages`. For example, you could add
|
||||
`numpy` like this:
|
||||
|
||||
```nix
|
||||
import ./make-test-python.nix
|
||||
{
|
||||
extraPythonPackages = p: [ p.numpy ];
|
||||
|
||||
nodes = { };
|
||||
|
||||
testScript = ''
|
||||
import numpy as np
|
||||
assert str(np.zeros(4) == "array([0., 0., 0., 0.])")
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
In that case, `numpy` is chosen from the generic `python3Packages`.
|
||||
|
||||
@@ -183,14 +183,14 @@ lib.mkOption {
|
||||
<programlisting language="bash">
|
||||
lib.mkPackageOption pkgs "GHC" {
|
||||
default = [ "ghc" ];
|
||||
example = "pkgs.haskell.package.ghc922.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
example = "pkgs.haskell.package.ghc923.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
}
|
||||
# is like
|
||||
lib.mkOption {
|
||||
type = lib.types.package;
|
||||
default = pkgs.ghc;
|
||||
defaultText = lib.literalExpression "pkgs.ghc";
|
||||
example = lib.literalExpression "pkgs.haskell.package.ghc922.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
example = lib.literalExpression "pkgs.haskell.package.ghc923.ghc.withPackages (hkgs: [ hkgs.primes ])";
|
||||
description = "The GHC package to use.";
|
||||
}
|
||||
</programlisting>
|
||||
|
||||
@@ -617,6 +617,12 @@
|
||||
(<link linkend="ex-submodule-reference">Example: Submodule defined
|
||||
as a reference</link>).
|
||||
</para>
|
||||
<para>
|
||||
Note that even if your submodule’s options all have a default
|
||||
value, you will still need to provide a default value (e.g. an
|
||||
empty attribute set) if you want to allow users to leave it
|
||||
undefined.
|
||||
</para>
|
||||
<anchor xml:id="ex-submodule-direct" />
|
||||
<para>
|
||||
<emphasis role="strong">Example: Directly defined
|
||||
|
||||
@@ -589,6 +589,19 @@ import ./make-test-python.nix {
|
||||
Python code…
|
||||
# fmt: on
|
||||
'';
|
||||
</programlisting>
|
||||
<para>
|
||||
Similarly, the type checking of test scripts can be disabled in
|
||||
the following way:
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
import ./make-test-python.nix {
|
||||
skipTypeCheck = true;
|
||||
nodes.machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ configuration…
|
||||
};
|
||||
}
|
||||
</programlisting>
|
||||
</section>
|
||||
<section xml:id="ssec-failing-tests-early">
|
||||
@@ -652,4 +665,30 @@ def foo_running():
|
||||
```
|
||||
</programlisting>
|
||||
</section>
|
||||
<section xml:id="ssec-python-packages-in-test-script">
|
||||
<title>Adding Python packages to the test script</title>
|
||||
<para>
|
||||
When additional Python libraries are required in the test script,
|
||||
they can be added using the parameter
|
||||
<literal>extraPythonPackages</literal>. For example, you could add
|
||||
<literal>numpy</literal> like this:
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
import ./make-test-python.nix
|
||||
{
|
||||
extraPythonPackages = p: [ p.numpy ];
|
||||
|
||||
nodes = { };
|
||||
|
||||
testScript = ''
|
||||
import numpy as np
|
||||
assert str(np.zeros(4) == "array([0., 0., 0., 0.])")
|
||||
'';
|
||||
}
|
||||
</programlisting>
|
||||
<para>
|
||||
In that case, <literal>numpy</literal> is chosen from the generic
|
||||
<literal>python3Packages</literal>.
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<listitem>
|
||||
<para>
|
||||
<emphasis>Stable channels</emphasis>, such as
|
||||
<link xlink:href="https://nixos.org/channels/nixos-21.11"><literal>nixos-21.11</literal></link>.
|
||||
<link xlink:href="https://nixos.org/channels/nixos-22.05"><literal>nixos-22.05</literal></link>.
|
||||
These only get conservative bug fixes and package upgrades. For
|
||||
instance, a channel update may cause the Linux kernel on your
|
||||
system to be upgraded from 4.19.34 to 4.19.38 (a minor bug fix),
|
||||
@@ -33,7 +33,7 @@
|
||||
<listitem>
|
||||
<para>
|
||||
<emphasis>Small channels</emphasis>, such as
|
||||
<link xlink:href="https://nixos.org/channels/nixos-21.11-small"><literal>nixos-21.11-small</literal></link>
|
||||
<link xlink:href="https://nixos.org/channels/nixos-22.05-small"><literal>nixos-22.05-small</literal></link>
|
||||
or
|
||||
<link xlink:href="https://nixos.org/channels/nixos-unstable-small"><literal>nixos-unstable-small</literal></link>.
|
||||
These are identical to the stable and unstable channels
|
||||
@@ -60,8 +60,8 @@
|
||||
<para>
|
||||
When you first install NixOS, you’re automatically subscribed to the
|
||||
NixOS channel that corresponds to your installation source. For
|
||||
instance, if you installed from a 21.11 ISO, you will be subscribed
|
||||
to the <literal>nixos-21.11</literal> channel. To see which NixOS
|
||||
instance, if you installed from a 22.05 ISO, you will be subscribed
|
||||
to the <literal>nixos-22.05</literal> channel. To see which NixOS
|
||||
channel you’re subscribed to, run the following as root:
|
||||
</para>
|
||||
<programlisting>
|
||||
@@ -76,17 +76,17 @@ nixos https://nixos.org/channels/nixos-unstable
|
||||
</programlisting>
|
||||
<para>
|
||||
(Be sure to include the <literal>nixos</literal> parameter at the
|
||||
end.) For instance, to use the NixOS 21.11 stable channel:
|
||||
end.) For instance, to use the NixOS 22.05 stable channel:
|
||||
</para>
|
||||
<programlisting>
|
||||
# nix-channel --add https://nixos.org/channels/nixos-21.11 nixos
|
||||
# nix-channel --add https://nixos.org/channels/nixos-22.05 nixos
|
||||
</programlisting>
|
||||
<para>
|
||||
If you have a server, you may want to use the <quote>small</quote>
|
||||
channel instead:
|
||||
</para>
|
||||
<programlisting>
|
||||
# nix-channel --add https://nixos.org/channels/nixos-21.11-small nixos
|
||||
# nix-channel --add https://nixos.org/channels/nixos-22.05-small nixos
|
||||
</programlisting>
|
||||
<para>
|
||||
And if you want to live on the bleeding edge:
|
||||
@@ -146,7 +146,7 @@ system.autoUpgrade.allowReboot = true;
|
||||
also specify a channel explicitly, e.g.
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
system.autoUpgrade.channel = https://nixos.org/channels/nixos-21.11;
|
||||
system.autoUpgrade.channel = https://nixos.org/channels/nixos-22.05;
|
||||
</programlisting>
|
||||
</section>
|
||||
</chapter>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-release-22.05">
|
||||
<title>Release 22.05 (“Quokka”, 2022.05/??)</title>
|
||||
<title>Release 22.05 (“Quokka”, 2022.05/30)</title>
|
||||
<itemizedlist spacing="compact">
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -16,15 +16,8 @@
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Nix has been updated from 2.3 to 2.8. This mainly brings
|
||||
experimental support for Flakes, but also marks the
|
||||
<literal>nix</literal> command as experimental which now has
|
||||
to be enabled via the configuration explicitly. For more
|
||||
information and instructions for upgrades, see the
|
||||
<link xlink:href="https://nixos.org/manual/nix/stable/release-notes/release-notes.html">Release
|
||||
Notes</link>.
|
||||
</para>
|
||||
<literallayout>Nix has been updated from 2.3 to 2.8. This mainly brings experimental support for Flakes, but also marks the <literal>nix</literal> command as experimental which now has to be enabled via the configuration explicitly. For more information and instructions for upgrades, see the relase notes for <link xlink:href="https://nixos.org/manual/nix/stable/release-notes/rl-2.4.html">nix-2.4</link>,
|
||||
<link xlink:href="https://nixos.org/manual/nix/stable/release-notes/rl-2.5.html">nix-2.5</link>, <link xlink:href="https://nixos.org/manual/nix/stable/release-notes/rl-2.6.html">nix-2.6</link>, <link xlink:href="https://nixos.org/manual/nix/stable/release-notes/rl-2.7.html">nix-2.7</link> and <link xlink:href="https://nixos.org/manual/nix/stable/release-notes/rl-2.8.html">nix-2.8</link></literallayout>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -622,7 +615,7 @@
|
||||
version of the <literal>xmonad</literal> module, which will
|
||||
break your configuration if you use <literal>launch</literal>
|
||||
as entrypoint. The example code the corresponding nixos module
|
||||
was adjusted, you way want to have a look at it.
|
||||
was adjusted, you may want to have a look at it.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
@@ -801,6 +794,13 @@
|
||||
<literal>services.openldap.settings</literal>, which
|
||||
represents your <literal>cn=config</literal>.
|
||||
</para>
|
||||
<para>
|
||||
Additionally with 2.5 the argon2 module was included in the
|
||||
standard distrubtion and renamed from
|
||||
<literal>pw-argon2</literal> to <literal>argon2</literal>.
|
||||
Remember to update your <literal>olcModuleLoad</literal> entry
|
||||
in <literal>cn=config</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -1006,7 +1006,7 @@
|
||||
};
|
||||
|
||||
extraConfigFiles = [
|
||||
/run/keys/matrix-synapse/secrets.yaml
|
||||
"/run/keys/matrix-synapse/secrets.yaml"
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1014,7 +1014,9 @@
|
||||
<para>
|
||||
The secrets in your original config should be migrated into a
|
||||
YAML file that is included via
|
||||
<literal>extraConfigFiles</literal>.
|
||||
<literal>extraConfigFiles</literal>. The filename must be
|
||||
quoted to prevent nix from copying it to the (world readable)
|
||||
store.
|
||||
</para>
|
||||
<para>
|
||||
Additionally a few option defaults have been synced up with
|
||||
@@ -2096,6 +2098,28 @@
|
||||
<programlisting language="bash">
|
||||
redis-cli save
|
||||
cp /var/lib/redis/dump.rdb "/var/lib/redis-mastodon/dump.rdb"
|
||||
</programlisting>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Peertube now uses services.redis.servers to start a new redis
|
||||
server, instead of using a global redis server. This improves
|
||||
compatibility with other services that use redis.
|
||||
</para>
|
||||
<para>
|
||||
Redis database is used for storage only cache and job queue.
|
||||
More information can be found here -
|
||||
<link xlink:href="https://docs.joinpeertube.org/contribute-architecture">Peertube
|
||||
architecture</link>.
|
||||
</para>
|
||||
<para>
|
||||
If you do want to save the redis database, you can use the
|
||||
following commands before upgrade OS:
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
redis-cli save
|
||||
sudo mkdir /var/lib/redis-peertube
|
||||
sudo cp /var/lib/redis/dump.rdb /var/lib/redis-peertube/dump.rdb
|
||||
</programlisting>
|
||||
</listitem>
|
||||
<listitem>
|
||||
@@ -2670,6 +2694,14 @@ cp /var/lib/redis/dump.rdb "/var/lib/redis-mastodon/dump.rdb"
|
||||
like <literal>firefox</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The default <literal>scribus</literal> version is now 1.5,
|
||||
while version 1.4 is still available as
|
||||
<literal>scribus_1_4</literal>
|
||||
(<link xlink:href="https://github.com/NixOS/nixpkgs/pull/172700">#172700</link>).
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The Nextcloud module now supports to create a Mysql database
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
</section>
|
||||
<section xml:id="sec-release-22.11-new-services">
|
||||
<title>New Services</title>
|
||||
<itemizedlist spacing="compact">
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://github.com/jollheef/appvm">appvm</link>,
|
||||
@@ -48,6 +48,13 @@
|
||||
<link xlink:href="options.html#opt-virtualisation.appvm.enable">virtualisation.appvm</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://github.com/leetronics/infnoise">infnoise</link>,
|
||||
a hardware True Random Number Generator dongle. Available as
|
||||
<link xlink:href="options.html#opt-services.infnoise.enable">services.infnoise</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section xml:id="sec-release-22.11-incompatibilities">
|
||||
@@ -89,11 +96,31 @@
|
||||
</section>
|
||||
<section xml:id="sec-release-22.11-notable-changes">
|
||||
<title>Other Notable Changes</title>
|
||||
<itemizedlist spacing="compact">
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Please remove this line when you add the first item since
|
||||
docbook requires the section to be non-empty
|
||||
A new module was added for the Saleae Logic device family,
|
||||
providing the options
|
||||
<literal>hardware.saleae-logic.enable</literal> and
|
||||
<literal>hardware.saleae-logic.package</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Matrix Synapse now requires entries in the
|
||||
<literal>state_group_edges</literal> table to be unique, in
|
||||
order to prevent accidentally introducing duplicate
|
||||
information (for example, because a database backup was
|
||||
restored multiple times). If your Synapse database already has
|
||||
duplicate rows in this table, this could fail with an error
|
||||
and require manual remediation.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
memtest86+ was updated from 5.00-coreboot-002 to 6.00-beta2.
|
||||
It is now the upstream version from https://www.memtest.org/,
|
||||
as coreboot’s fork is no longer available.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
@@ -6,7 +6,7 @@ expressions and associated binaries. The NixOS channels are updated
|
||||
automatically from NixOS's Git repository after certain tests have
|
||||
passed and all packages have been built. These channels are:
|
||||
|
||||
- *Stable channels*, such as [`nixos-21.11`](https://nixos.org/channels/nixos-21.11).
|
||||
- *Stable channels*, such as [`nixos-22.05`](https://nixos.org/channels/nixos-22.05).
|
||||
These only get conservative bug fixes and package upgrades. For
|
||||
instance, a channel update may cause the Linux kernel on your system
|
||||
to be upgraded from 4.19.34 to 4.19.38 (a minor bug fix), but not
|
||||
@@ -19,7 +19,7 @@ passed and all packages have been built. These channels are:
|
||||
radical changes between channel updates. It's not recommended for
|
||||
production systems.
|
||||
|
||||
- *Small channels*, such as [`nixos-21.11-small`](https://nixos.org/channels/nixos-21.11-small)
|
||||
- *Small channels*, such as [`nixos-22.05-small`](https://nixos.org/channels/nixos-22.05-small)
|
||||
or [`nixos-unstable-small`](https://nixos.org/channels/nixos-unstable-small).
|
||||
These are identical to the stable and unstable channels described above,
|
||||
except that they contain fewer binary packages. This means they get updated
|
||||
@@ -38,8 +38,8 @@ newest supported stable release.
|
||||
|
||||
When you first install NixOS, you're automatically subscribed to the
|
||||
NixOS channel that corresponds to your installation source. For
|
||||
instance, if you installed from a 21.11 ISO, you will be subscribed to
|
||||
the `nixos-21.11` channel. To see which NixOS channel you're subscribed
|
||||
instance, if you installed from a 22.05 ISO, you will be subscribed to
|
||||
the `nixos-22.05` channel. To see which NixOS channel you're subscribed
|
||||
to, run the following as root:
|
||||
|
||||
```ShellSession
|
||||
@@ -54,16 +54,16 @@ To switch to a different NixOS channel, do
|
||||
```
|
||||
|
||||
(Be sure to include the `nixos` parameter at the end.) For instance, to
|
||||
use the NixOS 21.11 stable channel:
|
||||
use the NixOS 22.05 stable channel:
|
||||
|
||||
```ShellSession
|
||||
# nix-channel --add https://nixos.org/channels/nixos-21.11 nixos
|
||||
# nix-channel --add https://nixos.org/channels/nixos-22.05 nixos
|
||||
```
|
||||
|
||||
If you have a server, you may want to use the "small" channel instead:
|
||||
|
||||
```ShellSession
|
||||
# nix-channel --add https://nixos.org/channels/nixos-21.11-small nixos
|
||||
# nix-channel --add https://nixos.org/channels/nixos-22.05-small nixos
|
||||
```
|
||||
|
||||
And if you want to live on the bleeding edge:
|
||||
@@ -114,5 +114,5 @@ the new generation contains a different kernel, initrd or kernel
|
||||
modules. You can also specify a channel explicitly, e.g.
|
||||
|
||||
```nix
|
||||
system.autoUpgrade.channel = https://nixos.org/channels/nixos-21.11;
|
||||
system.autoUpgrade.channel = https://nixos.org/channels/nixos-22.05;
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Release 22.05 (“Quokka”, 2022.05/??) {#sec-release-22.05}
|
||||
# Release 22.05 (“Quokka”, 2022.05/30) {#sec-release-22.05}
|
||||
|
||||
- Support is planned until the end of December 2022, handing over to 22.11.
|
||||
|
||||
@@ -7,8 +7,14 @@
|
||||
In addition to numerous new and upgraded packages, this release has the following highlights:
|
||||
|
||||
- Nix has been updated from 2.3 to 2.8. This mainly brings experimental support
|
||||
for Flakes, but also marks the `nix` command as experimental which now has to be enabled via the configuration explicitly. For more
|
||||
information and instructions for upgrades, see the [Release Notes](https://nixos.org/manual/nix/stable/release-notes/release-notes.html).
|
||||
for Flakes, but also marks the `nix` command as experimental which now has to
|
||||
be enabled via the configuration explicitly. For more information and
|
||||
instructions for upgrades, see the
|
||||
relase notes for [nix-2.4](https://nixos.org/manual/nix/stable/release-notes/rl-2.4.html),
|
||||
[nix-2.5](https://nixos.org/manual/nix/stable/release-notes/rl-2.5.html),
|
||||
[nix-2.6](https://nixos.org/manual/nix/stable/release-notes/rl-2.6.html),
|
||||
[nix-2.7](https://nixos.org/manual/nix/stable/release-notes/rl-2.7.html) and
|
||||
[nix-2.8](https://nixos.org/manual/nix/stable/release-notes/rl-2.8.html)
|
||||
|
||||
- The `firefox` browser on `x86_64-linux` now makes use of profile-guided
|
||||
optimisation, resulting in a much more responsive browsing experience.
|
||||
@@ -189,7 +195,7 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
- The update of the haskell package set brings with it a new version of the `xmonad`
|
||||
module, which will break your configuration if you use `launch` as entrypoint. The
|
||||
example code the corresponding nixos module was adjusted, you way want to have a look at it.
|
||||
example code the corresponding nixos module was adjusted, you may want to have a look at it.
|
||||
|
||||
- The `home-assistant` module now requires users that don't want their
|
||||
configuration to be managed declaratively to set
|
||||
@@ -270,6 +276,8 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
- `openldap` (and therefore the slapd LDAP server) were updated to version 2.6.2. The project introduced backwards-incompatible changes, namely the removal of the bdb, hdb, ndb, and shell backends in slapd. Therefore before updating, dump your database `slapcat -n 1` in LDIF format, and reimport it after updating your `services.openldap.settings`, which represents your `cn=config`.
|
||||
|
||||
Additionally with 2.5 the argon2 module was included in the standard distrubtion and renamed from `pw-argon2` to `argon2`. Remember to update your `olcModuleLoad` entry in `cn=config`.
|
||||
|
||||
- `openssh` has been update to 8.9p1, changing the FIDO security key middleware interface.
|
||||
|
||||
- `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`.
|
||||
@@ -388,13 +396,13 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
};
|
||||
|
||||
extraConfigFiles = [
|
||||
/run/keys/matrix-synapse/secrets.yaml
|
||||
"/run/keys/matrix-synapse/secrets.yaml"
|
||||
];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The secrets in your original config should be migrated into a YAML file that is included via `extraConfigFiles`.
|
||||
The secrets in your original config should be migrated into a YAML file that is included via `extraConfigFiles`. The filename must be quoted to prevent nix from copying it to the (world readable) store.
|
||||
|
||||
Additionally a few option defaults have been synced up with upstream default values, for example the `max_upload_size` grew from `10M` to `50M`. For the same reason, the default
|
||||
`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
|
||||
@@ -757,6 +765,17 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
redis-cli save
|
||||
cp /var/lib/redis/dump.rdb "/var/lib/redis-mastodon/dump.rdb"
|
||||
```
|
||||
- Peertube now uses services.redis.servers to start a new redis server, instead of using a global redis server.
|
||||
This improves compatibility with other services that use redis.
|
||||
|
||||
Redis database is used for storage only cache and job queue. More information can be found here - [Peertube architecture](https://docs.joinpeertube.org/contribute-architecture).
|
||||
|
||||
If you do want to save the redis database, you can use the following commands before upgrade OS:
|
||||
```bash
|
||||
redis-cli save
|
||||
sudo mkdir /var/lib/redis-peertube
|
||||
sudo cp /var/lib/redis/dump.rdb /var/lib/redis-peertube/dump.rdb
|
||||
```
|
||||
|
||||
- If you are using Wayland you can choose to use the Ozone Wayland support
|
||||
in Chrome and several Electron apps by setting the environment variable
|
||||
@@ -928,6 +947,8 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
- 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`.
|
||||
|
||||
- The default `scribus` version is now 1.5, while version 1.4 is still available as `scribus_1_4` ([#172700](https://github.com/NixOS/nixpkgs/pull/172700)).
|
||||
|
||||
- The Nextcloud module now supports to create a Mysql database automatically
|
||||
with `services.nextcloud.database.createLocally` enabled.
|
||||
|
||||
|
||||
@@ -25,6 +25,9 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
- [appvm](https://github.com/jollheef/appvm), Nix based app VMs. Available as [virtualisation.appvm](options.html#opt-virtualisation.appvm.enable).
|
||||
|
||||
- [infnoise](https://github.com/leetronics/infnoise), a hardware True Random Number Generator dongle.
|
||||
Available as [services.infnoise](options.html#opt-services.infnoise.enable).
|
||||
|
||||
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
||||
|
||||
## Backward Incompatibilities {#sec-release-22.11-incompatibilities}
|
||||
@@ -44,5 +47,10 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
## Other Notable Changes {#sec-release-22.11-notable-changes}
|
||||
|
||||
- Please remove this line when you add the first item since docbook requires the section to be non-empty
|
||||
- A new module was added for the Saleae Logic device family, providing the options `hardware.saleae-logic.enable` and `hardware.saleae-logic.package`.
|
||||
|
||||
- Matrix Synapse now requires entries in the `state_group_edges` table to be unique, in order to prevent accidentally introducing duplicate information (for example, because a database backup was restored multiple times). If your Synapse database already has duplicate rows in this table, this could fail with an error and require manual remediation.
|
||||
|
||||
- memtest86+ was updated from 5.00-coreboot-002 to 6.00-beta2. It is now the upstream version from https://www.memtest.org/, as coreboot's fork is no longer available.
|
||||
|
||||
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
||||
|
||||
@@ -50,11 +50,6 @@ let
|
||||
# they way through, but has the last priority behind everything else.
|
||||
nixpkgs.system = lib.mkDefault system;
|
||||
|
||||
# Stash the value of the `system` argument. When using `nesting.children`
|
||||
# we want to have the same default value behavior (immediately above)
|
||||
# without any interference from the user's configuration.
|
||||
nixpkgs.initialSystem = system;
|
||||
|
||||
_module.args.pkgs = lib.mkIf (pkgs_ != null) (lib.mkForce pkgs_);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
, socat
|
||||
, tesseract4
|
||||
, vde2
|
||||
, extraPythonPackages ? (_ : [])
|
||||
}:
|
||||
|
||||
python3Packages.buildPythonApplication rec {
|
||||
@@ -17,14 +18,25 @@ python3Packages.buildPythonApplication rec {
|
||||
version = "1.1";
|
||||
src = ./.;
|
||||
|
||||
propagatedBuildInputs = [ coreutils netpbm python3Packages.colorama python3Packages.ptpython qemu_pkg socat vde2 ]
|
||||
++ (lib.optionals enableOCR [ imagemagick_light tesseract4 ]);
|
||||
propagatedBuildInputs = [
|
||||
coreutils
|
||||
netpbm
|
||||
python3Packages.colorama
|
||||
python3Packages.ptpython
|
||||
qemu_pkg
|
||||
socat
|
||||
vde2
|
||||
]
|
||||
++ (lib.optionals enableOCR [ imagemagick_light tesseract4 ])
|
||||
++ extraPythonPackages python3Packages;
|
||||
|
||||
doCheck = true;
|
||||
checkInputs = with python3Packages; [ mypy pylint black ];
|
||||
checkPhase = ''
|
||||
mypy --disallow-untyped-defs \
|
||||
--no-implicit-optional \
|
||||
--pretty \
|
||||
--no-color-output \
|
||||
--ignore-missing-imports ${src}/test_driver
|
||||
pylint --errors-only --enable=unused-import ${src}/test_driver
|
||||
black --check --diff ${src}/test_driver
|
||||
|
||||
@@ -682,7 +682,7 @@ class Machine:
|
||||
with self.nested("waiting for {} to appear on tty {}".format(regexp, tty)):
|
||||
retry(tty_matches)
|
||||
|
||||
def send_chars(self, chars: List[str]) -> None:
|
||||
def send_chars(self, chars: str) -> None:
|
||||
with self.nested("sending keys ‘{}‘".format(chars)):
|
||||
for char in chars:
|
||||
self.send_key(char)
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
# This file contains type hints that can be prepended to Nix test scripts so they can be type
|
||||
# checked.
|
||||
|
||||
from test_driver.driver import Driver
|
||||
from test_driver.vlan import VLan
|
||||
from test_driver.machine import Machine
|
||||
from test_driver.logger import Logger
|
||||
from typing import Callable, Iterator, ContextManager, Optional, List, Dict, Any, Union
|
||||
from typing_extensions import Protocol
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class RetryProtocol(Protocol):
|
||||
def __call__(self, fn: Callable, timeout: int = 900) -> None:
|
||||
raise Exception("This is just type information for the Nix test driver")
|
||||
|
||||
|
||||
class PollingConditionProtocol(Protocol):
|
||||
def __call__(
|
||||
self,
|
||||
fun_: Optional[Callable] = None,
|
||||
*,
|
||||
seconds_interval: float = 2.0,
|
||||
description: Optional[str] = None,
|
||||
) -> Union[Callable[[Callable], ContextManager], ContextManager]:
|
||||
raise Exception("This is just type information for the Nix test driver")
|
||||
|
||||
|
||||
start_all: Callable[[], None]
|
||||
subtest: Callable[[str], ContextManager[None]]
|
||||
retry: RetryProtocol
|
||||
test_script: Callable[[], None]
|
||||
machines: List[Machine]
|
||||
vlans: List[VLan]
|
||||
driver: Driver
|
||||
log: Logger
|
||||
create_machine: Callable[[Dict[str, Any]], Machine]
|
||||
run_tests: Callable[[], None]
|
||||
join_all: Callable[[], None]
|
||||
serial_stdout_off: Callable[[], None]
|
||||
serial_stdout_on: Callable[[], None]
|
||||
polling_condition: PollingConditionProtocol
|
||||
@@ -50,14 +50,16 @@ rec {
|
||||
, qemu_pkg ? pkgs.qemu_test
|
||||
, enableOCR ? false
|
||||
, skipLint ? false
|
||||
, skipTypeCheck ? false
|
||||
, passthru ? {}
|
||||
, interactive ? false
|
||||
, extraPythonPackages ? (_ :[])
|
||||
}:
|
||||
let
|
||||
# Reifies and correctly wraps the python test driver for
|
||||
# the respective qemu version and with or without ocr support
|
||||
testDriver = pkgs.callPackage ./test-driver {
|
||||
inherit enableOCR;
|
||||
inherit enableOCR extraPythonPackages;
|
||||
qemu_pkg = qemu_test;
|
||||
imagemagick_light = imagemagick_light.override { inherit libtiff; };
|
||||
tesseract4 = tesseract4.override { enableLanguages = [ "eng" ]; };
|
||||
@@ -85,7 +87,7 @@ rec {
|
||||
|
||||
nodeHostNames = let
|
||||
nodesList = map (c: c.config.system.name) (lib.attrValues nodes);
|
||||
in nodesList ++ lib.optional (lib.length nodesList == 1) "machine";
|
||||
in nodesList ++ lib.optional (lib.length nodesList == 1 && !lib.elem "machine" nodesList) "machine";
|
||||
|
||||
# TODO: This is an implementation error and needs fixing
|
||||
# the testing famework cannot legitimately restrict hostnames further
|
||||
@@ -100,6 +102,9 @@ rec {
|
||||
then testScript { inherit nodes; }
|
||||
else testScript;
|
||||
|
||||
uniqueVlans = lib.unique (builtins.concatLists vlans);
|
||||
vlanNames = map (i: "vlan${toString i}: VLan;") uniqueVlans;
|
||||
machineNames = map (name: "${name}: Machine;") nodeHostNames;
|
||||
in
|
||||
if lib.length invalidNodeNames > 0 then
|
||||
throw ''
|
||||
@@ -113,7 +118,7 @@ rec {
|
||||
else lib.warnIf skipLint "Linting is disabled" (runCommand testDriverName
|
||||
{
|
||||
inherit testName;
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
nativeBuildInputs = [ makeWrapper mypy ];
|
||||
testScript = testScript';
|
||||
preferLocalBuild = true;
|
||||
passthru = passthru // {
|
||||
@@ -125,7 +130,25 @@ rec {
|
||||
mkdir -p $out/bin
|
||||
|
||||
vmStartScripts=($(for i in ${toString vms}; do echo $i/bin/run-*-vm; done))
|
||||
echo -n "$testScript" > $out/test-script
|
||||
|
||||
${lib.optionalString (!skipTypeCheck) ''
|
||||
# prepend type hints so the test script can be type checked with mypy
|
||||
cat "${./test-script-prepend.py}" >> testScriptWithTypes
|
||||
echo "${builtins.toString machineNames}" >> testScriptWithTypes
|
||||
echo "${builtins.toString vlanNames}" >> testScriptWithTypes
|
||||
echo -n "$testScript" >> testScriptWithTypes
|
||||
|
||||
# set pythonpath so mypy knows where to find the imports. this requires the py.typed file.
|
||||
export PYTHONPATH='${./test-driver}'
|
||||
mypy --no-implicit-optional \
|
||||
--pretty \
|
||||
--no-color-output \
|
||||
testScriptWithTypes
|
||||
unset PYTHONPATH
|
||||
''}
|
||||
|
||||
echo -n "$testScript" >> $out/test-script
|
||||
|
||||
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-test-driver
|
||||
|
||||
${testDriver}/bin/generate-driver-symbols
|
||||
@@ -152,6 +175,7 @@ rec {
|
||||
, testScript
|
||||
, enableOCR ? false
|
||||
, name ? "unnamed"
|
||||
, skipTypeCheck ? false
|
||||
# Skip linting (mainly intended for faster dev cycles)
|
||||
, skipLint ? false
|
||||
, passthru ? {}
|
||||
@@ -161,6 +185,7 @@ rec {
|
||||
(if meta.description or null != null
|
||||
then builtins.unsafeGetAttrPos "description" meta
|
||||
else builtins.unsafeGetAttrPos "testScript" t)
|
||||
, extraPythonPackages ? (_ : [])
|
||||
} @ t:
|
||||
let
|
||||
mkNodes = qemu_pkg:
|
||||
@@ -207,19 +232,19 @@ rec {
|
||||
)];
|
||||
};
|
||||
in
|
||||
lib.warnIf (t?machine) "In test `${name}': The `machine' attribute in NixOS tests (pkgs.nixosTest / make-test-pyton.nix / testing-python.nix / makeTest) is deprecated. Please use the equivalent `nodes.machine'."
|
||||
lib.warnIf (t?machine) "In test `${name}': The `machine' attribute in NixOS tests (pkgs.nixosTest / make-test-python.nix / testing-python.nix / makeTest) is deprecated. Please use the equivalent `nodes.machine'."
|
||||
build-vms.buildVirtualNetwork (
|
||||
nodes // lib.optionalAttrs (machine != null) { inherit machine; }
|
||||
);
|
||||
|
||||
driver = setupDriverForTest {
|
||||
inherit testScript enableOCR skipLint passthru;
|
||||
inherit testScript enableOCR skipTypeCheck skipLint passthru extraPythonPackages;
|
||||
testName = name;
|
||||
qemu_pkg = pkgs.qemu_test;
|
||||
nodes = mkNodes pkgs.qemu_test;
|
||||
};
|
||||
driverInteractive = setupDriverForTest {
|
||||
inherit testScript enableOCR skipLint passthru;
|
||||
inherit testScript enableOCR skipTypeCheck skipLint passthru extraPythonPackages;
|
||||
testName = name;
|
||||
qemu_pkg = pkgs.qemu;
|
||||
nodes = mkNodes pkgs.qemu;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
{ pkgs, lib, config, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.hardware.new-lg4ff;
|
||||
kernelPackages = config.boot.kernelPackages;
|
||||
in {
|
||||
options.hardware.new-lg4ff = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enables improved Linux module drivers for Logitech driving wheels.
|
||||
This will replace the existing in-kernel hid-logitech modules.
|
||||
Works most notably on the Logitech G25, G27, G29 and Driving Force (GT).
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
boot = {
|
||||
extraModulePackages = [ kernelPackages.new-lg4ff ];
|
||||
kernelModules = [ "hid-logitech-new" ];
|
||||
};
|
||||
};
|
||||
|
||||
meta.maintainers = with lib.maintainers; [ matthiasbenaets ];
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.hardware.saleae-logic;
|
||||
in
|
||||
{
|
||||
options.hardware.saleae-logic = {
|
||||
enable = lib.mkEnableOption "udev rules for Saleae Logic devices";
|
||||
|
||||
package = lib.mkOption {
|
||||
type = lib.types.package;
|
||||
default = pkgs.saleae-logic-2;
|
||||
defaultText = lib.literalExpression "pkgs.saleae-logic-2";
|
||||
description = ''
|
||||
Saleae Logic package to use.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.udev.packages = [ cfg.package ];
|
||||
};
|
||||
|
||||
meta.maintainers = with lib.maintainers; [ chivay ];
|
||||
}
|
||||
@@ -163,8 +163,19 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
hardware.nvidia.forceFullCompositionPipeline = lib.mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = ''
|
||||
Whether to force-enable the full composition pipeline.
|
||||
This sometimes fixes screen tearing issues.
|
||||
This has been reported to reduce the performance of some OpenGL applications and may produce issues in WebGL.
|
||||
It also drastically increases the time the driver needs to clock down after load.
|
||||
'';
|
||||
};
|
||||
|
||||
hardware.nvidia.package = lib.mkOption {
|
||||
type = lib.types.package;
|
||||
type = types.package;
|
||||
default = config.boot.kernelPackages.nvidiaPackages.stable;
|
||||
defaultText = literalExpression "config.boot.kernelPackages.nvidiaPackages.stable";
|
||||
description = ''
|
||||
@@ -255,13 +266,18 @@ in
|
||||
''
|
||||
BusID "${pCfg.nvidiaBusId}"
|
||||
${optionalString syncCfg.allowExternalGpu "Option \"AllowExternalGpus\""}
|
||||
${optionalString cfg.powerManagement.finegrained "Option \"NVreg_DynamicPowerManagement=0x02\""}
|
||||
'';
|
||||
screenSection =
|
||||
''
|
||||
Option "RandRRotation" "on"
|
||||
${optionalString syncCfg.enable "Option \"AllowEmptyInitialConfiguration\""}
|
||||
'';
|
||||
'' + optionalString syncCfg.enable ''
|
||||
Option "AllowEmptyInitialConfiguration"
|
||||
'' + optionalString cfg.forceFullCompositionPipeline ''
|
||||
Option "metamodes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}"
|
||||
Option "AllowIndirectGLXProtocol" "off"
|
||||
Option "TripleBuffer" "on"
|
||||
''
|
||||
;
|
||||
};
|
||||
|
||||
services.xserver.serverLayoutSection = optionalString syncCfg.enable ''
|
||||
@@ -367,7 +383,8 @@ in
|
||||
RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia%c{3} c 195 %c{3}"
|
||||
KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0'"
|
||||
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'"
|
||||
'' + optionalString cfg.powerManagement.finegrained ''
|
||||
'' + optionalString cfg.powerManagement.finegrained (
|
||||
optionalString (versionOlder config.boot.kernelPackages.kernel.version "5.5") ''
|
||||
# Remove NVIDIA USB xHCI Host Controller devices, if present
|
||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1"
|
||||
|
||||
@@ -376,7 +393,7 @@ in
|
||||
|
||||
# Remove NVIDIA Audio devices, if present
|
||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{remove}="1"
|
||||
|
||||
'' + ''
|
||||
# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind
|
||||
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
|
||||
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"
|
||||
@@ -384,7 +401,7 @@ in
|
||||
# Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind
|
||||
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
|
||||
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"
|
||||
'';
|
||||
'');
|
||||
|
||||
boot.extraModprobeConfig = mkIf cfg.powerManagement.finegrained ''
|
||||
options nvidia "NVreg_DynamicPowerManagement=0x02"
|
||||
|
||||
@@ -67,6 +67,7 @@ in
|
||||
imports = [
|
||||
./assertions.nix
|
||||
./meta.nix
|
||||
(mkRemovedOptionModule [ "nixpkgs" "initialSystem" ] "The NixOS options `nesting.clone` and `nesting.children` have been deleted, and replaced with named specialisation. Therefore `nixpgks.initialSystem` has no effect anymore.")
|
||||
];
|
||||
|
||||
options.nixpkgs = {
|
||||
@@ -219,14 +220,6 @@ in
|
||||
Ignored when <code>nixpkgs.pkgs</code> is set.
|
||||
'';
|
||||
};
|
||||
|
||||
initialSystem = mkOption {
|
||||
type = types.str;
|
||||
internal = true;
|
||||
description = ''
|
||||
Preserved value of <literal>system</literal> passed to <literal>eval-config.nix</literal>.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
@@ -13,7 +13,7 @@ let
|
||||
attrsToText = attrs:
|
||||
concatStringsSep "\n" (
|
||||
mapAttrsToList (n: v: ''${n}=${escapeIfNeccessary (toString v)}'') attrs
|
||||
);
|
||||
) + "\n";
|
||||
|
||||
osReleaseContents = {
|
||||
NAME = "NixOS";
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
./hardware/network/ath-user-regd.nix
|
||||
./hardware/network/b43.nix
|
||||
./hardware/network/intel-2200bg.nix
|
||||
./hardware/new-lg4ff.nix
|
||||
./hardware/nitrokey.nix
|
||||
./hardware/opengl.nix
|
||||
./hardware/openrazer.nix
|
||||
@@ -73,6 +74,7 @@
|
||||
./hardware/printers.nix
|
||||
./hardware/raid/hpsa.nix
|
||||
./hardware/rtl-sdr.nix
|
||||
./hardware/saleae-logic.nix
|
||||
./hardware/steam-hardware.nix
|
||||
./hardware/system-76.nix
|
||||
./hardware/tuxedo-keyboard.nix
|
||||
@@ -981,6 +983,7 @@
|
||||
./services/security/hologram-server.nix
|
||||
./services/security/hologram-agent.nix
|
||||
./services/security/kanidm.nix
|
||||
./services/security/infnoise.nix
|
||||
./services/security/munge.nix
|
||||
./services/security/nginx-sso.nix
|
||||
./services/security/oauth2_proxy.nix
|
||||
|
||||
@@ -136,6 +136,24 @@ in
|
||||
packages = [ atop (lib.mkIf cfg.netatop.enable cfg.netatop.package) ];
|
||||
services =
|
||||
mkService cfg.atopService.enable "atop" [ atop ]
|
||||
// lib.mkIf cfg.atopService.enable {
|
||||
# always convert logs to newer version first
|
||||
# XXX might trigger TimeoutStart but restarting atop.service will
|
||||
# convert remainings logs and start eventually
|
||||
atop.serviceConfig.ExecStartPre = pkgs.writeShellScript "atop-update-log-format" ''
|
||||
set -e -u
|
||||
for logfile in "$LOGPATH"/atop_*
|
||||
do
|
||||
${atop}/bin/atopconvert "$logfile" "$logfile".new
|
||||
# only replace old file if version was upgraded to avoid
|
||||
# false positives for atop-rotate.service
|
||||
if ! ${pkgs.diffutils}/bin/cmp -s "$logfile" "$logfile".new
|
||||
then
|
||||
${pkgs.coreutils}/bin/mv -v -f "$logfile".new "$logfile"
|
||||
fi
|
||||
done
|
||||
'';
|
||||
}
|
||||
// mkService cfg.atopacctService.enable "atopacct" [ atop ]
|
||||
// mkService cfg.netatop.enable "netatop" [ cfg.netatop.package ]
|
||||
// mkService cfg.atopgpu.enable "atopgpu" [ atop ];
|
||||
|
||||
@@ -96,13 +96,22 @@ in
|
||||
};
|
||||
|
||||
repository = mkOption {
|
||||
type = types.str;
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
repository to backup to.
|
||||
'';
|
||||
example = "sftp:backup@192.168.1.100:/backups/${name}";
|
||||
};
|
||||
|
||||
repositoryFile = mkOption {
|
||||
type = with types; nullOr path;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to the file containing the repository location to backup to.
|
||||
'';
|
||||
};
|
||||
|
||||
paths = mkOption {
|
||||
type = types.nullOr (types.listOf types.str);
|
||||
default = null;
|
||||
@@ -142,7 +151,7 @@ in
|
||||
|
||||
extraBackupArgs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
Extra arguments passed to restic backup.
|
||||
'';
|
||||
@@ -153,7 +162,7 @@ in
|
||||
|
||||
extraOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
Extra extended options to be passed to the restic --option flag.
|
||||
'';
|
||||
@@ -172,7 +181,7 @@ in
|
||||
|
||||
pruneOpts = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
A list of options (--keep-* et al.) for 'restic forget
|
||||
--prune', to automatically prune old snapshots. The
|
||||
@@ -197,9 +206,25 @@ in
|
||||
'';
|
||||
example = "find /home/matt/git -type d -name .git";
|
||||
};
|
||||
|
||||
backupPrepareCommand = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
A script that must run before starting the backup process.
|
||||
'';
|
||||
};
|
||||
|
||||
backupCleanupCommand = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
A script that must run after finishing the backup process.
|
||||
'';
|
||||
};
|
||||
};
|
||||
}));
|
||||
default = {};
|
||||
default = { };
|
||||
example = {
|
||||
localbackup = {
|
||||
paths = [ "/home" ];
|
||||
@@ -225,66 +250,85 @@ in
|
||||
config = {
|
||||
warnings = mapAttrsToList (n: v: "services.restic.backups.${n}.s3CredentialsFile is deprecated, please use services.restic.backups.${n}.environmentFile instead.") (filterAttrs (n: v: v.s3CredentialsFile != null) config.services.restic.backups);
|
||||
systemd.services =
|
||||
mapAttrs' (name: backup:
|
||||
let
|
||||
extraOptions = concatMapStrings (arg: " -o ${arg}") backup.extraOptions;
|
||||
resticCmd = "${pkgs.restic}/bin/restic${extraOptions}";
|
||||
filesFromTmpFile = "/run/restic-backups-${name}/includes";
|
||||
backupPaths = if (backup.dynamicFilesFrom == null)
|
||||
then if (backup.paths != null) then concatStringsSep " " backup.paths else ""
|
||||
else "--files-from ${filesFromTmpFile}";
|
||||
pruneCmd = optionals (builtins.length backup.pruneOpts > 0) [
|
||||
( resticCmd + " forget --prune " + (concatStringsSep " " backup.pruneOpts) )
|
||||
( resticCmd + " check" )
|
||||
];
|
||||
# Helper functions for rclone remotes
|
||||
rcloneRemoteName = builtins.elemAt (splitString ":" backup.repository) 1;
|
||||
rcloneAttrToOpt = v: "RCLONE_" + toUpper (builtins.replaceStrings [ "-" ] [ "_" ] v);
|
||||
rcloneAttrToConf = v: "RCLONE_CONFIG_" + toUpper (rcloneRemoteName + "_" + v);
|
||||
toRcloneVal = v: if lib.isBool v then lib.boolToString v else v;
|
||||
in nameValuePair "restic-backups-${name}" ({
|
||||
environment = {
|
||||
RESTIC_PASSWORD_FILE = backup.passwordFile;
|
||||
RESTIC_REPOSITORY = backup.repository;
|
||||
} // optionalAttrs (backup.rcloneOptions != null) (mapAttrs' (name: value:
|
||||
nameValuePair (rcloneAttrToOpt name) (toRcloneVal value)
|
||||
) backup.rcloneOptions) // optionalAttrs (backup.rcloneConfigFile != null) {
|
||||
RCLONE_CONFIG = backup.rcloneConfigFile;
|
||||
} // optionalAttrs (backup.rcloneConfig != null) (mapAttrs' (name: value:
|
||||
nameValuePair (rcloneAttrToConf name) (toRcloneVal value)
|
||||
) backup.rcloneConfig);
|
||||
path = [ pkgs.openssh ];
|
||||
restartIfChanged = false;
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = (optionals (backupPaths != "") [ "${resticCmd} backup --cache-dir=%C/restic-backups-${name} ${concatStringsSep " " backup.extraBackupArgs} ${backupPaths}" ])
|
||||
++ pruneCmd;
|
||||
User = backup.user;
|
||||
RuntimeDirectory = "restic-backups-${name}";
|
||||
CacheDirectory = "restic-backups-${name}";
|
||||
CacheDirectoryMode = "0700";
|
||||
} // optionalAttrs (backup.environmentFile != null) {
|
||||
EnvironmentFile = backup.environmentFile;
|
||||
};
|
||||
} // optionalAttrs (backup.initialize || backup.dynamicFilesFrom != null) {
|
||||
preStart = ''
|
||||
${optionalString (backup.initialize) ''
|
||||
${resticCmd} snapshots || ${resticCmd} init
|
||||
''}
|
||||
${optionalString (backup.dynamicFilesFrom != null) ''
|
||||
${pkgs.writeScript "dynamicFilesFromScript" backup.dynamicFilesFrom} > ${filesFromTmpFile}
|
||||
''}
|
||||
'';
|
||||
} // optionalAttrs (backup.dynamicFilesFrom != null) {
|
||||
postStart = ''
|
||||
rm ${filesFromTmpFile}
|
||||
'';
|
||||
})
|
||||
) config.services.restic.backups;
|
||||
mapAttrs'
|
||||
(name: backup:
|
||||
let
|
||||
extraOptions = concatMapStrings (arg: " -o ${arg}") backup.extraOptions;
|
||||
resticCmd = "${pkgs.restic}/bin/restic${extraOptions}";
|
||||
filesFromTmpFile = "/run/restic-backups-${name}/includes";
|
||||
backupPaths =
|
||||
if (backup.dynamicFilesFrom == null)
|
||||
then if (backup.paths != null) then concatStringsSep " " backup.paths else ""
|
||||
else "--files-from ${filesFromTmpFile}";
|
||||
pruneCmd = optionals (builtins.length backup.pruneOpts > 0) [
|
||||
(resticCmd + " forget --prune " + (concatStringsSep " " backup.pruneOpts))
|
||||
(resticCmd + " check")
|
||||
];
|
||||
# Helper functions for rclone remotes
|
||||
rcloneRemoteName = builtins.elemAt (splitString ":" backup.repository) 1;
|
||||
rcloneAttrToOpt = v: "RCLONE_" + toUpper (builtins.replaceStrings [ "-" ] [ "_" ] v);
|
||||
rcloneAttrToConf = v: "RCLONE_CONFIG_" + toUpper (rcloneRemoteName + "_" + v);
|
||||
toRcloneVal = v: if lib.isBool v then lib.boolToString v else v;
|
||||
in
|
||||
nameValuePair "restic-backups-${name}" ({
|
||||
environment = {
|
||||
RESTIC_PASSWORD_FILE = backup.passwordFile;
|
||||
RESTIC_REPOSITORY = backup.repository;
|
||||
RESTIC_REPOSITORY_FILE = backup.repositoryFile;
|
||||
} // optionalAttrs (backup.rcloneOptions != null) (mapAttrs'
|
||||
(name: value:
|
||||
nameValuePair (rcloneAttrToOpt name) (toRcloneVal value)
|
||||
)
|
||||
backup.rcloneOptions) // optionalAttrs (backup.rcloneConfigFile != null) {
|
||||
RCLONE_CONFIG = backup.rcloneConfigFile;
|
||||
} // optionalAttrs (backup.rcloneConfig != null) (mapAttrs'
|
||||
(name: value:
|
||||
nameValuePair (rcloneAttrToConf name) (toRcloneVal value)
|
||||
)
|
||||
backup.rcloneConfig);
|
||||
path = [ pkgs.openssh ];
|
||||
restartIfChanged = false;
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = (optionals (backupPaths != "") [ "${resticCmd} backup --cache-dir=%C/restic-backups-${name} ${concatStringsSep " " backup.extraBackupArgs} ${backupPaths}" ])
|
||||
++ pruneCmd;
|
||||
User = backup.user;
|
||||
RuntimeDirectory = "restic-backups-${name}";
|
||||
CacheDirectory = "restic-backups-${name}";
|
||||
CacheDirectoryMode = "0700";
|
||||
} // optionalAttrs (backup.environmentFile != null) {
|
||||
EnvironmentFile = backup.environmentFile;
|
||||
};
|
||||
} // optionalAttrs (backup.initialize || backup.dynamicFilesFrom != null || backup.backupPrepareCommand != null) {
|
||||
preStart = ''
|
||||
${optionalString (backup.backupPrepareCommand != null) ''
|
||||
${pkgs.writeScript "backupPrepareCommand" backup.backupPrepareCommand}
|
||||
''}
|
||||
${optionalString (backup.initialize) ''
|
||||
${resticCmd} snapshots || ${resticCmd} init
|
||||
''}
|
||||
${optionalString (backup.dynamicFilesFrom != null) ''
|
||||
${pkgs.writeScript "dynamicFilesFromScript" backup.dynamicFilesFrom} > ${filesFromTmpFile}
|
||||
''}
|
||||
'';
|
||||
} // optionalAttrs (backup.dynamicFilesFrom != null || backup.backupCleanupCommand != null) {
|
||||
postStart = ''
|
||||
${optionalString (backup.backupCleanupCommand != null) ''
|
||||
${pkgs.writeScript "backupCleanupCommand" backup.backupCleanupCommand}
|
||||
''}
|
||||
${optionalString (backup.dynamicFilesFrom != null) ''
|
||||
rm ${filesFromTmpFile}
|
||||
''}
|
||||
'';
|
||||
})
|
||||
)
|
||||
config.services.restic.backups;
|
||||
systemd.timers =
|
||||
mapAttrs' (name: backup: nameValuePair "restic-backups-${name}" {
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = backup.timerConfig;
|
||||
}) config.services.restic.backups;
|
||||
mapAttrs'
|
||||
(name: backup: nameValuePair "restic-backups-${name}" {
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = backup.timerConfig;
|
||||
})
|
||||
config.services.restic.backups;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -361,8 +361,13 @@ in
|
||||
++ lib.optional cfg.enableSrunX11 slurm-spank-x11;
|
||||
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "systemd-tmpfiles-clean.service" ];
|
||||
requires = [ "network.target" ];
|
||||
after = [
|
||||
"systemd-tmpfiles-clean.service"
|
||||
"munge.service"
|
||||
"network-online.target"
|
||||
"remote-fs.target"
|
||||
];
|
||||
wants = [ "network-online.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "forking";
|
||||
@@ -371,6 +376,7 @@ in
|
||||
PIDFile = "/run/slurmd.pid";
|
||||
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
|
||||
LimitMEMLOCK = "infinity";
|
||||
Delegate="Yes";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -310,7 +310,11 @@ in
|
||||
|
||||
mkdir -m 0700 -p ${baseDir}/queue-runner
|
||||
mkdir -m 0750 -p ${baseDir}/build-logs
|
||||
chown hydra-queue-runner:hydra ${baseDir}/queue-runner ${baseDir}/build-logs
|
||||
mkdir -m 0750 -p ${baseDir}/runcommand-logs
|
||||
chown hydra-queue-runner.hydra \
|
||||
${baseDir}/queue-runner \
|
||||
${baseDir}/build-logs \
|
||||
${baseDir}/runcommand-logs
|
||||
|
||||
${optionalString haveLocalDB ''
|
||||
if ! [ -e ${baseDir}/.db-created ]; then
|
||||
|
||||
@@ -239,7 +239,7 @@ in {
|
||||
};
|
||||
|
||||
environment.sessionVariables.LD_LIBRARY_PATH =
|
||||
lib.optional cfg.jack.enable "${cfg.package.jack}/lib";
|
||||
lib.mkIf cfg.jack.enable [ "${cfg.package.jack}/lib" ];
|
||||
|
||||
users = lib.mkIf cfg.systemWide {
|
||||
users.pipewire = {
|
||||
|
||||
@@ -13,6 +13,8 @@ let
|
||||
# is in theory not needed as this is already the default for default builds
|
||||
UpdateChannel = 0;
|
||||
Headless = true;
|
||||
} // lib.optionalAttrs (cfg.ipcPasswordFile != null) {
|
||||
IPCPassword = "#ipcPassword#";
|
||||
});
|
||||
|
||||
ipc-config = format.generate "IPC.config" cfg.ipcSettings;
|
||||
@@ -81,8 +83,7 @@ in
|
||||
type = format.type;
|
||||
description = ''
|
||||
The ASF.json file, all the options are documented <link xlink:href="https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Configuration#global-config">here</link>.
|
||||
Do note that `AutoRestart` and `UpdateChannel` is always to `false`
|
||||
respectively `0` because NixOS takes care of updating everything.
|
||||
Do note that `AutoRestart` and `UpdateChannel` is always to `false` respectively `0` because NixOS takes care of updating everything.
|
||||
`Headless` is also always set to `true` because there is no way to provide inputs via a systemd service.
|
||||
You should try to keep ASF up to date since upstream does not provide support for anything but the latest version and you're exposing yourself to all kinds of issues - as is outlined <link xlink:href="https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Configuration#updateperiod">here</link>.
|
||||
'';
|
||||
@@ -92,6 +93,12 @@ respectively `0` because NixOS takes care of updating everything.
|
||||
default = { };
|
||||
};
|
||||
|
||||
ipcPasswordFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = "Path to a file containig the password. The file must be readable by the <literal>asf</literal> user/group.";
|
||||
};
|
||||
|
||||
ipcSettings = mkOption {
|
||||
type = format.type;
|
||||
description = ''
|
||||
@@ -115,14 +122,12 @@ respectively `0` because NixOS takes care of updating everything.
|
||||
options = {
|
||||
username = mkOption {
|
||||
type = types.str;
|
||||
description =
|
||||
"Name of the user to log in. Default is attribute name.";
|
||||
description = "Name of the user to log in. Default is attribute name.";
|
||||
default = "";
|
||||
};
|
||||
passwordFile = mkOption {
|
||||
type = types.path;
|
||||
description =
|
||||
"Path to a file containig the password. The file must be readable by the <literal>asf</literal> user/group.";
|
||||
description = "Path to a file containig the password. The file must be readable by the <literal>asf</literal> user/group.";
|
||||
};
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@@ -131,8 +136,7 @@ respectively `0` because NixOS takes care of updating everything.
|
||||
};
|
||||
settings = mkOption {
|
||||
type = types.attrs;
|
||||
description =
|
||||
"Additional settings that are documented <link xlink:href=\"https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Configuration#bot-config\">here</link>.";
|
||||
description = "Additional settings that are documented <link xlink:href=\"https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Configuration#bot-config\">here</link>.";
|
||||
default = { };
|
||||
};
|
||||
};
|
||||
@@ -170,14 +174,17 @@ respectively `0` because NixOS takes care of updating everything.
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = mkMerge [
|
||||
(mkIf (cfg.dataDir == "/var/lib/asf") { StateDirectory = "asf"; })
|
||||
(mkIf (cfg.dataDir == "/var/lib/asf") {
|
||||
StateDirectory = "asf";
|
||||
StateDirectoryMode = "700";
|
||||
})
|
||||
{
|
||||
User = "asf";
|
||||
Group = "asf";
|
||||
WorkingDirectory = cfg.dataDir;
|
||||
Type = "simple";
|
||||
ExecStart =
|
||||
"${cfg.package}/bin/ArchiSteamFarm --path ${cfg.dataDir} --process-required --no-restart --service --no-config-migrate";
|
||||
ExecStart = "${cfg.package}/bin/ArchiSteamFarm --path ${cfg.dataDir} --process-required --no-restart --service --no-config-migrate";
|
||||
Restart = "always";
|
||||
|
||||
# mostly copied from the default systemd service
|
||||
PrivateTmp = true;
|
||||
@@ -202,35 +209,47 @@ respectively `0` because NixOS takes care of updating everything.
|
||||
}
|
||||
];
|
||||
|
||||
preStart = ''
|
||||
mkdir -p config
|
||||
rm -f www
|
||||
rm -f config/{*.json,*.config}
|
||||
preStart =
|
||||
let
|
||||
createBotsScript = pkgs.runCommandLocal "ASF-bots" { } ''
|
||||
mkdir -p $out
|
||||
# clean potential removed bots
|
||||
rm -rf $out/*.json
|
||||
for i in ${strings.concatStringsSep " " (lists.map (x: "${getName x},${x}") (attrsets.mapAttrsToList mkBot cfg.bots))}; do IFS=",";
|
||||
set -- $i
|
||||
ln -fs $2 $out/$1
|
||||
done
|
||||
'';
|
||||
replaceSecretBin = "${pkgs.replace-secret}/bin/replace-secret";
|
||||
in
|
||||
''
|
||||
mkdir -p config
|
||||
|
||||
ln -s ${asf-config} config/ASF.json
|
||||
cp --no-preserve=mode ${asf-config} config/ASF.json
|
||||
|
||||
${strings.optionalString (cfg.ipcSettings != {}) ''
|
||||
ln -s ${ipc-config} config/IPC.config
|
||||
''}
|
||||
${optionalString (cfg.ipcPasswordFile != null) ''
|
||||
${replaceSecretBin} '#ipcPassword#' '${cfg.ipcPasswordFile}' config/ASF.json
|
||||
''}
|
||||
|
||||
ln -s ${pkgs.runCommandLocal "ASF-bots" {} ''
|
||||
mkdir -p $out/lib/asf/bots
|
||||
for i in ${strings.concatStringsSep " " (lists.map (x: "${getName x},${x}") (attrsets.mapAttrsToList mkBot cfg.bots))}; do IFS=",";
|
||||
set -- $i
|
||||
ln -s $2 $out/lib/asf/bots/$1
|
||||
done
|
||||
''}/lib/asf/bots/* config/
|
||||
${optionalString (cfg.ipcSettings != {}) ''
|
||||
ln -fs ${ipc-config} config/IPC.config
|
||||
''}
|
||||
|
||||
${strings.optionalString cfg.web-ui.enable ''
|
||||
ln -s ${cfg.web-ui.package}/lib/dist www
|
||||
''}
|
||||
'';
|
||||
${optionalString (cfg.ipcSettings != {}) ''
|
||||
ln -fs ${createBotsScript}/* config/
|
||||
''}
|
||||
|
||||
rm -f www
|
||||
${optionalString cfg.web-ui.enable ''
|
||||
ln -s ${cfg.web-ui.package}/lib/dist www
|
||||
''}
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
meta = {
|
||||
buildDocsInSandbox = false;
|
||||
maintainers = with maintainers; [ lom ];
|
||||
maintainers = with maintainers; [ lom SuperSandro2000 ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -51,9 +51,6 @@ in {
|
||||
extraModulePaths = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = literalExpression ''
|
||||
[ "''${pkgs.syslogng_incubator}/lib/syslog-ng" ]
|
||||
'';
|
||||
description = ''
|
||||
A list of paths that should be included in syslog-ng's
|
||||
<literal>--module-path</literal> option. They should usually
|
||||
|
||||
@@ -74,6 +74,18 @@ in
|
||||
<literal>dendrite</literal> is running.
|
||||
'';
|
||||
};
|
||||
loadCredential = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [ ];
|
||||
example = [ "private_key:/path/to/my_private_key" ];
|
||||
description = ''
|
||||
This can be used to pass secrets to the systemd service without adding them to
|
||||
the nix store.
|
||||
To use the example setting, see the example of
|
||||
<option>services.dendrite.settings.global.private_key</option>.
|
||||
See the LoadCredential section of systemd.exec manual for more information.
|
||||
'';
|
||||
};
|
||||
settings = lib.mkOption {
|
||||
type = lib.types.submodule {
|
||||
freeformType = settingsFormat.type;
|
||||
@@ -88,8 +100,10 @@ in
|
||||
'';
|
||||
};
|
||||
private_key = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
example = "${workingDir}/matrix_key.pem";
|
||||
type = lib.types.either
|
||||
lib.types.path
|
||||
(lib.types.strMatching "^\\$CREDENTIALS_DIRECTORY/.+");
|
||||
example = "$CREDENTIALS_DIRECTORY/private_key";
|
||||
description = ''
|
||||
The path to the signing private key file, used to sign
|
||||
requests and events.
|
||||
@@ -256,6 +270,7 @@ in
|
||||
RuntimeDirectoryMode = "0700";
|
||||
LimitNOFILE = 65535;
|
||||
EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
|
||||
LoadCredential = cfg.loadCredential;
|
||||
ExecStartPre = ''
|
||||
${pkgs.envsubst}/bin/envsubst \
|
||||
-i ${configurationYaml} \
|
||||
|
||||
@@ -53,7 +53,10 @@ in
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
StateDirectory = "jellyfin";
|
||||
StateDirectoryMode = "0700";
|
||||
CacheDirectory = "jellyfin";
|
||||
CacheDirectoryMode = "0700";
|
||||
UMask = "0077";
|
||||
ExecStart = "${cfg.package}/bin/jellyfin --datadir '/var/lib/${StateDirectory}' --cachedir '/var/cache/${CacheDirectory}'";
|
||||
Restart = "on-failure";
|
||||
|
||||
|
||||
@@ -2,14 +2,13 @@
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.libreddit;
|
||||
|
||||
args = concatStringsSep " " ([
|
||||
"--port ${toString cfg.port}"
|
||||
"--address ${cfg.address}"
|
||||
] ++ optional cfg.redirect "--redirect-https");
|
||||
let
|
||||
cfg = config.services.libreddit;
|
||||
|
||||
args = concatStringsSep " " ([
|
||||
"--port ${toString cfg.port}"
|
||||
"--address ${cfg.address}"
|
||||
]);
|
||||
in
|
||||
{
|
||||
options = {
|
||||
@@ -30,12 +29,6 @@ in
|
||||
description = "The port to listen on";
|
||||
};
|
||||
|
||||
redirect = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Enable the redirecting to HTTPS";
|
||||
};
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
@@ -56,6 +49,31 @@ in
|
||||
AmbientCapabilities = lib.mkIf (cfg.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
|
||||
Restart = "on-failure";
|
||||
RestartSec = "2s";
|
||||
# Hardening
|
||||
CapabilityBoundingSet = if (cfg.port < 1024) then [ "CAP_NET_BIND_SERVICE" ] else [ "" ];
|
||||
DeviceAllow = [ "" ];
|
||||
LockPersonality = true;
|
||||
MemoryDenyWriteExecute = true;
|
||||
PrivateDevices = true;
|
||||
# A private user cannot have process capabilities on the host's user
|
||||
# namespace and thus CAP_NET_BIND_SERVICE has no effect.
|
||||
PrivateUsers = (cfg.port >= 1024);
|
||||
ProcSubset = "pid";
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectHome = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectProc = "invisible";
|
||||
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
|
||||
RestrictNamespaces = true;
|
||||
RestrictRealtime = true;
|
||||
RestrictSUIDSGID = true;
|
||||
SystemCallArchitectures = "native";
|
||||
SystemCallFilter = [ "@system-service" "~@privileged" "~@resources" ];
|
||||
UMask = "0077";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -80,11 +80,12 @@ in {
|
||||
tls_enable = cfg.enableTLS;
|
||||
file_plugins = pkgs.writeText "uhub-plugins.conf"
|
||||
(lib.strings.concatStringsSep "\n" (map ({ plugin, settings }:
|
||||
"plugin ${plugin} ${
|
||||
toString
|
||||
(lib.attrsets.mapAttrsToList (key: value: ''"${key}=${value}"'')
|
||||
settings)
|
||||
}") cfg.plugins));
|
||||
''
|
||||
plugin ${plugin} "${
|
||||
toString
|
||||
(lib.attrsets.mapAttrsToList (key: value: "${key}=${value}")
|
||||
settings)
|
||||
}"'') cfg.plugins));
|
||||
};
|
||||
in {
|
||||
name = "uhub/${name}.conf";
|
||||
@@ -104,6 +105,9 @@ in {
|
||||
ExecStart = "${pkg}/bin/uhub -c /etc/uhub/${name}.conf -L";
|
||||
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
|
||||
DynamicUser = true;
|
||||
|
||||
AmbientCapabilities = "CAP_NET_BIND_SERVICE";
|
||||
CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
|
||||
};
|
||||
};
|
||||
}) hubs;
|
||||
|
||||
@@ -14,6 +14,7 @@ let
|
||||
PATHS_PLUGINS = if builtins.isNull cfg.declarativePlugins then "${cfg.dataDir}/plugins" else declarativePlugins;
|
||||
PATHS_LOGS = "${cfg.dataDir}/log";
|
||||
|
||||
SERVER_SERVE_FROM_SUBPATH = boolToString cfg.server.serveFromSubPath;
|
||||
SERVER_PROTOCOL = cfg.protocol;
|
||||
SERVER_HTTP_ADDR = cfg.addr;
|
||||
SERVER_HTTP_PORT = cfg.port;
|
||||
@@ -41,9 +42,23 @@ let
|
||||
USERS_AUTO_ASSIGN_ORG = boolToString cfg.users.autoAssignOrg;
|
||||
USERS_AUTO_ASSIGN_ORG_ROLE = cfg.users.autoAssignOrgRole;
|
||||
|
||||
AUTH_DISABLE_LOGIN_FORM = boolToString cfg.auth.disableLoginForm;
|
||||
|
||||
AUTH_ANONYMOUS_ENABLED = boolToString cfg.auth.anonymous.enable;
|
||||
AUTH_ANONYMOUS_ORG_NAME = cfg.auth.anonymous.org_name;
|
||||
AUTH_ANONYMOUS_ORG_ROLE = cfg.auth.anonymous.org_role;
|
||||
|
||||
AUTH_AZUREAD_NAME = "Azure AD";
|
||||
AUTH_AZUREAD_ENABLED = boolToString cfg.auth.azuread.enable;
|
||||
AUTH_AZUREAD_ALLOW_SIGN_UP = boolToString cfg.auth.azuread.allowSignUp;
|
||||
AUTH_AZUREAD_CLIENT_ID = cfg.auth.azuread.clientId;
|
||||
AUTH_AZUREAD_SCOPES = "openid email profile";
|
||||
AUTH_AZUREAD_AUTH_URL = "https://login.microsoftonline.com/${cfg.auth.azuread.tenantId}/oauth2/v2.0/authorize";
|
||||
AUTH_AZUREAD_TOKEN_URL = "https://login.microsoftonline.com/${cfg.auth.azuread.tenantId}/oauth2/v2.0/token";
|
||||
AUTH_AZUREAD_ALLOWED_DOMAINS = cfg.auth.azuread.allowedDomains;
|
||||
AUTH_AZUREAD_ALLOWED_GROUPS = cfg.auth.azuread.allowedGroups;
|
||||
AUTH_AZUREAD_ROLE_ATTRIBUTE_STRICT = false;
|
||||
|
||||
AUTH_GOOGLE_ENABLED = boolToString cfg.auth.google.enable;
|
||||
AUTH_GOOGLE_ALLOW_SIGN_UP = boolToString cfg.auth.google.allowSignUp;
|
||||
AUTH_GOOGLE_CLIENT_ID = cfg.auth.google.clientId;
|
||||
@@ -484,6 +499,14 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
server = {
|
||||
serveFromSubPath = mkOption {
|
||||
description = "Serve Grafana from subpath specified in rootUrl setting";
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
};
|
||||
|
||||
smtp = {
|
||||
enable = mkEnableOption "smtp";
|
||||
host = mkOption {
|
||||
@@ -546,6 +569,12 @@ in {
|
||||
};
|
||||
|
||||
auth = {
|
||||
disableLoginForm = mkOption {
|
||||
description = "Set to true to disable (hide) the login form, useful if you use OAuth";
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
anonymous = {
|
||||
enable = mkOption {
|
||||
description = "Whether to allow anonymous access.";
|
||||
@@ -563,6 +592,53 @@ in {
|
||||
type = types.str;
|
||||
};
|
||||
};
|
||||
azuread = {
|
||||
enable = mkOption {
|
||||
description = "Whether to allow Azure AD OAuth.";
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
allowSignUp = mkOption {
|
||||
description = "Whether to allow sign up with Azure AD OAuth.";
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
clientId = mkOption {
|
||||
description = "Azure AD OAuth client ID.";
|
||||
default = "";
|
||||
type = types.str;
|
||||
};
|
||||
clientSecretFile = mkOption {
|
||||
description = "Azure AD OAuth client secret.";
|
||||
default = null;
|
||||
type = types.nullOr types.path;
|
||||
};
|
||||
tenantId = mkOption {
|
||||
description = ''
|
||||
Tenant id used to create auth and token url. Default to "common"
|
||||
, let user sign in with any tenant.
|
||||
'';
|
||||
default = "common";
|
||||
type = types.str;
|
||||
};
|
||||
allowedDomains = mkOption {
|
||||
description = ''
|
||||
To limit access to authenticated users who are members of one or more groups,
|
||||
set allowedGroups to a comma- or space-separated list of group object IDs.
|
||||
You can find object IDs for a specific group on the Azure portal.
|
||||
'';
|
||||
default = "";
|
||||
type = types.str;
|
||||
};
|
||||
allowedGroups = mkOption {
|
||||
description = ''
|
||||
Limits access to users who belong to specific domains.
|
||||
Separate domains with space or comma.
|
||||
'';
|
||||
default = "";
|
||||
type = types.str;
|
||||
};
|
||||
};
|
||||
google = {
|
||||
enable = mkOption {
|
||||
description = "Whether to allow Google OAuth2.";
|
||||
@@ -652,6 +728,10 @@ in {
|
||||
set -o errexit -o pipefail -o nounset -o errtrace
|
||||
shopt -s inherit_errexit
|
||||
|
||||
${optionalString (cfg.auth.azuread.clientSecretFile != null) ''
|
||||
GF_AUTH_AZUREAD_CLIENT_SECRET="$(<${escapeShellArg cfg.auth.azuread.clientSecretFile})"
|
||||
export GF_AUTH_AZUREAD_CLIENT_SECRET
|
||||
''}
|
||||
${optionalString (cfg.auth.google.clientSecretFile != null) ''
|
||||
GF_AUTH_GOOGLE_CLIENT_SECRET="$(<${escapeShellArg cfg.auth.google.clientSecretFile})"
|
||||
export GF_AUTH_GOOGLE_CLIENT_SECRET
|
||||
|
||||
@@ -28,6 +28,9 @@ in {
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
# for mimirtool
|
||||
environment.systemPackages = [ pkgs.mimir ];
|
||||
|
||||
assertions = [{
|
||||
assertion = (
|
||||
(cfg.configuration == {} -> cfg.configFile != null) &&
|
||||
@@ -56,6 +59,7 @@ in {
|
||||
ProtectSystem = "full";
|
||||
DevicePolicy = "closed";
|
||||
NoNewPrivileges = true;
|
||||
WorkingDirectory = "/var/lib/mimir";
|
||||
StateDirectory = "mimir";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -201,6 +201,8 @@ in {
|
||||
serviceConfig = {
|
||||
ExecStart = "${cfg.package}/bin/netdata -P /run/netdata/netdata.pid -D -c /etc/netdata/netdata.conf";
|
||||
ExecReload = "${pkgs.util-linux}/bin/kill -s HUP -s USR1 -s USR2 $MAINPID";
|
||||
ExecPostStart = ''while [ "$(netdatacli ping)" != pong ]; do sleep 0.5; done'';
|
||||
|
||||
TimeoutStopSec = 60;
|
||||
Restart = "on-failure";
|
||||
# User and group
|
||||
|
||||
@@ -108,7 +108,7 @@ in {
|
||||
-i ${pkgs.writeText "dmarc-exporter.json.template" json} \
|
||||
-o ''${STATE_DIRECTORY}/dmarc-exporter.json
|
||||
|
||||
exec ${pkgs.prometheus-dmarc-exporter}/bin/prometheus-dmarc-exporter \
|
||||
exec ${pkgs.dmarc-metrics-exporter}/bin/dmarc-metrics-exporter \
|
||||
--configuration /var/lib/prometheus-dmarc-exporter/dmarc-exporter.json \
|
||||
${optionalString cfg.debug "--debug"}
|
||||
''}";
|
||||
|
||||
@@ -9,6 +9,12 @@ let
|
||||
};
|
||||
interfaceOptions = {
|
||||
options = {
|
||||
autoStart = mkOption {
|
||||
default = true;
|
||||
description = "Whether this VPN connection should be started automatically.";
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
gateway = mkOption {
|
||||
description = "Gateway server to connect to.";
|
||||
example = "gateway.example.com";
|
||||
@@ -95,7 +101,7 @@ let
|
||||
description = "OpenConnect Interface - ${name}";
|
||||
requires = [ "network-online.target" ];
|
||||
after = [ "network.target" "network-online.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
wantedBy = optional icfg.autoStart "multi-user.target";
|
||||
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
|
||||
@@ -51,7 +51,7 @@ in
|
||||
|
||||
services.unifi.openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether or not to open the minimum required ports on the firewall.
|
||||
|
||||
@@ -85,10 +85,6 @@ in
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
warnings = optional
|
||||
(options.services.unifi.openFirewall.highestPrio >= (mkOptionDefault null).priority)
|
||||
"The current services.unifi.openFirewall = true default is deprecated and will change to false in 22.11. Set it explicitly to silence this warning.";
|
||||
|
||||
users.users.unifi = {
|
||||
isSystemUser = true;
|
||||
group = "unifi";
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.infnoise;
|
||||
in {
|
||||
options = {
|
||||
services.infnoise = {
|
||||
enable = mkEnableOption "the Infinite Noise TRNG driver";
|
||||
|
||||
fillDevRandom = mkOption {
|
||||
description = ''
|
||||
Whether to run the infnoise driver as a daemon to refill /dev/random.
|
||||
|
||||
If disabled, you can use the `infnoise` command-line tool to
|
||||
manually obtain randomness.
|
||||
'';
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
environment.systemPackages = [ pkgs.infnoise ];
|
||||
|
||||
services.udev.extraRules = ''
|
||||
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", SYMLINK+="infnoise", TAG+="systemd", GROUP="dialout", MODE="0664", ENV{SYSTEMD_WANTS}="infnoise.service"
|
||||
'';
|
||||
|
||||
systemd.services.infnoise = mkIf cfg.fillDevRandom {
|
||||
description = "Infinite Noise TRNG driver";
|
||||
|
||||
bindsTo = [ "dev-infnoise.device" ];
|
||||
after = [ "dev-infnoise.device" ];
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.infnoise}/bin/infnoise --dev-random --debug";
|
||||
Restart = "always";
|
||||
User = "infnoise";
|
||||
DynamicUser = true;
|
||||
SupplementaryGroups = [ "dialout" ];
|
||||
DeviceAllow = [ "/dev/infnoise" ];
|
||||
DevicePolicy = "closed";
|
||||
PrivateNetwork = true;
|
||||
ProtectSystem = "strict";
|
||||
ProtectHome = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true; # only reads entropy pool size and watermark
|
||||
RestrictNamespaces = true;
|
||||
RestrictRealtime = true;
|
||||
LockPersonality = true;
|
||||
MemoryDenyWriteExecute = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -3,30 +3,26 @@
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.localtime;
|
||||
cfg = config.services.localtimed;
|
||||
in {
|
||||
options = {
|
||||
services.localtime = {
|
||||
services.localtimed = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable <literal>localtime</literal>, simple daemon for keeping the system
|
||||
timezone up-to-date based on the current location. It uses geoclue2 to
|
||||
determine the current location and systemd-timedated to actually set
|
||||
the timezone.
|
||||
Enable <literal>localtimed</literal>, a simple daemon for keeping the
|
||||
system timezone up-to-date based on the current location. It uses
|
||||
geoclue2 to determine the current location.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
services.geoclue2 = {
|
||||
enable = true;
|
||||
appConfig.localtime = {
|
||||
isAllowed = true;
|
||||
isSystem = true;
|
||||
};
|
||||
services.geoclue2.appConfig.localtimed = {
|
||||
isAllowed = true;
|
||||
isSystem = true;
|
||||
};
|
||||
|
||||
# Install the polkit rules.
|
||||
@@ -34,16 +30,6 @@ in {
|
||||
# Install the systemd unit.
|
||||
systemd.packages = [ pkgs.localtime ];
|
||||
|
||||
users.users.localtimed = {
|
||||
description = "localtime daemon";
|
||||
isSystemUser = true;
|
||||
group = "localtimed";
|
||||
};
|
||||
users.groups.localtimed = {};
|
||||
|
||||
systemd.services.localtime = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig.Restart = "on-failure";
|
||||
};
|
||||
systemd.services.localtime.wantedBy = [ "multi-user.target" ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -197,6 +197,13 @@ in
|
||||
Whether to allow note creation by accessing a nonexistent note URL.
|
||||
'';
|
||||
};
|
||||
requireFreeURLAuthentication = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to require authentication for FreeURL mode style note creation.
|
||||
'';
|
||||
};
|
||||
defaultPermission = mkOption {
|
||||
type = types.enum [ "freely" "editable" "limited" "locked" "private" ];
|
||||
default = "editable";
|
||||
@@ -431,7 +438,7 @@ in
|
||||
Minio secret key.
|
||||
'';
|
||||
};
|
||||
endpoint = mkOption {
|
||||
endPoint = mkOption {
|
||||
type = types.str;
|
||||
description = ''
|
||||
Minio endpoint.
|
||||
|
||||
@@ -733,7 +733,7 @@ in {
|
||||
'trusted_domains' => ${writePhpArrary ([ cfg.hostName ] ++ c.extraTrustedDomains)},
|
||||
'trusted_proxies' => ${writePhpArrary (c.trustedProxies)},
|
||||
${optionalString (c.defaultPhoneRegion != null) "'default_phone_region' => '${c.defaultPhoneRegion}',"}
|
||||
${optionalString (nextcloudGreaterOrEqualThan "23") "'profile.enabled' => ${boolToString cfg.globalProfiles}"}
|
||||
${optionalString (nextcloudGreaterOrEqualThan "23") "'profile.enabled' => ${boolToString cfg.globalProfiles},"}
|
||||
${objectstoreConfig}
|
||||
];
|
||||
'';
|
||||
@@ -830,7 +830,7 @@ in {
|
||||
${occ}/bin/nextcloud-occ config:system:delete trusted_domains
|
||||
|
||||
${optionalString (cfg.extraAppsEnable && cfg.extraApps != { }) ''
|
||||
# Try to enable apps (don't fail when one of them cannot be enabled , eg. due to incompatible version)
|
||||
# Try to enable apps
|
||||
${occ}/bin/nextcloud-occ app:enable ${concatStringsSep " " (attrNames cfg.extraApps)}
|
||||
''}
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ in {
|
||||
|
||||
port = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.port;
|
||||
default = if cfg.redis.createLocally && cfg.redis.enableUnixSocket then null else 6379;
|
||||
default = if cfg.redis.createLocally && cfg.redis.enableUnixSocket then null else 31638;
|
||||
defaultText = lib.literalExpression ''
|
||||
if config.${opt.redis.createLocally} && config.${opt.redis.enableUnixSocket}
|
||||
then null
|
||||
@@ -344,7 +344,7 @@ in {
|
||||
};
|
||||
};
|
||||
}
|
||||
(lib.mkIf cfg.redis.enableUnixSocket { redis = { socket = "/run/redis/redis.sock"; }; })
|
||||
(lib.mkIf cfg.redis.enableUnixSocket { redis = { socket = "/run/redis-peertube/redis.sock"; }; })
|
||||
];
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
@@ -441,13 +441,17 @@ in {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
services.redis = lib.mkMerge [
|
||||
services.redis.servers.peertube = lib.mkMerge [
|
||||
(lib.mkIf cfg.redis.createLocally {
|
||||
enable = true;
|
||||
})
|
||||
(lib.mkIf (cfg.redis.createLocally && !cfg.redis.enableUnixSocket) {
|
||||
bind = "127.0.0.1";
|
||||
port = cfg.redis.port;
|
||||
})
|
||||
(lib.mkIf (cfg.redis.createLocally && cfg.redis.enableUnixSocket) {
|
||||
unixSocket = "/run/redis/redis.sock";
|
||||
unixSocketPerm = 770;
|
||||
unixSocket = "/run/redis-peertube/redis.sock";
|
||||
unixSocketPerm = 660;
|
||||
})
|
||||
];
|
||||
|
||||
@@ -465,7 +469,7 @@ in {
|
||||
};
|
||||
})
|
||||
(lib.attrsets.setAttrByPath [ cfg.user "packages" ] [ cfg.package peertubeEnv peertubeCli pkgs.ffmpeg pkgs.nodejs-16_x pkgs.yarn ])
|
||||
(lib.mkIf cfg.redis.enableUnixSocket {${config.services.peertube.user}.extraGroups = [ "redis" ];})
|
||||
(lib.mkIf cfg.redis.enableUnixSocket {${config.services.peertube.user}.extraGroups = [ "redis-peertube" ];})
|
||||
];
|
||||
|
||||
users.groups = lib.optionalAttrs (cfg.group == "peertube") {
|
||||
|
||||
@@ -932,7 +932,7 @@ in
|
||||
# System Call Filtering
|
||||
SystemCallArchitectures = "native";
|
||||
SystemCallFilter = [ "~@cpu-emulation @debug @keyring @mount @obsolete @privileged @setuid" ]
|
||||
++ optionals ((cfg.package != pkgs.tengine) && (!lib.any (mod: (mod.disableIPC or false)) cfg.package.modules)) [ "~@ipc" ];
|
||||
++ optionals ((cfg.package != pkgs.tengine) && (cfg.package != pkgs.openresty) && (!lib.any (mod: (mod.disableIPC or false)) cfg.package.modules)) [ "~@ipc" ];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -78,7 +78,13 @@ let
|
||||
description = ''
|
||||
Display scaling factor.
|
||||
'';
|
||||
type = types.nullOr types.ints.unsigned;
|
||||
type = types.nullOr (
|
||||
types.addCheck
|
||||
(types.either types.int types.float)
|
||||
(x : x > 0)
|
||||
) // {
|
||||
description = "null or positive integer or float";
|
||||
};
|
||||
default = null;
|
||||
example = 2;
|
||||
};
|
||||
|
||||
@@ -204,7 +204,6 @@ def get_profiles() -> List[str]:
|
||||
else:
|
||||
return []
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description='Update NixOS-related systemd-boot files')
|
||||
parser.add_argument('default_config', metavar='DEFAULT-CONFIG', help='The default NixOS config to boot')
|
||||
@@ -244,27 +243,29 @@ def main() -> None:
|
||||
subprocess.check_call(["@systemd@/bin/bootctl", "--path=@efiSysMountPoint@"] + flags + ["install"])
|
||||
else:
|
||||
# Update bootloader to latest if needed
|
||||
systemd_version = subprocess.check_output(["@systemd@/bin/bootctl", "--version"], universal_newlines=True).split()[2]
|
||||
sdboot_status = subprocess.check_output(["@systemd@/bin/bootctl", "--path=@efiSysMountPoint@", "status"], universal_newlines=True)
|
||||
available_out = subprocess.check_output(["@systemd@/bin/bootctl", "--version"], universal_newlines=True).split()[2]
|
||||
installed_out = subprocess.check_output(["@systemd@/bin/bootctl", "--path=@efiSysMountPoint@", "status"], universal_newlines=True)
|
||||
|
||||
# See status_binaries() in systemd bootctl.c for code which generates this
|
||||
m = re.search("^\W+File:.*/EFI/(BOOT|systemd)/.*\.efi \(systemd-boot ([\d.]+[^)]*)\)$",
|
||||
sdboot_status, re.IGNORECASE | re.MULTILINE)
|
||||
installed_match = re.search(r"^\W+File:.*/EFI/(?:BOOT|systemd)/.*\.efi \(systemd-boot ([\d.]+[^)]*)\)$",
|
||||
installed_out, re.IGNORECASE | re.MULTILINE)
|
||||
|
||||
needs_install = False
|
||||
available_match = re.search(r"^\((.*)\)$", available_out)
|
||||
|
||||
if m is None:
|
||||
print("could not find any previously installed systemd-boot, installing.")
|
||||
# Let systemd-boot attempt an installation if a previous one wasn't found
|
||||
needs_install = True
|
||||
else:
|
||||
sdboot_version = f'({m.group(2)})'
|
||||
if systemd_version != sdboot_version:
|
||||
print("updating systemd-boot from %s to %s" % (sdboot_version, systemd_version))
|
||||
needs_install = True
|
||||
if installed_match is None:
|
||||
raise Exception("could not find any previously installed systemd-boot")
|
||||
|
||||
if needs_install:
|
||||
if available_match is None:
|
||||
raise Exception("could not determine systemd-boot version")
|
||||
|
||||
installed_version = installed_match.group(1)
|
||||
available_version = available_match.group(1)
|
||||
|
||||
if installed_version < available_version:
|
||||
print("updating systemd-boot from %s to %s" % (installed_version, available_version))
|
||||
subprocess.check_call(["@systemd@/bin/bootctl", "--path=@efiSysMountPoint@", "update"])
|
||||
else:
|
||||
print("leaving systemd-boot %s in place (%s is not newer)" % (installed_version, available_version))
|
||||
|
||||
mkdir_p("@efiSysMountPoint@/efi/nixos")
|
||||
mkdir_p("@efiSysMountPoint@/loader/entries")
|
||||
|
||||
@@ -14,6 +14,8 @@ extraUtils="@extraUtils@"
|
||||
export LD_LIBRARY_PATH=@extraUtils@/lib
|
||||
export PATH=@extraUtils@/bin
|
||||
ln -s @extraUtils@/bin /bin
|
||||
# hardcoded in util-linux's mount helper search path `/run/wrappers/bin:/run/current-system/sw/bin:/sbin`
|
||||
ln -s @extraUtils@/bin /sbin
|
||||
|
||||
# Copy the secrets to their needed location
|
||||
if [ -d "@extraUtils@/secrets" ]; then
|
||||
|
||||
@@ -31,6 +31,9 @@ let
|
||||
# mounting `/`, like `/` on a loopback).
|
||||
fileSystems = filter utils.fsNeededForBoot config.system.build.fileSystems;
|
||||
|
||||
# Determine whether zfs-mount(8) is needed.
|
||||
zfsRequiresMountHelper = any (fs: lib.elem "zfsutil" fs.options) fileSystems;
|
||||
|
||||
# A utility for enumerating the shared-library dependencies of a program
|
||||
findLibs = pkgs.buildPackages.writeShellScriptBin "find-libs" ''
|
||||
set -euo pipefail
|
||||
@@ -107,6 +110,22 @@ let
|
||||
copy_bin_and_libs $BIN
|
||||
done
|
||||
|
||||
${optionalString zfsRequiresMountHelper ''
|
||||
# Filesystems using the "zfsutil" option are mounted regardless of the
|
||||
# mount.zfs(8) helper, but it is required to ensure that ZFS properties
|
||||
# are used as mount options.
|
||||
#
|
||||
# BusyBox does not use the ZFS helper in the first place.
|
||||
# util-linux searches /sbin/ as last path for helpers (stage-1-init.sh
|
||||
# must symlink it to the store PATH).
|
||||
# Without helper program, both `mount`s silently fails back to internal
|
||||
# code, using default options and effectively ignore security relevant
|
||||
# ZFS properties such as `setuid=off` and `exec=off` (unless manually
|
||||
# duplicated in `fileSystems.*.options`, defeating "zfsutil"'s purpose).
|
||||
copy_bin_and_libs ${pkgs.util-linux}/bin/mount
|
||||
copy_bin_and_libs ${pkgs.zfs}/bin/mount.zfs
|
||||
''}
|
||||
|
||||
# Copy some util-linux stuff.
|
||||
copy_bin_and_libs ${pkgs.util-linux}/sbin/blkid
|
||||
|
||||
@@ -204,24 +223,29 @@ let
|
||||
|
||||
# Run patchelf to make the programs refer to the copied libraries.
|
||||
find $out/bin $out/lib -type f | while read i; do
|
||||
if ! test -L $i; then
|
||||
nuke-refs -e $out $i
|
||||
fi
|
||||
nuke-refs -e $out $i
|
||||
done
|
||||
|
||||
find $out/bin -type f | while read i; do
|
||||
if ! test -L $i; then
|
||||
echo "patching $i..."
|
||||
patchelf --set-interpreter $out/lib/ld*.so.? --set-rpath $out/lib $i || true
|
||||
fi
|
||||
echo "patching $i..."
|
||||
patchelf --set-interpreter $out/lib/ld*.so.? --set-rpath $out/lib $i || true
|
||||
done
|
||||
|
||||
find $out/lib -type f \! -name 'ld*.so.?' | while read i; do
|
||||
echo "patching $i..."
|
||||
patchelf --set-rpath $out/lib $i
|
||||
done
|
||||
|
||||
if [ -z "${toString (pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform)}" ]; then
|
||||
# Make sure that the patchelf'ed binaries still work.
|
||||
echo "testing patched programs..."
|
||||
$out/bin/ash -c 'echo hello world' | grep "hello world"
|
||||
export LD_LIBRARY_PATH=$out/lib
|
||||
$out/bin/mount --help 2>&1 | grep -q "BusyBox"
|
||||
${if zfsRequiresMountHelper then ''
|
||||
$out/bin/mount -V 1>&1 | grep -q "mount from util-linux"
|
||||
$out/bin/mount.zfs -h 2>&1 | grep -q "Usage: mount.zfs"
|
||||
'' else ''
|
||||
$out/bin/mount --help 2>&1 | grep -q "BusyBox"
|
||||
''}
|
||||
$out/bin/blkid -V 2>&1 | grep -q 'libblkid'
|
||||
$out/bin/udevadm --version
|
||||
$out/bin/dmsetup --version 2>&1 | tee -a log | grep -q "version:"
|
||||
@@ -260,8 +284,6 @@ let
|
||||
} ''
|
||||
mkdir -p $out
|
||||
|
||||
echo 'ENV{LD_LIBRARY_PATH}="${extraUtils}/lib"' > $out/00-env.rules
|
||||
|
||||
cp -v ${udev}/lib/udev/rules.d/60-cdrom_id.rules $out/
|
||||
cp -v ${udev}/lib/udev/rules.d/60-persistent-storage.rules $out/
|
||||
cp -v ${udev}/lib/udev/rules.d/75-net-description.rules $out/
|
||||
|
||||
@@ -219,14 +219,15 @@ let
|
||||
cidr = "${route.address}/${toString route.prefixLength}";
|
||||
via = optionalString (route.via != null) ''via "${route.via}"'';
|
||||
options = concatStrings (mapAttrsToList (name: val: "${name} ${val} ") route.options);
|
||||
type = toString route.type;
|
||||
in
|
||||
''
|
||||
echo "${cidr}" >> $state
|
||||
echo -n "adding route ${cidr}... "
|
||||
if out=$(ip route add "${cidr}" ${options} ${via} dev "${i.name}" proto static 2>&1); then
|
||||
if out=$(ip route add ${type} "${cidr}" ${options} ${via} dev "${i.name}" proto static 2>&1); then
|
||||
echo "done"
|
||||
elif ! echo "$out" | grep "File exists" >/dev/null 2>&1; then
|
||||
echo "'ip route add "${cidr}" ${options} ${via} dev "${i.name}"' failed: $out"
|
||||
echo "'ip route add ${type} "${cidr}" ${options} ${via} dev "${i.name}"' failed: $out"
|
||||
exit 1
|
||||
fi
|
||||
''
|
||||
|
||||
@@ -142,6 +142,9 @@ in
|
||||
optionalAttrs (route.via != null) {
|
||||
Gateway = route.via;
|
||||
} //
|
||||
optionalAttrs (route.type != null) {
|
||||
Type = route.type;
|
||||
} //
|
||||
optionalAttrs (route.options ? onlink) {
|
||||
GatewayOnLink = true;
|
||||
} //
|
||||
|
||||
@@ -90,6 +90,22 @@ let
|
||||
'';
|
||||
};
|
||||
|
||||
type = mkOption {
|
||||
type = types.nullOr (types.enum [
|
||||
"unicast" "local" "broadcast" "multicast"
|
||||
]);
|
||||
default = null;
|
||||
description = ''
|
||||
Type of the route. See the <literal>Route types</literal> section
|
||||
in the <literal>ip-route(8)</literal> manual page for the details.
|
||||
|
||||
Note that <literal>prohibit</literal>, <literal>blackhole</literal>,
|
||||
<literal>unreachable</literal>, and <literal>throw</literal> cannot
|
||||
be configured per device, so they are not available here. Similarly,
|
||||
<literal>nat</literal> hasn't been supported since kernel 2.6.
|
||||
'';
|
||||
};
|
||||
|
||||
via = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
|
||||
@@ -51,7 +51,6 @@ in
|
||||
default = pkgs.docker;
|
||||
defaultText = literalExpression "pkgs.docker";
|
||||
type = types.package;
|
||||
example = literalExpression "pkgs.docker-edge";
|
||||
description = ''
|
||||
Docker package to be used in the module.
|
||||
'';
|
||||
|
||||
@@ -155,7 +155,6 @@ in
|
||||
default = pkgs.docker;
|
||||
defaultText = literalExpression "pkgs.docker";
|
||||
type = types.package;
|
||||
example = literalExpression "pkgs.docker-edge";
|
||||
description = ''
|
||||
Docker package to be used in the module.
|
||||
'';
|
||||
|
||||
@@ -11,10 +11,9 @@ let
|
||||
auth_unix_rw = "polkit"
|
||||
${cfg.extraConfig}
|
||||
'';
|
||||
ovmfFilePrefix = if pkgs.stdenv.isAarch64 then "AAVMF" else "OVMF";
|
||||
qemuConfigFile = pkgs.writeText "qemu.conf" ''
|
||||
${optionalString cfg.qemu.ovmf.enable ''
|
||||
nvram = [ "/run/libvirt/nix-ovmf/${ovmfFilePrefix}_CODE.fd:/run/libvirt/nix-ovmf/${ovmfFilePrefix}_VARS.fd" ]
|
||||
nvram = [ "/run/libvirt/nix-ovmf/AAVMF_CODE.fd:/run/libvirt/nix-ovmf/AAVMF_VARS.fd", "/run/libvirt/nix-ovmf/OVMF_CODE.fd:/run/libvirt/nix-ovmf/OVMF_VARS.fd" ]
|
||||
''}
|
||||
${optionalString (!cfg.qemu.runAsRoot) ''
|
||||
user = "qemu-libvirtd"
|
||||
@@ -36,13 +35,20 @@ let
|
||||
'';
|
||||
};
|
||||
|
||||
# mkRemovedOptionModule does not work in submodules, do it manually
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.OVMF;
|
||||
defaultText = literalExpression "pkgs.OVMF";
|
||||
example = literalExpression "pkgs.OVMFFull";
|
||||
type = types.nullOr types.package;
|
||||
default = null;
|
||||
internal = true;
|
||||
};
|
||||
|
||||
packages = mkOption {
|
||||
type = types.listOf types.package;
|
||||
default = [ pkgs.OVMF.fd ];
|
||||
defaultText = literalExpression "[ pkgs.OVMF.fd ]";
|
||||
example = literalExpression "[ pkgs.OVMFFull.fd pkgs.pkgsCross.aarch64-multiplatform.OVMF.fd ]";
|
||||
description = ''
|
||||
OVMF package to use.
|
||||
List of OVMF packages to use. Each listed package must contain files names FV/OVMF_CODE.fd and FV/OVMF_VARS.fd or FV/AAVMF_CODE.fd and FV/AAVMF_VARS.fd
|
||||
'';
|
||||
};
|
||||
};
|
||||
@@ -141,9 +147,9 @@ in
|
||||
(mkRenamedOptionModule
|
||||
[ "virtualisation" "libvirtd" "qemuOvmf" ]
|
||||
[ "virtualisation" "libvirtd" "qemu" "ovmf" "enable" ])
|
||||
(mkRenamedOptionModule
|
||||
(mkRemovedOptionModule
|
||||
[ "virtualisation" "libvirtd" "qemuOvmfPackage" ]
|
||||
[ "virtualisation" "libvirtd" "qemu" "ovmf" "package" ])
|
||||
"If this option was set to `foo`, set the option `virtualisation.libvirtd.qemu.ovmf.packages' to `[foo.fd]` instead.")
|
||||
(mkRenamedOptionModule
|
||||
[ "virtualisation" "libvirtd" "qemuSwtpm" ]
|
||||
[ "virtualisation" "libvirtd" "qemu" "swtpm" "enable" ])
|
||||
@@ -238,12 +244,15 @@ in
|
||||
|
||||
assertions = [
|
||||
{
|
||||
assertion = config.security.polkit.enable;
|
||||
message = "The libvirtd module currently requires Polkit to be enabled ('security.polkit.enable = true').";
|
||||
assertion = config.virtualisation.libvirtd.qemu.ovmf.package == null;
|
||||
message = ''
|
||||
The option virtualisation.libvirtd.qemu.ovmf.package is superseded by virtualisation.libvirtd.qemu.ovmf.packages.
|
||||
If this option was set to `foo`, set the option `virtualisation.libvirtd.qemu.ovmf.packages' to `[foo.fd]` instead.
|
||||
'';
|
||||
}
|
||||
{
|
||||
assertion = builtins.elem "fd" cfg.qemu.ovmf.package.outputs;
|
||||
message = "The option 'virtualisation.libvirtd.qemuOvmfPackage' needs a package that has an 'fd' output.";
|
||||
assertion = config.security.polkit.enable;
|
||||
message = "The libvirtd module currently requires Polkit to be enabled ('security.polkit.enable = true').";
|
||||
}
|
||||
];
|
||||
|
||||
@@ -303,10 +312,18 @@ in
|
||||
ln -s --force ${cfg.qemu.package}/$helper /run/${dirName}/nix-helpers/
|
||||
done
|
||||
|
||||
${optionalString cfg.qemu.ovmf.enable ''
|
||||
ln -s --force ${cfg.qemu.ovmf.package.fd}/FV/${ovmfFilePrefix}_CODE.fd /run/${dirName}/nix-ovmf/
|
||||
ln -s --force ${cfg.qemu.ovmf.package.fd}/FV/${ovmfFilePrefix}_VARS.fd /run/${dirName}/nix-ovmf/
|
||||
''}
|
||||
${optionalString cfg.qemu.ovmf.enable (let
|
||||
ovmfpackage = pkgs.buildEnv {
|
||||
name = "qemu-ovmf";
|
||||
paths = cfg.qemu.ovmf.packages;
|
||||
};
|
||||
in
|
||||
''
|
||||
ln -s --force ${ovmfpackage}/FV/AAVMF_CODE.fd /run/${dirName}/nix-ovmf/
|
||||
ln -s --force ${ovmfpackage}/FV/OVMF_CODE.fd /run/${dirName}/nix-ovmf/
|
||||
ln -s --force ${ovmfpackage}/FV/AAVMF_VARS.fd /run/${dirName}/nix-ovmf/
|
||||
ln -s --force ${ovmfpackage}/FV/OVMF_VARS.fd /run/${dirName}/nix-ovmf/
|
||||
'')}
|
||||
'';
|
||||
|
||||
serviceConfig = {
|
||||
|
||||
@@ -284,7 +284,7 @@ let
|
||||
DeviceAllow = map (d: "${d.node} ${d.modifier}") cfg.allowedDevices;
|
||||
};
|
||||
|
||||
system = config.nixpkgs.localSystem.system;
|
||||
inherit (config.nixpkgs) localSystem;
|
||||
kernelVersion = config.boot.kernelPackages.kernel.version;
|
||||
|
||||
bindMountOpts = { name, ... }: {
|
||||
@@ -478,12 +478,12 @@ in
|
||||
type = lib.mkOptionType {
|
||||
name = "Toplevel NixOS config";
|
||||
merge = loc: defs: (import "${toString config.nixpkgs}/nixos/lib/eval-config.nix" {
|
||||
inherit system;
|
||||
modules =
|
||||
let
|
||||
extraConfig = {
|
||||
_file = "module at ${__curPos.file}:${toString __curPos.line}";
|
||||
config = {
|
||||
nixpkgs = { inherit localSystem; };
|
||||
boot.isContainer = true;
|
||||
networking.hostName = mkDefault name;
|
||||
networking.useDHCP = false;
|
||||
|
||||
@@ -64,7 +64,6 @@ in
|
||||
environment.etc.vmware-tools.source = "${open-vm-tools}/etc/vmware-tools/*";
|
||||
|
||||
services.xserver = mkIf (!cfg.headless) {
|
||||
videoDrivers = mkOverride 50 [ "vmware" ];
|
||||
modules = [ xf86inputvmmouse ];
|
||||
|
||||
config = ''
|
||||
|
||||
@@ -17,6 +17,7 @@ let
|
||||
# Run the tests for each platform. You can run a test by doing
|
||||
# e.g. ‘nix-build -A tests.login.x86_64-linux’, or equivalently,
|
||||
# ‘nix-build tests/login.nix -A result’.
|
||||
# See also nixosTests in pkgs/top-level/all-packages.nix
|
||||
allTestsForSystem = system:
|
||||
import ./tests/all-tests.nix {
|
||||
inherit system;
|
||||
@@ -24,7 +25,19 @@ let
|
||||
callTest = t: {
|
||||
${system} = hydraJob t.test;
|
||||
};
|
||||
} // {
|
||||
# for typechecking of the scripts and evaluation of
|
||||
# the nodes, without running VMs.
|
||||
allDrivers =
|
||||
import ./tests/all-tests.nix {
|
||||
inherit system;
|
||||
pkgs = import ./.. { inherit system; };
|
||||
callTest = t: {
|
||||
${system} = hydraJob t.test.driver;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
allTests =
|
||||
foldAttrs recursiveUpdate {} (map allTestsForSystem supportedSystems);
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ let
|
||||
featureFlags.minimalModules = {};
|
||||
};
|
||||
evalMinimalConfig = module: nixosLib.evalModules { modules = [ module ]; };
|
||||
in
|
||||
{
|
||||
|
||||
in {
|
||||
_3proxy = handleTest ./3proxy.nix {};
|
||||
acme = handleTest ./acme.nix {};
|
||||
adguardhome = handleTest ./adguardhome.nix {};
|
||||
@@ -123,7 +123,6 @@ in
|
||||
doas = handleTest ./doas.nix {};
|
||||
docker = handleTestOn ["x86_64-linux"] ./docker.nix {};
|
||||
docker-rootless = handleTestOn ["x86_64-linux"] ./docker-rootless.nix {};
|
||||
docker-edge = handleTestOn ["x86_64-linux"] ./docker-edge.nix {};
|
||||
docker-registry = handleTest ./docker-registry.nix {};
|
||||
docker-tools = handleTestOn ["x86_64-linux"] ./docker-tools.nix {};
|
||||
docker-tools-cross = handleTestOn ["x86_64-linux" "aarch64-linux"] ./docker-tools-cross.nix {};
|
||||
@@ -152,6 +151,7 @@ in
|
||||
etcd-cluster = handleTestOn ["x86_64-linux"] ./etcd-cluster.nix {};
|
||||
etebase-server = handleTest ./etebase-server.nix {};
|
||||
etesync-dav = handleTest ./etesync-dav.nix {};
|
||||
extra-python-packages = handleTest ./extra-python-packages.nix {};
|
||||
fancontrol = handleTest ./fancontrol.nix {};
|
||||
fcitx = handleTest ./fcitx {};
|
||||
fenics = handleTest ./fenics.nix {};
|
||||
@@ -170,6 +170,7 @@ in
|
||||
frr = handleTest ./frr.nix {};
|
||||
fsck = handleTest ./fsck.nix {};
|
||||
ft2-clone = handleTest ./ft2-clone.nix {};
|
||||
grafana-mimir = handleTest ./grafana-mimir.nix {};
|
||||
gerrit = handleTest ./gerrit.nix {};
|
||||
geth = handleTest ./geth.nix {};
|
||||
ghostunnel = handleTest ./ghostunnel.nix {};
|
||||
|
||||
@@ -18,8 +18,9 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||
# container available within the VM, because we don't have network access.
|
||||
virtualisation.additionalPaths = let
|
||||
emptyContainer = import ../lib/eval-config.nix {
|
||||
inherit (config.nixpkgs.localSystem) system;
|
||||
modules = lib.singleton {
|
||||
nixpkgs = { inherit (config.nixpkgs) localSystem; };
|
||||
|
||||
containers.foo.config = {
|
||||
system.stateVersion = "18.03";
|
||||
};
|
||||
|
||||
@@ -17,10 +17,11 @@ import ./make-test-python.nix (
|
||||
homeserver = { pkgs, ... }: {
|
||||
services.dendrite = {
|
||||
enable = true;
|
||||
loadCredential = [ "test_private_key:${private_key}" ];
|
||||
openRegistration = true;
|
||||
settings = {
|
||||
global.server_name = "test-dendrite-server.com";
|
||||
global.private_key = private_key;
|
||||
global.private_key = "$CREDENTIALS_DIRECTORY/test_private_key";
|
||||
client_api.registration_disabled = false;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
# This test runs docker and checks if simple container starts
|
||||
|
||||
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||
name = "docker";
|
||||
meta = with pkgs.lib.maintainers; {
|
||||
maintainers = [ nequissimus offline ];
|
||||
};
|
||||
|
||||
nodes = {
|
||||
docker =
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
virtualisation.docker.enable = true;
|
||||
virtualisation.docker.package = pkgs.docker-edge;
|
||||
|
||||
users.users = {
|
||||
noprivs = {
|
||||
isNormalUser = true;
|
||||
description = "Can't access the docker daemon";
|
||||
password = "foobar";
|
||||
};
|
||||
|
||||
hasprivs = {
|
||||
isNormalUser = true;
|
||||
description = "Can access the docker daemon";
|
||||
password = "foobar";
|
||||
extraGroups = [ "docker" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
start_all()
|
||||
|
||||
docker.wait_for_unit("sockets.target")
|
||||
docker.succeed("tar cv --files-from /dev/null | docker import - scratchimg")
|
||||
docker.succeed(
|
||||
"docker run -d --name=sleeping -v /nix/store:/nix/store -v /run/current-system/sw/bin:/bin scratchimg /bin/sleep 10"
|
||||
)
|
||||
docker.succeed("docker ps | grep sleeping")
|
||||
docker.succeed("sudo -u hasprivs docker ps")
|
||||
docker.fail("sudo -u noprivs docker ps")
|
||||
docker.succeed("docker stop sleeping")
|
||||
|
||||
# Must match version 4 times to ensure client and server git commits and versions are correct
|
||||
docker.succeed('[ $(docker version | grep ${pkgs.docker-edge.version} | wc -l) = "4" ]')
|
||||
'';
|
||||
})
|
||||
@@ -11,16 +11,16 @@ import ./make-test-python.nix ({ ... }:
|
||||
|
||||
testScript = ''
|
||||
def login_as_alice():
|
||||
machine.wait_until_tty_matches(1, "login: ")
|
||||
machine.wait_until_tty_matches("1", "login: ")
|
||||
machine.send_chars("alice\n")
|
||||
machine.wait_until_tty_matches(1, "Password: ")
|
||||
machine.wait_until_tty_matches("1", "Password: ")
|
||||
machine.send_chars("foobar\n")
|
||||
machine.wait_until_tty_matches(1, "alice\@machine")
|
||||
machine.wait_until_tty_matches("1", "alice\@machine")
|
||||
|
||||
|
||||
def logout():
|
||||
machine.send_chars("logout\n")
|
||||
machine.wait_until_tty_matches(1, "login: ")
|
||||
machine.wait_until_tty_matches("1", "login: ")
|
||||
|
||||
|
||||
machine.wait_for_unit("default.target")
|
||||
@@ -36,7 +36,7 @@ import ./make-test-python.nix ({ ... }:
|
||||
with subtest("Log alice in (ecryptfs passwhrase is wrapped during first login)"):
|
||||
login_as_alice()
|
||||
machine.send_chars("logout\n")
|
||||
machine.wait_until_tty_matches(1, "login: ")
|
||||
machine.wait_until_tty_matches("1", "login: ")
|
||||
|
||||
# Why do I need to do this??
|
||||
machine.succeed("su alice -c ecryptfs-umount-private || true")
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import ./make-test-python.nix ({ ... }:
|
||||
{
|
||||
name = "extra-python-packages";
|
||||
|
||||
extraPythonPackages = p: [ p.numpy ];
|
||||
|
||||
nodes = { };
|
||||
|
||||
testScript = ''
|
||||
import numpy as np
|
||||
assert str(np.zeros(4) == "array([0., 0., 0., 0.])")
|
||||
'';
|
||||
})
|
||||
@@ -54,7 +54,7 @@ import ./make-test-python.nix ({ pkgs, firefoxPackage, ... }: {
|
||||
|
||||
|
||||
@contextmanager
|
||||
def audio_recording(machine: Machine) -> None:
|
||||
def record_audio(machine: Machine):
|
||||
"""
|
||||
Perform actions while recording the
|
||||
machine audio output.
|
||||
@@ -64,7 +64,7 @@ import ./make-test-python.nix ({ pkgs, firefoxPackage, ... }: {
|
||||
machine.systemctl("stop audio-recorder")
|
||||
|
||||
|
||||
def wait_for_sound(machine: Machine) -> None:
|
||||
def wait_for_sound(machine: Machine):
|
||||
"""
|
||||
Wait until any sound has been emitted.
|
||||
"""
|
||||
@@ -94,7 +94,7 @@ import ./make-test-python.nix ({ pkgs, firefoxPackage, ... }: {
|
||||
machine.sleep(40)
|
||||
|
||||
with subtest("Check whether Firefox can play sound"):
|
||||
with audio_recording(machine):
|
||||
with record_audio(machine):
|
||||
machine.succeed(
|
||||
"firefox file://${pkgs.sound-theme-freedesktop}/share/sounds/freedesktop/stereo/phone-incoming-call.oga >&2 &"
|
||||
)
|
||||
|
||||
@@ -107,7 +107,7 @@ in
|
||||
with subtest("gitolite server starts"):
|
||||
server.wait_for_unit("gitolite-init.service")
|
||||
server.wait_for_unit("sshd.service")
|
||||
client.succeed("ssh gitolite@server info")
|
||||
client.succeed("ssh -n gitolite@server info")
|
||||
|
||||
with subtest("admin can clone and configure gitolite-admin.git"):
|
||||
client.succeed(
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
import ./make-test-python.nix ({ pkgs, ... }: {
|
||||
name = "grafana-mimir";
|
||||
nodes = {
|
||||
server = { ... }: {
|
||||
environment.systemPackages = [ pkgs.jq ];
|
||||
services.mimir.enable = true;
|
||||
services.mimir.configuration = {
|
||||
ingester.ring.replication_factor = 1;
|
||||
};
|
||||
|
||||
services.telegraf.enable = true;
|
||||
services.telegraf.extraConfig = {
|
||||
agent.interval = "1s";
|
||||
agent.flush_interval = "1s";
|
||||
inputs.exec = {
|
||||
commands = [
|
||||
"${pkgs.coreutils}/bin/echo 'foo i=42i'"
|
||||
];
|
||||
data_format = "influx";
|
||||
};
|
||||
outputs = {
|
||||
http = {
|
||||
# test remote write
|
||||
url = "http://localhost:8080/api/v1/push";
|
||||
|
||||
# Data format to output.
|
||||
data_format = "prometheusremotewrite";
|
||||
|
||||
headers = {
|
||||
Content-Type = "application/x-protobuf";
|
||||
Content-Encoding = "snappy";
|
||||
X-Scope-OrgID = "nixos";
|
||||
X-Prometheus-Remote-Write-Version = "0.1.0";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
start_all()
|
||||
server.wait_for_unit("mimir.service")
|
||||
server.wait_for_unit("telegraf.service")
|
||||
server.wait_for_open_port(8080)
|
||||
server.wait_until_succeeds(
|
||||
"curl -H 'X-Scope-OrgID: nixos' http://127.0.0.1:8080/prometheus/api/v1/label/host/values | jq -r '.data[0]' | grep server"
|
||||
)
|
||||
'';
|
||||
})
|
||||
@@ -111,6 +111,7 @@ in {
|
||||
pattern = re.compile(r"path=(?P<path>[\/a-z0-9-.]+)\/bin\/hass")
|
||||
response = hass.execute("systemctl show -p ExecStart home-assistant.service")[1]
|
||||
match = pattern.search(response)
|
||||
assert match
|
||||
package = match.group('path')
|
||||
|
||||
hass.wait_for_unit("home-assistant.service")
|
||||
|
||||
@@ -32,14 +32,7 @@ let
|
||||
};
|
||||
};
|
||||
# ihatemoney needs a local smtp server otherwise project creation just crashes
|
||||
services.opensmtpd = {
|
||||
enable = true;
|
||||
serverConfiguration = ''
|
||||
listen on lo
|
||||
action foo relay
|
||||
match from any for any action foo
|
||||
'';
|
||||
};
|
||||
services.postfix.enable = true;
|
||||
};
|
||||
testScript = ''
|
||||
machine.wait_for_open_port(8000)
|
||||
|
||||
@@ -6,14 +6,16 @@ with lib;
|
||||
name = "libreddit";
|
||||
meta.maintainers = with maintainers; [ fab ];
|
||||
|
||||
nodes.machine =
|
||||
{ pkgs, ... }:
|
||||
{ services.libreddit.enable = true; };
|
||||
nodes.machine = {
|
||||
services.libreddit.enable = true;
|
||||
# Test CAP_NET_BIND_SERVICE
|
||||
services.libreddit.port = 80;
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("libreddit.service")
|
||||
machine.wait_for_open_port("8080")
|
||||
# The service wants to get data from https://www.reddit.com
|
||||
machine.succeed("curl http://localhost:8080/")
|
||||
machine.wait_for_open_port("80")
|
||||
# Query a page that does not require Internet access
|
||||
machine.succeed("curl --fail http://localhost:80/settings")
|
||||
'';
|
||||
})
|
||||
|
||||
@@ -29,11 +29,11 @@ import ./make-test-python.nix ({ pkgs, latestKernel ? false, ... }:
|
||||
machine.wait_until_succeeds("pgrep -f 'agetty.*tty2'")
|
||||
|
||||
with subtest("Log in as alice on a virtual console"):
|
||||
machine.wait_until_tty_matches(2, "login: ")
|
||||
machine.wait_until_tty_matches("2", "login: ")
|
||||
machine.send_chars("alice\n")
|
||||
machine.wait_until_tty_matches(2, "login: alice")
|
||||
machine.wait_until_tty_matches("2", "login: alice")
|
||||
machine.wait_until_succeeds("pgrep login")
|
||||
machine.wait_until_tty_matches(2, "Password: ")
|
||||
machine.wait_until_tty_matches("2", "Password: ")
|
||||
machine.send_chars("foobar\n")
|
||||
machine.wait_until_succeeds("pgrep -u alice bash")
|
||||
machine.send_chars("touch done\n")
|
||||
|
||||
@@ -43,7 +43,9 @@ import ../make-test-python.nix (
|
||||
tls_certificate_path = "${cert}";
|
||||
tls_private_key_path = "${key}";
|
||||
enable_registration = true;
|
||||
enable_registration_without_verification = true;
|
||||
registration_shared_secret = "supersecret-registration";
|
||||
enable_registration_without_verification = true;
|
||||
|
||||
listeners = [ {
|
||||
# The default but tls=false
|
||||
|
||||
@@ -5,9 +5,10 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
|
||||
apiUrl = "http://${listenAddress}:${toString listenPort}";
|
||||
uid = "movies";
|
||||
indexJSON = pkgs.writeText "index.json" (builtins.toJSON { inherit uid; });
|
||||
moviesJSON = pkgs.runCommand "movies.json" {} ''
|
||||
sed -n '1,5p;$p' ${pkgs.meilisearch.src}/datasets/movies/movies.json > $out
|
||||
'';
|
||||
moviesJSON = pkgs.fetchurl {
|
||||
url = "https://github.com/meilisearch/meilisearch/raw/v0.23.1/datasets/movies/movies.json";
|
||||
sha256 = "1r3srld63dpmg9yrmysm6xl175661j5cspi93mk5q2wf8xwn50c5";
|
||||
};
|
||||
in {
|
||||
name = "meilisearch";
|
||||
meta.maintainers = with lib.maintainers; [ Br1ght0ne ];
|
||||
@@ -34,7 +35,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
|
||||
|
||||
with subtest("create index"):
|
||||
machine.succeed(
|
||||
"curl -XPOST ${apiUrl}/indexes --data @${indexJSON}"
|
||||
"curl -XPOST --header 'Content-Type: application/json' ${apiUrl}/indexes --data @${indexJSON}"
|
||||
)
|
||||
indexes = json.loads(machine.succeed("curl ${apiUrl}/indexes"))
|
||||
assert len(indexes) == 1, "index wasn't created"
|
||||
@@ -42,7 +43,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
|
||||
with subtest("add documents"):
|
||||
response = json.loads(
|
||||
machine.succeed(
|
||||
"curl -XPOST ${apiUrl}/indexes/${uid}/documents --data @${moviesJSON}"
|
||||
"curl -XPOST --header 'Content-Type: application/json' ${apiUrl}/indexes/${uid}/documents --data @${moviesJSON}"
|
||||
)
|
||||
)
|
||||
update_id = response["updateId"]
|
||||
|
||||
@@ -77,12 +77,14 @@ let
|
||||
testCases = {
|
||||
loopback = {
|
||||
name = "Loopback";
|
||||
machine.networking.useDHCP = false;
|
||||
machine.networking.useNetworkd = networkd;
|
||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
||||
networking.useDHCP = false;
|
||||
networking.useNetworkd = networkd;
|
||||
};
|
||||
testScript = ''
|
||||
start_all()
|
||||
machine.wait_for_unit("network.target")
|
||||
loopback_addresses = machine.succeed("ip addr show lo")
|
||||
client.wait_for_unit("network.target")
|
||||
loopback_addresses = client.succeed("ip addr show lo")
|
||||
assert "inet 127.0.0.1/8" in loopback_addresses
|
||||
assert "inet6 ::1/128" in loopback_addresses
|
||||
'';
|
||||
@@ -139,6 +141,25 @@ let
|
||||
client.wait_until_succeeds("ping -c 1 192.168.3.1")
|
||||
'';
|
||||
};
|
||||
routeType = {
|
||||
name = "RouteType";
|
||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
useNetworkd = networkd;
|
||||
interfaces.eth1.ipv4.routes = [{
|
||||
address = "192.168.1.127";
|
||||
prefixLength = 32;
|
||||
type = "local";
|
||||
}];
|
||||
};
|
||||
};
|
||||
testScript = ''
|
||||
start_all()
|
||||
client.wait_for_unit("network.target")
|
||||
client.succeed("ip -4 route list table local | grep 'local 192.168.1.127'")
|
||||
'';
|
||||
};
|
||||
dhcpDefault = {
|
||||
name = "useDHCP-by-default";
|
||||
nodes.router = router;
|
||||
|
||||
@@ -12,7 +12,7 @@ import ./make-test-python.nix ({ pkgs, ... }:
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("nitter.service")
|
||||
machine.wait_for_open_port("80")
|
||||
machine.wait_for_open_port(80)
|
||||
machine.succeed("curl --fail http://localhost:80/")
|
||||
'';
|
||||
})
|
||||
|
||||
+20
-11
@@ -75,21 +75,30 @@ in {
|
||||
# The test cannot access the network, so any packages
|
||||
# nixos-rebuild needs must be included in the VM.
|
||||
system.extraDependencies = with pkgs;
|
||||
[ sudo
|
||||
libxml2.bin
|
||||
libxslt.bin
|
||||
[
|
||||
brotli
|
||||
brotli.dev
|
||||
brotli.lib
|
||||
desktop-file-utils
|
||||
docbook5
|
||||
docbook_xsl_ns
|
||||
unionfs-fuse
|
||||
ntp
|
||||
nixos-artwork.wallpapers.simple-dark-gray-bottom
|
||||
perlPackages.XMLLibXML
|
||||
perlPackages.ListCompare
|
||||
shared-mime-info
|
||||
texinfo
|
||||
xorg.lndir
|
||||
grub2
|
||||
kmod.dev
|
||||
libarchive
|
||||
libarchive.dev
|
||||
libxml2.bin
|
||||
libxslt.bin
|
||||
nixos-artwork.wallpapers.simple-dark-gray-bottom
|
||||
ntp
|
||||
perlPackages.ListCompare
|
||||
perlPackages.XMLLibXML
|
||||
python3Minimal
|
||||
shared-mime-info
|
||||
stdenv
|
||||
sudo
|
||||
texinfo
|
||||
unionfs-fuse
|
||||
xorg.lndir
|
||||
|
||||
# add curl so that rather than seeing the test attempt to download
|
||||
# curl's tarball, we see what it's trying to download
|
||||
|
||||
@@ -77,28 +77,28 @@ in
|
||||
machine.screenshot("postboot")
|
||||
|
||||
with subtest("Invalid password"):
|
||||
switch_to_tty(2)
|
||||
enter_user_alice(2)
|
||||
switch_to_tty("2")
|
||||
enter_user_alice("2")
|
||||
|
||||
machine.send_chars("${oathSnakeOilPassword1}\n")
|
||||
machine.wait_until_tty_matches(2, "Password: ")
|
||||
machine.wait_until_tty_matches("2", "Password: ")
|
||||
machine.send_chars("blorg\n")
|
||||
machine.wait_until_tty_matches(2, "Login incorrect")
|
||||
machine.wait_until_tty_matches("2", "Login incorrect")
|
||||
|
||||
with subtest("Invalid oath token"):
|
||||
switch_to_tty(3)
|
||||
enter_user_alice(3)
|
||||
switch_to_tty("3")
|
||||
enter_user_alice("3")
|
||||
|
||||
machine.send_chars("000000\n")
|
||||
machine.wait_until_tty_matches(3, "Login incorrect")
|
||||
machine.wait_until_tty_matches(3, "login:")
|
||||
machine.wait_until_tty_matches("3", "Login incorrect")
|
||||
machine.wait_until_tty_matches("3", "login:")
|
||||
|
||||
with subtest("Happy path: Both passwords are mandatory to get us in"):
|
||||
switch_to_tty(4)
|
||||
enter_user_alice(4)
|
||||
switch_to_tty("4")
|
||||
enter_user_alice("4")
|
||||
|
||||
machine.send_chars("${oathSnakeOilPassword2}\n")
|
||||
machine.wait_until_tty_matches(4, "Password: ")
|
||||
machine.wait_until_tty_matches("4", "Password: ")
|
||||
machine.send_chars("${alicePassword}\n")
|
||||
|
||||
machine.wait_until_succeeds("pgrep -u alice bash")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user