mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-10-03 21:40:12 +00:00
Merge remote-tracking branch 'origin/master' into r-updates
This commit is contained in:
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
@@ -75,8 +75,8 @@
|
||||
# @raitobezarius is not "code owner", but is listed here to be notified of changes
|
||||
# pertaining to the Nix package manager.
|
||||
# i.e. no authority over those files.
|
||||
pkgs/tools/package-management/nix/ @raitobezarius
|
||||
nixos/modules/installer/tools/nix-fallback-paths.nix @raitobezarius
|
||||
pkgs/tools/package-management/nix/ @NixOS/nix-team @raitobezarius
|
||||
nixos/modules/installer/tools/nix-fallback-paths.nix @NixOS/nix-team @raitobezarius
|
||||
|
||||
# Nixpkgs documentation
|
||||
/maintainers/scripts/db-to-md.sh @jtojnar @ryantm
|
||||
|
||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -21,7 +21,7 @@ For new packages please briefly describe the package or provide a link to its ho
|
||||
- [NixOS test(s)](https://nixos.org/manual/nixos/unstable/index.html#sec-nixos-tests) (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests))
|
||||
- and/or [package tests](https://github.com/NixOS/nixpkgs/blob/master/pkgs/README.md#package-tests)
|
||||
- or, for functions and "core" functionality, tests in [lib/tests](https://github.com/NixOS/nixpkgs/blob/master/lib/tests) or [pkgs/test](https://github.com/NixOS/nixpkgs/blob/master/pkgs/test)
|
||||
- made sure NixOS tests are [linked](https://nixos.org/manual/nixpkgs/unstable/#ssec-nixos-tests-linking) to the relevant packages
|
||||
- made sure NixOS tests are [linked](https://github.com/NixOS/nixpkgs/blob/master/pkgs/README.md#linking-nixos-module-tests-to-a-package) 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/`)
|
||||
- [24.11 Release Notes](https://github.com/NixOS/nixpkgs/blob/master/nixos/doc/manual/release-notes/rl-2411.section.md) (or backporting [23.11](https://github.com/NixOS/nixpkgs/blob/master/nixos/doc/manual/release-notes/rl-2311.section.md) and [24.05](https://github.com/NixOS/nixpkgs/blob/master/nixos/doc/manual/release-notes/rl-2405.section.md) Release notes)
|
||||
|
||||
2
.github/workflows/check-nix-format.yml
vendored
2
.github/workflows/check-nix-format.yml
vendored
@@ -83,7 +83,7 @@ jobs:
|
||||
|
||||
if (( "${#unformattedFiles[@]}" > 0 )); then
|
||||
echo "Some new/changed Nix files are not properly formatted"
|
||||
echo "Please run the following in \`nix-shell\`:"
|
||||
echo "Please go to the Nixpkgs root directory, run \`nix-shell\`, then:"
|
||||
echo "nixfmt ${unformattedFiles[*]@Q}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
1
.mailmap
1
.mailmap
@@ -3,6 +3,7 @@ Anderson Torres <torres.anderson.85@protonmail.com>
|
||||
Atemu <git@atemu.net> <atemu.main@gmail.com>
|
||||
Daniel Løvbrøtte Olsen <me@dandellion.xyz> <daniel.olsen99@gmail.com>
|
||||
Fabian Affolter <mail@fabian-affolter.ch> <fabian@affolter-engineering.ch>
|
||||
goatastronaut0212 <goatastronaut0212@proton.me> <goatastronaut0212@outlook.com>
|
||||
Janne Heß <janne@hess.ooo> <dasJ@users.noreply.github.com>
|
||||
Jörg Thalheim <joerg@thalheim.io> <Mic92@users.noreply.github.com>
|
||||
Martin Weinelt <hexa@darmstadt.ccc.de> <mweinelt@users.noreply.github.com>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"rev": "521d48afa9ae596930a95325529df27fa7135ff5",
|
||||
"sha256": "0a1pa5azw990narsfipdli1wng4nc3vhvrp00hb8v1qfchcq7dc9"
|
||||
"rev": "4de4818c1ffa76d57787af936e8a23648bda6be4",
|
||||
"sha256": "0l3b9jr5ydzqgvd10j12imc9jqb6jv5v2bdi1gyy5cwkwplfay67"
|
||||
}
|
||||
|
||||
@@ -3,32 +3,122 @@
|
||||
Nixpkgs provides a variety of wrapper functions that help build commonly useful derivations.
|
||||
Like [`stdenv.mkDerivation`](#sec-using-stdenv), each of these build helpers creates a derivation, but the arguments passed are different (usually simpler) from those required by `stdenv.mkDerivation`.
|
||||
|
||||
## `runCommand` {#trivial-builder-runCommand}
|
||||
|
||||
`runCommand :: String -> AttrSet -> String -> Derivation`
|
||||
## `runCommandWith` {#trivial-builder-runCommandWith}
|
||||
|
||||
The result of `runCommand name drvAttrs buildCommand` is a derivation that is built by running the specified shell commands.
|
||||
The function `runCommandWith` returns a derivation built using the specified command(s), in a specified environment.
|
||||
|
||||
By default `runCommand` runs in a stdenv with no compiler environment, whereas [`runCommandCC`](#trivial-builder-runCommandCC) uses the default stdenv, `pkgs.stdenv`.
|
||||
It is the underlying base function of all [`runCommand*` variants].
|
||||
The general behavior is controlled via a single attribute set passed
|
||||
as the first argument, and allows specifying `stdenv` freely.
|
||||
|
||||
`name :: String`
|
||||
: The name that Nix will append to the store path in the same way that `stdenv.mkDerivation` uses its `name` attribute.
|
||||
The following [`runCommand*` variants] exist: `runCommand`, `runCommandCC`, and `runCommandLocal`.
|
||||
|
||||
`drvAttr :: AttrSet`
|
||||
: Attributes to pass to the underlying call to [`stdenv.mkDerivation`](#chap-stdenv).
|
||||
[`runCommand*` variants]: #trivial-builder-runCommand
|
||||
|
||||
`buildCommand :: String`
|
||||
### Type {#trivial-builder-runCommandWith-Type}
|
||||
|
||||
```
|
||||
runCommandWith :: {
|
||||
name :: name;
|
||||
stdenv? :: Derivation;
|
||||
runLocal? :: Bool;
|
||||
derivationArgs? :: { ... };
|
||||
} -> String -> Derivation
|
||||
```
|
||||
|
||||
### Inputs {#trivial-builder-runCommandWith-Inputs}
|
||||
|
||||
`name` (String)
|
||||
: The derivation's name, which Nix will append to the store path; see [`mkDerivation`](#sec-using-stdenv).
|
||||
|
||||
`runLocal` (Boolean)
|
||||
: If set to `true` this forces the derivation to be built locally, not using [substitutes] nor remote builds.
|
||||
This is intended for very cheap commands (<1s execution time) which can be sped up by avoiding the network round-trip(s).
|
||||
Its effect is to set [`preferLocalBuild = true`][preferLocalBuild] and [`allowSubstitutes = false`][allowSubstitutes].
|
||||
|
||||
::: {.note}
|
||||
This prevents the use of [substituters][substituter], so only set `runLocal` (or use `runCommandLocal`) when certain the user will
|
||||
always have a builder for the `system` of the derivation. This should be true for most trivial use cases
|
||||
(e.g., just copying some files to a different location or adding symlinks) because there the `system`
|
||||
is usually the same as `builtins.currentSystem`.
|
||||
:::
|
||||
|
||||
`stdenv` (Derivation)
|
||||
: The [standard environment](#chap-stdenv) to use, defaulting to `pkgs.stdenv`
|
||||
|
||||
`derivationArgs` (Attribute set)
|
||||
: Additional arguments for [`mkDerivation`](#sec-using-stdenv).
|
||||
|
||||
`buildCommand` (String)
|
||||
: Shell commands to run in the derivation builder.
|
||||
|
||||
::: {.note}
|
||||
You have to create a file or directory `$out` for Nix to be able to run the builder successfully.
|
||||
:::
|
||||
|
||||
[allowSubstitutes]: https://nixos.org/nix/manual/#adv-attr-allowSubstitutes
|
||||
[preferLocalBuild]: https://nixos.org/nix/manual/#adv-attr-preferLocalBuild
|
||||
[substituter]: https://nix.dev/manual/nix/latest/glossary#gloss-substituter
|
||||
[substitutes]: https://nix.dev/manual/nix/2.23/glossary#gloss-substitute
|
||||
|
||||
::: {.example #ex-runcommandwith}
|
||||
# Invocation of `runCommandWith`
|
||||
|
||||
```nix
|
||||
runCommandWith {
|
||||
name = "example";
|
||||
derivationArgs.nativeBuildInputs = [ cowsay ];
|
||||
} ''
|
||||
cowsay > $out <<EOMOO
|
||||
'runCommandWith' is a bit cumbersome,
|
||||
so we have more ergonomic wrappers.
|
||||
EOMOO
|
||||
''
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
|
||||
## `runCommand` and `runCommandCC` {#trivial-builder-runCommand}
|
||||
|
||||
The function `runCommand` returns a derivation built using the specified command(s), in the `stdenvNoCC` environment.
|
||||
|
||||
`runCommandCC` is similar but uses the default compiler environment. To minimize dependencies, `runCommandCC`
|
||||
should only be used when the build command needs a C compiler.
|
||||
|
||||
`runCommandLocal` is also similar to `runCommand`, but forces the derivation to be built locally.
|
||||
See the note on [`runCommandWith`] about `runLocal`.
|
||||
|
||||
[`runCommandWith`]: #trivial-builder-runCommandWith
|
||||
|
||||
### Type {#trivial-builder-runCommand-Type}
|
||||
|
||||
```
|
||||
runCommand :: String -> AttrSet -> String -> Derivation
|
||||
runCommandCC :: String -> AttrSet -> String -> Derivation
|
||||
runCommandLocal :: String -> AttrSet -> String -> Derivation
|
||||
```
|
||||
|
||||
### Input {#trivial-builder-runCommand-Input}
|
||||
|
||||
While the type signature(s) differ from [`runCommandWith`], individual arguments with the same name will have the same type and meaning:
|
||||
|
||||
`name` (String)
|
||||
: The derivation's name
|
||||
|
||||
`derivationArgs` (Attribute set)
|
||||
: Additional parameters passed to [`mkDerivation`]
|
||||
|
||||
`buildCommand` (String)
|
||||
: The command(s) run to build the derivation.
|
||||
|
||||
|
||||
::: {.example #ex-runcommand-simple}
|
||||
# Invocation of `runCommand`
|
||||
|
||||
```nix
|
||||
(import <nixpkgs> {}).runCommand "my-example" {} ''
|
||||
runCommand "my-example" {} ''
|
||||
echo My example command is running
|
||||
|
||||
mkdir $out
|
||||
@@ -49,18 +139,24 @@ By default `runCommand` runs in a stdenv with no compiler environment, whereas [
|
||||
```
|
||||
:::
|
||||
|
||||
## `runCommandCC` {#trivial-builder-runCommandCC}
|
||||
|
||||
This works just like `runCommand`. The only difference is that it also provides a C compiler in `buildCommand`'s environment. To minimize your dependencies, you should only use this if you are sure you will need a C compiler as part of running your command.
|
||||
|
||||
## `runCommandLocal` {#trivial-builder-runCommandLocal}
|
||||
|
||||
Variant of `runCommand` that forces the derivation to be built locally, it is not substituted. This is intended for very cheap commands (<1s execution time). It saves on the network round-trip and can speed up a build.
|
||||
|
||||
::: {.note}
|
||||
This sets [`allowSubstitutes` to `false`](https://nixos.org/nix/manual/#adv-attr-allowSubstitutes), so only use `runCommandLocal` if you are certain the user will always have a builder for the `system` of the derivation. This should be true for most trivial use cases (e.g., just copying some files to a different location or adding symlinks) because there the `system` is usually the same as `builtins.currentSystem`.
|
||||
`runCommand name derivationArgs buildCommand` is equivalent to
|
||||
```nix
|
||||
runCommandWith {
|
||||
inherit name derivationArgs;
|
||||
stdenv = stdenvNoCC;
|
||||
} buildCommand
|
||||
```
|
||||
|
||||
Likewise, `runCommandCC name derivationArgs buildCommand` is equivalent to
|
||||
```nix
|
||||
runCommandWith {
|
||||
inherit name derivationArgs;
|
||||
} buildCommand
|
||||
```
|
||||
:::
|
||||
|
||||
|
||||
## Writing text files {#trivial-builder-text-writing}
|
||||
|
||||
Nixpkgs provides the following functions for producing derivations which write text files or executable scripts into the Nix store.
|
||||
|
||||
@@ -232,6 +232,14 @@ To add a new plugin, run `nix-shell -p vimPluginsUpdater --run 'vim-plugins-upda
|
||||
|
||||
Finally, there are some plugins that are also packaged in nodePackages because they have Javascript-related build steps, such as running webpack. Those plugins are not listed in `vim-plugin-names` or managed by `vimPluginsUpdater` at all, and are included separately in `overrides.nix`. Currently, all these plugins are related to the `coc.nvim` ecosystem of the Language Server Protocol integration with Vim/Neovim.
|
||||
|
||||
### Plugin optional configuration {#vim-plugin-required-snippet}
|
||||
|
||||
Some plugins require specific configuration to work. We choose not to
|
||||
patch those plugins but expose the necessary configuration under
|
||||
`PLUGIN.passthru.initLua` for neovim plugins. For instance, the `unicode-vim` plugin
|
||||
needs the path towards a unicode database so we expose the following snippet `vim.g.Unicode_data_directory="${self.unicode-vim}/autoload/unicode"` under `vimPlugins.unicode-vim.passthru.initLua`.
|
||||
|
||||
|
||||
## Updating plugins in nixpkgs {#updating-plugins-in-nixpkgs}
|
||||
|
||||
Run the update script with a GitHub API token that has at least `public_repo` access. Running the script without the token is likely to result in rate-limiting (429 errors). For steps on creating an API token, please refer to [GitHub's token documentation](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token).
|
||||
|
||||
102
doc/packages/build-support.md
Normal file
102
doc/packages/build-support.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# Build Support {#sec-build-support}
|
||||
|
||||
## `pkgs.substitute` {#pkgs-substitute}
|
||||
|
||||
`pkgs.substitute` is a wrapper around [the `substitute` Bash function](#fun-substitute) in the standard environment.
|
||||
It replaces strings in `src` as specified by the `substitutions` argument.
|
||||
|
||||
|
||||
:::{.example #ex-pkgs-substitute}
|
||||
# Usage of `pkgs.substitute`
|
||||
|
||||
In a build script, the line:
|
||||
|
||||
```bash
|
||||
substitute $infile $outfile --replace-fail @foo@ ${foopkg}/bin/foo
|
||||
```
|
||||
|
||||
is equivalent to:
|
||||
|
||||
```nix
|
||||
{ substitute, foopkg }:
|
||||
substitute {
|
||||
src = ./sourcefile.txt;
|
||||
substitutions = [
|
||||
"--replace"
|
||||
"@foo@"
|
||||
"${foopkg}/bin/foo"
|
||||
];
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## `pkgs.substituteAll` {#pkgs-substituteall}
|
||||
|
||||
`pkgs.substituteAll` substitutes all instances of `@varName@` (`@`s included) in file `src` with the value of the corresponding environment variable.
|
||||
As this uses the [`substituteAll`] (#fun-substitute) function, its limitations regarding variable names that will or will not be replaced also apply here.
|
||||
|
||||
:::{.example #ex-pkgs-substituteAll}
|
||||
# Usage of `pkgs.substituteAll`
|
||||
|
||||
If `say-goodbye.sh` contains the following:
|
||||
|
||||
```bash
|
||||
#! @bash@/bin/bash
|
||||
|
||||
echo @unchanged@
|
||||
@hello@/bin/hello --greeting @greeting@
|
||||
```
|
||||
|
||||
the following derivation will make substitutions to `@bash@`, `@hello@`, and `@greeting@`:
|
||||
|
||||
```nix
|
||||
{
|
||||
substituteAll,
|
||||
bash,
|
||||
hello,
|
||||
}:
|
||||
substituteAll {
|
||||
src = ./say-goodbye.sh;
|
||||
env = {
|
||||
inherit bash hello;
|
||||
greeting = "goodbye";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
such that `$out` will result in something like the following:
|
||||
|
||||
```
|
||||
#! /nix/store/s30jrpgav677fpc9yvkqsib70xfmx7xi-bash-5.2p26/bin/bash
|
||||
|
||||
echo @unchanged@
|
||||
/nix/store/566f5isbvw014h7knmzmxa5l6hshx43k-hello-2.12.1/bin/hello --greeting goodbye
|
||||
```
|
||||
:::
|
||||
|
||||
## `pkgs.substituteAllFiles` {#pkgs-substituteallfiles}
|
||||
|
||||
`pkgs.substituteAllFiles` replaces `@varName@` with the value of the environment variable `varName`.
|
||||
It expects `src` to be a directory and requires a `files` argument that specifies which files will be subject to replacements; only these files will be placed in `$out`.
|
||||
|
||||
As it also uses the `substituteAll` function, it is subject to the same limitations on environment variables as discussed in [pkgs.substituteAll](#pkgs-substituteall).
|
||||
|
||||
:::{.example #ex-pkgs-substitute-all-files}
|
||||
# Usage of `pkgs.substituteAllFiles`
|
||||
|
||||
If the current directory contains `{foo,bar,baz}.txt` and the following `default.nix`
|
||||
|
||||
```nix
|
||||
{ substituteAllFiles }:
|
||||
substituteAllFiles {
|
||||
src = ./.;
|
||||
files = [
|
||||
"foo.txt"
|
||||
"bar.txt"
|
||||
];
|
||||
hello = "there";
|
||||
}
|
||||
```
|
||||
|
||||
in the resulting derivation, every instance of `@hello@` will be replaced with `there` in `$out/foo.txt` and` `$out/bar.txt`; `baz.txt` will not be processed nor will it appear in `$out`.
|
||||
:::
|
||||
@@ -27,4 +27,5 @@ urxvt.section.md
|
||||
vcpkg.section.md
|
||||
weechat.section.md
|
||||
xorg.section.md
|
||||
build-support.md
|
||||
```
|
||||
|
||||
@@ -219,7 +219,7 @@ rec {
|
||||
else "(${t.description})";
|
||||
|
||||
# When adding new types don't forget to document them in
|
||||
# nixos/doc/manual/development/option-types.xml!
|
||||
# nixos/doc/manual/development/option-types.section.md!
|
||||
types = rec {
|
||||
|
||||
raw = mkOptionType {
|
||||
|
||||
@@ -212,6 +212,12 @@
|
||||
githubId = 882455;
|
||||
name = "Elliot Cameron";
|
||||
};
|
||||
_404wolf = {
|
||||
email = "wolfmermelstein@gmail.com";
|
||||
github = "404wolf";
|
||||
githubId = 108041238;
|
||||
name = "Wolf Mermelstein";
|
||||
};
|
||||
_414owen = {
|
||||
email = "owen@owen.cafe";
|
||||
github = "414owen";
|
||||
@@ -828,6 +834,12 @@
|
||||
githubId = 20405311;
|
||||
name = "Aksh Gupta";
|
||||
};
|
||||
aksiksi = {
|
||||
email = "assil@ksiksi.net";
|
||||
github = "aksiksi";
|
||||
githubId = 916621;
|
||||
name = "Assil Ksiksi";
|
||||
};
|
||||
akssri = {
|
||||
email = "akssri@vakra.xyz";
|
||||
github = "akssri";
|
||||
@@ -963,6 +975,12 @@
|
||||
matrix = "@alexshpilkin:matrix.org";
|
||||
name = "Alexander Shpilkin";
|
||||
};
|
||||
AlexSKaye = {
|
||||
email = "AlexSKaye@proton.me";
|
||||
github = "AlexSKaye";
|
||||
githubId = 3017212;
|
||||
name = "Alex S. Kaye";
|
||||
};
|
||||
alexvorobiev = {
|
||||
email = "alexander.vorobiev@gmail.com";
|
||||
github = "alexvorobiev";
|
||||
@@ -1887,7 +1905,7 @@
|
||||
keys = [ { fingerprint = "BF47 81E1 F304 1ADF 18CE C401 DE16 C7D1 536D A72F"; } ];
|
||||
};
|
||||
astronaut0212 = {
|
||||
email = "goatastronaut0212@proton.me";
|
||||
email = "goatastronaut0212@outlook.com";
|
||||
github = "goatastronaut0212";
|
||||
githubId = 119769817;
|
||||
name = "goatastronaut0212";
|
||||
@@ -2702,6 +2720,14 @@
|
||||
githubId = 5700358;
|
||||
name = "Thomas Blank";
|
||||
};
|
||||
bleetube = {
|
||||
email = "git@blee.tube";
|
||||
matrix = "@blee:satstack.cloud";
|
||||
name = "Brian Lee";
|
||||
github = "bleetube";
|
||||
githubId = 77934086;
|
||||
keys = [ { fingerprint = "4CA3 48F6 8FE1 1777 8EDA 3860 B9A2 C1B0 25EC 2C55"; } ];
|
||||
};
|
||||
blinry = {
|
||||
name = "blinry";
|
||||
email = "mail@blinry.org";
|
||||
@@ -3423,6 +3449,12 @@
|
||||
githubId = 977929;
|
||||
name = "Cody Allen";
|
||||
};
|
||||
Celibistrial = {
|
||||
email = "ryan80222@gmail.com";
|
||||
github = "Celibistrial";
|
||||
githubId = 82810795;
|
||||
name = "Gaurav Choudhury";
|
||||
};
|
||||
centromere = {
|
||||
email = "nix@centromere.net";
|
||||
github = "centromere";
|
||||
@@ -5634,7 +5666,7 @@
|
||||
matrix = "@e1mo:chaos.jetzt";
|
||||
github = "e1mo";
|
||||
githubId = 61651268;
|
||||
name = "Moritz Fromm";
|
||||
name = "Nina Fromm";
|
||||
keys = [ { fingerprint = "67BE E563 43B6 420D 550E DF2A 6D61 7FD0 A85B AADA"; } ];
|
||||
};
|
||||
eadwu = {
|
||||
@@ -7671,6 +7703,12 @@
|
||||
githubId = 1621335;
|
||||
name = "Andrew Trachenko";
|
||||
};
|
||||
gordon-bp = {
|
||||
email = "gordy@hanakano.com";
|
||||
github = "Gordon-BP";
|
||||
githubId = 77560236;
|
||||
name = "Gordon Clark";
|
||||
};
|
||||
gotcha = {
|
||||
email = "gotcha@bubblenet.be";
|
||||
github = "gotcha";
|
||||
@@ -8559,6 +8597,11 @@
|
||||
name = "Iago Manoel Brito";
|
||||
keys = [ { fingerprint = "DF90 9D58 BEE4 E73A 1B8C 5AF3 35D3 9F9A 9A1B C8DA"; } ];
|
||||
};
|
||||
i-al-istannen = {
|
||||
name = "I Al Istannen";
|
||||
github = "I-Al-Istannen";
|
||||
githubId = 20284688;
|
||||
};
|
||||
iammrinal0 = {
|
||||
email = "nixpkgs@mrinalpurohit.in";
|
||||
matrix = "@iammrinal0:nixos.dev";
|
||||
@@ -8687,6 +8730,12 @@
|
||||
githubId = 7481521;
|
||||
name = "Balázs Lengyel";
|
||||
};
|
||||
ilaumjd = {
|
||||
email = "ilaumjd@gmail.com";
|
||||
github = "ilaumjd";
|
||||
githubId = 16514431;
|
||||
name = "Ilham AM";
|
||||
};
|
||||
ilian = {
|
||||
email = "ilian@tuta.io";
|
||||
github = "ilian";
|
||||
@@ -10097,6 +10146,12 @@
|
||||
githubId = 15893072;
|
||||
name = "Josh van Leeuwen";
|
||||
};
|
||||
jovandeginste = {
|
||||
email = "jo.vandeginste@gmail.com";
|
||||
github = "jovandeginste";
|
||||
githubId = 3170771;
|
||||
name = "Jo Vandeginste";
|
||||
};
|
||||
jpagex = {
|
||||
name = "Jérémy Pagé";
|
||||
email = "contact@jeremypage.me";
|
||||
@@ -14429,6 +14484,12 @@
|
||||
githubId = 2287221;
|
||||
name = "Andreas Zweili";
|
||||
};
|
||||
nebunebu = {
|
||||
email = "neb.nebuchadnezzar@gmail.com";
|
||||
github = "nebunebu";
|
||||
githubId = 87451010;
|
||||
name = "nebu";
|
||||
};
|
||||
Necior = {
|
||||
email = "adrian@sadlocha.eu";
|
||||
github = "Necior";
|
||||
@@ -15157,6 +15218,12 @@
|
||||
githubId = 61095988;
|
||||
name = "Brian Shu";
|
||||
};
|
||||
oberth-effect = {
|
||||
email = "stepan.venclik@gmail.com";
|
||||
github = "oberth-effect";
|
||||
githubId = 88210794;
|
||||
name = "Štěpán Venclík";
|
||||
};
|
||||
obfusk = {
|
||||
email = "flx@obfusk.net";
|
||||
matrix = "@obfusk:matrix.org";
|
||||
@@ -15210,6 +15277,12 @@
|
||||
githubId = 7397786;
|
||||
name = "Odysseas Georgoudis";
|
||||
};
|
||||
ofalvai = {
|
||||
email = "ofalvai@gmail.com";
|
||||
github = "ofalvai";
|
||||
githubId = 1694986;
|
||||
name = "Olivér Falvai";
|
||||
};
|
||||
ofek = {
|
||||
email = "oss@ofek.dev";
|
||||
github = "ofek";
|
||||
@@ -15463,6 +15536,12 @@
|
||||
github = "OlivierNicole";
|
||||
githubId = 14031333;
|
||||
};
|
||||
ottoblep = {
|
||||
name = "Severin Lochschmidt";
|
||||
email = "seviron53@gmail.com";
|
||||
github = "ottoblep";
|
||||
githubId = 57066925;
|
||||
};
|
||||
otwieracz = {
|
||||
email = "slawek@otwiera.cz";
|
||||
github = "otwieracz";
|
||||
@@ -17103,11 +17182,11 @@
|
||||
name = "Szymon Scholz";
|
||||
};
|
||||
ratcornu = {
|
||||
email = "ratcornu@skaven.org";
|
||||
email = "ratcornu+programmation@skaven.org";
|
||||
github = "RatCornu";
|
||||
githubId = 98173832;
|
||||
name = "Balthazar Patiachvili";
|
||||
matrix = "@ratcornu:skweel.skaven.org";
|
||||
matrix = "@ratcornu:skaven.org";
|
||||
keys = [ { fingerprint = "1B91 F087 3D06 1319 D3D0 7F91 FA47 BDA2 6048 9ADA"; } ];
|
||||
};
|
||||
ratsclub = {
|
||||
@@ -17182,6 +17261,12 @@
|
||||
githubId = 52847440;
|
||||
name = "Ryan Burns";
|
||||
};
|
||||
rcmlz = {
|
||||
email = "haguga-nixos@yahoo.com";
|
||||
github = "rcmlz";
|
||||
githubId = 19784049;
|
||||
name = "rcmlz";
|
||||
};
|
||||
rcoeurjoly = {
|
||||
email = "rolandcoeurjoly@gmail.com";
|
||||
github = "RCoeurjoly";
|
||||
@@ -18545,6 +18630,12 @@
|
||||
githubId = 17243347;
|
||||
name = "Sebastian Sellmeier";
|
||||
};
|
||||
sedlund = {
|
||||
email = "scott+nixpkgs@teraton.com";
|
||||
github = "sedlund";
|
||||
githubId = 8109138;
|
||||
name = "Scott Edlund";
|
||||
};
|
||||
sefidel = {
|
||||
name = "sefidel";
|
||||
email = "contact@sefidel.net";
|
||||
|
||||
@@ -73,6 +73,9 @@ OK_MISSING_BY_PACKAGE = {
|
||||
"kwin": {
|
||||
"display-info", # newer versions identify as libdisplay-info
|
||||
},
|
||||
"libksysguard": {
|
||||
"Libcap", # used to call setcap at build time and nothing else
|
||||
},
|
||||
"mlt": {
|
||||
"Qt5", # intentionally disabled
|
||||
"SWIG",
|
||||
@@ -88,6 +91,9 @@ OK_MISSING_BY_PACKAGE = {
|
||||
"powerdevil": {
|
||||
"DDCUtil", # cursed, intentionally disabled
|
||||
},
|
||||
"print-manager": {
|
||||
"PackageKitQt6", # used for auto-installing drivers which does not work for obvious reasons
|
||||
},
|
||||
"pulseaudio-qt": {
|
||||
"Qt6Qml", # tests only
|
||||
"Qt6Quick",
|
||||
|
||||
@@ -104,6 +104,7 @@ luv,,,,1.48.0-2,,
|
||||
lush.nvim,,,https://luarocks.org/dev,,,teto
|
||||
lyaml,,,,,,lblasc
|
||||
lz.n,,,,,,mrcjkb
|
||||
lzn-auto-require,,,,,,mrcjkb
|
||||
magick,,,,,5.1,donovanglover
|
||||
markdown,,,,,,
|
||||
mediator_lua,,,,,,
|
||||
|
||||
|
@@ -61,6 +61,8 @@
|
||||
|
||||
- [wg-access-server](https://github.com/freifunkMUC/wg-access-server/), an all-in-one WireGuard VPN solution with a web ui for connecting devices. Available at [services.wg-access-server](#opt-services.wg-access-server.enable).
|
||||
|
||||
- [Pingvin Share](https://github.com/stonith404/pingvin-share), a self-hosted file sharing platform and an alternative for WeTransfer. Available as [services.pingvin-share](#opt-services.pingvin-share.enable).
|
||||
|
||||
- [Envision](https://gitlab.com/gabmus/envision), a UI for building, configuring and running Monado, the open source OpenXR runtime. Available as [programs.envision](#opt-programs.envision.enable).
|
||||
|
||||
- [Localsend](https://localsend.org/), an open source cross-platform alternative to AirDrop. Available as [programs.localsend](#opt-programs.localsend.enable).
|
||||
@@ -73,6 +75,8 @@
|
||||
|
||||
- [Playerctld](https://github.com/altdesktop/playerctl), a daemon to track media player activity. Available as [services.playerctld](option.html#opt-services.playerctld).
|
||||
|
||||
- [MenhirLib](https://gitlab.inria.fr/fpottier/menhir/-/tree/master/coq-menhirlib) A support library for verified Coq parsers produced by Menhir.
|
||||
|
||||
- [Glance](https://github.com/glanceapp/glance), a self-hosted dashboard that puts all your feeds in one place. Available as [services.glance](option.html#opt-services.glance).
|
||||
|
||||
- [Apache Tika](https://github.com/apache/tika), a toolkit that detects and extracts metadata and text from over a thousand different file types. Available as [services.tika](option.html#opt-services.tika).
|
||||
@@ -87,6 +91,9 @@
|
||||
|
||||
- [Proton Mail bridge](https://proton.me/mail/bridge), a desktop application that runs in the background, encrypting and decrypting messages as they enter and leave your computer. It lets you add your Proton Mail account to your favorite email client via IMAP/SMTP by creating a local email server on your computer.
|
||||
|
||||
- [chromadb](https://www.trychroma.com/), an open-source AI application
|
||||
database. Batteries included. Available as [services.chromadb](options.html#opt-services.chromadb.enable).
|
||||
|
||||
## Backward Incompatibilities {#sec-release-24.11-incompatibilities}
|
||||
|
||||
- `transmission` package has been aliased with a `trace` warning to `transmission_3`. Since [Transmission 4 has been released last year](https://github.com/transmission/transmission/releases/tag/4.0.0), and Transmission 3 will eventually go away, it was decided perform this warning alias to make people aware of the new version. The `services.transmission.package` defaults to `transmission_3` as well because the upgrade can cause data loss in certain specific usage patterns (examples: [#5153](https://github.com/transmission/transmission/issues/5153), [#6796](https://github.com/transmission/transmission/issues/6796)). Please make sure to back up to your data directory per your usage:
|
||||
@@ -253,6 +260,8 @@
|
||||
|
||||
- `/share/nano` is now only linked when `programs.nano.enable` is enabled.
|
||||
|
||||
- PPD files for Utax printers got renamed (spaces replaced by underscores) in newest `foomatic-db` package; users of Utax printers might need to adapt their `hardware.printers.ensurePrinters.*.model` value.
|
||||
|
||||
- `libe57format` has been updated to `>= 3.0.0`, which contains some backward-incompatible API changes. See the [release note](https://github.com/asmaloney/libE57Format/releases/tag/v3.0.0) for more details.
|
||||
|
||||
- `gitlab` deprecated support for *runner registration tokens* in GitLab 16.0, disabled their support in GitLab 17.0 and will
|
||||
@@ -319,6 +328,12 @@
|
||||
|
||||
- The `services.trust-dns` module has been renamed to `services.hickory-dns`.
|
||||
|
||||
- The `lsh` package and the `services.lshd` module have been removed as they had no maintainer in Nixpkgs and hadn’t seen an upstream release in over a decade. It is recommended to migrate to `openssh` and `services.openssh`.
|
||||
|
||||
- `opencv2` and `opencv3` have been removed, as they are obsolete and
|
||||
were not used by any other package. External users are encouraged to
|
||||
migrate to OpenCV 4.
|
||||
|
||||
## Other Notable Changes {#sec-release-24.11-notable-changes}
|
||||
|
||||
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
||||
@@ -383,9 +398,6 @@
|
||||
- `nix.channel.enable = false` no longer implies `nix.settings.nix-path = []`.
|
||||
Since Nix 2.13, a `nix-path` set in `nix.conf` cannot be overriden by the `NIX_PATH` configuration variable.
|
||||
|
||||
- Buildkite Agents are now each running in their own private `/tmp`.
|
||||
To return to the old behaviour, set `systemd.services.buildkite-agent-${name}.serviceConfig.PrivateTmp = false;`.
|
||||
|
||||
## Detailed migration information {#sec-release-24.11-migration}
|
||||
|
||||
### `sound` options removal {#sec-release-24.11-migration-sound}
|
||||
|
||||
@@ -458,6 +458,7 @@
|
||||
./services/continuous-integration/woodpecker/server.nix
|
||||
./services/databases/aerospike.nix
|
||||
./services/databases/cassandra.nix
|
||||
./services/databases/chromadb.nix
|
||||
./services/databases/clickhouse.nix
|
||||
./services/databases/cockroachdb.nix
|
||||
./services/databases/couchdb.nix
|
||||
@@ -1208,7 +1209,6 @@
|
||||
./services/networking/spacecookie.nix
|
||||
./services/networking/spiped.nix
|
||||
./services/networking/squid.nix
|
||||
./services/networking/ssh/lshd.nix
|
||||
./services/networking/ssh/sshd.nix
|
||||
./services/networking/sslh.nix
|
||||
./services/networking/strongswan-swanctl/module.nix
|
||||
@@ -1467,6 +1467,7 @@
|
||||
./services/web-apps/phylactery.nix
|
||||
./services/web-apps/photoprism.nix
|
||||
./services/web-apps/pict-rs.nix
|
||||
./services/web-apps/pingvin-share.nix
|
||||
./services/web-apps/plantuml-server.nix
|
||||
./services/web-apps/plausible.nix
|
||||
./services/web-apps/powerdns-admin.nix
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# WARNING: If you enable this profile, you will NOT be able to switch to a new
|
||||
# configuration and thus you will not be able to rebuild your system with
|
||||
# nixos-rebuild!
|
||||
|
||||
{ lib, ... }:
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
@@ -31,4 +27,8 @@
|
||||
# string "perl".
|
||||
system.forbiddenDependenciesRegexes = ["perl"];
|
||||
|
||||
# Re-add nixos-rebuild to the systemPackages that was removed by the
|
||||
# `system.disableInstallerTools` option.
|
||||
environment.systemPackages = [pkgs.nixos-rebuild];
|
||||
|
||||
}
|
||||
|
||||
@@ -70,6 +70,7 @@ in
|
||||
(mkRemovedOptionModule [ "services" "hydron" ] "The `services.hydron` module has been removed as the project has been archived upstream since 2022 and is affected by a severe remote code execution vulnerability.")
|
||||
(mkRemovedOptionModule [ "services" "ihatemoney" ] "The ihatemoney module has been removed for lack of downstream maintainer")
|
||||
(mkRemovedOptionModule [ "services" "kippo" ] "The corresponding package was removed from nixpkgs.")
|
||||
(mkRemovedOptionModule [ "services" "lshd" ] "The corresponding package was removed from nixpkgs as it had no maintainer in Nixpkgs and hasn't seen an upstream release in over a decades.")
|
||||
(mkRemovedOptionModule [ "services" "mailpile" ] "The corresponding package was removed from nixpkgs.")
|
||||
(mkRemovedOptionModule [ "services" "marathon" ] "The corresponding package was removed from nixpkgs.")
|
||||
(mkRemovedOptionModule [ "services" "mathics" ] "The Mathics module has been removed")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -205,8 +205,6 @@ in
|
||||
serviceConfig = {
|
||||
ExecStart = "${cfg.package}/bin/buildkite-agent start --config ${cfg.dataDir}/buildkite-agent.cfg";
|
||||
User = "buildkite-agent-${name}";
|
||||
# Workaround https://github.com/buildkite/agent/issues/2916
|
||||
PrivateTmp = lib.mkDefault true;
|
||||
RestartSec = 5;
|
||||
Restart = "on-failure";
|
||||
TimeoutSec = 10;
|
||||
|
||||
107
nixos/modules/services/databases/chromadb.nix
Normal file
107
nixos/modules/services/databases/chromadb.nix
Normal file
@@ -0,0 +1,107 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
cfg = config.services.chromadb;
|
||||
inherit (lib)
|
||||
mkEnableOption
|
||||
mkOption
|
||||
mkIf
|
||||
types
|
||||
literalExpression
|
||||
;
|
||||
in
|
||||
{
|
||||
|
||||
meta.maintainers = with lib.maintainers; [ drupol ];
|
||||
|
||||
options = {
|
||||
services.chromadb = {
|
||||
enable = mkEnableOption "ChromaDB, an open-source AI application database.";
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
example = literalExpression "pkgs.python3Packages.chromadb";
|
||||
default = pkgs.python3Packages.chromadb;
|
||||
defaultText = "pkgs.python3Packages.chromadb";
|
||||
description = "ChromaDB package to use.";
|
||||
};
|
||||
|
||||
host = mkOption {
|
||||
type = types.str;
|
||||
default = "127.0.0.1";
|
||||
description = ''
|
||||
Defines the IP address by which ChromaDB will be accessible.
|
||||
'';
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 8000;
|
||||
description = ''
|
||||
Defined the port number to listen.
|
||||
'';
|
||||
};
|
||||
|
||||
logFile = mkOption {
|
||||
type = types.path;
|
||||
default = "/var/log/chromadb/chromadb.log";
|
||||
description = ''
|
||||
Specifies the location of file for logging output.
|
||||
'';
|
||||
};
|
||||
|
||||
dbpath = mkOption {
|
||||
type = types.str;
|
||||
default = "/var/lib/chromadb";
|
||||
description = "Location where ChromaDB stores its files";
|
||||
};
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to automatically open the specified TCP port in the firewall.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services.chromadb = {
|
||||
description = "ChromaDB";
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
StateDirectory = "chromadb";
|
||||
WorkingDirectory = "/var/lib/chromadb";
|
||||
LogsDirectory = "chromadb";
|
||||
ExecStart = "${lib.getExe cfg.package} run --path ${cfg.dbpath} --host ${cfg.host} --port ${toString cfg.port} --log-path ${cfg.logFile}";
|
||||
Restart = "on-failure";
|
||||
ProtectHome = true;
|
||||
ProtectSystem = "strict";
|
||||
PrivateTmp = true;
|
||||
PrivateDevices = true;
|
||||
ProtectHostname = true;
|
||||
ProtectClock = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectControlGroups = true;
|
||||
NoNewPrivileges = true;
|
||||
RestrictRealtime = true;
|
||||
RestrictSUIDSGID = true;
|
||||
RemoveIPC = true;
|
||||
PrivateMounts = true;
|
||||
DynamicUser = true;
|
||||
};
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = lib.optionals cfg.openFirewall [ cfg.port ];
|
||||
};
|
||||
}
|
||||
@@ -26,6 +26,7 @@ in {
|
||||
lomiri-clock-app
|
||||
lomiri-download-manager
|
||||
lomiri-filemanager-app
|
||||
lomiri-gallery-app
|
||||
lomiri-polkit-agent
|
||||
lomiri-schemas # exposes some required dbus interfaces
|
||||
lomiri-session # wrappers to properly launch the session
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
default = false;
|
||||
type = lib.types.bool;
|
||||
description = ''
|
||||
Enable dynamic CDI configuration for NVidia devices by running
|
||||
Enable dynamic CDI configuration for Nvidia devices by running
|
||||
nvidia-container-toolkit on boot.
|
||||
'';
|
||||
};
|
||||
|
||||
@@ -108,6 +108,16 @@ in {
|
||||
List of Systemd services to require and wait for when starting the application service.
|
||||
'';
|
||||
};
|
||||
|
||||
registerToSynapse = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = config.services.matrix-synapse.enable;
|
||||
defaultText = lib.literalExpression "config.services.matrix-synapse.enable";
|
||||
description = ''
|
||||
Whether to add the bridge's app service registration file to
|
||||
`services.matrix-synapse.settings.app_service_config_files`.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
@@ -121,6 +131,13 @@ in {
|
||||
|
||||
users.groups.mautrix-whatsapp = {};
|
||||
|
||||
services.matrix-synapse = lib.mkIf cfg.registerToSynapse {
|
||||
settings.app_service_config_files = [ registrationFile ];
|
||||
};
|
||||
systemd.services.matrix-synapse = lib.mkIf cfg.registerToSynapse {
|
||||
serviceConfig.SupplementaryGroups = [ "mautrix-whatsapp" ];
|
||||
};
|
||||
|
||||
services.mautrix-whatsapp.settings = lib.mkMerge (map mkDefaults [
|
||||
defaultConfig
|
||||
# Note: this is defined here to avoid the docs depending on `config`
|
||||
@@ -155,10 +172,15 @@ in {
|
||||
chmod 640 ${registrationFile}
|
||||
|
||||
umask 0177
|
||||
# 1. Overwrite registration tokens in config
|
||||
# 2. If environment variable MAUTRIX_WHATSAPP_BRIDGE_LOGIN_SHARED_SECRET
|
||||
# is set, set it as the login shared secret value for the configured
|
||||
# homeserver domain.
|
||||
${pkgs.yq}/bin/yq -s '.[0].appservice.as_token = .[1].as_token
|
||||
| .[0].appservice.hs_token = .[1].hs_token
|
||||
| .[0]' '${settingsFile}' '${registrationFile}' \
|
||||
> '${settingsFile}.tmp'
|
||||
| .[0]
|
||||
| if env.MAUTRIX_WHATSAPP_BRIDGE_LOGIN_SHARED_SECRET then .bridge.login_shared_secret_map.[.homeserver.domain] = env.MAUTRIX_WHATSAPP_BRIDGE_LOGIN_SHARED_SECRET else . end' \
|
||||
'${settingsFile}' '${registrationFile}' > '${settingsFile}.tmp'
|
||||
mv '${settingsFile}.tmp' '${settingsFile}'
|
||||
umask $old_umask
|
||||
'';
|
||||
|
||||
@@ -560,6 +560,9 @@ in
|
||||
};
|
||||
environment.NUT_CONFPATH = "/etc/nut";
|
||||
environment.NUT_STATEPATH = "/var/lib/nut";
|
||||
restartTriggers = [
|
||||
config.environment.etc."nut/ups.conf".source
|
||||
];
|
||||
};
|
||||
|
||||
environment.etc = {
|
||||
|
||||
@@ -6,6 +6,7 @@ let
|
||||
cfgs = config.services.cgit;
|
||||
|
||||
settingType = with types; oneOf [ bool int str ];
|
||||
repeatedSettingType = with types; oneOf [ settingType (listOf settingType) ];
|
||||
|
||||
genAttrs' = names: f: listToAttrs (map f names);
|
||||
|
||||
@@ -44,12 +45,20 @@ let
|
||||
toString value
|
||||
}";
|
||||
|
||||
# list value as multiple lines (for "readme" for example)
|
||||
cgitrcEntry = name: value:
|
||||
if isList value then
|
||||
map (cgitrcLine name) value
|
||||
else
|
||||
[ (cgitrcLine name value) ];
|
||||
|
||||
mkCgitrc = cfg: pkgs.writeText "cgitrc" ''
|
||||
# global settings
|
||||
${concatStringsSep "\n" (
|
||||
mapAttrsToList
|
||||
cgitrcLine
|
||||
flatten (mapAttrsToList
|
||||
cgitrcEntry
|
||||
({ virtual-root = cfg.nginx.location; } // cfg.settings)
|
||||
)
|
||||
)
|
||||
}
|
||||
${optionalString (cfg.scanPath != null) (cgitrcLine "scan-path" cfg.scanPath)}
|
||||
@@ -125,7 +134,7 @@ in
|
||||
|
||||
settings = mkOption {
|
||||
description = "cgit configuration, see cgitrc(5)";
|
||||
type = types.attrsOf settingType;
|
||||
type = types.attrsOf repeatedSettingType;
|
||||
default = {};
|
||||
example = literalExpression ''
|
||||
{
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
let
|
||||
cfg = config.services.harmonia;
|
||||
format = pkgs.formats.toml { };
|
||||
|
||||
signKeyPaths = cfg.signKeyPaths ++ lib.optional (cfg.signKeyPath != null) cfg.signKeyPath;
|
||||
credentials = lib.imap0 (i: signKeyPath: {
|
||||
id = "sign-key-${builtins.toString i}";
|
||||
path = signKeyPath;
|
||||
}) signKeyPaths;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
@@ -11,7 +17,13 @@ in
|
||||
signKeyPath = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.path;
|
||||
default = null;
|
||||
description = "Path to the signing key that will be used for signing the cache";
|
||||
description = "DEPRECATED: Use `services.harmonia.signKeyPaths` instead. Path to the signing key to use for signing the cache";
|
||||
};
|
||||
|
||||
signKeyPaths = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.path;
|
||||
default = [ ];
|
||||
description = "Paths to the signing keys to use for signing the cache";
|
||||
};
|
||||
|
||||
package = lib.mkPackageOption pkgs "harmonia" { };
|
||||
@@ -28,6 +40,8 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
warnings = lib.optional (cfg.signKeyPath != null)
|
||||
"`services.harmonia.signKeyPath` is deprecated, use `services.harmonia.signKeyPaths` instead";
|
||||
nix.settings.extra-allowed-users = [ "harmonia" ];
|
||||
users.users.harmonia = {
|
||||
isSystemUser = true;
|
||||
@@ -44,7 +58,9 @@ in
|
||||
|
||||
environment = {
|
||||
CONFIG_FILE = format.generate "harmonia.toml" cfg.settings;
|
||||
SIGN_KEY_PATH = lib.mkIf (cfg.signKeyPath != null) "%d/sign-key";
|
||||
SIGN_KEY_PATHS = lib.strings.concatMapStringsSep " " (
|
||||
credential: "%d/${credential.id}"
|
||||
) credentials;
|
||||
# Note: it's important to set this for nix-store, because it wants to use
|
||||
# $HOME in order to use a temporary cache dir. bizarre failures will occur
|
||||
# otherwise
|
||||
@@ -60,7 +76,7 @@ in
|
||||
DeviceAllow = [ "" ];
|
||||
UMask = "0066";
|
||||
RuntimeDirectory = "harmonia";
|
||||
LoadCredential = lib.mkIf (cfg.signKeyPath != null) [ "sign-key:${cfg.signKeyPath}" ];
|
||||
LoadCredential = builtins.map (credential: "${credential.id}:${credential.path}") credentials;
|
||||
SystemCallFilter = [
|
||||
"@system-service"
|
||||
"~@privileged"
|
||||
|
||||
@@ -1,187 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
|
||||
inherit (pkgs) lsh;
|
||||
|
||||
cfg = config.services.lshd;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
services.lshd = {
|
||||
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to enable the GNU lshd SSH2 daemon, which allows
|
||||
secure remote login.
|
||||
'';
|
||||
};
|
||||
|
||||
portNumber = mkOption {
|
||||
default = 22;
|
||||
type = types.port;
|
||||
description = ''
|
||||
The port on which to listen for connections.
|
||||
'';
|
||||
};
|
||||
|
||||
interfaces = mkOption {
|
||||
default = [];
|
||||
type = types.listOf types.str;
|
||||
description = ''
|
||||
List of network interfaces where listening for connections.
|
||||
When providing the empty list, `[]`, lshd listens on all
|
||||
network interfaces.
|
||||
'';
|
||||
example = [ "localhost" "1.2.3.4:443" ];
|
||||
};
|
||||
|
||||
hostKey = mkOption {
|
||||
default = "/etc/lsh/host-key";
|
||||
type = types.str;
|
||||
description = ''
|
||||
Path to the server's private key. Note that this key must
|
||||
have been created, e.g., using "lsh-keygen --server |
|
||||
lsh-writekey --server", so that you can run lshd.
|
||||
'';
|
||||
};
|
||||
|
||||
syslog = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Whether to enable syslog output.";
|
||||
};
|
||||
|
||||
passwordAuthentication = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Whether to enable password authentication.";
|
||||
};
|
||||
|
||||
publicKeyAuthentication = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Whether to enable public key authentication.";
|
||||
};
|
||||
|
||||
rootLogin = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Whether to enable remote root login.";
|
||||
};
|
||||
|
||||
loginShell = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.str;
|
||||
description = ''
|
||||
If non-null, override the default login shell with the
|
||||
specified value.
|
||||
'';
|
||||
example = "/nix/store/xyz-bash-10.0/bin/bash10";
|
||||
};
|
||||
|
||||
srpKeyExchange = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = ''
|
||||
Whether to enable SRP key exchange and user authentication.
|
||||
'';
|
||||
};
|
||||
|
||||
tcpForwarding = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Whether to enable TCP/IP forwarding.";
|
||||
};
|
||||
|
||||
x11Forwarding = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Whether to enable X11 forwarding.";
|
||||
};
|
||||
|
||||
subsystems = mkOption {
|
||||
type = types.listOf types.path;
|
||||
description = ''
|
||||
List of subsystem-path pairs, where the head of the pair
|
||||
denotes the subsystem name, and the tail denotes the path to
|
||||
an executable implementing it.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
services.lshd.subsystems = [ ["sftp" "${pkgs.lsh}/sbin/sftp-server"] ];
|
||||
|
||||
systemd.services.lshd = {
|
||||
description = "GNU lshd SSH2 daemon";
|
||||
|
||||
after = [ "network.target" ];
|
||||
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
environment = {
|
||||
LD_LIBRARY_PATH = config.system.nssModules.path;
|
||||
};
|
||||
|
||||
preStart = ''
|
||||
test -d /etc/lsh || mkdir -m 0755 -p /etc/lsh
|
||||
test -d /var/spool/lsh || mkdir -m 0755 -p /var/spool/lsh
|
||||
|
||||
if ! test -f /var/spool/lsh/yarrow-seed-file
|
||||
then
|
||||
# XXX: It would be nice to provide feedback to the
|
||||
# user when this fails, so that they can retry it
|
||||
# manually.
|
||||
${lsh}/bin/lsh-make-seed --sloppy \
|
||||
-o /var/spool/lsh/yarrow-seed-file
|
||||
fi
|
||||
|
||||
if ! test -f "${cfg.hostKey}"
|
||||
then
|
||||
${lsh}/bin/lsh-keygen --server | \
|
||||
${lsh}/bin/lsh-writekey --server -o "${cfg.hostKey}"
|
||||
fi
|
||||
'';
|
||||
|
||||
script = with cfg; ''
|
||||
${lsh}/sbin/lshd --daemonic \
|
||||
--password-helper="${lsh}/sbin/lsh-pam-checkpw" \
|
||||
-p ${toString portNumber} \
|
||||
${optionalString (interfaces != []) (concatStrings (map (i: "--interface=\"${i}\"") interfaces))} \
|
||||
-h "${hostKey}" \
|
||||
${optionalString (!syslog) "--no-syslog" } \
|
||||
${if passwordAuthentication then "--password" else "--no-password" } \
|
||||
${if publicKeyAuthentication then "--publickey" else "--no-publickey" } \
|
||||
${if rootLogin then "--root-login" else "--no-root-login" } \
|
||||
${optionalString (loginShell != null) "--login-shell=\"${loginShell}\"" } \
|
||||
${if srpKeyExchange then "--srp-keyexchange" else "--no-srp-keyexchange" } \
|
||||
${if !tcpForwarding then "--no-tcpip-forward" else "--tcpip-forward"} \
|
||||
${if x11Forwarding then "--x11-forward" else "--no-x11-forward" } \
|
||||
--subsystems=${concatStringsSep ","
|
||||
(map (pair: (head pair) + "=" +
|
||||
(head (tail pair)))
|
||||
subsystems)}
|
||||
'';
|
||||
};
|
||||
|
||||
security.pam.services.lshd = {};
|
||||
};
|
||||
}
|
||||
@@ -775,7 +775,7 @@ in {
|
||||
'' + lib.optionalString (!databaseActuallyCreateLocally) ''
|
||||
unset PGPASSWORD
|
||||
'';
|
||||
path = [ cfg.package pkgs.postgresql ];
|
||||
path = [ cfg.package config.services.postgresql.package ];
|
||||
environment = env // lib.optionalAttrs (!databaseActuallyCreateLocally) {
|
||||
PGHOST = cfg.database.host;
|
||||
PGPORT = toString cfg.database.port;
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
let
|
||||
cfg = config.services.pict-rs;
|
||||
inherit (lib) maintainers mkOption types;
|
||||
|
||||
is03 = lib.versionOlder cfg.package.version "0.4.0";
|
||||
|
||||
in
|
||||
{
|
||||
meta.maintainers = with maintainers; [ happysalada ];
|
||||
@@ -61,38 +58,62 @@ in
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.pict-rs.package = lib.mkDefault (
|
||||
# An incompatible db change happened in the transition from 0.3 to 0.4.
|
||||
if lib.versionAtLeast config.system.stateVersion "23.11"
|
||||
then pkgs.pict-rs
|
||||
else pkgs.pict-rs_0_3
|
||||
else throw ''
|
||||
pict-rs made changes to the database schema between 0.3 and 0.4. It
|
||||
will apply these automatically on the first run of 0.4, but the old
|
||||
version will no longer work after that.
|
||||
|
||||
Your configuration is currently using the old default of pict-rs
|
||||
0.3. Unfortunately, 0.3 no longer builds due to the Rust 1.80 update,
|
||||
and has been removed. pict-rs has already been updated to 0.5 in
|
||||
Nixpkgs, which has another schema change but removes the migration
|
||||
logic for 0.3.
|
||||
|
||||
You will need to migrate to 0.4 first, and then to 0.5. As 0.4 is
|
||||
no longer present in Nixpkgs, the recommended migration path is:
|
||||
|
||||
* Import a separate Nixpkgs old enough to contain 0.4, temporarily
|
||||
set `services.pict-rs.package` to its pict-rs, set the
|
||||
`PICTRS__OLD_DB__PATH` environment variable for the migration, and
|
||||
activate your configuration to start it. The following configuration
|
||||
snippet should work:
|
||||
|
||||
services.pict-rs.package =
|
||||
(import (builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/9b19f5e77dd906cb52dade0b7bd280339d2a1f3d.tar.gz";
|
||||
sha256 = "sha256:0939vbhln9d33xkqw63nsk908k03fxihj85zaf70i3il9z42q8mc";
|
||||
}) pkgs.config).pict-rs;
|
||||
|
||||
systemd.services.pict-rs.environment.PICTRS__OLD_DB__PATH = config.services.pict-rs.dataDir;
|
||||
|
||||
* After the migration to 0.4 completes, remove the package and
|
||||
environment variable overrides, set `services.pict-rs.package` to
|
||||
the current `pkgs.pict-rs` instead, and activate your configuration
|
||||
to begin the migration to 0.5.
|
||||
|
||||
For more information, see:
|
||||
|
||||
* <https://git.asonix.dog/asonix/pict-rs/src/tag/v0.4.8#0-3-to-0-4-migration-guide>
|
||||
* <https://git.asonix.dog/asonix/pict-rs/src/tag/v0.5.16#0-4-to-0-5-migration-guide>
|
||||
|
||||
The NixOS module will handle the configuration changes for you,
|
||||
at least.
|
||||
''
|
||||
);
|
||||
|
||||
# Account for config differences between 0.3 and 0.4
|
||||
assertions = [
|
||||
{
|
||||
assertion = !is03 || (cfg.repoPath == null && cfg.storePath == null);
|
||||
message = ''
|
||||
Using `services.pict-rs.repoPath` or `services.pict-rs.storePath` with pict-rs 0.3 or older has no effect.
|
||||
'';
|
||||
}
|
||||
];
|
||||
|
||||
systemd.services.pict-rs = {
|
||||
# Pict-rs split it's database and image storage paths in 0.4.0.
|
||||
environment =
|
||||
if is03 then {
|
||||
PICTRS__PATH = cfg.dataDir;
|
||||
PICTRS__ADDR = "${cfg.address}:${toString cfg.port}";
|
||||
} else {
|
||||
PICTRS__REPO__PATH = if cfg.repoPath != null then cfg.repoPath else "${cfg.dataDir}/sled-repo";
|
||||
PICTRS__STORE__PATH = if cfg.storePath != null then cfg.storePath else "${cfg.dataDir}/files";
|
||||
PICTRS__SERVER__ADDR = "${cfg.address}:${toString cfg.port}";
|
||||
};
|
||||
environment = {
|
||||
PICTRS__REPO__PATH = if cfg.repoPath != null then cfg.repoPath else "${cfg.dataDir}/sled-repo";
|
||||
PICTRS__STORE__PATH = if cfg.storePath != null then cfg.storePath else "${cfg.dataDir}/files";
|
||||
PICTRS__SERVER__ADDRESS = "${cfg.address}:${toString cfg.port}";
|
||||
};
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
StateDirectory = "pict-rs";
|
||||
ExecStart = if is03 then "${lib.getBin cfg.package}/bin/pict-rs" else "${lib.getBin cfg.package}/bin/pict-rs run";
|
||||
ExecStart = "${lib.getBin cfg.package}/bin/pict-rs run";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
43
nixos/modules/services/web-apps/pingvin-share.md
Normal file
43
nixos/modules/services/web-apps/pingvin-share.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# Pingvin Share {#module-services-pingvin-share}
|
||||
|
||||
A self-hosted file sharing platform and an alternative for WeTransfer.
|
||||
|
||||
## Configuration {#module-services-pingvin-share-basic-usage}
|
||||
|
||||
By default, the module will execute Pingvin Share backend and frontend on the ports 8080 and 3000.
|
||||
|
||||
I will run two systemd services named `pingvin-share-backend` and `pingvin-share-frontend` in the specified data directory.
|
||||
|
||||
Here is a basic configuration:
|
||||
|
||||
```nix
|
||||
{
|
||||
services-pingvin-share = {
|
||||
enable = true;
|
||||
|
||||
openFirewall = true;
|
||||
|
||||
backend.port = 9010;
|
||||
frontend.port = 9011;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## Reverse proxy configuration {#module-services-pingvin-share-reverse-proxy-configuration}
|
||||
|
||||
The prefered method to run this service is behind a reverse proxy not to expose an open port. This, you can configure Nginx such like this:
|
||||
|
||||
```nix
|
||||
{
|
||||
services-pingvin-share = {
|
||||
enable = true;
|
||||
|
||||
hostname = "pingvin-share.domain.tld";
|
||||
https = true;
|
||||
|
||||
nginx.enable = true;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Furthermore, you can increase the maximal size of an uploaded file with the option [services.nginx.clientMaxBodySize](#opt-services.nginx.clientMaxBodySize).
|
||||
226
nixos/modules/services/web-apps/pingvin-share.nix
Normal file
226
nixos/modules/services/web-apps/pingvin-share.nix
Normal file
@@ -0,0 +1,226 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
cfg = config.services.pingvin-share;
|
||||
inherit (lib)
|
||||
mkOption
|
||||
mkEnableOption
|
||||
mkIf
|
||||
mkPackageOption
|
||||
types
|
||||
;
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
services.pingvin-share = {
|
||||
enable = mkEnableOption "Pingvin Share, a self-hosted file sharing platform";
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "pingvin";
|
||||
description = ''
|
||||
User account under which Pingvin Share runs.
|
||||
'';
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "pingvin";
|
||||
description = ''
|
||||
Group under which Pingvin Share runs.
|
||||
'';
|
||||
};
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to open the firewall for the port in {option}`services.pingvin-share.frontend.port`.
|
||||
'';
|
||||
};
|
||||
|
||||
dataDir = mkOption {
|
||||
type = types.path;
|
||||
default = "/var/lib/pingvin-share";
|
||||
example = "/var/lib/pingvin";
|
||||
description = ''
|
||||
The path to the data directory in which Pingvin Share will store its data.
|
||||
'';
|
||||
};
|
||||
|
||||
hostname = mkOption {
|
||||
type = types.str;
|
||||
default = "localhost:${toString cfg.backend.port}";
|
||||
defaultText = lib.literalExpression "localhost:\${options.services.pingvin-share.backend.port}";
|
||||
example = "pingvin-share.domain.tdl";
|
||||
description = ''
|
||||
The domain name of your instance. If null, the redirections will be made to localhost.
|
||||
'';
|
||||
};
|
||||
|
||||
https = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
example = true;
|
||||
description = ''
|
||||
Whether to enable HTTPS for the domain.
|
||||
'';
|
||||
};
|
||||
|
||||
backend = {
|
||||
package = mkPackageOption pkgs [
|
||||
"pingvin-share"
|
||||
"backend"
|
||||
] { };
|
||||
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 8080;
|
||||
example = 9000;
|
||||
description = ''
|
||||
The port that the backend service of Pingvin Share will listen to.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
frontend = {
|
||||
package = mkPackageOption pkgs [
|
||||
"pingvin-share"
|
||||
"frontend"
|
||||
] { };
|
||||
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 3000;
|
||||
example = 8000;
|
||||
description = ''
|
||||
The port that the frontend service of Pingvin Share will listen to.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
nginx = {
|
||||
enable = mkEnableOption "a Nginx reverse proxy for Pingvin Share.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
users.groups = mkIf (cfg.group == "pingvin") { pingvin = { }; };
|
||||
|
||||
users.users = mkIf (cfg.user == "pingvin") {
|
||||
pingvin = {
|
||||
group = cfg.group;
|
||||
description = "Pingvin Share daemon user";
|
||||
isSystemUser = true;
|
||||
};
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.frontend.port ];
|
||||
|
||||
systemd.services.pingvin-share-backend = {
|
||||
description = "Backend service of Pingvin Share, a self-hosted file sharing platform.";
|
||||
|
||||
wantedBy = [
|
||||
"multi-user.target"
|
||||
"pingvin-share-frontend.service"
|
||||
];
|
||||
before = [ "pingvin-share-frontend.service" ];
|
||||
after = [
|
||||
"network.target"
|
||||
"network-online.target"
|
||||
];
|
||||
wants = [ "network-online.target" ];
|
||||
|
||||
environment = {
|
||||
PRISMA_SCHEMA_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/schema-engine";
|
||||
PRISMA_QUERY_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/query-engine";
|
||||
PRISMA_QUERY_ENGINE_LIBRARY = "${pkgs.prisma-engines}/lib/libquery_engine.node";
|
||||
PRISMA_INTROSPECTION_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/introspection-engine";
|
||||
PRISMA_FMT_BINARY = "${pkgs.prisma-engines}/bin/prisma-fmt";
|
||||
PORT = toString cfg.backend.port;
|
||||
DATABASE_URL = "file:${cfg.dataDir}/pingvin-share.db?connection_limit=1";
|
||||
DATA_DIRECTORY = cfg.dataDir;
|
||||
};
|
||||
|
||||
path = with pkgs; [
|
||||
cfg.backend.package
|
||||
openssl
|
||||
prisma-engines
|
||||
];
|
||||
|
||||
serviceConfig = {
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
ExecStartPre = [
|
||||
"${cfg.backend.package}/node_modules/.bin/prisma migrate deploy"
|
||||
"${cfg.backend.package}/node_modules/.bin/prisma db seed"
|
||||
];
|
||||
ExecStart = "${cfg.backend.package}/node_modules/.bin/ts-node dist/src/main";
|
||||
StateDirectory = mkIf (cfg.dataDir == "/var/lib/pingvin-share") "pingvin-share";
|
||||
WorkingDirectory = cfg.backend.package;
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.pingvin-share-frontend = {
|
||||
description = "Frontend service of Pingvin Share, a self-hosted file sharing platform.";
|
||||
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
wants = [
|
||||
"network-online.target"
|
||||
"pingvin-share-backend.service"
|
||||
];
|
||||
after = [
|
||||
"network-online.target"
|
||||
"pingvin-share-backend.service"
|
||||
];
|
||||
|
||||
environment = {
|
||||
PORT = toString cfg.frontend.port;
|
||||
API_URL = "${if cfg.https then "https" else "http"}://${cfg.hostname}";
|
||||
};
|
||||
path = [ cfg.frontend.package ];
|
||||
|
||||
serviceConfig = {
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
ExecStart = "${cfg.frontend.package}/node_modules/.bin/next start";
|
||||
StateDirectory = mkIf (cfg.dataDir == "/var/lib/pingvin-share") "pingvin-share";
|
||||
WorkingDirectory = cfg.frontend.package;
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx = mkIf cfg.nginx.enable {
|
||||
enable = lib.mkDefault true;
|
||||
virtualHosts."${cfg.hostname}" = {
|
||||
enableACME = cfg.https;
|
||||
forceSSL = cfg.https;
|
||||
|
||||
locations."/" = {
|
||||
proxyPass = "http://localhost:${toString cfg.frontend.port}";
|
||||
recommendedProxySettings = true;
|
||||
};
|
||||
locations."/api" = {
|
||||
proxyPass = "http://localhost:${toString cfg.backend.port}";
|
||||
recommendedProxySettings = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
meta = {
|
||||
maintainers = with lib.maintainers; [ ratcornu ];
|
||||
doc = ./pingvin-share.md;
|
||||
};
|
||||
}
|
||||
@@ -42,9 +42,10 @@ let
|
||||
SESSION_COOKIE_SECURE = ENABLE_HTTPS
|
||||
DATA_DIR = "${dataDir}"
|
||||
CACHE_DIR = f"{DATA_DIR}/cache"
|
||||
STATIC_ROOT = "${finalPackage.static}/static"
|
||||
STATIC_ROOT = "${finalPackage.static}"
|
||||
MEDIA_ROOT = "/var/lib/weblate/media"
|
||||
COMPRESS_ROOT = "${finalPackage.static}/compressor-cache"
|
||||
COMPRESS_ROOT = "${finalPackage.static}"
|
||||
COMPRESS_OFFLINE = True
|
||||
DEBUG = False
|
||||
|
||||
DATABASES = {
|
||||
@@ -86,6 +87,13 @@ let
|
||||
|
||||
VCS_BACKENDS = ("weblate.vcs.git.GitRepository",)
|
||||
|
||||
SITE_URL = "https://{}".format(SITE_DOMAIN)
|
||||
|
||||
# WebAuthn
|
||||
OTP_WEBAUTHN_RP_NAME = SITE_TITLE
|
||||
OTP_WEBAUTHN_RP_ID = SITE_DOMAIN.split(":")[0]
|
||||
OTP_WEBAUTHN_ALLOWED_ORIGINS = [SITE_URL]
|
||||
|
||||
''
|
||||
+ lib.optionalString cfg.smtp.enable ''
|
||||
ADMINS = (("Weblate Admin", "${cfg.smtp.user}"),)
|
||||
@@ -205,8 +213,7 @@ in
|
||||
|
||||
locations = {
|
||||
"= /favicon.ico".alias = "${finalPackage}/${python.sitePackages}/weblate/static/favicon.ico";
|
||||
"/static/".alias = "${finalPackage.static}/static/";
|
||||
"/static/CACHE/".alias = "${finalPackage.static}/compressor-cache/CACHE/";
|
||||
"/static/".alias = "${finalPackage.static}/";
|
||||
"/media/".alias = "/var/lib/weblate/media/";
|
||||
"/".proxyPass = "http://unix:///run/weblate.socket";
|
||||
};
|
||||
|
||||
@@ -426,6 +426,7 @@ in
|
||||
# standard wordpress .htaccess contents
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
||||
RewriteBase /
|
||||
RewriteRule ^index\.php$ - [L]
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
|
||||
@@ -20,6 +20,7 @@ let
|
||||
"IPv6PrivacyExtensions"
|
||||
"IPv4Forwarding"
|
||||
"IPv6Forwarding"
|
||||
"UseDomains"
|
||||
])
|
||||
(assertValueOneOf "SpeedMeter" boolValues)
|
||||
(assertInt "SpeedMeterIntervalSec")
|
||||
@@ -28,6 +29,7 @@ let
|
||||
(assertValueOneOf "IPv6PrivacyExtensions" (boolValues ++ ["prefer-public" "kernel"]))
|
||||
(assertValueOneOf "IPv4Forwarding" boolValues)
|
||||
(assertValueOneOf "IPv6Forwarding" boolValues)
|
||||
(assertValueOneOf "UseDomains" (boolValues ++ ["route"]))
|
||||
];
|
||||
|
||||
sectionDHCPv4 = checkUnitConfig "DHCPv4" [
|
||||
@@ -652,6 +654,7 @@ let
|
||||
"Address"
|
||||
"Gateway"
|
||||
"DNS"
|
||||
"UseDomains"
|
||||
"Domains"
|
||||
"DNSDefaultRoute"
|
||||
"NTP"
|
||||
@@ -705,6 +708,7 @@ let
|
||||
(assertValueOneOf "DNSSEC" (boolValues ++ ["allow-downgrade"]))
|
||||
(assertValueOneOf "LLDP" (boolValues ++ ["routers-only"]))
|
||||
(assertValueOneOf "EmitLLDP" (boolValues ++ ["nearest-bridge" "non-tpmr-bridge" "customer-bridge"]))
|
||||
(assertValueOneOf "UseDomains" (boolValues ++ ["route"]))
|
||||
(assertValueOneOf "DNSDefaultRoute" boolValues)
|
||||
(assertRemoved "IPForward" "IPv4Forwarding and IPv6Forwarding in systemd.network(5) and networkd.conf(5)")
|
||||
(assertValueOneOf "IPv4Forwarding" boolValues)
|
||||
|
||||
@@ -53,7 +53,6 @@ let
|
||||
"debug-shell.service"
|
||||
|
||||
# Udev.
|
||||
"systemd-tmpfiles-setup-dev-early.service"
|
||||
"systemd-udevd-control.socket"
|
||||
"systemd-udevd-kernel.socket"
|
||||
"systemd-udevd.service"
|
||||
|
||||
@@ -67,8 +67,6 @@ let
|
||||
"systemd-poweroff.service"
|
||||
"systemd-reboot.service"
|
||||
"systemd-sysctl.service"
|
||||
"systemd-tmpfiles-setup-dev.service"
|
||||
"systemd-tmpfiles-setup.service"
|
||||
"timers.target"
|
||||
"tpm2.target"
|
||||
"umount.target"
|
||||
@@ -103,8 +101,17 @@ let
|
||||
initrdBinEnv = pkgs.buildEnv {
|
||||
name = "initrd-bin-env";
|
||||
paths = map getBin cfg.initrdBin;
|
||||
pathsToLink = ["/bin"];
|
||||
postBuild = concatStringsSep "\n" (mapAttrsToList (n: v: "ln -sf '${v}' $out/bin/'${n}'") cfg.extraBin);
|
||||
pathsToLink = ["/bin" "/sbin"];
|
||||
|
||||
# Make sure sbin and bin have the same contents, and add extraBin
|
||||
postBuild = ''
|
||||
find $out/bin -maxdepth 1 -type l -print0 | xargs --null cp --no-dereference --no-clobber -t $out/sbin/
|
||||
find $out/sbin -maxdepth 1 -type l -print0 | xargs --null cp --no-dereference --no-clobber -t $out/bin/
|
||||
${concatStringsSep "\n" (mapAttrsToList (n: v: ''
|
||||
ln -sf '${v}' $out/bin/'${n}'
|
||||
ln -sf '${v}' $out/sbin/'${n}'
|
||||
'') cfg.extraBin)}
|
||||
'';
|
||||
};
|
||||
|
||||
initialRamdisk = pkgs.makeInitrdNG {
|
||||
@@ -226,8 +233,8 @@ in {
|
||||
emergencyAccess = mkOption {
|
||||
type = with types; oneOf [ bool (nullOr (passwdEntry str)) ];
|
||||
description = ''
|
||||
Set to true for unauthenticated emergency access, and false for
|
||||
no emergency access.
|
||||
Set to true for unauthenticated emergency access, and false or
|
||||
null for no emergency access.
|
||||
|
||||
Can also be set to a hashed super user password to allow
|
||||
authenticated access to the emergency mode.
|
||||
@@ -408,7 +415,7 @@ in {
|
||||
fsck = "${cfg.package.util-linux}/bin/fsck";
|
||||
};
|
||||
|
||||
managerEnvironment.PATH = "/bin";
|
||||
managerEnvironment.PATH = "/bin:/sbin";
|
||||
|
||||
contents = {
|
||||
"/tmp/.keep".text = "systemd requires the /tmp mount point in the initrd cpio archive";
|
||||
@@ -417,7 +424,7 @@ in {
|
||||
|
||||
"/etc/systemd/system.conf".text = ''
|
||||
[Manager]
|
||||
DefaultEnvironment=PATH=/bin
|
||||
DefaultEnvironment=PATH=/bin:/sbin
|
||||
${cfg.extraConfig}
|
||||
ManagerEnvironment=${lib.concatStringsSep " " (lib.mapAttrsToList (n: v: "${n}=${lib.escapeShellArg v}") cfg.managerEnvironment)}
|
||||
'';
|
||||
@@ -429,12 +436,17 @@ in {
|
||||
# We can use either ! or * to lock the root account in the
|
||||
# console, but some software like OpenSSH won't even allow you
|
||||
# to log in with an SSH key if you use ! so we use * instead
|
||||
"/etc/shadow".text = "root:${if isBool cfg.emergencyAccess then optionalString (!cfg.emergencyAccess) "*" else cfg.emergencyAccess}:::::::";
|
||||
"/etc/shadow".text = let
|
||||
ea = cfg.emergencyAccess;
|
||||
access = ea != null && !(isBool ea && !ea);
|
||||
passwd = if isString ea then ea else "";
|
||||
in
|
||||
"root:${if access then passwd else "*"}:::::::";
|
||||
|
||||
"/bin".source = "${initrdBinEnv}/bin";
|
||||
"/sbin".source = "${initrdBinEnv}/bin";
|
||||
"/sbin".source = "${initrdBinEnv}/sbin";
|
||||
|
||||
"/etc/sysctl.d/nixos.conf".text = "kernel.modprobe = /bin/modprobe";
|
||||
"/etc/sysctl.d/nixos.conf".text = "kernel.modprobe = /sbin/modprobe";
|
||||
"/etc/modprobe.d/systemd.conf".source = "${cfg.package}/lib/modprobe.d/systemd.conf";
|
||||
"/etc/modprobe.d/ubuntu.conf".source = pkgs.runCommand "initrd-kmod-blacklist-ubuntu" { } ''
|
||||
${pkgs.buildPackages.perl}/bin/perl -0pe 's/## file: iwlwifi.conf(.+?)##/##/s;' $src > $out
|
||||
@@ -509,8 +521,6 @@ in {
|
||||
(v: let n = escapeSystemdPath v.where;
|
||||
in nameValuePair "${n}.automount" (automountToUnit v)) cfg.automounts);
|
||||
|
||||
# make sure all the /dev nodes are set up
|
||||
services.systemd-tmpfiles-setup-dev.wantedBy = ["sysinit.target"];
|
||||
|
||||
services.initrd-nixos-activation = {
|
||||
after = [ "initrd-fs.target" ];
|
||||
|
||||
@@ -1,10 +1,121 @@
|
||||
{ config, lib, pkgs, utils, ... }:
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.systemd.tmpfiles;
|
||||
initrdCfg = config.boot.initrd.systemd.tmpfiles;
|
||||
systemd = config.systemd.package;
|
||||
|
||||
settingsOption = {
|
||||
description = ''
|
||||
Declare systemd-tmpfiles rules to create, delete, and clean up volatile
|
||||
and temporary files and directories.
|
||||
|
||||
Even though the service is called `*tmp*files` you can also create
|
||||
persistent files.
|
||||
'';
|
||||
example = {
|
||||
"10-mypackage" = {
|
||||
"/var/lib/my-service/statefolder".d = {
|
||||
mode = "0755";
|
||||
user = "root";
|
||||
group = "root";
|
||||
};
|
||||
};
|
||||
};
|
||||
default = {};
|
||||
type = types.attrsOf (types.attrsOf (types.attrsOf (types.submodule ({ name, config, ... }: {
|
||||
options.type = mkOption {
|
||||
type = types.str;
|
||||
default = name;
|
||||
example = "d";
|
||||
description = ''
|
||||
The type of operation to perform on the file.
|
||||
|
||||
The type consists of a single letter and optionally one or more
|
||||
modifier characters.
|
||||
|
||||
Please see the upstream documentation for the available types and
|
||||
more details:
|
||||
<https://www.freedesktop.org/software/systemd/man/tmpfiles.d>
|
||||
'';
|
||||
};
|
||||
options.mode = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "0755";
|
||||
description = ''
|
||||
The file access mode to use when creating this file or directory.
|
||||
'';
|
||||
};
|
||||
options.user = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "root";
|
||||
description = ''
|
||||
The user of the file.
|
||||
|
||||
This may either be a numeric ID or a user/group name.
|
||||
|
||||
If omitted or when set to `"-"`, the user and group of the user who
|
||||
invokes systemd-tmpfiles is used.
|
||||
'';
|
||||
};
|
||||
options.group = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "root";
|
||||
description = ''
|
||||
The group of the file.
|
||||
|
||||
This may either be a numeric ID or a user/group name.
|
||||
|
||||
If omitted or when set to `"-"`, the user and group of the user who
|
||||
invokes systemd-tmpfiles is used.
|
||||
'';
|
||||
};
|
||||
options.age = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "10d";
|
||||
description = ''
|
||||
Delete a file when it reaches a certain age.
|
||||
|
||||
If a file or directory is older than the current time minus the age
|
||||
field, it is deleted.
|
||||
|
||||
If set to `"-"` no automatic clean-up is done.
|
||||
'';
|
||||
};
|
||||
options.argument = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "";
|
||||
description = ''
|
||||
An argument whose meaning depends on the type of operation.
|
||||
|
||||
Please see the upstream documentation for the meaning of this
|
||||
parameter in different situations:
|
||||
<https://www.freedesktop.org/software/systemd/man/tmpfiles.d>
|
||||
'';
|
||||
};
|
||||
}))));
|
||||
};
|
||||
|
||||
# generates a single entry for a tmpfiles.d rule
|
||||
settingsEntryToRule = path: entry: ''
|
||||
'${entry.type}' '${path}' '${entry.mode}' '${entry.user}' '${entry.group}' '${entry.age}' ${entry.argument}
|
||||
'';
|
||||
|
||||
# generates a list of tmpfiles.d rules from the attrs (paths) under tmpfiles.settings.<name>
|
||||
pathsToRules = mapAttrsToList (path: types:
|
||||
concatStrings (
|
||||
mapAttrsToList (_type: settingsEntryToRule path) types
|
||||
)
|
||||
);
|
||||
|
||||
mkRuleFileContent = paths: concatStrings (pathsToRules paths);
|
||||
in
|
||||
{
|
||||
options = {
|
||||
@@ -20,101 +131,16 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.tmpfiles.settings = mkOption {
|
||||
systemd.tmpfiles.settings = mkOption settingsOption;
|
||||
|
||||
boot.initrd.systemd.tmpfiles.settings = mkOption (settingsOption // {
|
||||
description = ''
|
||||
Declare systemd-tmpfiles rules to create, delete, and clean up volatile
|
||||
and temporary files and directories.
|
||||
Similar to {option}`systemd.tmpfiles.settings` but the rules are
|
||||
only applied by systemd-tmpfiles before `initrd-switch-root.target`.
|
||||
|
||||
Even though the service is called `*tmp*files` you can also create
|
||||
persistent files.
|
||||
See {manpage}`bootup(7)`.
|
||||
'';
|
||||
example = {
|
||||
"10-mypackage" = {
|
||||
"/var/lib/my-service/statefolder".d = {
|
||||
mode = "0755";
|
||||
user = "root";
|
||||
group = "root";
|
||||
};
|
||||
};
|
||||
};
|
||||
default = {};
|
||||
type = types.attrsOf (types.attrsOf (types.attrsOf (types.submodule ({ name, config, ... }: {
|
||||
options.type = mkOption {
|
||||
type = types.str;
|
||||
default = name;
|
||||
example = "d";
|
||||
description = ''
|
||||
The type of operation to perform on the file.
|
||||
|
||||
The type consists of a single letter and optionally one or more
|
||||
modifier characters.
|
||||
|
||||
Please see the upstream documentation for the available types and
|
||||
more details:
|
||||
<https://www.freedesktop.org/software/systemd/man/tmpfiles.d>
|
||||
'';
|
||||
};
|
||||
options.mode = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "0755";
|
||||
description = ''
|
||||
The file access mode to use when creating this file or directory.
|
||||
'';
|
||||
};
|
||||
options.user = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "root";
|
||||
description = ''
|
||||
The user of the file.
|
||||
|
||||
This may either be a numeric ID or a user/group name.
|
||||
|
||||
If omitted or when set to `"-"`, the user and group of the user who
|
||||
invokes systemd-tmpfiles is used.
|
||||
'';
|
||||
};
|
||||
options.group = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "root";
|
||||
description = ''
|
||||
The group of the file.
|
||||
|
||||
This may either be a numeric ID or a user/group name.
|
||||
|
||||
If omitted or when set to `"-"`, the user and group of the user who
|
||||
invokes systemd-tmpfiles is used.
|
||||
'';
|
||||
};
|
||||
options.age = mkOption {
|
||||
type = types.str;
|
||||
default = "-";
|
||||
example = "10d";
|
||||
description = ''
|
||||
Delete a file when it reaches a certain age.
|
||||
|
||||
If a file or directory is older than the current time minus the age
|
||||
field, it is deleted.
|
||||
|
||||
If set to `"-"` no automatic clean-up is done.
|
||||
'';
|
||||
};
|
||||
options.argument = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "";
|
||||
description = ''
|
||||
An argument whose meaning depends on the type of operation.
|
||||
|
||||
Please see the upstream documentation for the meaning of this
|
||||
parameter in different situations:
|
||||
<https://www.freedesktop.org/software/systemd/man/tmpfiles.d>
|
||||
'';
|
||||
};
|
||||
}))));
|
||||
};
|
||||
});
|
||||
|
||||
systemd.tmpfiles.packages = mkOption {
|
||||
type = types.listOf types.package;
|
||||
@@ -140,8 +166,9 @@ in
|
||||
systemd.additionalUpstreamSystemUnits = [
|
||||
"systemd-tmpfiles-clean.service"
|
||||
"systemd-tmpfiles-clean.timer"
|
||||
"systemd-tmpfiles-setup.service"
|
||||
"systemd-tmpfiles-setup-dev-early.service"
|
||||
"systemd-tmpfiles-setup-dev.service"
|
||||
"systemd-tmpfiles-setup.service"
|
||||
];
|
||||
|
||||
systemd.additionalUpstreamUserUnits = [
|
||||
@@ -236,11 +263,7 @@ in
|
||||
'';
|
||||
})
|
||||
] ++ (mapAttrsToList (name: paths:
|
||||
pkgs.writeTextDir "lib/tmpfiles.d/${name}.conf" (concatStrings (mapAttrsToList (path: types:
|
||||
concatStrings (mapAttrsToList (_type: entry: ''
|
||||
'${entry.type}' '${path}' '${entry.mode}' '${entry.user}' '${entry.group}' '${entry.age}' ${entry.argument}
|
||||
'') types)
|
||||
) paths ))
|
||||
pkgs.writeTextDir "lib/tmpfiles.d/${name}.conf" (mkRuleFileContent paths)
|
||||
) cfg.settings);
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
@@ -256,5 +279,62 @@ in
|
||||
"R! /nix/var/nix/gcroots/tmp - - - - -"
|
||||
"R! /nix/var/nix/temproots - - - - -"
|
||||
];
|
||||
|
||||
boot.initrd.systemd = {
|
||||
additionalUpstreamUnits = [
|
||||
"systemd-tmpfiles-setup-dev-early.service"
|
||||
"systemd-tmpfiles-setup-dev.service"
|
||||
"systemd-tmpfiles-setup.service"
|
||||
];
|
||||
|
||||
# override to exclude the prefix /sysroot, because it is not necessarily set up when the unit starts
|
||||
services.systemd-tmpfiles-setup.serviceConfig = {
|
||||
ExecStart = [
|
||||
""
|
||||
"systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev --exclude-prefix=/sysroot"
|
||||
];
|
||||
};
|
||||
|
||||
# sets up files under the prefix /sysroot, after the hierarchy is available and before nixos activation
|
||||
services.systemd-tmpfiles-setup-sysroot = {
|
||||
description = "Create Volatile Files and Directories in the Real Root";
|
||||
after = [ "initrd-fs.target" ];
|
||||
before = [
|
||||
"initrd-nixos-activation.service"
|
||||
"shutdown.target" "initrd-switch-root.target"
|
||||
];
|
||||
conflicts = [ "shutdown.target" "initrd-switch-root.target" ];
|
||||
wantedBy = [ "initrd.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
ExecStart = "systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev --prefix=/sysroot";
|
||||
SuccessExitStatus = [ "DATAERR CANTCREAT" ];
|
||||
ImportCredential = [
|
||||
"tmpfiles.*"
|
||||
"login.motd"
|
||||
"login.issue"
|
||||
"network.hosts"
|
||||
"ssh.authorized_keys.root"
|
||||
];
|
||||
};
|
||||
unitConfig = {
|
||||
DefaultDependencies = false;
|
||||
RefuseManualStop = true;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
contents."/etc/tmpfiles.d" = mkIf (initrdCfg.settings != { }) {
|
||||
source = pkgs.linkFarm "initrd-tmpfiles.d" (
|
||||
mapAttrsToList
|
||||
(name: paths: {
|
||||
name = "${name}.conf";
|
||||
path = pkgs.writeText "${name}.conf" (mkRuleFileContent paths);
|
||||
}
|
||||
)
|
||||
initrdCfg.settings);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
] ++ lib.optionals (!config.system.etc.overlay.mutable) [
|
||||
"ro"
|
||||
]);
|
||||
wantedBy = [ "initrd-fs.target" ];
|
||||
requiredBy = [ "initrd-fs.target" ];
|
||||
before = [ "initrd-fs.target" ];
|
||||
requires = lib.mkIf config.system.etc.overlay.mutable [ "rw-etc.service" ];
|
||||
after = lib.mkIf config.system.etc.overlay.mutable [ "rw-etc.service" ];
|
||||
|
||||
@@ -279,7 +279,7 @@ in
|
||||
${pkgs.move-mount-beneath}/bin/move-mount --move --beneath $tmpEtcMount /etc
|
||||
|
||||
# Unmount the top /etc mount to atomically reveal the new mount.
|
||||
umount --recursive /etc
|
||||
umount --lazy --recursive /etc
|
||||
fi
|
||||
'' else ''
|
||||
# Set up the statically computed bits of /etc.
|
||||
|
||||
@@ -256,7 +256,11 @@ in
|
||||
live-restore = mkDefault cfg.liveRestore;
|
||||
runtimes = mkIf cfg.enableNvidia {
|
||||
nvidia = {
|
||||
path = "${pkgs.nvidia-docker}/bin/nvidia-container-runtime";
|
||||
# Use the legacy nvidia-container-runtime wrapper to allow
|
||||
# the `--runtime=nvidia` approach to expose
|
||||
# GPU's. Starting with Docker > 25, CDI can be used
|
||||
# instead, removing the need for runtime wrappers.
|
||||
path = lib.getExe' pkgs.nvidia-docker "nvidia-container-runtime.legacy";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -84,7 +84,7 @@ in
|
||||
description = ''
|
||||
**Deprecated**, please use hardware.nvidia-container-toolkit.enable instead.
|
||||
|
||||
Enable use of NVidia GPUs from within podman containers.
|
||||
Enable use of Nvidia GPUs from within podman containers.
|
||||
'';
|
||||
};
|
||||
|
||||
@@ -170,7 +170,7 @@ in
|
||||
lib.mkIf cfg.enable {
|
||||
warnings = lib.optionals cfg.enableNvidia [
|
||||
''
|
||||
You have set virtualisation.podman.enableNvidia. This option is deprecated, please set virtualisation.containers.cdi.dynamic.nvidia.enable instead.
|
||||
You have set virtualisation.podman.enableNvidia. This option is deprecated, please set hardware.nvidia-container-toolkit.enable instead.
|
||||
''
|
||||
];
|
||||
|
||||
@@ -189,11 +189,6 @@ in
|
||||
enable = true; # Enable common /etc/containers configuration
|
||||
containersConf.settings = {
|
||||
network.network_backend = "netavark";
|
||||
} // lib.optionalAttrs cfg.enableNvidia {
|
||||
engine = {
|
||||
conmon_env_vars = [ "PATH=${lib.makeBinPath [ pkgs.nvidia-podman ]}" ];
|
||||
runtimes.nvidia = [ "${pkgs.nvidia-podman}/bin/nvidia-container-runtime" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -143,6 +143,7 @@ let
|
||||
--transform 'flags=rSh;s|/nix/store/||' \
|
||||
--files-from ${hostPkgs.closureInfo { rootPaths = [ config.system.build.toplevel regInfo ]; }}/store-paths \
|
||||
| ${hostPkgs.erofs-utils}/bin/mkfs.erofs \
|
||||
--quiet \
|
||||
--force-uid=0 \
|
||||
--force-gid=0 \
|
||||
-L ${nixStoreFilesystemLabel} \
|
||||
|
||||
@@ -192,6 +192,7 @@ in {
|
||||
cfssl = handleTestOn ["aarch64-linux" "x86_64-linux"] ./cfssl.nix {};
|
||||
cgit = handleTest ./cgit.nix {};
|
||||
charliecloud = handleTest ./charliecloud.nix {};
|
||||
chromadb = runTest ./chromadb.nix;
|
||||
chromium = (handleTestOn ["aarch64-linux" "x86_64-linux"] ./chromium.nix {}).stable or {};
|
||||
chrony = handleTestOn ["aarch64-linux" "x86_64-linux"] ./chrony.nix {};
|
||||
chrony-ptp = handleTestOn ["aarch64-linux" "x86_64-linux"] ./chrony-ptp.nix {};
|
||||
@@ -545,6 +546,7 @@ in {
|
||||
lomiri-camera-app = runTest ./lomiri-camera-app.nix;
|
||||
lomiri-clock-app = runTest ./lomiri-clock-app.nix;
|
||||
lomiri-filemanager-app = runTest ./lomiri-filemanager-app.nix;
|
||||
lomiri-gallery-app = runTest ./lomiri-gallery-app.nix;
|
||||
lomiri-system-settings = handleTest ./lomiri-system-settings.nix {};
|
||||
lorri = handleTest ./lorri/default.nix {};
|
||||
ly = handleTest ./ly.nix {};
|
||||
@@ -770,6 +772,7 @@ in {
|
||||
php84 = handleTest ./php { php = pkgs.php84; };
|
||||
phylactery = handleTest ./web-apps/phylactery.nix {};
|
||||
pict-rs = handleTest ./pict-rs.nix {};
|
||||
pingvin-share = handleTest ./pingvin-share.nix {} ;
|
||||
pinnwand = handleTest ./pinnwand.nix {};
|
||||
plantuml-server = handleTest ./plantuml-server.nix {};
|
||||
plasma-bigscreen = handleTest ./plasma-bigscreen.nix {};
|
||||
@@ -826,7 +829,7 @@ in {
|
||||
qgis = handleTest ./qgis.nix { qgisPackage = pkgs.qgis; };
|
||||
qgis-ltr = handleTest ./qgis.nix { qgisPackage = pkgs.qgis-ltr; };
|
||||
qownnotes = handleTest ./qownnotes.nix {};
|
||||
qtile = handleTestOn ["x86_64-linux" "aarch64-linux"] ./qtile.nix {};
|
||||
qtile = handleTestOn ["x86_64-linux" "aarch64-linux"] ./qtile/default.nix {};
|
||||
quake3 = handleTest ./quake3.nix {};
|
||||
quicktun = handleTest ./quicktun.nix {};
|
||||
quickwit = handleTest ./quickwit.nix {};
|
||||
|
||||
@@ -27,6 +27,12 @@ in {
|
||||
desc = "some-repo description";
|
||||
};
|
||||
};
|
||||
settings = {
|
||||
readme = [
|
||||
":README.md"
|
||||
":date.txt"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [ pkgs.git ];
|
||||
@@ -56,18 +62,42 @@ in {
|
||||
git init -b master reference
|
||||
cd reference
|
||||
git remote add origin /tmp/git/some-repo
|
||||
date > date.txt
|
||||
{ echo -n "cgit NixOS Test at "; date; } > date.txt
|
||||
git add date.txt
|
||||
git -c user.name=test -c user.email=test@localhost commit -m 'add date'
|
||||
git push -u origin master
|
||||
''}")
|
||||
|
||||
# test web download
|
||||
server.succeed(
|
||||
"curl -fsS 'http://localhost/%28c%29git/some-repo/plain/date.txt?id=master' | diff -u reference/date.txt -"
|
||||
)
|
||||
|
||||
# test http clone
|
||||
server.succeed(
|
||||
"git clone http://localhost/%28c%29git/some-repo && diff -u reference/date.txt some-repo/date.txt"
|
||||
)
|
||||
|
||||
# test list settings by greping for the fallback readme
|
||||
server.succeed(
|
||||
"curl -fsS 'http://localhost/%28c%29git/some-repo/about/' | grep -F 'cgit NixOS Test at'"
|
||||
)
|
||||
|
||||
# add real readme
|
||||
server.succeed("sudo -u cgit ${pkgs.writeShellScript "cgit-commit-readme" ''
|
||||
set -e
|
||||
echo '# cgit NixOS test README' > reference/README.md
|
||||
git -C reference add README.md
|
||||
git -C reference -c user.name=test -c user.email=test@localhost commit -m 'add readme'
|
||||
git -C reference push
|
||||
''}")
|
||||
|
||||
# test list settings by greping for the real readme
|
||||
server.succeed(
|
||||
"curl -fsS 'http://localhost/%28c%29git/some-repo/about/' | grep -F '# cgit NixOS test README'"
|
||||
)
|
||||
server.fail(
|
||||
"curl -fsS 'http://localhost/%28c%29git/some-repo/about/' | grep -F 'cgit NixOS Test at'"
|
||||
)
|
||||
'';
|
||||
})
|
||||
|
||||
26
nixos/tests/chromadb.nix
Normal file
26
nixos/tests/chromadb.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
lib = pkgs.lib;
|
||||
|
||||
in
|
||||
{
|
||||
name = "chromadb";
|
||||
meta.maintainers = [ lib.maintainers.drupol ];
|
||||
|
||||
nodes = {
|
||||
machine =
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
services.chromadb = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.start()
|
||||
machine.wait_for_unit("chromadb.service")
|
||||
machine.wait_for_open_port(8000)
|
||||
'';
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import ./make-test-python.nix ({ lib, pkgs, ... }: {
|
||||
services.dae = {
|
||||
enable = true;
|
||||
config = ''
|
||||
global{}
|
||||
global { disable_waiting_network: true }
|
||||
routing{}
|
||||
'';
|
||||
};
|
||||
|
||||
@@ -4,6 +4,9 @@ import ./make-test-python.nix ({ pkgs, ...} :
|
||||
|
||||
meta = with pkgs.lib.maintainers; {
|
||||
maintainers = [ romildo ];
|
||||
timeout = 600;
|
||||
# OCR tests are flaky
|
||||
broken = true;
|
||||
};
|
||||
|
||||
nodes.machine = { ... }:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
harmonia = {
|
||||
services.harmonia = {
|
||||
enable = true;
|
||||
signKeyPath = pkgs.writeText "cache-key" "cache.example.com-1:9FhO0w+7HjZrhvmzT1VlAZw4OSAlFGTgC24Seg3tmPl4gZBdwZClzTTHr9cVzJpwsRSYLTu7hEAQe3ljy92CWg==";
|
||||
signKeyPaths = [(pkgs.writeText "cache-key" "cache.example.com-1:9FhO0w+7HjZrhvmzT1VlAZw4OSAlFGTgC24Seg3tmPl4gZBdwZClzTTHr9cVzJpwsRSYLTu7hEAQe3ljy92CWg==")];
|
||||
settings.priority = 35;
|
||||
};
|
||||
|
||||
|
||||
@@ -4,6 +4,13 @@ import ./make-test-python.nix (
|
||||
certs = import ./common/acme/server/snakeoil-certs.nix;
|
||||
serverDomain = certs.domain;
|
||||
|
||||
# copy certs to store to work around mount namespacing
|
||||
certsPath = pkgs.runCommandNoCC "snakeoil-certs" { } ''
|
||||
mkdir $out
|
||||
cp ${certs."${serverDomain}".cert} $out/snakeoil.crt
|
||||
cp ${certs."${serverDomain}".key} $out/snakeoil.key
|
||||
'';
|
||||
|
||||
provisionAdminPassword = "very-strong-password-for-admin";
|
||||
provisionIdmAdminPassword = "very-strong-password-for-idm-admin";
|
||||
provisionIdmAdminPassword2 = "very-strong-alternative-password-for-idm-admin";
|
||||
@@ -23,8 +30,8 @@ import ./make-test-python.nix (
|
||||
domain = serverDomain;
|
||||
bindaddress = "[::]:443";
|
||||
ldapbindaddress = "[::1]:636";
|
||||
tls_chain = certs."${serverDomain}".cert;
|
||||
tls_key = certs."${serverDomain}".key;
|
||||
tls_chain = "${certsPath}/snakeoil.crt";
|
||||
tls_key = "${certsPath}/snakeoil.key";
|
||||
};
|
||||
# So we can check whether provisioning did what we wanted
|
||||
enableClient = true;
|
||||
|
||||
@@ -6,6 +6,13 @@ import ./make-test-python.nix ({ pkgs, ... }:
|
||||
testCredentials = {
|
||||
password = "Password1_cZPEwpCWvrReripJmAZdmVIZd8HHoHcl";
|
||||
};
|
||||
|
||||
# copy certs to store to work around mount namespacing
|
||||
certsPath = pkgs.runCommandNoCC "snakeoil-certs" { } ''
|
||||
mkdir $out
|
||||
cp ${certs."${serverDomain}".cert} $out/snakeoil.crt
|
||||
cp ${certs."${serverDomain}".key} $out/snakeoil.key
|
||||
'';
|
||||
in
|
||||
{
|
||||
name = "kanidm";
|
||||
@@ -19,8 +26,8 @@ import ./make-test-python.nix ({ pkgs, ... }:
|
||||
domain = serverDomain;
|
||||
bindaddress = "[::]:443";
|
||||
ldapbindaddress = "[::1]:636";
|
||||
tls_chain = certs."${serverDomain}".cert;
|
||||
tls_key = certs."${serverDomain}".key;
|
||||
tls_chain = "${certsPath}/snakeoil.crt";
|
||||
tls_key = "${certsPath}/snakeoil.key";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ let
|
||||
# NOTE: what featureGates are useful for testing might change in
|
||||
# the future, see link below to find new ones
|
||||
# https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/
|
||||
featureGates = {CPUManager = true; AppArmor= false;};
|
||||
featureGates = {AnonymousAuthConfigurableEndpoints = true; ConsistentListFromCache = false;};
|
||||
masterAddress = "${masterName}.${config.networking.domain}";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -51,8 +51,8 @@ in
|
||||
|
||||
with subtest("the backend starts and responds"):
|
||||
server.wait_for_open_port(${toString backendPort})
|
||||
# wait until succeeds, it just needs few seconds for migrations, but lets give it 10s max
|
||||
server.wait_until_succeeds("curl --fail localhost:${toString backendPort}/api/v3/site", 10)
|
||||
# wait until succeeds, it just needs few seconds for migrations, but lets give it 50s max
|
||||
server.wait_until_succeeds("curl --fail localhost:${toString backendPort}/api/v3/site", 50)
|
||||
|
||||
with subtest("the UI starts and responds"):
|
||||
server.wait_for_unit("lemmy-ui.service")
|
||||
@@ -77,7 +77,7 @@ in
|
||||
server.execute("systemctl stop lemmy-ui.service")
|
||||
|
||||
def assert_http_code(url, expected_http_code, extra_curl_args=""):
|
||||
_, http_code = server.execute(f'curl --silent -o /dev/null {extra_curl_args} --fail --write-out "%{{http_code}}" {url}')
|
||||
_, http_code = server.execute(f'curl --location --silent -o /dev/null {extra_curl_args} --fail --write-out "%{{http_code}}" {url}')
|
||||
assert http_code == str(expected_http_code), f"expected http code {expected_http_code}, got {http_code}"
|
||||
|
||||
# Caddy responds with HTTP code 502 if it cannot handle the requested path
|
||||
|
||||
156
nixos/tests/lomiri-gallery-app.nix
Normal file
156
nixos/tests/lomiri-gallery-app.nix
Normal file
@@ -0,0 +1,156 @@
|
||||
{ lib, ... }:
|
||||
{
|
||||
name = "lomiri-gallery-app-standalone";
|
||||
meta.maintainers = lib.teams.lomiri.members;
|
||||
|
||||
nodes.machine =
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [ ./common/x11.nix ];
|
||||
|
||||
services.xserver.enable = true;
|
||||
|
||||
environment = {
|
||||
systemPackages =
|
||||
with pkgs;
|
||||
[
|
||||
ffmpeg # make a video from the image
|
||||
(imagemagick.override { ghostscriptSupport = true; }) # example image creation
|
||||
mpv # URI dispatching for video support
|
||||
xdotool # mouse movement
|
||||
]
|
||||
++ (with pkgs.lomiri; [
|
||||
suru-icon-theme
|
||||
lomiri-gallery-app
|
||||
lomiri-thumbnailer # finds new images & generates thumbnails
|
||||
]);
|
||||
variables = {
|
||||
UITK_ICON_THEME = "suru";
|
||||
};
|
||||
};
|
||||
|
||||
i18n.supportedLocales = [ "all" ];
|
||||
|
||||
fonts = {
|
||||
packages = with pkgs; [
|
||||
# Intended font & helps with OCR
|
||||
ubuntu-classic
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
enableOCR = true;
|
||||
|
||||
testScript =
|
||||
let
|
||||
imageLabel = "Image";
|
||||
in
|
||||
''
|
||||
machine.wait_for_x()
|
||||
|
||||
with subtest("lomiri gallery launches"):
|
||||
machine.succeed("lomiri-gallery-app >&2 &")
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text(r"(Albums|Events|Photos)")
|
||||
machine.screenshot("lomiri-gallery_open")
|
||||
|
||||
machine.succeed("pkill -f lomiri-gallery-app")
|
||||
|
||||
machine.succeed("mkdir /root/Pictures /root/Videos")
|
||||
# Setup example data, OCR-friendly:
|
||||
# - White square, black text
|
||||
# - uppercase extension
|
||||
machine.succeed("magick -size 500x500 -background white -fill black canvas:white -pointsize 70 -annotate +100+300 '${imageLabel}' /root/Pictures/output.PNG")
|
||||
|
||||
# Different image formats
|
||||
machine.succeed("magick /root/Pictures/output.PNG /root/Pictures/output.JPG")
|
||||
machine.succeed("magick /root/Pictures/output.PNG /root/Pictures/output.BMP")
|
||||
machine.succeed("magick /root/Pictures/output.PNG /root/Pictures/output.GIF")
|
||||
|
||||
# Video for dispatching
|
||||
machine.succeed("ffmpeg -loop 1 -r 1 -i /root/Pictures/output.PNG -t 100 -pix_fmt yuv420p /root/Videos/output.MP4")
|
||||
|
||||
with subtest("lomiri gallery handles files"):
|
||||
machine.succeed("lomiri-gallery-app >&2 &")
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text(r"(Albums|Events|Photos|${imageLabel})")
|
||||
|
||||
machine.succeed("xdotool mousemove 30 40 click 1") # burger menu for categories
|
||||
machine.sleep(2)
|
||||
machine.succeed("xdotool mousemove 30 180 click 1") # photos
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text("${imageLabel}") # should see thumbnail of at least one of them
|
||||
machine.screenshot("lomiri-gallery_photos")
|
||||
|
||||
machine.succeed("xdotool mousemove 80 140 click 1") # select newest one
|
||||
machine.sleep(2)
|
||||
machine.succeed("xdotool mousemove 80 140 click 1") # enable top-bar
|
||||
machine.sleep(2)
|
||||
|
||||
with subtest("lomiri gallery handles mp4"):
|
||||
machine.succeed("xdotool mousemove 870 50 click 1") # open media information
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text("MP4") # make sure we're looking at the right file
|
||||
machine.screenshot("lomiri-gallery_mp4_info")
|
||||
machine.send_key("esc")
|
||||
|
||||
machine.wait_for_text("${imageLabel}") # make sure thumbnail rendering worked
|
||||
|
||||
machine.succeed("xdotool mousemove 450 350 click 1") # dispatch to system's video handler
|
||||
machine.wait_until_succeeds("pgrep -u root -f mpv") # wait for video to start
|
||||
machine.sleep(10)
|
||||
machine.succeed("pgrep -u root -f mpv") # should still be playing
|
||||
machine.screenshot("lomiri-gallery_mp4_dispatch")
|
||||
|
||||
machine.send_key("q")
|
||||
machine.wait_until_fails("pgrep mpv") # wait for video to stop
|
||||
|
||||
machine.send_key("right")
|
||||
|
||||
with subtest("lomiri gallery handles gif"):
|
||||
machine.succeed("xdotool mousemove 870 50 click 1") # open media information
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text("GIF") # make sure we're looking at the right file
|
||||
machine.screenshot("lomiri-gallery_gif_info")
|
||||
machine.send_key("esc")
|
||||
|
||||
machine.wait_for_text("${imageLabel}") # make sure media shows fine
|
||||
machine.send_key("right")
|
||||
|
||||
with subtest("lomiri gallery handles bmp"):
|
||||
machine.succeed("xdotool mousemove 840 50 click 1") # open media information (extra icon, different location)
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text("BMP") # make sure we're looking at the right file
|
||||
machine.screenshot("lomiri-gallery_bmp_info")
|
||||
machine.send_key("esc")
|
||||
|
||||
machine.wait_for_text("${imageLabel}") # make sure media shows fine
|
||||
machine.send_key("right")
|
||||
|
||||
with subtest("lomiri gallery handles jpg"):
|
||||
machine.succeed("xdotool mousemove 840 50 click 1") # open media information (extra icon, different location)
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text("JPG") # make sure we're looking at the right file
|
||||
machine.screenshot("lomiri-gallery_jpg_info")
|
||||
machine.send_key("esc")
|
||||
|
||||
machine.wait_for_text("${imageLabel}") # make sure media shows fine
|
||||
machine.send_key("right")
|
||||
|
||||
with subtest("lomiri gallery handles png"):
|
||||
machine.succeed("xdotool mousemove 840 50 click 1") # open media information (extra icon, different location)
|
||||
machine.sleep(2)
|
||||
machine.wait_for_text("PNG") # make sure we're looking at the right file
|
||||
machine.screenshot("lomiri-gallery_png_info")
|
||||
machine.send_key("esc")
|
||||
|
||||
machine.wait_for_text("${imageLabel}") # make sure media shows fine
|
||||
|
||||
machine.succeed("pkill -f lomiri-gallery-app")
|
||||
|
||||
with subtest("lomiri gallery localisation works"):
|
||||
machine.succeed("env LANG=de_DE.UTF-8 lomiri-gallery-app >&2 &")
|
||||
machine.wait_for_text(r"(Alben|Ereignisse|Fotos)")
|
||||
machine.screenshot("lomiri-gallery_localised")
|
||||
'';
|
||||
}
|
||||
26
nixos/tests/pingvin-share.nix
Normal file
26
nixos/tests/pingvin-share.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
import ./make-test-python.nix (
|
||||
{ lib, ... }:
|
||||
{
|
||||
name = "pingvin-share";
|
||||
meta.maintainers = with lib.maintainers; [ ratcornu ];
|
||||
|
||||
nodes.machine =
|
||||
{ ... }:
|
||||
{
|
||||
services.pingvin-share = {
|
||||
enable = true;
|
||||
|
||||
backend.port = 9010;
|
||||
frontend.port = 9011;
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("pingvin-share-frontend.service")
|
||||
machine.wait_for_open_port(9010)
|
||||
machine.wait_for_open_port(9011)
|
||||
machine.succeed("curl --fail http://127.0.0.1:9010/api/configs")
|
||||
machine.succeed("curl --fail http://127.0.0.1:9011/")
|
||||
'';
|
||||
}
|
||||
)
|
||||
19
nixos/tests/qtile/add-widget.patch
Normal file
19
nixos/tests/qtile/add-widget.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
--- a/config.py 2024-05-31 14:49:23.852287845 +0200
|
||||
+++ b/config.py 2024-05-31 14:51:00.935182266 +0200
|
||||
@@ -29,6 +29,8 @@
|
||||
from libqtile.lazy import lazy
|
||||
from libqtile.utils import guess_terminal
|
||||
|
||||
+from qtile_extras import widget
|
||||
+
|
||||
mod = "mod4"
|
||||
terminal = guess_terminal()
|
||||
|
||||
@@ -162,6 +164,7 @@
|
||||
# NB Systray is incompatible with Wayland, consider using StatusNotifier instead
|
||||
# widget.StatusNotifier(),
|
||||
widget.Systray(),
|
||||
+ widget.AnalogueClock(),
|
||||
widget.Clock(format="%Y-%m-%d %a %I:%M %p"),
|
||||
widget.QuickExit(),
|
||||
],
|
||||
24
nixos/tests/qtile/config.nix
Normal file
24
nixos/tests/qtile/config.nix
Normal file
@@ -0,0 +1,24 @@
|
||||
{ stdenvNoCC, fetchurl }:
|
||||
stdenvNoCC.mkDerivation {
|
||||
name = "qtile-config";
|
||||
version = "0.0.1";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://raw.githubusercontent.com/qtile/qtile/v0.28.1/libqtile/resources/default_config.py";
|
||||
hash = "sha256-Y5W277CWVNSi4BdgEW/f7Px/MMjnN9W9TDqdOncVwPc=";
|
||||
};
|
||||
|
||||
prePatch = ''
|
||||
cp $src config.py
|
||||
'';
|
||||
|
||||
patches = [ ./add-widget.patch ];
|
||||
|
||||
dontUnpack = true;
|
||||
dontBuild = true;
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp config.py $out/config.py
|
||||
'';
|
||||
}
|
||||
@@ -1,15 +1,26 @@
|
||||
import ./make-test-python.nix ({ lib, ...} : {
|
||||
import ../make-test-python.nix ({ lib, ...} : {
|
||||
name = "qtile";
|
||||
|
||||
meta = {
|
||||
maintainers = with lib.maintainers; [ sigmanificient ];
|
||||
};
|
||||
|
||||
nodes.machine = { pkgs, lib, ... }: {
|
||||
imports = [ ./common/x11.nix ./common/user-account.nix ];
|
||||
nodes.machine = { pkgs, lib, ... }: let
|
||||
# We create a custom Qtile configuration file that adds a widget from
|
||||
# qtile-extras to the bar. This ensure that the qtile-extras package
|
||||
# also works, and that extraPackages behave as expected.
|
||||
|
||||
config-deriv = pkgs.callPackage ./config.nix { };
|
||||
in {
|
||||
imports = [ ../common/x11.nix ../common/user-account.nix ];
|
||||
test-support.displayManager.auto.user = "alice";
|
||||
|
||||
services.xserver.windowManager.qtile.enable = true;
|
||||
services.xserver.windowManager.qtile = {
|
||||
enable = true;
|
||||
configFile = "${config-deriv}/config.py";
|
||||
extraPackages = ps: [ ps.qtile-extras ];
|
||||
};
|
||||
|
||||
services.displayManager.defaultSession = lib.mkForce "qtile";
|
||||
|
||||
environment.systemPackages = [ pkgs.kitty ];
|
||||
@@ -269,9 +269,9 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
memtest86 = makeTest {
|
||||
memtest86 = with pkgs.lib; optionalAttrs (meta.availableOn { inherit system; } pkgs.memtest86plus) (makeTest {
|
||||
name = "systemd-boot-memtest86";
|
||||
meta.maintainers = with pkgs.lib.maintainers; [ julienmalka ];
|
||||
meta.maintainers = with maintainers; [ julienmalka ];
|
||||
|
||||
nodes.machine = { pkgs, lib, ... }: {
|
||||
imports = [ common ];
|
||||
@@ -282,7 +282,7 @@ in
|
||||
machine.succeed("test -e /boot/loader/entries/memtest86.conf")
|
||||
machine.succeed("test -e /boot/efi/memtest86/memtest.efi")
|
||||
'';
|
||||
};
|
||||
});
|
||||
|
||||
netbootxyz = makeTest {
|
||||
name = "systemd-boot-netbootxyz";
|
||||
|
||||
@@ -10,6 +10,9 @@ let
|
||||
192.168.2.103 mastodon.local
|
||||
'';
|
||||
|
||||
postgresqlPassword = "thisisnotasecret";
|
||||
redisPassword = "thisisnotasecrettoo";
|
||||
|
||||
in
|
||||
{
|
||||
name = "mastodon-remote-postgresql";
|
||||
@@ -19,9 +22,7 @@ in
|
||||
databases = { config, ... }: {
|
||||
environment = {
|
||||
etc = {
|
||||
"redis/password-redis-db".text = ''
|
||||
ogjhJL8ynrP7MazjYOF6
|
||||
'';
|
||||
"redis/password-redis-db".text = redisPassword;
|
||||
};
|
||||
};
|
||||
networking = {
|
||||
@@ -46,16 +47,19 @@ in
|
||||
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
# TODO remove once https://github.com/NixOS/nixpkgs/pull/266270 is resolved.
|
||||
package = pkgs.postgresql_14;
|
||||
enableTCPIP = true;
|
||||
authentication = ''
|
||||
hostnossl mastodon_local mastodon_test 192.168.2.201/32 md5
|
||||
hostnossl mastodon mastodon 192.168.2.201/32 md5
|
||||
'';
|
||||
ensureDatabases = [ "mastodon" ];
|
||||
ensureUsers = [
|
||||
{
|
||||
name = "mastodon";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
];
|
||||
initialScript = pkgs.writeText "postgresql_init.sql" ''
|
||||
CREATE ROLE mastodon_test LOGIN PASSWORD 'SoDTZcISc3f1M1LJsRLT';
|
||||
CREATE DATABASE mastodon_local TEMPLATE template0 ENCODING UTF8;
|
||||
GRANT ALL PRIVILEGES ON DATABASE mastodon_local TO mastodon_test;
|
||||
CREATE ROLE mastodon LOGIN PASSWORD '${postgresqlPassword}';
|
||||
'';
|
||||
};
|
||||
};
|
||||
@@ -100,12 +104,8 @@ in
|
||||
|
||||
environment = {
|
||||
etc = {
|
||||
"mastodon/password-redis-db".text = ''
|
||||
ogjhJL8ynrP7MazjYOF6
|
||||
'';
|
||||
"mastodon/password-posgressql-db".text = ''
|
||||
SoDTZcISc3f1M1LJsRLT
|
||||
'';
|
||||
"mastodon/password-redis-db".text = redisPassword;
|
||||
"mastodon/password-posgressql-db".text = postgresqlPassword;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -138,8 +138,8 @@ in
|
||||
createLocally = false;
|
||||
host = "192.168.2.102";
|
||||
port = 5432;
|
||||
name = "mastodon_local";
|
||||
user = "mastodon_test";
|
||||
name = "mastodon";
|
||||
user = "mastodon";
|
||||
passwordFile = "/etc/mastodon/password-posgressql-db";
|
||||
};
|
||||
smtp = {
|
||||
|
||||
@@ -34,9 +34,6 @@ in
|
||||
pki.certificateFiles = [ "${cert pkgs}/cert.pem" ];
|
||||
};
|
||||
|
||||
# TODO remove once https://github.com/NixOS/nixpkgs/pull/266270 is resolved.
|
||||
services.postgresql.package = pkgs.postgresql_14;
|
||||
|
||||
services.mastodon = {
|
||||
enable = true;
|
||||
configureNginx = true;
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "squeekboard";
|
||||
version = "1.38.0";
|
||||
version = "1.41.0";
|
||||
|
||||
src = fetchFromGitLab {
|
||||
domain = "gitlab.gnome.org";
|
||||
@@ -30,13 +30,13 @@ stdenv.mkDerivation rec {
|
||||
owner = "Phosh";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
hash = "sha256-ZVSnLH2wLPcOHkU2pO0BgIdGmULMNiacIYMRmhN+bZ8=";
|
||||
hash = "sha256-WHGdA0cEB1nu7vJ+pwjdl8aZzccJ232vsbSGmZohFVo=";
|
||||
};
|
||||
|
||||
cargoDeps = rustPlatform.fetchCargoTarball {
|
||||
inherit src;
|
||||
name = "${pname}-${version}";
|
||||
hash = "sha256-tcn1tRuRlHVTYvc8T/ePfCEPNjih6B9lo/hdX+WwitQ=";
|
||||
hash = "sha256-CRKaH8cA/EhXQna3zCU0Z06zkB9qu6QxPJ4No3NFcs0=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
, fetchgit
|
||||
, fetchzip
|
||||
, fetchpatch
|
||||
, fetchpatch2
|
||||
, alsa-lib
|
||||
, aubio
|
||||
, boost
|
||||
@@ -86,6 +87,12 @@ stdenv.mkDerivation rec {
|
||||
url = "https://github.com/Ardour/ardour/commit/e995daa37529715214c6c4a2587e4134aaaba02f.patch";
|
||||
hash = "sha256-EpXOIIObOwwcNgNma0E3nvaBad3930sagDjBpa+78WI=";
|
||||
})
|
||||
|
||||
# Work around itstools bug #9648
|
||||
(fetchpatch2 {
|
||||
url = "https://github.com/Ardour/ardour/commit/338cd09a4aa1b36b8095dfc14ab534395f9a4a92.patch?full_index=1";
|
||||
hash = "sha256-AvV4aLdkfrxPkE4NX2ETSagq4GjEC+sHCEqdcYvL+CY=";
|
||||
})
|
||||
];
|
||||
|
||||
# Ardour's wscript requires git revision and date to be available.
|
||||
|
||||
@@ -14,17 +14,17 @@
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "listenbrainz-mpd";
|
||||
version = "2.3.7";
|
||||
version = "2.3.8";
|
||||
|
||||
src = fetchFromGitea {
|
||||
domain = "codeberg.org";
|
||||
owner = "elomatreb";
|
||||
repo = "listenbrainz-mpd";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-xnVhPiHhI7VqkSBBlrKJBpdS6kd51DMlKWVnJIo/OQQ=";
|
||||
hash = "sha256-QBc0avci232UIxzTKlS0pjL7cCuvwAFgw6dSwdtYAtU=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-Reglc7UtsFk+VIwg4Q9TIChVrWweuV6yPWxbtTDH6mU=";
|
||||
cargoHash = "sha256-jnDS9tIJ387A2P9oUSYB3tXrXjwwVmQ26erIIlHBkao=";
|
||||
|
||||
nativeBuildInputs = [ pkg-config installShellFiles asciidoctor ];
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
{ lib
|
||||
# Python 3.12 demonstrates a peculiar segmentation fault with pyqt5. Using
|
||||
# pyqt6 with Python 3.12 should work, but this is not released yet.
|
||||
, python311Packages
|
||||
, python312Packages
|
||||
, fetchFromGitHub
|
||||
|
||||
, chromaprint
|
||||
@@ -13,7 +11,7 @@
|
||||
}:
|
||||
|
||||
let
|
||||
pythonPackages = python311Packages;
|
||||
pythonPackages = python312Packages;
|
||||
pyqt5 =
|
||||
if enablePlayback then
|
||||
pythonPackages.pyqt5-multimedia
|
||||
@@ -23,19 +21,20 @@ in
|
||||
pythonPackages.buildPythonApplication rec {
|
||||
pname = "picard";
|
||||
# nix-update --commit picard --version-regex 'release-(.*)'
|
||||
version = "2.12";
|
||||
version = "2.12.1";
|
||||
format = "setuptools";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "metabrainz";
|
||||
repo = "picard";
|
||||
rev = "refs/tags/release-${version}";
|
||||
hash = "sha256-+++NDJzXw4tA5eQd24r+l3UK3YS8Jy1t9WNiEU9sH0Q=";
|
||||
hash = "sha256-wKPE4lj3DIlY+X5A/MqhnwyrhPTXGjmUnLK1VWXUOas=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
gettext
|
||||
qt5.wrapQtAppsHook
|
||||
pythonPackages.pytestCheckHook
|
||||
] ++ lib.optionals (pyqt5.multimediaEnabled) [
|
||||
gst_all_1.gst-libav
|
||||
gst_all_1.gst-plugins-base
|
||||
@@ -68,6 +67,7 @@ pythonPackages.buildPythonApplication rec {
|
||||
preCheck = ''
|
||||
export HOME=$(mktemp -d)
|
||||
'';
|
||||
doCheck = true;
|
||||
|
||||
# In order to spare double wrapping, we use:
|
||||
preFixup = ''
|
||||
@@ -76,12 +76,13 @@ pythonPackages.buildPythonApplication rec {
|
||||
makeWrapperArgs+=(--prefix GST_PLUGIN_SYSTEM_PATH_1_0 : "$GST_PLUGIN_SYSTEM_PATH_1_0")
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
meta = {
|
||||
homepage = "https://picard.musicbrainz.org";
|
||||
changelog = "https://picard.musicbrainz.org/changelog";
|
||||
description = "Official MusicBrainz tagger";
|
||||
mainProgram = "picard";
|
||||
license = licenses.gpl2Plus;
|
||||
platforms = platforms.all;
|
||||
license = lib.licenses.gpl2Plus;
|
||||
platforms = lib.platforms.all;
|
||||
maintainers = with lib.maintainers; [ doronbehar ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -16,13 +16,13 @@ let
|
||||
in
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "psst";
|
||||
version = "unstable-2024-07-29";
|
||||
version = "unstable-2024-08-19";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "jpochyla";
|
||||
repo = pname;
|
||||
rev = "d895cb94623d320f79b364a8f63ab518fddf697b";
|
||||
hash = "sha256-LsveuaDmRvC9TUON847QdzqQDUW1zd37++MbtXrfJjk=";
|
||||
rev = "11bef15e66a3c9b0b991207d09a67c071b3dda02";
|
||||
hash = "sha256-lKxWIUDouUUul7CpuTy30z/cLJAjFE9e0J1zyZ/PnIo=";
|
||||
};
|
||||
|
||||
cargoLock = {
|
||||
|
||||
@@ -54,7 +54,7 @@ index fcbd491..8f6e6f0 100644
|
||||
-pub const GIT_VERSION: &str = git_version!();
|
||||
-pub const BUILD_TIME: &str = include!(concat!(env!("OUT_DIR"), "/build-time.txt"));
|
||||
-pub const REMOTE_URL: &str = include!(concat!(env!("OUT_DIR"), "/remote-url.txt"));
|
||||
+pub const GIT_VERSION: &str = "d895cb94623d320f79b364a8f63ab518fddf697b";
|
||||
+pub const GIT_VERSION: &str = "11bef15e66a3c9b0b991207d09a67c071b3dda02";
|
||||
+pub const BUILD_TIME: &str = "1970-01-01 00:00:00";
|
||||
+pub const REMOTE_URL: &str = "https://github.com/jpochyla/psst";
|
||||
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "pt2-clone";
|
||||
version = "1.69.2";
|
||||
version = "1.70";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "8bitbubsy";
|
||||
repo = "pt2-clone";
|
||||
rev = "v${finalAttrs.version}";
|
||||
sha256 = "sha256-Vy8b9rbYM/bK/mCUW4V4rPeAmoBN/wn7iVBANSboL2Q=";
|
||||
sha256 = "sha256-oGdgvyVIqM4YVxyr5DFBJ+YLtH95vqbNv0arD9yskdo=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake ];
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
{ lib
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, pkg-config
|
||||
, python3Packages
|
||||
, ffmpeg
|
||||
, flac
|
||||
, libjxl
|
||||
, librsvg
|
||||
, game-music-emu
|
||||
, gobject-introspection
|
||||
, gtk3
|
||||
, kissfft
|
||||
, libappindicator
|
||||
, libnotify
|
||||
, libsamplerate
|
||||
, libvorbis
|
||||
, miniaudio
|
||||
, mpg123
|
||||
, libopenmpt
|
||||
, opusfile
|
||||
, wavpack
|
||||
, pango
|
||||
, pulseaudio
|
||||
, withDiscordRPC ? false
|
||||
{
|
||||
lib,
|
||||
stdenv,
|
||||
fetchFromGitHub,
|
||||
kissfft,
|
||||
miniaudio,
|
||||
pkg-config,
|
||||
python3Packages,
|
||||
gobject-introspection,
|
||||
flac,
|
||||
game-music-emu,
|
||||
gtk3,
|
||||
libappindicator,
|
||||
libnotify,
|
||||
libopenmpt,
|
||||
librsvg,
|
||||
libsamplerate,
|
||||
libvorbis,
|
||||
mpg123,
|
||||
opusfile,
|
||||
pango,
|
||||
wavpack,
|
||||
ffmpeg,
|
||||
pulseaudio,
|
||||
withDiscordRPC ? false,
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
@@ -46,26 +46,23 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace tauon.py \
|
||||
--replace 'install_mode = False' 'install_mode = True' \
|
||||
--replace 'install_directory = os.path.dirname(os.path.abspath(__file__))' 'install_directory = "${placeholder "out"}/share/tauon"'
|
||||
--replace-fail 'install_mode = False' 'install_mode = True' \
|
||||
--replace-fail 'install_directory = os.path.dirname(os.path.abspath(__file__))' 'install_directory = "${placeholder "out"}/share/tauon"'
|
||||
|
||||
substituteInPlace t_modules/t_main.py \
|
||||
--replace 'install_mode = False' 'install_mode = True' \
|
||||
--replace 'libopenmpt.so' '${lib.getLib libopenmpt}/lib/libopenmpt.so' \
|
||||
--replace 'lib/libphazor.so' '../../lib/libphazor.so'
|
||||
--replace-fail 'install_mode = False' 'install_mode = True' \
|
||||
--replace-fail 'libopenmpt.so' '${lib.getLib libopenmpt}/lib/libopenmpt.so'
|
||||
|
||||
substituteInPlace t_modules/t_phazor.py \
|
||||
--replace 'lib/libphazor.so' '../../lib/libphazor.so'
|
||||
--replace-fail 'lib/libphazor.so' '../../lib/libphazor.so'
|
||||
|
||||
patchShebangs compile-phazor.sh
|
||||
substituteInPlace compile-phazor.sh --replace-fail 'gcc' '${stdenv.cc.targetPrefix}cc'
|
||||
|
||||
substituteInPlace compile-phazor.sh --replace 'gcc' '${stdenv.cc.targetPrefix}cc'
|
||||
|
||||
substituteInPlace extra/tauonmb.desktop --replace 'Exec=/opt/tauon-music-box/tauonmb.sh' 'Exec=${placeholder "out"}/bin/tauon'
|
||||
substituteInPlace extra/tauonmb.desktop --replace-fail 'Exec=/opt/tauon-music-box/tauonmb.sh' 'Exec=${placeholder "out"}/bin/tauon'
|
||||
'';
|
||||
|
||||
postBuild = ''
|
||||
./compile-phazor.sh
|
||||
bash ./compile-phazor.sh
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [
|
||||
@@ -90,32 +87,38 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
wavpack
|
||||
];
|
||||
|
||||
pythonPath = with python3Packages; [
|
||||
beautifulsoup4
|
||||
gst-python
|
||||
dbus-python
|
||||
isounidecode
|
||||
libjxl
|
||||
musicbrainzngs
|
||||
mutagen
|
||||
natsort
|
||||
pillow
|
||||
plexapi
|
||||
pycairo
|
||||
pychromecast
|
||||
pylast
|
||||
pygobject3
|
||||
pylyrics
|
||||
pysdl2
|
||||
requests
|
||||
send2trash
|
||||
setproctitle
|
||||
] ++ lib.optional withDiscordRPC pypresence
|
||||
pythonPath =
|
||||
with python3Packages;
|
||||
[
|
||||
beautifulsoup4
|
||||
dbus-python
|
||||
isounidecode
|
||||
jxlpy
|
||||
musicbrainzngs
|
||||
mutagen
|
||||
natsort
|
||||
pillow
|
||||
plexapi
|
||||
pycairo
|
||||
pychromecast
|
||||
pylast
|
||||
pygobject3
|
||||
pysdl2
|
||||
requests
|
||||
send2trash
|
||||
setproctitle
|
||||
]
|
||||
++ lib.optional withDiscordRPC pypresence
|
||||
++ lib.optional stdenv.isLinux pulsectl;
|
||||
|
||||
makeWrapperArgs = [
|
||||
"--prefix PATH : ${lib.makeBinPath [ffmpeg]}"
|
||||
"--prefix LD_LIBRARY_PATH : ${pulseaudio}/lib"
|
||||
"--prefix PATH : ${lib.makeBinPath [ ffmpeg ]}"
|
||||
"--prefix LD_LIBRARY_PATH : ${
|
||||
lib.makeLibraryPath [
|
||||
game-music-emu
|
||||
pulseaudio
|
||||
]
|
||||
}"
|
||||
"--prefix PYTHONPATH : $out/share/tauon"
|
||||
"--set GI_TYPELIB_PATH $GI_TYPELIB_PATH"
|
||||
];
|
||||
|
||||
@@ -36,8 +36,8 @@ let
|
||||
pffft-source = fetchFromBitbucket {
|
||||
owner = "jpommier";
|
||||
repo = "pffft";
|
||||
rev = "38946c766c1afecfa4c5945af77913e38b3cec31";
|
||||
sha256 = "1w6g9v9fy7bavqacb6qw1nxhcik2w36cvl2d7b0bh68w0pd70j5q";
|
||||
rev = "fbc4058602803f40dc554b8a5d2bcc694c005f2f";
|
||||
sha256 = "16biji3115232cr1j975hpxw68lfybajlspnhfjcwg8jz2d8ybrf";
|
||||
};
|
||||
fuzzysearchdatabase-source = fetchFromBitbucket {
|
||||
owner = "j_norberg";
|
||||
@@ -64,28 +64,28 @@ let
|
||||
sha256 = "1d3058x6wgzw7b0wai792flk7s6ffw0z4n9sl016v91yjwv7ds3a";
|
||||
};
|
||||
oui-blendish-source = fetchFromGitHub {
|
||||
owner = "AndrewBelt";
|
||||
owner = "VCVRack";
|
||||
repo = "oui-blendish";
|
||||
rev = "2fc6405883f8451944ed080547d073c8f9f31898";
|
||||
sha256 = "/QZFZuI5kSsEvSfMJlcqB1HiZ9Vcf3vqLqWIMEgxQK8=";
|
||||
sha256 = "1bs0654312555vm7nzswsmky4l8759bjdk17pl22p49rw9k4a1px";
|
||||
};
|
||||
simde-source = fetchFromGitHub {
|
||||
owner = "simd-everywhere";
|
||||
repo = "simde";
|
||||
rev = "b309d8951997201e493380a2fd09198c09ae1b4e";
|
||||
sha256 = "1hz8mfbhbiafvim4qrkyvh1yndlhydqkxwhls7cfqa48wkpxfip8";
|
||||
rev = "416091ebdb9e901b29d026633e73167d6353a0b0";
|
||||
sha256 = "064ygc6c737yjx04rydwwhkr4n4s4rbvj27swxwyzvp1h8nka6xf";
|
||||
};
|
||||
tinyexpr-source = fetchFromGitHub {
|
||||
owner = "codeplea";
|
||||
repo = "tinyexpr";
|
||||
rev = "74804b8c5d296aad0866bbde6c27e2bc1d85e5f2";
|
||||
sha256 = "0z3r7wfw7p2wwl6wls2nxacirppr2147yz29whxmjaxy89ic1744";
|
||||
rev = "9907207e5def0fabdb60c443517b0d9e9d521393";
|
||||
sha256 = "0xbpd09zvrk2ppm1qm1skk6p50mqr9mzjixv3s0biqq6jpabs88l";
|
||||
};
|
||||
fundamental-source = fetchFromGitHub {
|
||||
owner = "VCVRack";
|
||||
repo = "Fundamental";
|
||||
rev = "962547d7651260fb6a04f4d8aafd7c27f0221bee"; # tip of branch v2
|
||||
sha256 = "066gcjkni8ba98vv0di59x3f9piir0vyy5sb53cqrbrl51x853cg";
|
||||
rev = "5ed79544161e0fa9a55faa7c0a5f299e828e12ab"; # tip of branch v2
|
||||
sha256 = "0c6qpigyr0ppvra20hcy1fdcmqa212jckb9wkx4f6fgdby7565wv";
|
||||
};
|
||||
vcv-rtaudio = stdenv.mkDerivation rec {
|
||||
pname = "vcv-rtaudio";
|
||||
@@ -112,7 +112,7 @@ let
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "vcv-rack";
|
||||
version = "2.4.1";
|
||||
version = "2.5.1";
|
||||
|
||||
desktopItems = [
|
||||
(makeDesktopItem {
|
||||
@@ -132,7 +132,7 @@ stdenv.mkDerivation rec {
|
||||
owner = "VCVRack";
|
||||
repo = "Rack";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-Gn/sFltLXX2mLv4dDqmr/UPd+JBXVkIZGwMI6Rm0Ih4=";
|
||||
sha256 = "1q2bwjfn6crk9lyd6m3py0v754arw1xgpv5kkj6ka1bc2yz839qh";
|
||||
};
|
||||
|
||||
patches = [
|
||||
|
||||
@@ -23,16 +23,16 @@
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "ludusavi";
|
||||
version = "0.24.3";
|
||||
version = "0.25.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "mtkennerly";
|
||||
repo = "ludusavi";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-FtLLj5uFcKuRTCSsSuyj0XGzFMVWQvVk4dTmBCmzfNs=";
|
||||
hash = "sha256-GjecssOc5xVni73uNRQ/GaZmIdM9r09I8GpPK+jwoAY=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-xC6HiXt8cfrDtno9IrOe8SP7WBL79paLI223fjxPsbg=";
|
||||
cargoHash = "sha256-9QaQjb7bdDl4NWKbV+dfu9BgFU8NO3CZEvKSXujMUtI=";
|
||||
|
||||
nativeBuildInputs = [
|
||||
cmake
|
||||
|
||||
49
pkgs/applications/blockchains/polkadot/Cargo.lock
generated
49
pkgs/applications/blockchains/polkadot/Cargo.lock
generated
@@ -4124,7 +4124,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cumulus-primitives-storage-weight-reclaim"
|
||||
version = "7.0.0"
|
||||
version = "7.0.1"
|
||||
dependencies = [
|
||||
"cumulus-primitives-core",
|
||||
"cumulus-primitives-proof-size-hostfunction",
|
||||
@@ -4142,11 +4142,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cumulus-primitives-timestamp"
|
||||
version = "0.15.0"
|
||||
version = "0.15.1"
|
||||
dependencies = [
|
||||
"cumulus-primitives-core",
|
||||
"futures",
|
||||
"parity-scale-codec",
|
||||
"sp-inherents",
|
||||
"sp-timestamp",
|
||||
]
|
||||
@@ -5961,7 +5959,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "frame-system"
|
||||
version = "37.0.0"
|
||||
version = "37.1.0"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"criterion",
|
||||
@@ -8383,9 +8381,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.6.4"
|
||||
version = "2.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||
|
||||
[[package]]
|
||||
name = "memfd"
|
||||
@@ -12614,7 +12612,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot"
|
||||
version = "16.0.0"
|
||||
version = "16.0.1"
|
||||
dependencies = [
|
||||
"assert_cmd",
|
||||
"color-eyre",
|
||||
@@ -12691,7 +12689,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-availability-distribution"
|
||||
version = "17.0.0"
|
||||
version = "17.0.1"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"derive_more",
|
||||
@@ -13084,7 +13082,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-node-core-candidate-validation"
|
||||
version = "17.0.0"
|
||||
version = "17.1.0"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"async-trait",
|
||||
@@ -13101,8 +13099,10 @@ dependencies = [
|
||||
"polkadot-parachain-primitives",
|
||||
"polkadot-primitives",
|
||||
"polkadot-primitives-test-helpers",
|
||||
"sp-application-crypto",
|
||||
"sp-core",
|
||||
"sp-keyring",
|
||||
"sp-keystore",
|
||||
"sp-maybe-compressed-blob",
|
||||
"tracing-gum",
|
||||
]
|
||||
@@ -13194,26 +13194,20 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-node-core-prospective-parachains"
|
||||
version = "16.0.0"
|
||||
version = "16.1.0"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"bitvec",
|
||||
"fatality",
|
||||
"futures",
|
||||
"parity-scale-codec",
|
||||
"polkadot-node-primitives",
|
||||
"polkadot-node-subsystem",
|
||||
"polkadot-node-subsystem-test-helpers",
|
||||
"polkadot-node-subsystem-types",
|
||||
"polkadot-node-subsystem-util",
|
||||
"polkadot-primitives",
|
||||
"polkadot-primitives-test-helpers",
|
||||
"rand",
|
||||
"rstest",
|
||||
"sc-keystore",
|
||||
"sp-application-crypto",
|
||||
"sp-core",
|
||||
"sp-keyring",
|
||||
"sp-keystore",
|
||||
"sp-tracing",
|
||||
"thiserror",
|
||||
"tracing-gum",
|
||||
]
|
||||
@@ -13519,7 +13513,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-node-subsystem-types"
|
||||
version = "17.0.0"
|
||||
version = "17.1.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"bitvec",
|
||||
@@ -13548,7 +13542,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-node-subsystem-util"
|
||||
version = "17.0.0"
|
||||
version = "17.1.0"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"async-trait",
|
||||
@@ -13868,7 +13862,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-runtime-parachains"
|
||||
version = "16.0.0"
|
||||
version = "16.0.1"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"bitflags 1.3.2",
|
||||
@@ -14429,7 +14423,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "polkadot-service"
|
||||
version = "17.0.0"
|
||||
version = "17.0.1"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"async-trait",
|
||||
@@ -17189,7 +17183,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sc-consensus-grandpa"
|
||||
version = "0.29.0"
|
||||
version = "0.29.1"
|
||||
dependencies = [
|
||||
"ahash 0.8.11",
|
||||
"array-bytes",
|
||||
@@ -18642,12 +18636,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.114"
|
||||
version = "1.0.121"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
|
||||
checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609"
|
||||
dependencies = [
|
||||
"indexmap 2.2.3",
|
||||
"itoa",
|
||||
"memchr",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
@@ -19690,7 +19685,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sp-blockchain"
|
||||
version = "37.0.0"
|
||||
version = "37.0.1"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"parity-scale-codec",
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{ fetchFromGitHub
|
||||
, fetchpatch
|
||||
, lib
|
||||
, openssl
|
||||
, pkg-config
|
||||
@@ -18,13 +17,13 @@ let
|
||||
in
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "polkadot";
|
||||
version = "stable2407";
|
||||
version = "stable2407-1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "paritytech";
|
||||
repo = "polkadot-sdk";
|
||||
rev = "polkadot-${version}";
|
||||
hash = "sha256-g+jReHOAkaWjr1yJILFL4mSYGEfRBlSCrUHp8ro22SA=";
|
||||
hash = "sha256-IYRkXmFBjRAYSROL37EgEjC7wM1N97HabuSHtcSUxdg=";
|
||||
|
||||
# the build process of polkadot requires a .git folder in order to determine
|
||||
# the git commit hash that is being built and add it to the version string.
|
||||
@@ -52,15 +51,6 @@ rustPlatform.buildRustPackage rec {
|
||||
};
|
||||
};
|
||||
|
||||
cargoPatches = [
|
||||
# NOTE: bump `time` dependency to be able to build with rust 1.80
|
||||
# should be removed on the next release
|
||||
(fetchpatch {
|
||||
url = "https://github.com/paritytech/polkadot-sdk/pull/5149.patch";
|
||||
hash = "sha256-FNG9XLeMRJOT6k7mcs6GemtQ3oUrH/hOYG0JNQP0akU=";
|
||||
})
|
||||
];
|
||||
|
||||
buildType = "production";
|
||||
|
||||
cargoBuildFlags = [ "-p" "polkadot" ];
|
||||
|
||||
@@ -23,10 +23,6 @@ lib.packagesFromDirectoryRecursive {
|
||||
inherit (pkgs) basedpyright git go gopls python3;
|
||||
};
|
||||
|
||||
matrix-client = callPackage ./manual-packages/matrix-client {
|
||||
_map = self.map;
|
||||
};
|
||||
|
||||
structured-haskell-mode = self.shm;
|
||||
|
||||
texpresso = callPackage ./manual-packages/texpresso { inherit (pkgs) texpresso; };
|
||||
@@ -48,5 +44,6 @@ lib.packagesFromDirectoryRecursive {
|
||||
ess-R-object-popup = throw "emacsPackages.ess-R-object-popup was deleted, since the upstream repo looks abandoned."; # Added 2024-07-15
|
||||
ghc-mod = throw "emacsPackages.ghc-mod was deleted because it is deprecated, use haskell-language-server instead."; # Added 2024-07-17
|
||||
haskell-unicode-input-method = throw "emacsPackages.haskell-unicode-input-method is contained in emacsPackages.haskell-mode, please use that instead."; # Added 2024-07-17
|
||||
matrix-client = throw "emacsPackages.matrix-client is deprecated in favor of emacsPackages.ement."; # Added 2024-08-17
|
||||
perl-completion = throw "emacsPackages.perl-completion was removed, since it is broken."; # Added 2024-07-19
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ melpaBuild {
|
||||
popon
|
||||
];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -15,6 +15,8 @@ melpaBuild {
|
||||
|
||||
files = ''("acm/*.el" "acm/icons")'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
description = "Asynchronous Completion Menu";
|
||||
homepage = "https://github.com/manateelazycat/lsp-bridge";
|
||||
|
||||
@@ -8,6 +8,8 @@ melpaBuild {
|
||||
|
||||
files = ''("src/data/emacs-mode/*.el")'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
inherit (Agda.meta) homepage license;
|
||||
description = "Agda2-mode for Emacs extracted from Agda package";
|
||||
|
||||
@@ -25,6 +25,8 @@ melpaBuild {
|
||||
})
|
||||
];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = gitUpdater { };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -13,6 +13,8 @@ melpaBuild {
|
||||
hash = "sha256-JCrmS3FSGDHSR+eAR0X/uO0nAgd3TUmFxwEVH5+KV+4=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
homepage = "https://www.emacswiki.org/emacs/control-lock.el";
|
||||
description = "Like caps-lock, but for your control key";
|
||||
|
||||
@@ -30,6 +30,8 @@ melpaBuild {
|
||||
|
||||
propagatedUserEnvPkgs = [ nodejs ];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
description = "Unofficial copilot plugin for Emacs";
|
||||
homepage = "https://github.com/copilot-emacs/copilot.el";
|
||||
|
||||
@@ -13,6 +13,8 @@ melpaBuild rec {
|
||||
hash = "sha256-GFEDWT88Boz/DxEcmFgf7u2NOoMjAN05yRiYwoYtvXc=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
homepage = "https://gitweb.gentoo.org/proj/ebuild-mode.git/";
|
||||
description = "Major modes for Gentoo package files";
|
||||
|
||||
@@ -21,6 +21,8 @@ melpaBuild {
|
||||
|
||||
files = ''(:defaults "msg")'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { tagPrefix = "v"; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -27,6 +27,8 @@ melpaBuild {
|
||||
make
|
||||
'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -16,6 +16,8 @@ melpaBuild {
|
||||
hash = "sha256-DIGvnotSQYIgHxGxtyCALHd8ZbrfkmdvjLXlkcqQ6v4=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -23,6 +23,8 @@ melpaBuild {
|
||||
markdown-mode
|
||||
];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -17,6 +17,8 @@ melpaBuild {
|
||||
hash = "sha256-er+knxqAejgKAtOnhqHfsGN286biHFdeMIUlbW7JyYw=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -16,6 +16,8 @@ melpaBuild {
|
||||
hash = "sha256-xwVCAdxnIRHrFNWvtlM3u6CShsUiGgl1CiBTsp2x7IM=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -16,6 +16,8 @@ melpaBuild {
|
||||
hash = "sha256-3QDw4W3FbFvb2zpkDHAo9BJKxs3LaehyvUVJPKqS9RE=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -22,6 +22,8 @@ melpaBuild {
|
||||
helm
|
||||
];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
homepage = "https://github.com/emacsmirror/helm-words";
|
||||
description = "Helm extension for looking up words in dictionaries and thesauri";
|
||||
|
||||
@@ -16,6 +16,8 @@ melpaBuild {
|
||||
|
||||
packageRequires = [ haskell-mode ];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
inherit (hsc3.meta) homepage license;
|
||||
description = "Emacs mode for hsc3";
|
||||
|
||||
@@ -16,6 +16,8 @@ melpaBuild {
|
||||
hash = "sha256-Xbt0D9EgmvN1hDTeLbdxq1ARHObj8M4GfH2sbFILRTI=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -24,6 +24,8 @@ melpaBuild {
|
||||
prop-menu
|
||||
];
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = gitUpdater { };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -17,6 +17,8 @@ melpaBuild {
|
||||
hash = "sha256-h/jkIWjkLFbtBp9F+lhA3CulYy2XaeloLmexR0CDm3E=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -16,6 +16,8 @@ melpaBuild {
|
||||
hash = "sha256-Xli7TxBenl5cDMJv3Qz7ZELFpvJKStMploLpf9a+uoA=";
|
||||
};
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -27,6 +27,8 @@ melpaBuild rec {
|
||||
mv tmp.el jam-mode.el
|
||||
'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
description = "Emacs major mode for editing Jam files";
|
||||
license = lib.licenses.gpl2Plus;
|
||||
|
||||
@@ -19,6 +19,8 @@ melpaBuild {
|
||||
|
||||
files = ''("tools/emacs/ligo-mode.el")'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -9,6 +9,8 @@ melpaBuild {
|
||||
"llvm/utils/emacs/README")
|
||||
'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = {
|
||||
inherit (llvmPackages.llvm.meta) homepage license;
|
||||
description = "Major mode for the LLVM assembler language";
|
||||
|
||||
@@ -87,6 +87,8 @@ melpaBuild {
|
||||
|
||||
__darwinAllowLocalNetworking = true;
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru.updateScript = unstableGitUpdater { hardcodeZeroVersion = true; };
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -24,6 +24,8 @@ melpaBuild {
|
||||
# to compile lspce.el, it needs lspce-module.so
|
||||
files = ''(:defaults "${lib.getLib lspce-module}/lib/lspce-module.*")'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
passthru = {
|
||||
inherit lspce-module;
|
||||
updateScript = nix-update-script {
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
melpaBuild,
|
||||
fetchFromGitHub,
|
||||
fetchpatch,
|
||||
# Emacs packages
|
||||
_map,
|
||||
a,
|
||||
anaphora,
|
||||
cl-lib,
|
||||
dash,
|
||||
dash-functional,
|
||||
esxml,
|
||||
f,
|
||||
frame-purpose,
|
||||
ht,
|
||||
ov,
|
||||
rainbow-identifiers,
|
||||
request,
|
||||
s,
|
||||
tracking,
|
||||
}:
|
||||
|
||||
melpaBuild {
|
||||
pname = "matrix-client";
|
||||
version = "0.3.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "alphapapa";
|
||||
repo = "matrix-client.el";
|
||||
rev = "d2ac55293c96d4c95971ed8e2a3f6f354565c5ed";
|
||||
hash = "sha256-GLM8oCbm6PdEZPsM0ogMtNJr8mWjCKoX6ed5AUrYjuk=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# Fix: avatar loading when imagemagick support is not available
|
||||
(fetchpatch {
|
||||
url = "https://github.com/alphapapa/matrix-client.el/commit/5f49e615c7cf2872f48882d3ee5c4a2bff117d07.patch";
|
||||
hash = "sha256-dXUa/HKDe+UjaXYTvgwPdXDuDcHB2HLPGWHboE+Lex0=";
|
||||
})
|
||||
];
|
||||
|
||||
packageRequires = [
|
||||
_map
|
||||
a
|
||||
anaphora
|
||||
cl-lib
|
||||
dash
|
||||
dash-functional
|
||||
esxml
|
||||
f
|
||||
frame-purpose
|
||||
ht
|
||||
ov
|
||||
rainbow-identifiers
|
||||
request
|
||||
s
|
||||
tracking
|
||||
];
|
||||
|
||||
meta = {
|
||||
description = "Chat client and API wrapper for Matrix.org";
|
||||
license = lib.licenses.gpl3Plus;
|
||||
};
|
||||
}
|
||||
@@ -27,6 +27,8 @@ elpaBuild {
|
||||
popd
|
||||
'';
|
||||
|
||||
ignoreCompilationError = false;
|
||||
|
||||
meta = mu.meta // {
|
||||
description = "Full-featured e-mail client";
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user