Merge branch 'master' into package-petsc-p4est
This commit is contained in:
commit
705afbd338
2
.github/workflows/periodic-merge-24h.yml
vendored
2
.github/workflows/periodic-merge-24h.yml
vendored
@ -11,7 +11,7 @@ name: "Periodic Merges (24h)"
|
||||
on:
|
||||
schedule:
|
||||
# * is a special character in YAML so you have to quote this string
|
||||
# Merge every 6 hours
|
||||
# Merge every 24 hours
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
|
@ -56,16 +56,7 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
|
||||
|
||||
## steam-run {#sec-steam-run}
|
||||
|
||||
The FHS-compatible chroot used for steam can also be used to run other linux games that expect a FHS environment. To do it, add
|
||||
|
||||
```nix
|
||||
pkgs.steam.override ({
|
||||
nativeOnly = true;
|
||||
newStdcpp = true;
|
||||
}).run
|
||||
```
|
||||
|
||||
to your configuration, rebuild, and run the game with
|
||||
The FHS-compatible chroot used for Steam can also be used to run other Linux games that expect a FHS environment. To use it, install the `steam-run-native` package and run the game with
|
||||
|
||||
```
|
||||
steam-run ./foo
|
||||
|
@ -241,7 +241,7 @@ let
|
||||
git
|
||||
# replace with beam.packages.erlang.elixir_1_11 if you need
|
||||
beam.packages.erlang.elixir
|
||||
nodejs-15_x
|
||||
nodejs
|
||||
postgresql_13
|
||||
# only used for frontend dependencies
|
||||
# you are free to use yarn2nix as well
|
||||
|
@ -439,7 +439,7 @@ The following example shows which arguments are given to `buildPythonPackage` in
|
||||
order to build [`datashape`](https://github.com/blaze/datashape).
|
||||
|
||||
```nix
|
||||
{ lib, buildPythonPackage, fetchPypi, numpy, multipledispatch, dateutil, pytest }:
|
||||
{ lib, buildPythonPackage, fetchPypi, numpy, multipledispatch, python-dateutil, pytest }:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "datashape";
|
||||
@ -451,7 +451,7 @@ buildPythonPackage rec {
|
||||
};
|
||||
|
||||
checkInputs = [ pytest ];
|
||||
propagatedBuildInputs = [ numpy multipledispatch dateutil ];
|
||||
propagatedBuildInputs = [ numpy multipledispatch python-dateutil ];
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/ContinuumIO/datashape";
|
||||
@ -463,7 +463,7 @@ buildPythonPackage rec {
|
||||
```
|
||||
|
||||
We can see several runtime dependencies, `numpy`, `multipledispatch`, and
|
||||
`dateutil`. Furthermore, we have one `checkInputs`, i.e. `pytest`. `pytest` is a
|
||||
`python-dateutil`. Furthermore, we have one `checkInputs`, i.e. `pytest`. `pytest` is a
|
||||
test runner and is only used during the `checkPhase` and is therefore not added
|
||||
to `propagatedBuildInputs`.
|
||||
|
||||
|
@ -95,7 +95,7 @@ rec {
|
||||
result with the specified separator interspersed between
|
||||
elements.
|
||||
|
||||
Type: concatMapStringsSep :: string -> (string -> string) -> [string] -> string
|
||||
Type: concatMapStringsSep :: string -> (a -> string) -> [a] -> string
|
||||
|
||||
Example:
|
||||
concatMapStringsSep "-" (x: toUpper x) ["foo" "bar" "baz"]
|
||||
@ -112,7 +112,7 @@ rec {
|
||||
/* Same as `concatMapStringsSep`, but the mapping function
|
||||
additionally receives the position of its argument.
|
||||
|
||||
Type: concatIMapStringsSep :: string -> (int -> string -> string) -> [string] -> string
|
||||
Type: concatIMapStringsSep :: string -> (int -> a -> string) -> [a] -> string
|
||||
|
||||
Example:
|
||||
concatImapStringsSep "-" (pos: x: toString (x / pos)) [ 6 6 6 ]
|
||||
|
@ -4061,6 +4061,12 @@
|
||||
github = "gytis-ivaskevicius";
|
||||
githubId = 23264966;
|
||||
};
|
||||
hagl = {
|
||||
email = "harald@glie.be";
|
||||
github = "hagl";
|
||||
githubId = 1162118;
|
||||
name = "Harald Gliebe";
|
||||
};
|
||||
hakuch = {
|
||||
email = "hakuch@gmail.com";
|
||||
github = "hakuch";
|
||||
@ -8192,6 +8198,12 @@
|
||||
githubId = 1179566;
|
||||
name = "Nicolas B. Pierron";
|
||||
};
|
||||
pimeys = {
|
||||
email = "julius@nauk.io";
|
||||
github = "pimeys";
|
||||
githubId = 34967;
|
||||
name = "Julius de Bruijn";
|
||||
};
|
||||
pingiun = {
|
||||
email = "nixos@pingiun.com";
|
||||
github = "pingiun";
|
||||
@ -10638,6 +10650,12 @@
|
||||
github = "totoroot";
|
||||
githubId = 39650930;
|
||||
};
|
||||
ToxicFrog = {
|
||||
email = "toxicfrog@ancilla.ca";
|
||||
github = "ToxicFrog";
|
||||
githubId = 90456;
|
||||
name = "Rebecca (Bex) Kelly";
|
||||
};
|
||||
travisbhartwell = {
|
||||
email = "nafai@travishartwell.net";
|
||||
github = "travisbhartwell";
|
||||
@ -10788,6 +10806,12 @@
|
||||
githubId = 347983;
|
||||
name = "Udo Spallek";
|
||||
};
|
||||
ulrikstrid = {
|
||||
email = "ulrik.strid@outlook.com";
|
||||
github = "ulrikstrid";
|
||||
githubId = 1607770;
|
||||
name = "Ulrik Strid";
|
||||
};
|
||||
unode = {
|
||||
email = "alves.rjc@gmail.com";
|
||||
github = "unode";
|
||||
|
@ -17,9 +17,9 @@ trap "rm ${tmpfile}" 0
|
||||
|
||||
echo "Remember that you need to manually run 'maintainers/scripts/haskell/hydra-report.hs get-report' sometime before running this script."
|
||||
echo "Generating a list of broken builds and displaying for manual confirmation ..."
|
||||
maintainers/scripts/haskell/hydra-report.hs mark-broken-list | sort -i > $tmpfile
|
||||
maintainers/scripts/haskell/hydra-report.hs mark-broken-list | sort -i > "$tmpfile"
|
||||
|
||||
$EDITOR $tmpfile
|
||||
$EDITOR "$tmpfile"
|
||||
|
||||
tail -n +3 "$broken_config" >> "$tmpfile"
|
||||
|
||||
@ -28,10 +28,11 @@ broken-packages:
|
||||
# These packages don't compile.
|
||||
EOF
|
||||
|
||||
# clear environment here to avoid things like allowing broken builds in
|
||||
sort -iu "$tmpfile" >> "$broken_config"
|
||||
maintainers/scripts/haskell/regenerate-hackage-packages.sh
|
||||
maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh
|
||||
maintainers/scripts/haskell/regenerate-hackage-packages.sh
|
||||
env -i maintainers/scripts/haskell/regenerate-hackage-packages.sh
|
||||
env -i maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh
|
||||
env -i maintainers/scripts/haskell/regenerate-hackage-packages.sh
|
||||
|
||||
if [[ "${1:-}" == "--do-commit" ]]; then
|
||||
git add $broken_config
|
||||
|
@ -30,6 +30,12 @@ If NixOS fails to boot, there are a number of kernel command line parameters tha
|
||||
|
||||
: Make systemd very verbose and send log messages to the console instead of the journal. For more parameters recognised by systemd, see systemd(1).
|
||||
|
||||
In addition, these arguments are recognised by the live image only:
|
||||
|
||||
`live.nixos.passwd=password`
|
||||
|
||||
: Set the password for the `nixos` live user. This can be used for SSH access if there are issues using the terminal.
|
||||
|
||||
Notice that for `boot.shell_on_fail`, `boot.debug1`, `boot.debug1devices`, and `boot.debug1mounts`, if you did **not** select "start the new shell as pid 1", and you `exit` from the new shell, boot will proceed normally from the point where it failed, as if you'd chosen "ignore the error and continue".
|
||||
|
||||
If no login prompts or X11 login screens appear (e.g. due to hanging dependencies), you can press Alt+ArrowUp. If you’re lucky, this will start rescue mode (described above). (Also note that since most units have a 90-second timeout before systemd gives up on them, the `agetty` login prompts should appear eventually unless something is very wrong.)
|
||||
|
@ -13,7 +13,7 @@ xlink:href="https://github.com/NixOS/nixpkgs/tree/master/nixos/tests">nixos/test
|
||||
one or more virtual machines containing the NixOS system(s) required for the
|
||||
test.
|
||||
</para>
|
||||
<xi:include href="writing-nixos-tests.xml" />
|
||||
<xi:include href="running-nixos-tests.xml" />
|
||||
<xi:include href="running-nixos-tests-interactively.xml" />
|
||||
<xi:include href="../from_md/development/writing-nixos-tests.section.xml" />
|
||||
<xi:include href="../from_md/development/running-nixos-tests.section.xml" />
|
||||
<xi:include href="../from_md/development/running-nixos-tests-interactively.section.xml" />
|
||||
</chapter>
|
||||
|
@ -0,0 +1,44 @@
|
||||
# Running Tests interactively {#sec-running-nixos-tests-interactively}
|
||||
|
||||
The test itself can be run interactively. This is particularly useful
|
||||
when developing or debugging a test:
|
||||
|
||||
```ShellSession
|
||||
$ nix-build nixos/tests/login.nix -A driverInteractive
|
||||
$ ./result/bin/nixos-test-driver
|
||||
starting VDE switch for network 1
|
||||
>
|
||||
```
|
||||
|
||||
You can then take any Python statement, e.g.
|
||||
|
||||
```py
|
||||
> start_all()
|
||||
> test_script()
|
||||
> machine.succeed("touch /tmp/foo")
|
||||
> print(machine.succeed("pwd")) # Show stdout of command
|
||||
```
|
||||
|
||||
The function `test_script` executes the entire test script and drops you
|
||||
back into the test driver command line upon its completion. This allows
|
||||
you to inspect the state of the VMs after the test (e.g. to debug the
|
||||
test script).
|
||||
|
||||
To just start and experiment with the VMs, run:
|
||||
|
||||
```ShellSession
|
||||
$ nix-build nixos/tests/login.nix -A driverInteractive
|
||||
$ ./result/bin/nixos-run-vms
|
||||
```
|
||||
|
||||
The script `nixos-run-vms` starts the virtual machines defined by test.
|
||||
|
||||
You can re-use the VM states coming from a previous run by setting the
|
||||
`--keep-vm-state` flag.
|
||||
|
||||
```ShellSession
|
||||
$ ./result/bin/nixos-run-vms --keep-vm-state
|
||||
```
|
||||
|
||||
The machine state is stored in the `$TMPDIR/vm-state-machinename`
|
||||
directory.
|
@ -1,49 +0,0 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-running-nixos-tests-interactively">
|
||||
<title>Running Tests interactively</title>
|
||||
|
||||
<para>
|
||||
The test itself can be run interactively. This is particularly useful when
|
||||
developing or debugging a test:
|
||||
<screen>
|
||||
<prompt>$ </prompt>nix-build nixos/tests/login.nix -A driverInteractive
|
||||
<prompt>$ </prompt>./result/bin/nixos-test-driver
|
||||
starting VDE switch for network 1
|
||||
<prompt>></prompt>
|
||||
</screen>
|
||||
You can then take any Python statement, e.g.
|
||||
<screen>
|
||||
<prompt>></prompt> start_all()
|
||||
<prompt>></prompt> test_script()
|
||||
<prompt>></prompt> machine.succeed("touch /tmp/foo")
|
||||
<prompt>></prompt> print(machine.succeed("pwd")) # Show stdout of command
|
||||
</screen>
|
||||
The function <command>test_script</command> executes the entire test script
|
||||
and drops you back into the test driver command line upon its completion.
|
||||
This allows you to inspect the state of the VMs after the test (e.g. to debug
|
||||
the test script).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To just start and experiment with the VMs, run:
|
||||
<screen>
|
||||
<prompt>$ </prompt>nix-build nixos/tests/login.nix -A driverInteractive
|
||||
<prompt>$ </prompt>./result/bin/nixos-run-vms
|
||||
</screen>
|
||||
The script <command>nixos-run-vms</command> starts the virtual machines
|
||||
defined by test.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You can re-use the VM states coming from a previous run
|
||||
by setting the <command>--keep-vm-state</command> flag.
|
||||
<screen>
|
||||
<prompt>$ </prompt>./result/bin/nixos-run-vms --keep-vm-state
|
||||
</screen>
|
||||
The machine state is stored in the
|
||||
<filename>$TMPDIR/vm-state-</filename><varname>machinename</varname> directory.
|
||||
</para>
|
||||
</section>
|
31
nixos/doc/manual/development/running-nixos-tests.section.md
Normal file
31
nixos/doc/manual/development/running-nixos-tests.section.md
Normal file
@ -0,0 +1,31 @@
|
||||
# Running Tests {#sec-running-nixos-tests}
|
||||
|
||||
You can run tests using `nix-build`. For example, to run the test
|
||||
[`login.nix`](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/login.nix),
|
||||
you just do:
|
||||
|
||||
```ShellSession
|
||||
$ nix-build '<nixpkgs/nixos/tests/login.nix>'
|
||||
```
|
||||
|
||||
or, if you don't want to rely on `NIX_PATH`:
|
||||
|
||||
```ShellSession
|
||||
$ cd /my/nixpkgs/nixos/tests
|
||||
$ nix-build login.nix
|
||||
…
|
||||
running the VM test script
|
||||
machine: QEMU running (pid 8841)
|
||||
…
|
||||
6 out of 6 tests succeeded
|
||||
```
|
||||
|
||||
After building/downloading all required dependencies, this will perform
|
||||
a build that starts a QEMU/KVM virtual machine containing a NixOS
|
||||
system. The virtual machine mounts the Nix store of the host; this makes
|
||||
VM creation very fast, as no disk image needs to be created. Afterwards,
|
||||
you can view a pretty-printed log of the test:
|
||||
|
||||
```ShellSession
|
||||
$ firefox result/log.html
|
||||
```
|
@ -1,36 +0,0 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-running-nixos-tests">
|
||||
<title>Running Tests</title>
|
||||
|
||||
<para>
|
||||
You can run tests using <command>nix-build</command>. For example, to run the
|
||||
test
|
||||
<filename
|
||||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/login.nix">login.nix</filename>,
|
||||
you just do:
|
||||
<screen>
|
||||
<prompt>$ </prompt>nix-build '<nixpkgs/nixos/tests/login.nix>'
|
||||
</screen>
|
||||
or, if you don’t want to rely on <envar>NIX_PATH</envar>:
|
||||
<screen>
|
||||
<prompt>$ </prompt>cd /my/nixpkgs/nixos/tests
|
||||
<prompt>$ </prompt>nix-build login.nix
|
||||
…
|
||||
running the VM test script
|
||||
machine: QEMU running (pid 8841)
|
||||
…
|
||||
6 out of 6 tests succeeded
|
||||
</screen>
|
||||
After building/downloading all required dependencies, this will perform a
|
||||
build that starts a QEMU/KVM virtual machine containing a NixOS system. The
|
||||
virtual machine mounts the Nix store of the host; this makes VM creation very
|
||||
fast, as no disk image needs to be created. Afterwards, you can view a
|
||||
pretty-printed log of the test:
|
||||
<screen>
|
||||
<prompt>$ </prompt>firefox result/log.html
|
||||
</screen>
|
||||
</para>
|
||||
</section>
|
301
nixos/doc/manual/development/writing-nixos-tests.section.md
Normal file
301
nixos/doc/manual/development/writing-nixos-tests.section.md
Normal file
@ -0,0 +1,301 @@
|
||||
# Writing Tests {#sec-writing-nixos-tests}
|
||||
|
||||
A NixOS test is a Nix expression that has the following structure:
|
||||
|
||||
```nix
|
||||
import ./make-test-python.nix {
|
||||
|
||||
# Either the configuration of a single machine:
|
||||
machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ configuration…
|
||||
};
|
||||
|
||||
# Or a set of machines:
|
||||
nodes =
|
||||
{ machine1 =
|
||||
{ config, pkgs, ... }: { … };
|
||||
machine2 =
|
||||
{ config, pkgs, ... }: { … };
|
||||
…
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
Python code…
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
The attribute `testScript` is a bit of Python code that executes the
|
||||
test (described below). During the test, it will start one or more
|
||||
virtual machines, the configuration of which is described by the
|
||||
attribute `machine` (if you need only one machine in your test) or by
|
||||
the attribute `nodes` (if you need multiple machines). For instance,
|
||||
[`login.nix`](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/login.nix)
|
||||
only needs a single machine to test whether users can log in
|
||||
on the virtual console, whether device ownership is correctly maintained
|
||||
when switching between consoles, and so on. On the other hand,
|
||||
[`nfs/simple.nix`](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/nfs/simple.nix),
|
||||
which tests NFS client and server functionality in the
|
||||
Linux kernel (including whether locks are maintained across server
|
||||
crashes), requires three machines: a server and two clients.
|
||||
|
||||
There are a few special NixOS configuration options for test VMs:
|
||||
|
||||
`virtualisation.memorySize`
|
||||
|
||||
: The memory of the VM in megabytes.
|
||||
|
||||
`virtualisation.vlans`
|
||||
|
||||
: The virtual networks to which the VM is connected. See
|
||||
[`nat.nix`](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/nat.nix)
|
||||
for an example.
|
||||
|
||||
`virtualisation.writableStore`
|
||||
|
||||
: By default, the Nix store in the VM is not writable. If you enable
|
||||
this option, a writable union file system is mounted on top of the
|
||||
Nix store to make it appear writable. This is necessary for tests
|
||||
that run Nix operations that modify the store.
|
||||
|
||||
For more options, see the module
|
||||
[`qemu-vm.nix`](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/qemu-vm.nix).
|
||||
|
||||
The test script is a sequence of Python statements that perform various
|
||||
actions, such as starting VMs, executing commands in the VMs, and so on.
|
||||
Each virtual machine is represented as an object stored in the variable
|
||||
`name` if this is also the identifier of the machine in the declarative
|
||||
config. If you didn\'t specify multiple machines using the `nodes`
|
||||
attribute, it is just `machine`. The following example starts the
|
||||
machine, waits until it has finished booting, then executes a command
|
||||
and checks that the output is more-or-less correct:
|
||||
|
||||
```py
|
||||
machine.start()
|
||||
machine.wait_for_unit("default.target")
|
||||
if not "Linux" in machine.succeed("uname"):
|
||||
raise Exception("Wrong OS")
|
||||
```
|
||||
|
||||
The first line is actually unnecessary; machines are implicitly started
|
||||
when you first execute an action on them (such as `wait_for_unit` or
|
||||
`succeed`). If you have multiple machines, you can speed up the test by
|
||||
starting them in parallel:
|
||||
|
||||
```py
|
||||
start_all()
|
||||
```
|
||||
|
||||
The following methods are available on machine objects:
|
||||
|
||||
`start`
|
||||
|
||||
: Start the virtual machine. This method is asynchronous --- it does
|
||||
not wait for the machine to finish booting.
|
||||
|
||||
`shutdown`
|
||||
|
||||
: Shut down the machine, waiting for the VM to exit.
|
||||
|
||||
`crash`
|
||||
|
||||
: Simulate a sudden power failure, by telling the VM to exit
|
||||
immediately.
|
||||
|
||||
`block`
|
||||
|
||||
: Simulate unplugging the Ethernet cable that connects the machine to
|
||||
the other machines.
|
||||
|
||||
`unblock`
|
||||
|
||||
: Undo the effect of `block`.
|
||||
|
||||
`screenshot`
|
||||
|
||||
: Take a picture of the display of the virtual machine, in PNG format.
|
||||
The screenshot is linked from the HTML log.
|
||||
|
||||
`get_screen_text_variants`
|
||||
|
||||
: Return a list of different interpretations of what is currently
|
||||
visible on the machine\'s screen using optical character
|
||||
recognition. The number and order of the interpretations is not
|
||||
specified and is subject to change, but if no exception is raised at
|
||||
least one will be returned.
|
||||
|
||||
::: {.note}
|
||||
This requires passing `enableOCR` to the test attribute set.
|
||||
:::
|
||||
|
||||
`get_screen_text`
|
||||
|
||||
: Return a textual representation of what is currently visible on the
|
||||
machine\'s screen using optical character recognition.
|
||||
|
||||
::: {.note}
|
||||
This requires passing `enableOCR` to the test attribute set.
|
||||
:::
|
||||
|
||||
`send_monitor_command`
|
||||
|
||||
: Send a command to the QEMU monitor. This is rarely used, but allows
|
||||
doing stuff such as attaching virtual USB disks to a running
|
||||
machine.
|
||||
|
||||
`send_key`
|
||||
|
||||
: Simulate pressing keys on the virtual keyboard, e.g.,
|
||||
`send_key("ctrl-alt-delete")`.
|
||||
|
||||
`send_chars`
|
||||
|
||||
: Simulate typing a sequence of characters on the virtual keyboard,
|
||||
e.g., `send_chars("foobar\n")` will type the string `foobar`
|
||||
followed by the Enter key.
|
||||
|
||||
`execute`
|
||||
|
||||
: Execute a shell command, returning a list `(status, stdout)`.
|
||||
|
||||
`succeed`
|
||||
|
||||
: Execute a shell command, raising an exception if the exit status is
|
||||
not zero, otherwise returning the standard output. Commands are run
|
||||
with `set -euo pipefail` set:
|
||||
|
||||
- If several commands are separated by `;` and one fails, the
|
||||
command as a whole will fail.
|
||||
|
||||
- For pipelines, the last non-zero exit status will be returned
|
||||
(if there is one, zero will be returned otherwise).
|
||||
|
||||
- Dereferencing unset variables fail the command.
|
||||
|
||||
`fail`
|
||||
|
||||
: Like `succeed`, but raising an exception if the command returns a zero
|
||||
status.
|
||||
|
||||
`wait_until_succeeds`
|
||||
|
||||
: Repeat a shell command with 1-second intervals until it succeeds.
|
||||
|
||||
`wait_until_fails`
|
||||
|
||||
: Repeat a shell command with 1-second intervals until it fails.
|
||||
|
||||
`wait_for_unit`
|
||||
|
||||
: Wait until the specified systemd unit has reached the "active"
|
||||
state.
|
||||
|
||||
`wait_for_file`
|
||||
|
||||
: Wait until the specified file exists.
|
||||
|
||||
`wait_for_open_port`
|
||||
|
||||
: Wait until a process is listening on the given TCP port (on
|
||||
`localhost`, at least).
|
||||
|
||||
`wait_for_closed_port`
|
||||
|
||||
: Wait until nobody is listening on the given TCP port.
|
||||
|
||||
`wait_for_x`
|
||||
|
||||
: Wait until the X11 server is accepting connections.
|
||||
|
||||
`wait_for_text`
|
||||
|
||||
: Wait until the supplied regular expressions matches the textual
|
||||
contents of the screen by using optical character recognition (see
|
||||
`get_screen_text` and `get_screen_text_variants`).
|
||||
|
||||
::: {.note}
|
||||
This requires passing `enableOCR` to the test attribute set.
|
||||
:::
|
||||
|
||||
`wait_for_console_text`
|
||||
|
||||
: Wait until the supplied regular expressions match a line of the
|
||||
serial console output. This method is useful when OCR is not
|
||||
possibile or accurate enough.
|
||||
|
||||
`wait_for_window`
|
||||
|
||||
: Wait until an X11 window has appeared whose name matches the given
|
||||
regular expression, e.g., `wait_for_window("Terminal")`.
|
||||
|
||||
`copy_from_host`
|
||||
|
||||
: Copies a file from host to machine, e.g.,
|
||||
`copy_from_host("myfile", "/etc/my/important/file")`.
|
||||
|
||||
The first argument is the file on the host. The file needs to be
|
||||
accessible while building the nix derivation. The second argument is
|
||||
the location of the file on the machine.
|
||||
|
||||
`systemctl`
|
||||
|
||||
: Runs `systemctl` commands with optional support for
|
||||
`systemctl --user`
|
||||
|
||||
```py
|
||||
machine.systemctl("list-jobs --no-pager") # runs `systemctl list-jobs --no-pager`
|
||||
machine.systemctl("list-jobs --no-pager", "any-user") # spawns a shell for `any-user` and runs `systemctl --user list-jobs --no-pager`
|
||||
```
|
||||
|
||||
`shell_interact`
|
||||
|
||||
: Allows you to directly interact with the guest shell. This should
|
||||
only be used during test development, not in production tests.
|
||||
Killing the interactive session with `Ctrl-d` or `Ctrl-c` also ends
|
||||
the guest session.
|
||||
|
||||
To test user units declared by `systemd.user.services` the optional
|
||||
`user` argument can be used:
|
||||
|
||||
```py
|
||||
machine.start()
|
||||
machine.wait_for_x()
|
||||
machine.wait_for_unit("xautolock.service", "x-session-user")
|
||||
```
|
||||
|
||||
This applies to `systemctl`, `get_unit_info`, `wait_for_unit`,
|
||||
`start_job` and `stop_job`.
|
||||
|
||||
For faster dev cycles it\'s also possible to disable the code-linters
|
||||
(this shouldn\'t be commited though):
|
||||
|
||||
```nix
|
||||
import ./make-test-python.nix {
|
||||
skipLint = true;
|
||||
machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ configuration…
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
Python code…
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
This will produce a Nix warning at evaluation time. To fully disable the
|
||||
linter, wrap the test script in comment directives to disable the Black
|
||||
linter directly (again, don\'t commit this within the Nixpkgs
|
||||
repository):
|
||||
|
||||
```nix
|
||||
testScript =
|
||||
''
|
||||
# fmt: off
|
||||
Python code…
|
||||
# fmt: on
|
||||
'';
|
||||
```
|
@ -1,517 +0,0 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-writing-nixos-tests">
|
||||
<title>Writing Tests</title>
|
||||
|
||||
<para>
|
||||
A NixOS test is a Nix expression that has the following structure:
|
||||
<programlisting>
|
||||
import ./make-test-python.nix {
|
||||
|
||||
# Either the configuration of a single machine:
|
||||
machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ <replaceable>configuration…</replaceable>
|
||||
};
|
||||
|
||||
# Or a set of machines:
|
||||
nodes =
|
||||
{ <replaceable>machine1</replaceable> =
|
||||
{ config, pkgs, ... }: { <replaceable>…</replaceable> };
|
||||
<replaceable>machine2</replaceable> =
|
||||
{ config, pkgs, ... }: { <replaceable>…</replaceable> };
|
||||
…
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
<replaceable>Python code…</replaceable>
|
||||
'';
|
||||
}
|
||||
</programlisting>
|
||||
The attribute <literal>testScript</literal> is a bit of Python code that
|
||||
executes the test (described below). During the test, it will start one or
|
||||
more virtual machines, the configuration of which is described by the
|
||||
attribute <literal>machine</literal> (if you need only one machine in your
|
||||
test) or by the attribute <literal>nodes</literal> (if you need multiple
|
||||
machines). For instance,
|
||||
<filename
|
||||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/login.nix">login.nix</filename>
|
||||
only needs a single machine to test whether users can log in on the virtual
|
||||
console, whether device ownership is correctly maintained when switching
|
||||
between consoles, and so on. On the other hand,
|
||||
<filename
|
||||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/nfs/simple.nix">nfs/simple.nix</filename>,
|
||||
which tests NFS client and server functionality in the Linux kernel
|
||||
(including whether locks are maintained across server crashes), requires
|
||||
three machines: a server and two clients.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
There are a few special NixOS configuration options for test VMs:
|
||||
<!-- FIXME: would be nice to generate this automatically. -->
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>virtualisation.memorySize</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
The memory of the VM in megabytes.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>virtualisation.vlans</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
The virtual networks to which the VM is connected. See
|
||||
<filename
|
||||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/nat.nix">nat.nix</filename>
|
||||
for an example.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>virtualisation.writableStore</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
By default, the Nix store in the VM is not writable. If you enable this
|
||||
option, a writable union file system is mounted on top of the Nix store
|
||||
to make it appear writable. This is necessary for tests that run Nix
|
||||
operations that modify the store.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
For more options, see the module
|
||||
<filename
|
||||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/qemu-vm.nix">qemu-vm.nix</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The test script is a sequence of Python statements that perform various
|
||||
actions, such as starting VMs, executing commands in the VMs, and so on. Each
|
||||
virtual machine is represented as an object stored in the variable
|
||||
<literal><replaceable>name</replaceable></literal> if this is also the
|
||||
identifier of the machine in the declarative config.
|
||||
If you didn't specify multiple machines using the <literal>nodes</literal>
|
||||
attribute, it is just <literal>machine</literal>.
|
||||
The following example starts the machine, waits until it has finished booting,
|
||||
then executes a command and checks that the output is more-or-less correct:
|
||||
<programlisting>
|
||||
machine.start()
|
||||
machine.wait_for_unit("default.target")
|
||||
if not "Linux" in machine.succeed("uname"):
|
||||
raise Exception("Wrong OS")
|
||||
</programlisting>
|
||||
The first line is actually unnecessary; machines are implicitly started when
|
||||
you first execute an action on them (such as <literal>wait_for_unit</literal>
|
||||
or <literal>succeed</literal>). If you have multiple machines, you can speed
|
||||
up the test by starting them in parallel:
|
||||
<programlisting>
|
||||
start_all()
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The following methods are available on machine objects:
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>start</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Start the virtual machine. This method is asynchronous — it does not
|
||||
wait for the machine to finish booting.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>shutdown</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Shut down the machine, waiting for the VM to exit.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>crash</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate a sudden power failure, by telling the VM to exit immediately.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>block</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate unplugging the Ethernet cable that connects the machine to the
|
||||
other machines.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>unblock</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Undo the effect of <methodname>block</methodname>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>screenshot</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Take a picture of the display of the virtual machine, in PNG format. The
|
||||
screenshot is linked from the HTML log.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>get_screen_text_variants</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Return a list of different interpretations of what is currently visible
|
||||
on the machine's screen using optical character recognition. The number
|
||||
and order of the interpretations is not specified and is subject to
|
||||
change, but if no exception is raised at least one will be returned.
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
This requires passing <option>enableOCR</option> to the test attribute
|
||||
set.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>get_screen_text</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Return a textual representation of what is currently visible on the
|
||||
machine's screen using optical character recognition.
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
This requires passing <option>enableOCR</option> to the test attribute
|
||||
set.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>send_monitor_command</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Send a command to the QEMU monitor. This is rarely used, but allows doing
|
||||
stuff such as attaching virtual USB disks to a running machine.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>send_key</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate pressing keys on the virtual keyboard, e.g.,
|
||||
<literal>send_key("ctrl-alt-delete")</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>send_chars</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate typing a sequence of characters on the virtual keyboard, e.g.,
|
||||
<literal>send_chars("foobar\n")</literal> will type the string
|
||||
<literal>foobar</literal> followed by the Enter key.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>execute</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Execute a shell command, returning a list
|
||||
<literal>(<replaceable>status</replaceable>,
|
||||
<replaceable>stdout</replaceable>)</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>succeed</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Execute a shell command, raising an exception if the exit status
|
||||
is not zero, otherwise returning the standard output. Commands
|
||||
are run with <literal>set -euo pipefail</literal> set:
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
If several commands are separated by <literal>;</literal>
|
||||
and one fails, the command as a whole will fail.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
For pipelines, the last non-zero exit status will be
|
||||
returned (if there is one, zero will be returned
|
||||
otherwise).
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Dereferencing unset variables fail the command.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>fail</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Like <methodname>succeed</methodname>, but raising an exception if the
|
||||
command returns a zero status.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_until_succeeds</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Repeat a shell command with 1-second intervals until it succeeds.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_until_fails</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Repeat a shell command with 1-second intervals until it fails.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_unit</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the specified systemd unit has reached the “active” state.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_file</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the specified file exists.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_open_port</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until a process is listening on the given TCP port (on
|
||||
<literal>localhost</literal>, at least).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_closed_port</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until nobody is listening on the given TCP port.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_x</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the X11 server is accepting connections.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_text</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the supplied regular expressions matches the textual contents
|
||||
of the screen by using optical character recognition (see
|
||||
<methodname>get_screen_text</methodname> and
|
||||
<methodname>get_screen_text_variants</methodname>).
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
This requires passing <option>enableOCR</option> to the test attribute
|
||||
set.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_console_text</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the supplied regular expressions match a line of the serial
|
||||
console output. This method is useful when OCR is not possibile or
|
||||
accurate enough.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>wait_for_window</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until an X11 window has appeared whose name matches the given
|
||||
regular expression, e.g., <literal>wait_for_window("Terminal")</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>copy_from_host</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Copies a file from host to machine, e.g.,
|
||||
<literal>copy_from_host("myfile", "/etc/my/important/file")</literal>.
|
||||
</para>
|
||||
<para>
|
||||
The first argument is the file on the host. The file needs to be
|
||||
accessible while building the nix derivation. The second argument is the
|
||||
location of the file on the machine.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>systemctl</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Runs <literal>systemctl</literal> commands with optional support for
|
||||
<literal>systemctl --user</literal>
|
||||
</para>
|
||||
<para>
|
||||
<programlisting>
|
||||
machine.systemctl("list-jobs --no-pager") # runs `systemctl list-jobs --no-pager`
|
||||
machine.systemctl("list-jobs --no-pager", "any-user") # spawns a shell for `any-user` and runs `systemctl --user list-jobs --no-pager`
|
||||
</programlisting>
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<methodname>shell_interact</methodname>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Allows you to directly interact with the guest shell.
|
||||
This should only be used during test development, not in production tests.
|
||||
Killing the interactive session with <literal>Ctrl-d</literal> or <literal>Ctrl-c</literal> also ends the guest session.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To test user units declared by <literal>systemd.user.services</literal> the
|
||||
optional <literal>user</literal> argument can be used:
|
||||
<programlisting>
|
||||
machine.start()
|
||||
machine.wait_for_x()
|
||||
machine.wait_for_unit("xautolock.service", "x-session-user")
|
||||
</programlisting>
|
||||
This applies to <literal>systemctl</literal>, <literal>get_unit_info</literal>,
|
||||
<literal>wait_for_unit</literal>, <literal>start_job</literal> and
|
||||
<literal>stop_job</literal>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For faster dev cycles it's also possible to disable the code-linters (this shouldn't
|
||||
be commited though):
|
||||
<programlisting>
|
||||
import ./make-test-python.nix {
|
||||
skipLint = true;
|
||||
machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ <replaceable>configuration…</replaceable>
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
<replaceable>Python code…</replaceable>
|
||||
'';
|
||||
}
|
||||
</programlisting>
|
||||
This will produce a Nix warning at evaluation time. To fully disable the
|
||||
linter, wrap the test script in comment directives to disable the Black linter
|
||||
directly (again, don't commit this within the Nixpkgs repository):
|
||||
<programlisting>
|
||||
testScript =
|
||||
''
|
||||
# fmt: off
|
||||
<replaceable>Python code…</replaceable>
|
||||
# fmt: on
|
||||
'';
|
||||
</programlisting>
|
||||
</para>
|
||||
</section>
|
@ -106,6 +106,23 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para>
|
||||
In addition, these arguments are recognised by the live image only:
|
||||
</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>live.nixos.passwd=password</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Set the password for the <literal>nixos</literal> live user.
|
||||
This can be used for SSH access if there are issues using the
|
||||
terminal.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para>
|
||||
Notice that for <literal>boot.shell_on_fail</literal>,
|
||||
<literal>boot.debug1</literal>,
|
||||
|
@ -0,0 +1,50 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-running-nixos-tests-interactively">
|
||||
<title>Running Tests interactively</title>
|
||||
<para>
|
||||
The test itself can be run interactively. This is particularly
|
||||
useful when developing or debugging a test:
|
||||
</para>
|
||||
<programlisting>
|
||||
$ nix-build nixos/tests/login.nix -A driverInteractive
|
||||
$ ./result/bin/nixos-test-driver
|
||||
starting VDE switch for network 1
|
||||
>
|
||||
</programlisting>
|
||||
<para>
|
||||
You can then take any Python statement, e.g.
|
||||
</para>
|
||||
<programlisting language="python">
|
||||
> start_all()
|
||||
> test_script()
|
||||
> machine.succeed("touch /tmp/foo")
|
||||
> print(machine.succeed("pwd")) # Show stdout of command
|
||||
</programlisting>
|
||||
<para>
|
||||
The function <literal>test_script</literal> executes the entire test
|
||||
script and drops you back into the test driver command line upon its
|
||||
completion. This allows you to inspect the state of the VMs after
|
||||
the test (e.g. to debug the test script).
|
||||
</para>
|
||||
<para>
|
||||
To just start and experiment with the VMs, run:
|
||||
</para>
|
||||
<programlisting>
|
||||
$ nix-build nixos/tests/login.nix -A driverInteractive
|
||||
$ ./result/bin/nixos-run-vms
|
||||
</programlisting>
|
||||
<para>
|
||||
The script <literal>nixos-run-vms</literal> starts the virtual
|
||||
machines defined by test.
|
||||
</para>
|
||||
<para>
|
||||
You can re-use the VM states coming from a previous run by setting
|
||||
the <literal>--keep-vm-state</literal> flag.
|
||||
</para>
|
||||
<programlisting>
|
||||
$ ./result/bin/nixos-run-vms --keep-vm-state
|
||||
</programlisting>
|
||||
<para>
|
||||
The machine state is stored in the
|
||||
<literal>$TMPDIR/vm-state-machinename</literal> directory.
|
||||
</para>
|
||||
</section>
|
@ -0,0 +1,34 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-running-nixos-tests">
|
||||
<title>Running Tests</title>
|
||||
<para>
|
||||
You can run tests using <literal>nix-build</literal>. For example,
|
||||
to run the test
|
||||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/login.nix"><literal>login.nix</literal></link>,
|
||||
you just do:
|
||||
</para>
|
||||
<programlisting>
|
||||
$ nix-build '<nixpkgs/nixos/tests/login.nix>'
|
||||
</programlisting>
|
||||
<para>
|
||||
or, if you don’t want to rely on <literal>NIX_PATH</literal>:
|
||||
</para>
|
||||
<programlisting>
|
||||
$ cd /my/nixpkgs/nixos/tests
|
||||
$ nix-build login.nix
|
||||
…
|
||||
running the VM test script
|
||||
machine: QEMU running (pid 8841)
|
||||
…
|
||||
6 out of 6 tests succeeded
|
||||
</programlisting>
|
||||
<para>
|
||||
After building/downloading all required dependencies, this will
|
||||
perform a build that starts a QEMU/KVM virtual machine containing a
|
||||
NixOS system. The virtual machine mounts the Nix store of the host;
|
||||
this makes VM creation very fast, as no disk image needs to be
|
||||
created. Afterwards, you can view a pretty-printed log of the test:
|
||||
</para>
|
||||
<programlisting>
|
||||
$ firefox result/log.html
|
||||
</programlisting>
|
||||
</section>
|
@ -0,0 +1,526 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-writing-nixos-tests">
|
||||
<title>Writing Tests</title>
|
||||
<para>
|
||||
A NixOS test is a Nix expression that has the following structure:
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
import ./make-test-python.nix {
|
||||
|
||||
# Either the configuration of a single machine:
|
||||
machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ configuration…
|
||||
};
|
||||
|
||||
# Or a set of machines:
|
||||
nodes =
|
||||
{ machine1 =
|
||||
{ config, pkgs, ... }: { … };
|
||||
machine2 =
|
||||
{ config, pkgs, ... }: { … };
|
||||
…
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
Python code…
|
||||
'';
|
||||
}
|
||||
</programlisting>
|
||||
<para>
|
||||
The attribute <literal>testScript</literal> is a bit of Python code
|
||||
that executes the test (described below). During the test, it will
|
||||
start one or more virtual machines, the configuration of which is
|
||||
described by the attribute <literal>machine</literal> (if you need
|
||||
only one machine in your test) or by the attribute
|
||||
<literal>nodes</literal> (if you need multiple machines). For
|
||||
instance,
|
||||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/login.nix"><literal>login.nix</literal></link>
|
||||
only needs a single machine to test whether users can log in on the
|
||||
virtual console, whether device ownership is correctly maintained
|
||||
when switching between consoles, and so on. On the other hand,
|
||||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/nfs/simple.nix"><literal>nfs/simple.nix</literal></link>,
|
||||
which tests NFS client and server functionality in the Linux kernel
|
||||
(including whether locks are maintained across server crashes),
|
||||
requires three machines: a server and two clients.
|
||||
</para>
|
||||
<para>
|
||||
There are a few special NixOS configuration options for test VMs:
|
||||
</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>virtualisation.memorySize</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
The memory of the VM in megabytes.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>virtualisation.vlans</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
The virtual networks to which the VM is connected. See
|
||||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/tests/nat.nix"><literal>nat.nix</literal></link>
|
||||
for an example.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>virtualisation.writableStore</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
By default, the Nix store in the VM is not writable. If you
|
||||
enable this option, a writable union file system is mounted on
|
||||
top of the Nix store to make it appear writable. This is
|
||||
necessary for tests that run Nix operations that modify the
|
||||
store.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para>
|
||||
For more options, see the module
|
||||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/qemu-vm.nix"><literal>qemu-vm.nix</literal></link>.
|
||||
</para>
|
||||
<para>
|
||||
The test script is a sequence of Python statements that perform
|
||||
various actions, such as starting VMs, executing commands in the
|
||||
VMs, and so on. Each virtual machine is represented as an object
|
||||
stored in the variable <literal>name</literal> if this is also the
|
||||
identifier of the machine in the declarative config. If you didn't
|
||||
specify multiple machines using the <literal>nodes</literal>
|
||||
attribute, it is just <literal>machine</literal>. The following
|
||||
example starts the machine, waits until it has finished booting,
|
||||
then executes a command and checks that the output is more-or-less
|
||||
correct:
|
||||
</para>
|
||||
<programlisting language="python">
|
||||
machine.start()
|
||||
machine.wait_for_unit("default.target")
|
||||
if not "Linux" in machine.succeed("uname"):
|
||||
raise Exception("Wrong OS")
|
||||
</programlisting>
|
||||
<para>
|
||||
The first line is actually unnecessary; machines are implicitly
|
||||
started when you first execute an action on them (such as
|
||||
<literal>wait_for_unit</literal> or <literal>succeed</literal>). If
|
||||
you have multiple machines, you can speed up the test by starting
|
||||
them in parallel:
|
||||
</para>
|
||||
<programlisting language="python">
|
||||
start_all()
|
||||
</programlisting>
|
||||
<para>
|
||||
The following methods are available on machine objects:
|
||||
</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>start</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Start the virtual machine. This method is asynchronous — it
|
||||
does not wait for the machine to finish booting.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>shutdown</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Shut down the machine, waiting for the VM to exit.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>crash</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate a sudden power failure, by telling the VM to exit
|
||||
immediately.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>block</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate unplugging the Ethernet cable that connects the
|
||||
machine to the other machines.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>unblock</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Undo the effect of <literal>block</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>screenshot</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Take a picture of the display of the virtual machine, in PNG
|
||||
format. The screenshot is linked from the HTML log.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>get_screen_text_variants</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Return a list of different interpretations of what is
|
||||
currently visible on the machine's screen using optical
|
||||
character recognition. The number and order of the
|
||||
interpretations is not specified and is subject to change, but
|
||||
if no exception is raised at least one will be returned.
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
This requires passing <literal>enableOCR</literal> to the
|
||||
test attribute set.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>get_screen_text</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Return a textual representation of what is currently visible
|
||||
on the machine's screen using optical character recognition.
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
This requires passing <literal>enableOCR</literal> to the
|
||||
test attribute set.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>send_monitor_command</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Send a command to the QEMU monitor. This is rarely used, but
|
||||
allows doing stuff such as attaching virtual USB disks to a
|
||||
running machine.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>send_key</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate pressing keys on the virtual keyboard, e.g.,
|
||||
<literal>send_key("ctrl-alt-delete")</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>send_chars</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Simulate typing a sequence of characters on the virtual
|
||||
keyboard, e.g.,
|
||||
<literal>send_chars("foobar\n")</literal> will type
|
||||
the string <literal>foobar</literal> followed by the Enter
|
||||
key.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>execute</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Execute a shell command, returning a list
|
||||
<literal>(status, stdout)</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>succeed</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Execute a shell command, raising an exception if the exit
|
||||
status is not zero, otherwise returning the standard output.
|
||||
Commands are run with <literal>set -euo pipefail</literal>
|
||||
set:
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
If several commands are separated by <literal>;</literal>
|
||||
and one fails, the command as a whole will fail.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
For pipelines, the last non-zero exit status will be
|
||||
returned (if there is one, zero will be returned
|
||||
otherwise).
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Dereferencing unset variables fail the command.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>fail</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Like <literal>succeed</literal>, but raising an exception if
|
||||
the command returns a zero status.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_until_succeeds</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Repeat a shell command with 1-second intervals until it
|
||||
succeeds.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_until_fails</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Repeat a shell command with 1-second intervals until it fails.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_unit</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the specified systemd unit has reached the
|
||||
<quote>active</quote> state.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_file</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the specified file exists.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_open_port</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until a process is listening on the given TCP port (on
|
||||
<literal>localhost</literal>, at least).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_closed_port</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until nobody is listening on the given TCP port.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_x</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the X11 server is accepting connections.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_text</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the supplied regular expressions matches the
|
||||
textual contents of the screen by using optical character
|
||||
recognition (see <literal>get_screen_text</literal> and
|
||||
<literal>get_screen_text_variants</literal>).
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
This requires passing <literal>enableOCR</literal> to the
|
||||
test attribute set.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_console_text</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until the supplied regular expressions match a line of
|
||||
the serial console output. This method is useful when OCR is
|
||||
not possibile or accurate enough.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>wait_for_window</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Wait until an X11 window has appeared whose name matches the
|
||||
given regular expression, e.g.,
|
||||
<literal>wait_for_window("Terminal")</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>copy_from_host</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Copies a file from host to machine, e.g.,
|
||||
<literal>copy_from_host("myfile", "/etc/my/important/file")</literal>.
|
||||
</para>
|
||||
<para>
|
||||
The first argument is the file on the host. The file needs to
|
||||
be accessible while building the nix derivation. The second
|
||||
argument is the location of the file on the machine.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>systemctl</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Runs <literal>systemctl</literal> commands with optional
|
||||
support for <literal>systemctl --user</literal>
|
||||
</para>
|
||||
<programlisting language="python">
|
||||
machine.systemctl("list-jobs --no-pager") # runs `systemctl list-jobs --no-pager`
|
||||
machine.systemctl("list-jobs --no-pager", "any-user") # spawns a shell for `any-user` and runs `systemctl --user list-jobs --no-pager`
|
||||
</programlisting>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<literal>shell_interact</literal>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Allows you to directly interact with the guest shell. This
|
||||
should only be used during test development, not in production
|
||||
tests. Killing the interactive session with
|
||||
<literal>Ctrl-d</literal> or <literal>Ctrl-c</literal> also
|
||||
ends the guest session.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para>
|
||||
To test user units declared by
|
||||
<literal>systemd.user.services</literal> the optional
|
||||
<literal>user</literal> argument can be used:
|
||||
</para>
|
||||
<programlisting language="python">
|
||||
machine.start()
|
||||
machine.wait_for_x()
|
||||
machine.wait_for_unit("xautolock.service", "x-session-user")
|
||||
</programlisting>
|
||||
<para>
|
||||
This applies to <literal>systemctl</literal>,
|
||||
<literal>get_unit_info</literal>, <literal>wait_for_unit</literal>,
|
||||
<literal>start_job</literal> and <literal>stop_job</literal>.
|
||||
</para>
|
||||
<para>
|
||||
For faster dev cycles it's also possible to disable the code-linters
|
||||
(this shouldn't be commited though):
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
import ./make-test-python.nix {
|
||||
skipLint = true;
|
||||
machine =
|
||||
{ config, pkgs, ... }:
|
||||
{ configuration…
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
Python code…
|
||||
'';
|
||||
}
|
||||
</programlisting>
|
||||
<para>
|
||||
This will produce a Nix warning at evaluation time. To fully disable
|
||||
the linter, wrap the test script in comment directives to disable
|
||||
the Black linter directly (again, don't commit this within the
|
||||
Nixpkgs repository):
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
testScript =
|
||||
''
|
||||
# fmt: off
|
||||
Python code…
|
||||
# fmt: on
|
||||
'';
|
||||
</programlisting>
|
||||
</section>
|
@ -101,16 +101,18 @@
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://www.gnuradio.org/">GNURadio</link>
|
||||
3.8 was
|
||||
3.8 and 3.9 were
|
||||
<link xlink:href="https://github.com/NixOS/nixpkgs/issues/82263">finally</link>
|
||||
packaged, along with a rewrite to the Nix expressions,
|
||||
allowing users to override the features upstream supports
|
||||
selecting to compile or not to. Additionally, the attribute
|
||||
<literal>gnuradio</literal> and <literal>gnuradio3_7</literal>
|
||||
now point to an externally wrapped by default derivations,
|
||||
that allow you to also add `extraPythonPackages` to the Python
|
||||
interpreter used by GNURadio. Missing environmental variables
|
||||
needed for operational GUI were also added
|
||||
<literal>gnuradio</literal> (3.9),
|
||||
<literal>gnuradio3_8</literal> and
|
||||
<literal>gnuradio3_7</literal> now point to an externally
|
||||
wrapped by default derivations, that allow you to also add
|
||||
`extraPythonPackages` to the Python interpreter used by
|
||||
GNURadio. Missing environmental variables needed for
|
||||
operational GUI were also added
|
||||
(<link xlink:href="https://github.com/NixOS/nixpkgs/issues/75478">#75478</link>).
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1026,7 +1028,7 @@ self: super:
|
||||
<para>
|
||||
<link xlink:href="https://kodi.tv/">Kodi</link> has been
|
||||
updated to version 19.1 "Matrix". See the
|
||||
<link xlink:href="https://kodi.tv/article/kodi-190-matrix-release">announcement</link>
|
||||
<link xlink:href="https://kodi.tv/article/kodi-19-0-matrix-release">announcement</link>
|
||||
for further details.
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -25,6 +25,15 @@
|
||||
<section xml:id="sec-release-21.11-new-services">
|
||||
<title>New Services</title>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://digint.ch/btrbk/index.html">btrbk</link>,
|
||||
a backup tool for btrfs subvolumes, taking advantage of btrfs
|
||||
specific capabilities to create atomic snapshots and transfer
|
||||
them incrementally to your backup locations. Available as
|
||||
<link xlink:href="options.html#opt-services.brtbk.instances">services.btrbk</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://github.com/maxmind/geoipupdate">geoipupdate</link>,
|
||||
@ -64,7 +73,7 @@
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>staticjinja</literal> package has been upgraded
|
||||
from 1.0.4 to 2.0.0
|
||||
from 1.0.4 to 3.0.1
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
@ -339,6 +348,126 @@
|
||||
release instead of the old 2.31.0 version.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>bitwarden_rs</literal> packages and modules were
|
||||
renamed to <literal>vaultwarden</literal>
|
||||
<link xlink:href="https://github.com/dani-garcia/vaultwarden/discussions/1642">following
|
||||
upstream</link>. More specifically,
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>pkgs.bitwarden_rs</literal>,
|
||||
<literal>pkgs.bitwarden_rs-sqlite</literal>,
|
||||
<literal>pkgs.bitwarden_rs-mysql</literal> and
|
||||
<literal>pkgs.bitwarden_rs-postgresql</literal> were
|
||||
renamed to <literal>pkgs.vaultwarden</literal>,
|
||||
<literal>pkgs.vaultwarden-sqlite</literal>,
|
||||
<literal>pkgs.vaultwarden-mysql</literal> and
|
||||
<literal>pkgs.vaultwarden-postgresql</literal>,
|
||||
respectively.
|
||||
</para>
|
||||
<itemizedlist spacing="compact">
|
||||
<listitem>
|
||||
<para>
|
||||
Old names are preserved as aliases for backwards
|
||||
compatibility, but may be removed in the future.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>bitwarden_rs</literal> executable was
|
||||
also renamed to <literal>vaultwarden</literal> in all
|
||||
packages.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>pkgs.bitwarden_rs-vault</literal> was renamed to
|
||||
<literal>pkgs.vaultwarden-vault</literal>.
|
||||
</para>
|
||||
<itemizedlist spacing="compact">
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>pkgs.bitwarden_rs-vault</literal> is
|
||||
preserved as an alias for backwards compatibility, but
|
||||
may be removed in the future.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The static files were moved from
|
||||
<literal>/usr/share/bitwarden_rs</literal> to
|
||||
<literal>/usr/share/vaultwarden</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>services.bitwarden_rs</literal> config module
|
||||
was renamed to <literal>services.vaultwarden</literal>.
|
||||
</para>
|
||||
<itemizedlist spacing="compact">
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>services.bitwarden_rs</literal> is preserved
|
||||
as an alias for backwards compatibility, but may be
|
||||
removed in the future.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>systemd.services.bitwarden_rs</literal>,
|
||||
<literal>systemd.services.backup-bitwarden_rs</literal>
|
||||
and <literal>systemd.timers.backup-bitwarden_rs</literal>
|
||||
were renamed to
|
||||
<literal>systemd.services.vaultwarden</literal>,
|
||||
<literal>systemd.services.backup-vaultwarden</literal> and
|
||||
<literal>systemd.timers.backup-vaultwarden</literal>,
|
||||
respectively.
|
||||
</para>
|
||||
<itemizedlist spacing="compact">
|
||||
<listitem>
|
||||
<para>
|
||||
Old names are preserved as aliases for backwards
|
||||
compatibility, but may be removed in the future.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>users.users.bitwarden_rs</literal> and
|
||||
<literal>users.groups.bitwarden_rs</literal> were renamed
|
||||
to <literal>users.users.vaultwarden</literal> and
|
||||
<literal>users.groups.vaultwarden</literal>, respectively.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The data directory remains located at
|
||||
<literal>/var/lib/bitwarden_rs</literal>, for backwards
|
||||
compatibility.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<itemizedlist spacing="compact">
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>yggdrasil</literal> was upgraded to a new major
|
||||
release with breaking changes, see
|
||||
<link xlink:href="https://github.com/yggdrasil-network/yggdrasil-go/releases/tag/v0.4.0">upstream
|
||||
changelog</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section xml:id="sec-release-21.11-notable-changes">
|
||||
|
@ -446,8 +446,8 @@
|
||||
password for the <literal>root</literal> user, e.g.
|
||||
<screen>
|
||||
setting root password...
|
||||
Enter new UNIX password: ***
|
||||
Retype new UNIX password: ***</screen>
|
||||
New password: ***
|
||||
Retype new password: ***</screen>
|
||||
<note>
|
||||
<para>
|
||||
For unattended installations, it is possible to use
|
||||
|
@ -36,7 +36,7 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
The following new services were added since the last release:
|
||||
|
||||
- [GNURadio](https://www.gnuradio.org/) 3.8 was [finally](https://github.com/NixOS/nixpkgs/issues/82263) packaged, along with a rewrite to the Nix expressions, allowing users to override the features upstream supports selecting to compile or not to. Additionally, the attribute `gnuradio` and `gnuradio3_7` now point to an externally wrapped by default derivations, that allow you to also add \`extraPythonPackages\` to the Python interpreter used by GNURadio. Missing environmental variables needed for operational GUI were also added ([\#75478](https://github.com/NixOS/nixpkgs/issues/75478)).
|
||||
- [GNURadio](https://www.gnuradio.org/) 3.8 and 3.9 were [finally](https://github.com/NixOS/nixpkgs/issues/82263) packaged, along with a rewrite to the Nix expressions, allowing users to override the features upstream supports selecting to compile or not to. Additionally, the attribute `gnuradio` (3.9), `gnuradio3_8` and `gnuradio3_7` now point to an externally wrapped by default derivations, that allow you to also add \`extraPythonPackages\` to the Python interpreter used by GNURadio. Missing environmental variables needed for operational GUI were also added ([\#75478](https://github.com/NixOS/nixpkgs/issues/75478)).
|
||||
|
||||
- [Keycloak](https://www.keycloak.org/), an open source identity and access management server with support for [OpenID Connect](https://openid.net/connect/), [OAUTH 2.0](https://oauth.net/2/) and [SAML 2.0](https://en.wikipedia.org/wiki/SAML_2.0).
|
||||
|
||||
@ -300,7 +300,7 @@ When upgrading from a previous release, please be aware of the following incompa
|
||||
|
||||
Regarding the NixOS module, new options for HTTPS inspection have been added and `services.privoxy.extraConfig` has been replaced by the new [services.privoxy.settings](options.html#opt-services.privoxy.settings) (See [RFC 0042](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md) for the motivation).
|
||||
|
||||
- [Kodi](https://kodi.tv/) has been updated to version 19.1 \"Matrix\". See the [announcement](https://kodi.tv/article/kodi-190-matrix-release) for further details.
|
||||
- [Kodi](https://kodi.tv/) has been updated to version 19.1 \"Matrix\". See the [announcement](https://kodi.tv/article/kodi-19-0-matrix-release) for further details.
|
||||
|
||||
- The `services.packagekit.backend` option has been removed as it only supported a single setting which would always be the default. Instead new [RFC 0042](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md) compliant [services.packagekit.settings](options.html#opt-services.packagekit.settings) and [services.packagekit.vendorSettings](options.html#opt-services.packagekit.vendorSettings) options have been introduced.
|
||||
|
||||
|
@ -10,6 +10,8 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
## New Services {#sec-release-21.11-new-services}
|
||||
|
||||
- [btrbk](https://digint.ch/btrbk/index.html), a backup tool for btrfs subvolumes, taking advantage of btrfs specific capabilities to create atomic snapshots and transfer them incrementally to your backup locations. Available as [services.btrbk](options.html#opt-services.brtbk.instances).
|
||||
|
||||
- [geoipupdate](https://github.com/maxmind/geoipupdate), a GeoIP database updater from MaxMind. Available as [services.geoipupdate](options.html#opt-services.geoipupdate.enable).
|
||||
|
||||
- [sourcehut](https://sr.ht), a collection of tools useful for software development. Available as [services.sourcehut](options.html#opt-services.sourcehut.enable).
|
||||
@ -20,7 +22,7 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
## Backward Incompatibilities {#sec-release-21.11-incompatibilities}
|
||||
|
||||
- The `staticjinja` package has been upgraded from 1.0.4 to 2.0.0
|
||||
- The `staticjinja` package has been upgraded from 1.0.4 to 3.0.1
|
||||
|
||||
- `services.geoip-updater` was broken and has been replaced by [services.geoipupdate](options.html#opt-services.geoipupdate.enable).
|
||||
|
||||
@ -85,6 +87,34 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
* The `libwnck` package now defaults to the 3.x release instead of the
|
||||
old 2.31.0 version.
|
||||
|
||||
* The `bitwarden_rs` packages and modules were renamed to `vaultwarden`
|
||||
[following upstream](https://github.com/dani-garcia/vaultwarden/discussions/1642). More specifically,
|
||||
|
||||
* `pkgs.bitwarden_rs`, `pkgs.bitwarden_rs-sqlite`, `pkgs.bitwarden_rs-mysql` and
|
||||
`pkgs.bitwarden_rs-postgresql` were renamed to `pkgs.vaultwarden`, `pkgs.vaultwarden-sqlite`,
|
||||
`pkgs.vaultwarden-mysql` and `pkgs.vaultwarden-postgresql`, respectively.
|
||||
* Old names are preserved as aliases for backwards compatibility, but may be removed in the future.
|
||||
* The `bitwarden_rs` executable was also renamed to `vaultwarden` in all packages.
|
||||
|
||||
* `pkgs.bitwarden_rs-vault` was renamed to `pkgs.vaultwarden-vault`.
|
||||
* `pkgs.bitwarden_rs-vault` is preserved as an alias for backwards compatibility, but may be removed in the future.
|
||||
* The static files were moved from `/usr/share/bitwarden_rs` to `/usr/share/vaultwarden`.
|
||||
|
||||
* The `services.bitwarden_rs` config module was renamed to `services.vaultwarden`.
|
||||
* `services.bitwarden_rs` is preserved as an alias for backwards compatibility, but may be removed in the future.
|
||||
|
||||
* `systemd.services.bitwarden_rs`, `systemd.services.backup-bitwarden_rs` and `systemd.timers.backup-bitwarden_rs`
|
||||
were renamed to `systemd.services.vaultwarden`, `systemd.services.backup-vaultwarden` and
|
||||
`systemd.timers.backup-vaultwarden`, respectively.
|
||||
* Old names are preserved as aliases for backwards compatibility, but may be removed in the future.
|
||||
|
||||
* `users.users.bitwarden_rs` and `users.groups.bitwarden_rs` were renamed to `users.users.vaultwarden` and
|
||||
`users.groups.vaultwarden`, respectively.
|
||||
|
||||
* The data directory remains located at `/var/lib/bitwarden_rs`, for backwards compatibility.
|
||||
|
||||
- `yggdrasil` was upgraded to a new major release with breaking changes, see [upstream changelog](https://github.com/yggdrasil-network/yggdrasil-go/releases/tag/v0.4.0).
|
||||
|
||||
## Other Notable Changes {#sec-release-21.11-notable-changes}
|
||||
|
||||
- The setting [`services.openssh.logLevel`](options.html#opt-services.openssh.logLevel) `"VERBOSE"` `"INFO"`. This brings NixOS in line with upstream and other Linux distributions, and reduces log spam on servers due to bruteforcing botnets.
|
||||
|
@ -126,6 +126,14 @@ in
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
environment.localBinInPath = mkOption {
|
||||
description = ''
|
||||
Add ~/.local/bin/ to $PATH
|
||||
'';
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
environment.binsh = mkOption {
|
||||
default = "${config.system.build.binsh}/bin/sh";
|
||||
defaultText = "\${config.system.build.binsh}/bin/sh";
|
||||
@ -198,6 +206,10 @@ in
|
||||
# ~/bin if it exists overrides other bin directories.
|
||||
export PATH="$HOME/bin:$PATH"
|
||||
''}
|
||||
|
||||
${optionalString cfg.localBinInPath ''
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
''}
|
||||
'';
|
||||
|
||||
system.activationScripts.binsh = stringAfter [ "stdio" ]
|
||||
|
@ -30,5 +30,16 @@ with lib;
|
||||
# Add Memtest86+ to the CD.
|
||||
boot.loader.grub.memtest86.enable = true;
|
||||
|
||||
boot.postBootCommands = ''
|
||||
for o in $(</proc/cmdline); do
|
||||
case "$o" in
|
||||
live.nixos.passwd=*)
|
||||
set -- $(IFS==; echo $o)
|
||||
echo "nixos:$2" | ${pkgs.shadow}/bin/chpasswd
|
||||
;;
|
||||
esac
|
||||
done
|
||||
'';
|
||||
|
||||
system.stateVersion = mkDefault "18.03";
|
||||
}
|
||||
|
@ -260,6 +260,7 @@
|
||||
./services/backup/bacula.nix
|
||||
./services/backup/borgbackup.nix
|
||||
./services/backup/borgmatic.nix
|
||||
./services/backup/btrbk.nix
|
||||
./services/backup/duplicati.nix
|
||||
./services/backup/duplicity.nix
|
||||
./services/backup/mysql-backup.nix
|
||||
@ -874,7 +875,6 @@
|
||||
./services/search/hound.nix
|
||||
./services/search/kibana.nix
|
||||
./services/search/solr.nix
|
||||
./services/security/bitwarden_rs/default.nix
|
||||
./services/security/certmgr.nix
|
||||
./services/security/cfssl.nix
|
||||
./services/security/clamav.nix
|
||||
@ -900,6 +900,7 @@
|
||||
./services/security/torsocks.nix
|
||||
./services/security/usbguard.nix
|
||||
./services/security/vault.nix
|
||||
./services/security/vaultwarden/default.nix
|
||||
./services/security/yubikey-agent.nix
|
||||
./services/system/cloud-init.nix
|
||||
./services/system/dbus.nix
|
||||
|
@ -6,7 +6,7 @@ with lib;
|
||||
meta.maintainers = pkgs.hamster.meta.maintainers;
|
||||
|
||||
options.programs.hamster.enable =
|
||||
mkEnableOption "Whether to enable hamster time tracking.";
|
||||
mkEnableOption "hamster, a time tracking program";
|
||||
|
||||
config = lib.mkIf config.programs.hamster.enable {
|
||||
environment.systemPackages = [ pkgs.hamster ];
|
||||
|
@ -63,6 +63,7 @@ in {
|
||||
description = "Slimserver daemon user";
|
||||
home = cfg.dataDir;
|
||||
group = "slimserver";
|
||||
isSystemUser = true;
|
||||
};
|
||||
groups.slimserver = {};
|
||||
};
|
||||
|
220
nixos/modules/services/backup/btrbk.nix
Normal file
220
nixos/modules/services/backup/btrbk.nix
Normal file
@ -0,0 +1,220 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
cfg = config.services.btrbk;
|
||||
sshEnabled = cfg.sshAccess != [ ];
|
||||
serviceEnabled = cfg.instances != { };
|
||||
attr2Lines = attr:
|
||||
let
|
||||
pairs = lib.attrsets.mapAttrsToList (name: value: { inherit name value; }) attr;
|
||||
isSubsection = value:
|
||||
if builtins.isAttrs value then true
|
||||
else if builtins.isString value then false
|
||||
else throw "invalid type in btrbk config ${builtins.typeOf value}";
|
||||
sortedPairs = lib.lists.partition (x: isSubsection x.value) pairs;
|
||||
in
|
||||
lib.flatten (
|
||||
# non subsections go first
|
||||
(
|
||||
map (pair: [ "${pair.name} ${pair.value}" ]) sortedPairs.wrong
|
||||
)
|
||||
++ # subsections go last
|
||||
(
|
||||
map
|
||||
(
|
||||
pair:
|
||||
lib.mapAttrsToList
|
||||
(
|
||||
childname: value:
|
||||
[ "${pair.name} ${childname}" ] ++ (map (x: " " + x) (attr2Lines value))
|
||||
)
|
||||
pair.value
|
||||
)
|
||||
sortedPairs.right
|
||||
)
|
||||
)
|
||||
;
|
||||
addDefaults = settings: { backend = "btrfs-progs-sudo"; } // settings;
|
||||
mkConfigFile = settings: lib.concatStringsSep "\n" (attr2Lines (addDefaults settings));
|
||||
mkTestedConfigFile = name: settings:
|
||||
let
|
||||
configFile = pkgs.writeText "btrbk-${name}.conf" (mkConfigFile settings);
|
||||
in
|
||||
pkgs.runCommand "btrbk-${name}-tested.conf" { } ''
|
||||
mkdir foo
|
||||
cp ${configFile} $out
|
||||
if (set +o pipefail; ${pkgs.btrbk}/bin/btrbk -c $out ls foo 2>&1 | grep $out);
|
||||
then
|
||||
echo btrbk configuration is invalid
|
||||
cat $out
|
||||
exit 1
|
||||
fi;
|
||||
'';
|
||||
in
|
||||
{
|
||||
options = {
|
||||
services.btrbk = {
|
||||
extraPackages = lib.mkOption {
|
||||
description = "Extra packages for btrbk, like compression utilities for <literal>stream_compress</literal>";
|
||||
type = lib.types.listOf lib.types.package;
|
||||
default = [ ];
|
||||
example = lib.literalExample "[ pkgs.xz ]";
|
||||
};
|
||||
niceness = lib.mkOption {
|
||||
description = "Niceness for local instances of btrbk. Also applies to remote ones connecting via ssh when positive.";
|
||||
type = lib.types.ints.between (-20) 19;
|
||||
default = 10;
|
||||
};
|
||||
ioSchedulingClass = lib.mkOption {
|
||||
description = "IO scheduling class for btrbk (see ionice(1) for a quick description). Applies to local instances, and remote ones connecting by ssh if set to idle.";
|
||||
type = lib.types.enum [ "idle" "best-effort" "realtime" ];
|
||||
default = "best-effort";
|
||||
};
|
||||
instances = lib.mkOption {
|
||||
description = "Set of btrbk instances. The instance named <literal>btrbk</literal> is the default one.";
|
||||
type = with lib.types;
|
||||
attrsOf (
|
||||
submodule {
|
||||
options = {
|
||||
onCalendar = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "daily";
|
||||
description = "How often this btrbk instance is started. See systemd.time(7) for more information about the format.";
|
||||
};
|
||||
settings = lib.mkOption {
|
||||
type = let t = lib.types.attrsOf (lib.types.either lib.types.str (t // { description = "instances of this type recursively"; })); in t;
|
||||
default = { };
|
||||
example = {
|
||||
snapshot_preserve_min = "2d";
|
||||
snapshot_preserve = "14d";
|
||||
volume = {
|
||||
"/mnt/btr_pool" = {
|
||||
target = "/mnt/btr_backup/mylaptop";
|
||||
subvolume = {
|
||||
"rootfs" = { };
|
||||
"home" = { snapshot_create = "always"; };
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
description = "configuration options for btrbk. Nested attrsets translate to subsections.";
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
default = { };
|
||||
};
|
||||
sshAccess = lib.mkOption {
|
||||
description = "SSH keys that should be able to make or push snapshots on this system remotely with btrbk";
|
||||
type = with lib.types; listOf (
|
||||
submodule {
|
||||
options = {
|
||||
key = lib.mkOption {
|
||||
type = str;
|
||||
description = "SSH public key allowed to login as user <literal>btrbk</literal> to run remote backups.";
|
||||
};
|
||||
roles = lib.mkOption {
|
||||
type = listOf (enum [ "info" "source" "target" "delete" "snapshot" "send" "receive" ]);
|
||||
example = [ "source" "info" "send" ];
|
||||
description = "What actions can be performed with this SSH key. See ssh_filter_btrbk(1) for details";
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
default = [ ];
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
config = lib.mkIf (sshEnabled || serviceEnabled) {
|
||||
environment.systemPackages = [ pkgs.btrbk ] ++ cfg.extraPackages;
|
||||
security.sudo.extraRules = [
|
||||
{
|
||||
users = [ "btrbk" ];
|
||||
commands = [
|
||||
{ command = "${pkgs.btrfs-progs}/bin/btrfs"; options = [ "NOPASSWD" ]; }
|
||||
{ command = "${pkgs.coreutils}/bin/mkdir"; options = [ "NOPASSWD" ]; }
|
||||
{ command = "${pkgs.coreutils}/bin/readlink"; options = [ "NOPASSWD" ]; }
|
||||
# for ssh, they are not the same than the one hard coded in ${pkgs.btrbk}
|
||||
{ command = "/run/current-system/bin/btrfs"; options = [ "NOPASSWD" ]; }
|
||||
{ command = "/run/current-system/sw/bin/mkdir"; options = [ "NOPASSWD" ]; }
|
||||
{ command = "/run/current-system/sw/bin/readlink"; options = [ "NOPASSWD" ]; }
|
||||
];
|
||||
}
|
||||
];
|
||||
users.users.btrbk = {
|
||||
isSystemUser = true;
|
||||
# ssh needs a home directory
|
||||
home = "/var/lib/btrbk";
|
||||
createHome = true;
|
||||
shell = "${pkgs.bash}/bin/bash";
|
||||
group = "btrbk";
|
||||
openssh.authorizedKeys.keys = map
|
||||
(
|
||||
v:
|
||||
let
|
||||
options = lib.concatMapStringsSep " " (x: "--" + x) v.roles;
|
||||
ioniceClass = {
|
||||
"idle" = 3;
|
||||
"best-effort" = 2;
|
||||
"realtime" = 1;
|
||||
}.${cfg.ioSchedulingClass};
|
||||
in
|
||||
''command="${pkgs.util-linux}/bin/ionice -t -c ${toString ioniceClass} ${lib.optionalString (cfg.niceness >= 1) "${pkgs.coreutils}/bin/nice -n ${toString cfg.niceness}"} ${pkgs.btrbk}/share/btrbk/scripts/ssh_filter_btrbk.sh --sudo ${options}" ${v.key}''
|
||||
)
|
||||
cfg.sshAccess;
|
||||
};
|
||||
users.groups.btrbk = { };
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /var/lib/btrbk 0750 btrbk btrbk"
|
||||
"d /var/lib/btrbk/.ssh 0700 btrbk btrbk"
|
||||
"f /var/lib/btrbk/.ssh/config 0700 btrbk btrbk - StrictHostKeyChecking=accept-new"
|
||||
];
|
||||
environment.etc = lib.mapAttrs'
|
||||
(
|
||||
name: instance: {
|
||||
name = "btrbk/${name}.conf";
|
||||
value.source = mkTestedConfigFile name instance.settings;
|
||||
}
|
||||
)
|
||||
cfg.instances;
|
||||
systemd.services = lib.mapAttrs'
|
||||
(
|
||||
name: _: {
|
||||
name = "btrbk-${name}";
|
||||
value = {
|
||||
description = "Takes BTRFS snapshots and maintains retention policies.";
|
||||
unitConfig.Documentation = "man:btrbk(1)";
|
||||
path = [ "/run/wrappers" ] ++ cfg.extraPackages;
|
||||
serviceConfig = {
|
||||
User = "btrbk";
|
||||
Group = "btrbk";
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.btrbk}/bin/btrbk -c /etc/btrbk/${name}.conf run";
|
||||
Nice = cfg.niceness;
|
||||
IOSchedulingClass = cfg.ioSchedulingClass;
|
||||
StateDirectory = "btrbk";
|
||||
};
|
||||
};
|
||||
}
|
||||
)
|
||||
cfg.instances;
|
||||
|
||||
systemd.timers = lib.mapAttrs'
|
||||
(
|
||||
name: instance: {
|
||||
name = "btrbk-${name}";
|
||||
value = {
|
||||
description = "Timer to take BTRFS snapshots and maintain retention policies.";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = instance.onCalendar;
|
||||
AccuracySec = "10min";
|
||||
Persistent = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
)
|
||||
cfg.instances;
|
||||
};
|
||||
|
||||
}
|
@ -99,9 +99,22 @@ in
|
||||
LockFile = "/run/geoipupdate/.lock";
|
||||
};
|
||||
|
||||
systemd.services.geoipupdate-create-db-dir = {
|
||||
serviceConfig.Type = "oneshot";
|
||||
script = ''
|
||||
mkdir -p ${cfg.settings.DatabaseDirectory}
|
||||
chmod 0755 ${cfg.settings.DatabaseDirectory}
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.services.geoipupdate = {
|
||||
description = "GeoIP Updater";
|
||||
after = [ "network-online.target" "nss-lookup.target" ];
|
||||
requires = [ "geoipupdate-create-db-dir.service" ];
|
||||
after = [
|
||||
"geoipupdate-create-db-dir.service"
|
||||
"network-online.target"
|
||||
"nss-lookup.target"
|
||||
];
|
||||
wants = [ "network-online.target" ];
|
||||
startAt = cfg.interval;
|
||||
serviceConfig = {
|
||||
@ -119,11 +132,9 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
geoipupdateConf = pkgs.writeText "discourse.conf" (geoipupdateKeyValue cfg.settings);
|
||||
geoipupdateConf = pkgs.writeText "geoipupdate.conf" (geoipupdateKeyValue cfg.settings);
|
||||
|
||||
script = ''
|
||||
mkdir -p "${cfg.settings.DatabaseDirectory}"
|
||||
chmod 755 "${cfg.settings.DatabaseDirectory}"
|
||||
chown geoip "${cfg.settings.DatabaseDirectory}"
|
||||
|
||||
cp ${geoipupdateConf} /run/geoipupdate/GeoIP.conf
|
||||
@ -139,7 +150,38 @@ in
|
||||
ReadWritePaths = cfg.settings.DatabaseDirectory;
|
||||
RuntimeDirectory = "geoipupdate";
|
||||
RuntimeDirectoryMode = 0700;
|
||||
CapabilityBoundingSet = "";
|
||||
PrivateDevices = true;
|
||||
PrivateMounts = true;
|
||||
PrivateUsers = true;
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectHome = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectProc = "invisible";
|
||||
ProcSubset = "pid";
|
||||
SystemCallFilter = [ "@system-service" "~@privileged" "~@resources" ];
|
||||
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
|
||||
RestrictRealtime = true;
|
||||
RestrictNamespaces = true;
|
||||
MemoryDenyWriteExecute = true;
|
||||
LockPersonality = true;
|
||||
SystemCallArchitectures = "native";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.timers.geoipupdate-initial-run = {
|
||||
wantedBy = [ "timers.target" ];
|
||||
unitConfig.ConditionPathExists = "!${cfg.settings.DatabaseDirectory}";
|
||||
timerConfig = {
|
||||
Unit = "geoipupdate.service";
|
||||
OnActiveSec = 0;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
meta.maintainers = [ lib.maintainers.talyz ];
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ ${lib.optionalString cfg.lt-cred-mech "lt-cred-mech"}
|
||||
${lib.optionalString cfg.no-auth "no-auth"}
|
||||
${lib.optionalString cfg.use-auth-secret "use-auth-secret"}
|
||||
${lib.optionalString (cfg.static-auth-secret != null) ("static-auth-secret=${cfg.static-auth-secret}")}
|
||||
${lib.optionalString (cfg.static-auth-secret-file != null) ("static-auth-secret=#static-auth-secret#")}
|
||||
realm=${cfg.realm}
|
||||
${lib.optionalString cfg.no-udp "no-udp"}
|
||||
${lib.optionalString cfg.no-tcp "no-tcp"}
|
||||
@ -182,6 +183,13 @@ in {
|
||||
by a separate program, so this is why that other mode is 'dynamic'.
|
||||
'';
|
||||
};
|
||||
static-auth-secret-file = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to the file containing the static authentication secret.
|
||||
'';
|
||||
};
|
||||
realm = mkOption {
|
||||
type = types.str;
|
||||
default = config.networking.hostName;
|
||||
@ -293,42 +301,63 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
users.users.turnserver =
|
||||
{ uid = config.ids.uids.turnserver;
|
||||
description = "coturn TURN server user";
|
||||
};
|
||||
users.groups.turnserver =
|
||||
{ gid = config.ids.gids.turnserver;
|
||||
members = [ "turnserver" ];
|
||||
};
|
||||
config = mkIf cfg.enable (mkMerge ([
|
||||
{ assertions = [
|
||||
{ assertion = cfg.static-auth-secret != null -> cfg.static-auth-secret-file == null ;
|
||||
message = "static-auth-secret and static-auth-secret-file cannot be set at the same time";
|
||||
}
|
||||
];}
|
||||
|
||||
systemd.services.coturn = {
|
||||
description = "coturn TURN server";
|
||||
after = [ "network-online.target" ];
|
||||
wants = [ "network-online.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
{
|
||||
users.users.turnserver =
|
||||
{ uid = config.ids.uids.turnserver;
|
||||
description = "coturn TURN server user";
|
||||
};
|
||||
users.groups.turnserver =
|
||||
{ gid = config.ids.gids.turnserver;
|
||||
members = [ "turnserver" ];
|
||||
};
|
||||
|
||||
unitConfig = {
|
||||
Documentation = "man:coturn(1) man:turnadmin(1) man:turnserver(1)";
|
||||
};
|
||||
systemd.services.coturn = let
|
||||
runConfig = "/run/coturn/turnserver.cfg";
|
||||
in {
|
||||
description = "coturn TURN server";
|
||||
after = [ "network-online.target" ];
|
||||
wants = [ "network-online.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${pkgs.coturn}/bin/turnserver -c ${configFile}";
|
||||
RuntimeDirectory = "turnserver";
|
||||
User = "turnserver";
|
||||
Group = "turnserver";
|
||||
AmbientCapabilities =
|
||||
mkIf (
|
||||
cfg.listening-port < 1024 ||
|
||||
cfg.alt-listening-port < 1024 ||
|
||||
cfg.tls-listening-port < 1024 ||
|
||||
cfg.alt-tls-listening-port < 1024 ||
|
||||
cfg.min-port < 1024
|
||||
) "cap_net_bind_service";
|
||||
Restart = "on-abort";
|
||||
unitConfig = {
|
||||
Documentation = "man:coturn(1) man:turnadmin(1) man:turnserver(1)";
|
||||
};
|
||||
|
||||
preStart = ''
|
||||
cat ${configFile} > ${runConfig}
|
||||
${optionalString (cfg.static-auth-secret-file != null) ''
|
||||
STATIC_AUTH_SECRET="$(head -n1 ${cfg.static-auth-secret-file} || :)"
|
||||
sed -e "s,#static-auth-secret#,$STATIC_AUTH_SECRET,g" \
|
||||
-i ${runConfig}
|
||||
'' }
|
||||
chmod 640 ${runConfig}
|
||||
'';
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${pkgs.coturn}/bin/turnserver -c ${runConfig}";
|
||||
RuntimeDirectory = "turnserver";
|
||||
User = "turnserver";
|
||||
Group = "turnserver";
|
||||
AmbientCapabilities =
|
||||
mkIf (
|
||||
cfg.listening-port < 1024 ||
|
||||
cfg.alt-listening-port < 1024 ||
|
||||
cfg.tls-listening-port < 1024 ||
|
||||
cfg.alt-tls-listening-port < 1024 ||
|
||||
cfg.min-port < 1024
|
||||
) "cap_net_bind_service";
|
||||
Restart = "on-abort";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /run/coturn 0700 turnserver turnserver - -"
|
||||
];
|
||||
}]));
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Based on: https://github.com/dani-garcia/bitwarden_rs/wiki/Backing-up-your-vault
|
||||
# Based on: https://github.com/dani-garcia/vaultwarden/wiki/Backing-up-your-vault
|
||||
if ! mkdir -p "$BACKUP_FOLDER"; then
|
||||
echo "Could not create backup folder '$BACKUP_FOLDER'" >&2
|
||||
exit 1
|
@ -3,9 +3,9 @@
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.bitwarden_rs;
|
||||
user = config.users.users.bitwarden_rs.name;
|
||||
group = config.users.groups.bitwarden_rs.name;
|
||||
cfg = config.services.vaultwarden;
|
||||
user = config.users.users.vaultwarden.name;
|
||||
group = config.users.groups.vaultwarden.name;
|
||||
|
||||
# Convert name from camel case (e.g. disable2FARemember) to upper case snake case (e.g. DISABLE_2FA_REMEMBER).
|
||||
nameToEnvVar = name:
|
||||
@ -26,22 +26,26 @@ let
|
||||
if value != null then [ (nameValuePair (nameToEnvVar name) (if isBool value then boolToString value else toString value)) ] else []
|
||||
) cfg.config));
|
||||
in { DATA_FOLDER = "/var/lib/bitwarden_rs"; } // optionalAttrs (!(configEnv ? WEB_VAULT_ENABLED) || configEnv.WEB_VAULT_ENABLED == "true") {
|
||||
WEB_VAULT_FOLDER = "${pkgs.bitwarden_rs-vault}/share/bitwarden_rs/vault";
|
||||
WEB_VAULT_FOLDER = "${pkgs.vaultwarden-vault}/share/vaultwarden/vault";
|
||||
} // configEnv;
|
||||
|
||||
configFile = pkgs.writeText "bitwarden_rs.env" (concatStrings (mapAttrsToList (name: value: "${name}=${value}\n") configEnv));
|
||||
configFile = pkgs.writeText "vaultwarden.env" (concatStrings (mapAttrsToList (name: value: "${name}=${value}\n") configEnv));
|
||||
|
||||
bitwarden_rs = pkgs.bitwarden_rs.override { inherit (cfg) dbBackend; };
|
||||
vaultwarden = pkgs.vaultwarden.override { inherit (cfg) dbBackend; };
|
||||
|
||||
in {
|
||||
options.services.bitwarden_rs = with types; {
|
||||
enable = mkEnableOption "bitwarden_rs";
|
||||
imports = [
|
||||
(mkRenamedOptionModule [ "services" "bitwarden_rs" ] [ "services" "vaultwarden" ])
|
||||
];
|
||||
|
||||
options.services.vaultwarden = with types; {
|
||||
enable = mkEnableOption "vaultwarden";
|
||||
|
||||
dbBackend = mkOption {
|
||||
type = enum [ "sqlite" "mysql" "postgresql" ];
|
||||
default = "sqlite";
|
||||
description = ''
|
||||
Which database backend bitwarden_rs will be using.
|
||||
Which database backend vaultwarden will be using.
|
||||
'';
|
||||
};
|
||||
|
||||
@ -49,7 +53,7 @@ in {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
The directory under which bitwarden_rs will backup its persistent data.
|
||||
The directory under which vaultwarden will backup its persistent data.
|
||||
'';
|
||||
};
|
||||
|
||||
@ -65,7 +69,7 @@ in {
|
||||
}
|
||||
'';
|
||||
description = ''
|
||||
The configuration of bitwarden_rs is done through environment variables,
|
||||
The configuration of vaultwarden is done through environment variables,
|
||||
therefore the names are converted from camel case (e.g. disable2FARemember)
|
||||
to upper case snake case (e.g. DISABLE_2FA_REMEMBER).
|
||||
In this conversion digits (0-9) are handled just like upper case characters,
|
||||
@ -75,17 +79,17 @@ in {
|
||||
This allows working around any potential future conflicting naming conventions.
|
||||
|
||||
Based on the attributes passed to this config option an environment file will be generated
|
||||
that is passed to bitwarden_rs's systemd service.
|
||||
that is passed to vaultwarden's systemd service.
|
||||
|
||||
The available configuration options can be found in
|
||||
<link xlink:href="https://github.com/dani-garcia/bitwarden_rs/blob/${bitwarden_rs.version}/.env.template">the environment template file</link>.
|
||||
<link xlink:href="https://github.com/dani-garcia/vaultwarden/blob/${vaultwarden.version}/.env.template">the environment template file</link>.
|
||||
'';
|
||||
};
|
||||
|
||||
environmentFile = mkOption {
|
||||
type = with types; nullOr path;
|
||||
default = null;
|
||||
example = "/root/bitwarden_rs.env";
|
||||
example = "/root/vaultwarden.env";
|
||||
description = ''
|
||||
Additional environment file as defined in <citerefentry>
|
||||
<refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum>
|
||||
@ -95,7 +99,7 @@ in {
|
||||
may be passed to the service without adding them to the world-readable Nix store.
|
||||
|
||||
Note that this file needs to be available on the host on which
|
||||
<literal>bitwarden_rs</literal> is running.
|
||||
<literal>vaultwarden</literal> is running.
|
||||
'';
|
||||
};
|
||||
};
|
||||
@ -106,20 +110,21 @@ in {
|
||||
message = "Backups for database backends other than sqlite will need customization";
|
||||
} ];
|
||||
|
||||
users.users.bitwarden_rs = {
|
||||
users.users.vaultwarden = {
|
||||
inherit group;
|
||||
isSystemUser = true;
|
||||
};
|
||||
users.groups.bitwarden_rs = { };
|
||||
users.groups.vaultwarden = { };
|
||||
|
||||
systemd.services.bitwarden_rs = {
|
||||
systemd.services.vaultwarden = {
|
||||
aliases = [ "bitwarden_rs" ];
|
||||
after = [ "network.target" ];
|
||||
path = with pkgs; [ openssl ];
|
||||
serviceConfig = {
|
||||
User = user;
|
||||
Group = group;
|
||||
EnvironmentFile = [ configFile ] ++ optional (cfg.environmentFile != null) cfg.environmentFile;
|
||||
ExecStart = "${bitwarden_rs}/bin/bitwarden_rs";
|
||||
ExecStart = "${vaultwarden}/bin/vaultwarden";
|
||||
LimitNOFILE = "1048576";
|
||||
PrivateTmp = "true";
|
||||
PrivateDevices = "true";
|
||||
@ -131,15 +136,16 @@ in {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
};
|
||||
|
||||
systemd.services.backup-bitwarden_rs = mkIf (cfg.backupDir != null) {
|
||||
description = "Backup bitwarden_rs";
|
||||
systemd.services.backup-vaultwarden = mkIf (cfg.backupDir != null) {
|
||||
aliases = [ "backup-bitwarden_rs" ];
|
||||
description = "Backup vaultwarden";
|
||||
environment = {
|
||||
DATA_FOLDER = "/var/lib/bitwarden_rs";
|
||||
BACKUP_FOLDER = cfg.backupDir;
|
||||
};
|
||||
path = with pkgs; [ sqlite ];
|
||||
serviceConfig = {
|
||||
SyslogIdentifier = "backup-bitwarden_rs";
|
||||
SyslogIdentifier = "backup-vaultwarden";
|
||||
Type = "oneshot";
|
||||
User = mkDefault user;
|
||||
Group = mkDefault group;
|
||||
@ -148,12 +154,13 @@ in {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
};
|
||||
|
||||
systemd.timers.backup-bitwarden_rs = mkIf (cfg.backupDir != null) {
|
||||
description = "Backup bitwarden_rs on time";
|
||||
systemd.timers.backup-vaultwarden = mkIf (cfg.backupDir != null) {
|
||||
aliases = [ "backup-bitwarden_rs" ];
|
||||
description = "Backup vaultwarden on time";
|
||||
timerConfig = {
|
||||
OnCalendar = mkDefault "23:00";
|
||||
Persistent = "true";
|
||||
Unit = "backup-bitwarden_rs.service";
|
||||
Unit = "backup-vaultwarden.service";
|
||||
};
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
};
|
@ -13,7 +13,7 @@ let
|
||||
# !!! fix this
|
||||
children = mapAttrs (childName: childConfig:
|
||||
(import ../../../lib/eval-config.nix {
|
||||
inherit baseModules specialArgs;
|
||||
inherit lib baseModules specialArgs;
|
||||
system = config.nixpkgs.initialSystem;
|
||||
modules =
|
||||
(optionals childConfig.inheritParentConfig modules)
|
||||
|
@ -621,6 +621,8 @@ in
|
||||
Whether to allow TRIM requests to the underlying device. This option
|
||||
has security implications; please read the LUKS documentation before
|
||||
activating it.
|
||||
This option is incompatible with authenticated encryption (dm-crypt
|
||||
stacked over dm-integrity).
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -42,12 +42,12 @@ in
|
||||
bind = handleTest ./bind.nix {};
|
||||
bitcoind = handleTest ./bitcoind.nix {};
|
||||
bittorrent = handleTest ./bittorrent.nix {};
|
||||
bitwarden = handleTest ./bitwarden.nix {};
|
||||
blockbook-frontend = handleTest ./blockbook-frontend.nix {};
|
||||
boot = handleTestOn ["x86_64-linux"] ./boot.nix {}; # syslinux is unsupported on aarch64
|
||||
boot-stage1 = handleTest ./boot-stage1.nix {};
|
||||
borgbackup = handleTest ./borgbackup.nix {};
|
||||
botamusique = handleTest ./botamusique.nix {};
|
||||
btrbk = handleTest ./btrbk.nix {};
|
||||
buildbot = handleTest ./buildbot.nix {};
|
||||
buildkite-agents = handleTest ./buildkite-agents.nix {};
|
||||
caddy = handleTest ./caddy.nix {};
|
||||
@ -88,6 +88,7 @@ in
|
||||
containers-tmpfs = handleTest ./containers-tmpfs.nix {};
|
||||
convos = handleTest ./convos.nix {};
|
||||
corerad = handleTest ./corerad.nix {};
|
||||
coturn = handleTest ./coturn.nix {};
|
||||
couchdb = handleTest ./couchdb.nix {};
|
||||
cri-o = handleTestOn ["x86_64-linux"] ./cri-o.nix {};
|
||||
custom-ca = handleTest ./custom-ca.nix {};
|
||||
@ -446,6 +447,7 @@ in
|
||||
v2ray = handleTest ./v2ray.nix {};
|
||||
vault = handleTest ./vault.nix {};
|
||||
vault-postgresql = handleTest ./vault-postgresql.nix {};
|
||||
vaultwarden = handleTest ./vaultwarden.nix {};
|
||||
vector = handleTest ./vector.nix {};
|
||||
victoriametrics = handleTest ./victoriametrics.nix {};
|
||||
virtualbox = handleTestOn ["x86_64-linux"] ./virtualbox.nix {};
|
||||
|
110
nixos/tests/btrbk.nix
Normal file
110
nixos/tests/btrbk.nix
Normal file
@ -0,0 +1,110 @@
|
||||
import ./make-test-python.nix ({ pkgs, ... }:
|
||||
|
||||
let
|
||||
privateKey = ''
|
||||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
|
||||
QyNTUxOQAAACBx8UB04Q6Q/fwDFjakHq904PYFzG9pU2TJ9KXpaPMcrwAAAJB+cF5HfnBe
|
||||
RwAAAAtzc2gtZWQyNTUxOQAAACBx8UB04Q6Q/fwDFjakHq904PYFzG9pU2TJ9KXpaPMcrw
|
||||
AAAEBN75NsJZSpt63faCuaD75Unko0JjlSDxMhYHAPJk2/xXHxQHThDpD9/AMWNqQer3Tg
|
||||
9gXMb2lTZMn0pelo8xyvAAAADXJzY2h1ZXR6QGt1cnQ=
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
'';
|
||||
publicKey = ''
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHHxQHThDpD9/AMWNqQer3Tg9gXMb2lTZMn0pelo8xyv
|
||||
'';
|
||||
in
|
||||
{
|
||||
name = "btrbk";
|
||||
meta = with pkgs.lib; {
|
||||
maintainers = with maintainers; [ symphorien ];
|
||||
};
|
||||
|
||||
nodes = {
|
||||
archive = { ... }: {
|
||||
environment.systemPackages = with pkgs; [ btrfs-progs ];
|
||||
# note: this makes the privateKey world readable.
|
||||
# don't do it with real ssh keys.
|
||||
environment.etc."btrbk_key".text = privateKey;
|
||||
services.btrbk = {
|
||||
extraPackages = [ pkgs.lz4 ];
|
||||
instances = {
|
||||
remote = {
|
||||
onCalendar = "minutely";
|
||||
settings = {
|
||||
ssh_identity = "/etc/btrbk_key";
|
||||
ssh_user = "btrbk";
|
||||
stream_compress = "lz4";
|
||||
volume = {
|
||||
"ssh://main/mnt" = {
|
||||
target = "/mnt";
|
||||
snapshot_dir = "btrbk/remote";
|
||||
subvolume = "to_backup";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
main = { ... }: {
|
||||
environment.systemPackages = with pkgs; [ btrfs-progs ];
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
passwordAuthentication = false;
|
||||
challengeResponseAuthentication = false;
|
||||
};
|
||||
services.btrbk = {
|
||||
extraPackages = [ pkgs.lz4 ];
|
||||
sshAccess = [
|
||||
{
|
||||
key = publicKey;
|
||||
roles = [ "source" "send" "info" "delete" ];
|
||||
}
|
||||
];
|
||||
instances = {
|
||||
local = {
|
||||
onCalendar = "minutely";
|
||||
settings = {
|
||||
volume = {
|
||||
"/mnt" = {
|
||||
snapshot_dir = "btrbk/local";
|
||||
subvolume = "to_backup";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
start_all()
|
||||
|
||||
# create btrfs partition at /mnt
|
||||
for machine in (archive, main):
|
||||
machine.succeed("dd if=/dev/zero of=/data_fs bs=120M count=1")
|
||||
machine.succeed("mkfs.btrfs /data_fs")
|
||||
machine.succeed("mkdir /mnt")
|
||||
machine.succeed("mount /data_fs /mnt")
|
||||
|
||||
# what to backup and where
|
||||
main.succeed("btrfs subvolume create /mnt/to_backup")
|
||||
main.succeed("mkdir -p /mnt/btrbk/{local,remote}")
|
||||
|
||||
# check that local snapshots work
|
||||
with subtest("local"):
|
||||
main.succeed("echo foo > /mnt/to_backup/bar")
|
||||
main.wait_until_succeeds("cat /mnt/btrbk/local/*/bar | grep foo")
|
||||
main.succeed("echo bar > /mnt/to_backup/bar")
|
||||
main.succeed("cat /mnt/btrbk/local/*/bar | grep foo")
|
||||
|
||||
# check that btrfs send/receive works and ssh access works
|
||||
with subtest("remote"):
|
||||
archive.wait_until_succeeds("cat /mnt/*/bar | grep bar")
|
||||
main.succeed("echo baz > /mnt/to_backup/bar")
|
||||
archive.succeed("cat /mnt/*/bar | grep bar")
|
||||
'';
|
||||
})
|
29
nixos/tests/coturn.nix
Normal file
29
nixos/tests/coturn.nix
Normal file
@ -0,0 +1,29 @@
|
||||
import ./make-test-python.nix ({ ... }: {
|
||||
name = "coturn";
|
||||
nodes = {
|
||||
default = {
|
||||
services.coturn.enable = true;
|
||||
};
|
||||
secretsfile = {
|
||||
boot.postBootCommands = ''
|
||||
echo "some-very-secret-string" > /run/coturn-secret
|
||||
'';
|
||||
services.coturn = {
|
||||
enable = true;
|
||||
static-auth-secret-file = "/run/coturn-secret";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
start_all()
|
||||
|
||||
with subtest("by default works without configuration"):
|
||||
default.wait_for_unit("coturn.service")
|
||||
|
||||
with subtest("works with static-auth-secret-file"):
|
||||
secretsfile.wait_for_unit("coturn.service")
|
||||
secretsfile.succeed("grep 'some-very-secret-string' /run/coturn/turnserver.cfg")
|
||||
'';
|
||||
})
|
@ -98,7 +98,7 @@ import ./../make-test-python.nix ({ pkgs, ...} : {
|
||||
}];
|
||||
services.mysql.settings = {
|
||||
mysqld = {
|
||||
plugin-load-add = [ "ha_rocksdb.so" ];
|
||||
plugin-load-add = [ "ha_mroonga.so" "ha_rocksdb.so" ];
|
||||
};
|
||||
};
|
||||
services.mysql.package = pkgs.mariadb;
|
||||
@ -172,6 +172,20 @@ import ./../make-test-python.nix ({ pkgs, ...} : {
|
||||
"echo 'use testdb; select test_id from tests;' | sudo -u testuser mysql -u testuser -N | grep 42"
|
||||
)
|
||||
|
||||
# Check if Mroonga plugin works
|
||||
mariadb.succeed(
|
||||
"echo 'use testdb; create table mroongadb (test_id INT, PRIMARY KEY (test_id)) ENGINE = Mroonga;' | sudo -u testuser mysql -u testuser"
|
||||
)
|
||||
mariadb.succeed(
|
||||
"echo 'use testdb; insert into mroongadb values (25);' | sudo -u testuser mysql -u testuser"
|
||||
)
|
||||
mariadb.succeed(
|
||||
"echo 'use testdb; select test_id from mroongadb;' | sudo -u testuser mysql -u testuser -N | grep 25"
|
||||
)
|
||||
mariadb.succeed(
|
||||
"echo 'use testdb; drop table mroongadb;' | sudo -u testuser mysql -u testuser"
|
||||
)
|
||||
|
||||
# Check if RocksDB plugin works
|
||||
mariadb.succeed(
|
||||
"echo 'use testdb; create table rocksdb (test_id INT, PRIMARY KEY (test_id)) ENGINE = RocksDB;' | sudo -u testuser mysql -u testuser"
|
||||
|
@ -104,6 +104,7 @@ import ./make-test-python.nix ({ pkgs, ... }: {
|
||||
ats.wait_for_open_port(80)
|
||||
httpbin.wait_for_unit("httpbin")
|
||||
httpbin.wait_for_open_port(80)
|
||||
client.wait_for_unit("network-online.target")
|
||||
|
||||
with subtest("Traffic Server is running"):
|
||||
out = ats.succeed("traffic_ctl server status")
|
||||
|
@ -4,7 +4,7 @@
|
||||
}:
|
||||
|
||||
# These tests will:
|
||||
# * Set up a bitwarden-rs server
|
||||
# * Set up a vaultwarden server
|
||||
# * Have Firefox use the web vault to create an account, log in, and save a password to the valut
|
||||
# * Have the bw cli log in and read that password from the vault
|
||||
#
|
||||
@ -24,8 +24,8 @@ let
|
||||
|
||||
storedPassword = "seeeecret";
|
||||
|
||||
makeBitwardenTest = backend: makeTest {
|
||||
name = "bitwarden_rs-${backend}";
|
||||
makeVaultwardenTest = backend: makeTest {
|
||||
name = "vaultwarden-${backend}";
|
||||
meta = {
|
||||
maintainers = with pkgs.lib.maintainers; [ jjjollyjim ];
|
||||
};
|
||||
@ -45,9 +45,9 @@ let
|
||||
package = pkgs.mariadb;
|
||||
};
|
||||
|
||||
services.bitwarden_rs.config.databaseUrl = "mysql://bitwardenuser:${dbPassword}@localhost/bitwarden";
|
||||
services.vaultwarden.config.databaseUrl = "mysql://bitwardenuser:${dbPassword}@localhost/bitwarden";
|
||||
|
||||
systemd.services.bitwarden_rs.after = [ "mysql.service" ];
|
||||
systemd.services.vaultwarden.after = [ "mysql.service" ];
|
||||
};
|
||||
|
||||
postgresql = {
|
||||
@ -60,9 +60,9 @@ let
|
||||
'';
|
||||
};
|
||||
|
||||
services.bitwarden_rs.config.databaseUrl = "postgresql://bitwardenuser:${dbPassword}@localhost/bitwarden";
|
||||
services.vaultwarden.config.databaseUrl = "postgresql://bitwardenuser:${dbPassword}@localhost/bitwarden";
|
||||
|
||||
systemd.services.bitwarden_rs.after = [ "postgresql.service" ];
|
||||
systemd.services.vaultwarden.after = [ "postgresql.service" ];
|
||||
};
|
||||
|
||||
sqlite = { };
|
||||
@ -71,7 +71,7 @@ let
|
||||
mkMerge [
|
||||
backendConfig.${backend}
|
||||
{
|
||||
services.bitwarden_rs = {
|
||||
services.vaultwarden = {
|
||||
enable = true;
|
||||
dbBackend = backend;
|
||||
config.rocketPort = 80;
|
||||
@ -152,7 +152,7 @@ let
|
||||
|
||||
testScript = ''
|
||||
start_all()
|
||||
server.wait_for_unit("bitwarden_rs.service")
|
||||
server.wait_for_unit("vaultwarden.service")
|
||||
server.wait_for_open_port(80)
|
||||
|
||||
with subtest("configure the cli"):
|
||||
@ -184,6 +184,6 @@ let
|
||||
in
|
||||
builtins.listToAttrs (
|
||||
map
|
||||
(backend: { name = backend; value = makeBitwardenTest backend; })
|
||||
(backend: { name = backend; value = makeVaultwardenTest backend; })
|
||||
backends
|
||||
)
|
@ -1,23 +1,19 @@
|
||||
let
|
||||
aliceIp6 = "200:3b91:b2d8:e708:fbf3:f06:fdd5:90d0";
|
||||
aliceIp6 = "202:b70:9b0b:cf34:f93c:8f18:bbfd:7034";
|
||||
aliceKeys = {
|
||||
EncryptionPublicKey = "13e23986fe76bc3966b42453f479bc563348b7ff76633b7efcb76e185ec7652f";
|
||||
EncryptionPrivateKey = "9f86947b15e86f9badac095517a1982e39a2db37ca726357f95987b898d82208";
|
||||
SigningPublicKey = "e2c43349083bc1e998e4ec4535b4c6a8f44ca9a5a8e07336561267253b2be5f4";
|
||||
SigningPrivateKey = "fe3add8da35316c05f6d90d3ca79bd2801e6ccab6d37e5339fef4152589398abe2c43349083bc1e998e4ec4535b4c6a8f44ca9a5a8e07336561267253b2be5f4";
|
||||
PublicKey = "3e91ec9e861960d86e1ce88051f97c435bdf2859640ab681dfa906eb45ad5182";
|
||||
PrivateKey = "a867f9e078e4ce58d310cf5acd4622d759e2a21df07e1d6fc380a2a26489480d3e91ec9e861960d86e1ce88051f97c435bdf2859640ab681dfa906eb45ad5182";
|
||||
};
|
||||
bobIp6 = "201:ebbd:bde9:f138:c302:4afa:1fb6:a19a";
|
||||
bobPrefix = "301:ebbd:bde9:f138";
|
||||
bobIp6 = "202:a483:73a4:9f2d:a559:4a19:bc9:8458";
|
||||
bobPrefix = "302:a483:73a4:9f2d";
|
||||
bobConfig = {
|
||||
InterfacePeers = {
|
||||
eth1 = [ "tcp://192.168.1.200:12345" ];
|
||||
};
|
||||
MulticastInterfaces = [ "eth1" ];
|
||||
LinkLocalTCPPort = 54321;
|
||||
EncryptionPublicKey = "c99d6830111e12d1b004c52fe9e5a2eef0f6aefca167aca14589a370b7373279";
|
||||
EncryptionPrivateKey = "2e698a53d3fdce5962d2ff37de0fe77742a5c8b56cd8259f5da6aa792f6e8ba3";
|
||||
SigningPublicKey = "de111da0ec781e45bf6c63ecb45a78c24d7d4655abfaeea83b26c36eb5c0fd5b";
|
||||
SigningPrivateKey = "2a6c21550f3fca0331df50668ffab66b6dce8237bcd5728e571e8033b363e247de111da0ec781e45bf6c63ecb45a78c24d7d4655abfaeea83b26c36eb5c0fd5b";
|
||||
PublicKey = "2b6f918b6c1a4b54d6bcde86cf74e074fb32ead4ee439b7930df2aa60c825186";
|
||||
PrivateKey = "0c4a24acd3402722ce9277ed179f4a04b895b49586493c25fbaed60653d857d62b6f918b6c1a4b54d6bcde86cf74e074fb32ead4ee439b7930df2aa60c825186";
|
||||
};
|
||||
danIp6 = bobPrefix + "::2";
|
||||
|
||||
|
@ -23,7 +23,7 @@ import ./make-test-python.nix ({ pkgs, ...} : {
|
||||
# Login
|
||||
default.wait_until_tty_matches(1, "login: ")
|
||||
default.send_chars("root\n")
|
||||
default.wait_until_tty_matches(1, "root@default>")
|
||||
default.wait_until_tty_matches(1, r"\nroot@default\b")
|
||||
|
||||
# Generate some history
|
||||
default.send_chars("echo foobar\n")
|
||||
|
200
pkgs/applications/audio/pianoteq/default.nix
Normal file
200
pkgs/applications/audio/pianoteq/default.nix
Normal file
@ -0,0 +1,200 @@
|
||||
{ lib, stdenv, curl, gnugrep, jq, xorg, alsa-lib, freetype, p7zip, autoPatchelfHook, writeShellScript, zlib, libjack2, makeWrapper }:
|
||||
let
|
||||
versionForFile = v: builtins.replaceStrings ["."] [""] v;
|
||||
|
||||
mkPianoteq = { name, src, version, archdir, ... }:
|
||||
stdenv.mkDerivation rec {
|
||||
inherit src version;
|
||||
|
||||
pname = "pianoteq-${name}";
|
||||
|
||||
unpackPhase = ''
|
||||
${p7zip}/bin/7z x $src
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [
|
||||
autoPatchelfHook
|
||||
makeWrapper
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
stdenv.cc.cc.lib
|
||||
xorg.libX11 # libX11.so.6
|
||||
xorg.libXext # libXext.so.6
|
||||
alsa-lib # libasound.so.2
|
||||
freetype # libfreetype.so.6
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
mv -t $out/bin Pianoteq*/${archdir}/*
|
||||
for f in $out/bin/Pianoteq*; do
|
||||
if [ -x "$f" ] && [ -f "$f" ]; then
|
||||
wrapProgram "$f" --prefix LD_LIBRARY_PATH : ${
|
||||
lib.makeLibraryPath (buildInputs ++ [
|
||||
xorg.libXcursor
|
||||
xorg.libXinerama
|
||||
xorg.libXrandr
|
||||
libjack2
|
||||
zlib
|
||||
])
|
||||
}
|
||||
fi
|
||||
done
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://www.modartt.com/pianoteq";
|
||||
description = "Software synthesizer that features real-time MIDI-control of digital physically modeled pianos and related instruments";
|
||||
license = licenses.unfree;
|
||||
platforms = [ "x86_64-linux" ]; # TODO extract binary according to each platform?
|
||||
maintainers = [ maintainers.mausch ];
|
||||
};
|
||||
};
|
||||
|
||||
fetchWithCurlScript = { name, sha256, script, impureEnvVars ? [] }:
|
||||
stdenv.mkDerivation {
|
||||
inherit name;
|
||||
builder = writeShellScript "builder.sh" ''
|
||||
source $stdenv/setup
|
||||
|
||||
curlVersion=$(${curl}/bin/curl -V | head -1 | cut -d' ' -f2)
|
||||
|
||||
# Curl flags to handle redirects, not use EPSV, handle cookies for
|
||||
# servers to need them during redirects, and work on SSL without a
|
||||
# certificate (this isn't a security problem because we check the
|
||||
# cryptographic hash of the output anyway).
|
||||
curl=(
|
||||
${curl}/bin/curl
|
||||
--location
|
||||
--max-redirs 20
|
||||
--retry 3
|
||||
--disable-epsv
|
||||
--cookie-jar cookies
|
||||
--insecure
|
||||
--user-agent "curl/$curlVersion Nixpkgs/${lib.trivial.release}"
|
||||
$NIX_CURL_FLAGS
|
||||
)
|
||||
|
||||
${script}
|
||||
|
||||
'';
|
||||
nativeBuildInputs = [ curl ];
|
||||
outputHashAlgo = "sha256";
|
||||
outputHash = sha256;
|
||||
|
||||
impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ impureEnvVars ++ [
|
||||
# This variable allows the user to pass additional options to curl
|
||||
"NIX_CURL_FLAGS"
|
||||
];
|
||||
};
|
||||
|
||||
fetchPianoteqTrial = { name, sha256 }:
|
||||
fetchWithCurlScript {
|
||||
inherit name sha256;
|
||||
script = ''
|
||||
"''${curl[@]}" --silent --request POST \
|
||||
--cookie cookies \
|
||||
--header "modartt-json: request" \
|
||||
--header "origin: https://www.modartt.com" \
|
||||
--header "content-type: application/json; charset=UTF-8" \
|
||||
--header "accept: application/json, text/javascript, */*" \
|
||||
--data-raw '{"file": "${name}", "get": "url"}' \
|
||||
https://www.modartt.com/json/download -o /dev/null
|
||||
json=$(
|
||||
"''${curl[@]}" --silent --request POST \
|
||||
--cookie cookies \
|
||||
--header "modartt-json: request" \
|
||||
--header "origin: https://www.modartt.com" \
|
||||
--header "content-type: application/json; charset=UTF-8" \
|
||||
--header "accept: application/json, text/javascript, */*" \
|
||||
--data-raw '{"file": "${name}", "get": "url"}' \
|
||||
https://www.modartt.com/json/download
|
||||
)
|
||||
url=$(echo $json | ${jq}/bin/jq -r .url)
|
||||
"''${curl[@]}" --progress-bar --cookie cookies -o $out "$url"
|
||||
'';
|
||||
};
|
||||
|
||||
fetchPianoteqWithLogin = { name, sha256 }:
|
||||
fetchWithCurlScript {
|
||||
inherit name sha256;
|
||||
|
||||
impureEnvVars = [ "NIX_MODARTT_USERNAME" "NIX_MODARTT_PASSWORD" ];
|
||||
|
||||
script = ''
|
||||
if [ -z "''${NIX_MODARTT_USERNAME}" -o -z "''${NIX_MODARTT_PASSWORD}" ]; then
|
||||
echo "Error: Downloading a personal Pianoteq instance requires the nix building process (nix-daemon in multi user mode) to have the NIX_MODARTT_USERNAME and NIX_MODARTT_PASSWORD env vars set." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
"''${curl[@]}" -s -o /dev/null "https://www.modartt.com/user_area"
|
||||
|
||||
${jq}/bin/jq -n "{connect: 1, login: \"''${NIX_MODARTT_USERNAME}\", password: \"''${NIX_MODARTT_PASSWORD}\"}" > login.json
|
||||
|
||||
"''${curl[@]}" --silent --request POST \
|
||||
--cookie cookies \
|
||||
--referer "https://www.modartt.com/user_area" \
|
||||
--header "modartt-json: request" \
|
||||
--header "origin: https://www.modartt.com" \
|
||||
--header "content-type: application/json; charset=UTF-8" \
|
||||
--header "accept: application/json, text/javascript, */*" \
|
||||
--data @login.json \
|
||||
https://www.modartt.com/json/session
|
||||
|
||||
json=$(
|
||||
"''${curl[@]}" --silent --request POST \
|
||||
--cookie cookies \
|
||||
--header "modartt-json: request" \
|
||||
--header "origin: https://www.modartt.com" \
|
||||
--header "content-type: application/json; charset=UTF-8" \
|
||||
--header "accept: application/json, text/javascript, */*" \
|
||||
--data-raw '{"file": "${name}", "get": "url"}' \
|
||||
https://www.modartt.com/json/download
|
||||
)
|
||||
url=$(echo $json | ${jq}/bin/jq -r .url)
|
||||
|
||||
"''${curl[@]}" --progress-bar --cookie cookies -o $out "$url"
|
||||
'';
|
||||
};
|
||||
|
||||
in {
|
||||
# TODO currently can't install more than one because `lame` clashes
|
||||
stage-trial = mkPianoteq rec {
|
||||
name = "stage-trial";
|
||||
version = "7.3.0";
|
||||
archdir = "x86-64bit";
|
||||
src = fetchPianoteqTrial {
|
||||
name = "pianoteq_stage_linux_trial_v${versionForFile version}.7z";
|
||||
sha256 = "12zbr54ng7cb4ngl1qrf5h0gs8c42d6d3j08492xr14m9x9y132k";
|
||||
};
|
||||
};
|
||||
standard-trial = mkPianoteq rec {
|
||||
name = "standard-trial";
|
||||
version = "7.3.0";
|
||||
archdir = "x86-64bit";
|
||||
src = fetchPianoteqTrial {
|
||||
name = "pianoteq_linux_trial_v${versionForFile version}.7z";
|
||||
sha256 = "04sh45hm3y3y6kfj3p32fi6p95r9fc6xf4r5i74laylms4f6gr6d";
|
||||
};
|
||||
};
|
||||
stage-6 = mkPianoteq rec {
|
||||
name = "stage-6";
|
||||
version = "6.7.3";
|
||||
archdir = "amd64";
|
||||
src = fetchPianoteqWithLogin {
|
||||
name = "pianoteq_stage_linux_v${versionForFile version}.7z";
|
||||
sha256 = "0jy0hkdynhwv0zhrqkby0hdphgmcc09wxmy74rhg9afm1pzl91jy";
|
||||
};
|
||||
};
|
||||
stage-7 = mkPianoteq rec {
|
||||
name = "stage-7";
|
||||
version = "7.3.0";
|
||||
archdir = "x86-64bit";
|
||||
src = fetchPianoteqWithLogin {
|
||||
name = "pianoteq_stage_linux_v${versionForFile version}.7z";
|
||||
sha256 = "05w7sv9v38r6ljz9xai816w5z2qqwx88hcfjm241fvgbs54125hx";
|
||||
};
|
||||
};
|
||||
# TODO other paid binaries, I don't own that so I don't know their hash.
|
||||
}
|
@ -40,7 +40,7 @@ pythonPackages.buildPythonApplication rec {
|
||||
|
||||
propagatedBuildInputs = with pythonPackages; [
|
||||
chromaprint
|
||||
dateutil
|
||||
python-dateutil
|
||||
discid
|
||||
fasteners
|
||||
mutagen
|
||||
|
@ -1,30 +1,34 @@
|
||||
{ lib, stdenv, fetchurl, alsa-lib, gtk2, pkg-config }:
|
||||
{ lib, stdenv, fetchFromGitHub, pkg-config, wrapGAppsHook, alsa-lib, gtk3, libpulseaudio }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "praat";
|
||||
version = "6.0.43";
|
||||
version = "6.1.50";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/praat/praat/archive/v${version}.tar.gz";
|
||||
sha256 = "1l13bvnl7sv8v6s5z63201bhzavnj6bnqcj446akippsam13z4sf";
|
||||
src = fetchFromGitHub {
|
||||
owner = "praat";
|
||||
repo = "praat";
|
||||
rev = "v${version}";
|
||||
sha256 = "11cw4292pml71hdnfy8y91blwyh45dyam1ywr09355zk44c5njpq";
|
||||
};
|
||||
|
||||
configurePhase = ''
|
||||
cp makefiles/makefile.defs.linux.alsa makefile.defs
|
||||
cp makefiles/makefile.defs.linux.pulse makefile.defs
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
cp praat $out/bin
|
||||
install -Dt $out/bin praat
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [ pkg-config ];
|
||||
buildInputs = [ alsa-lib gtk2 ];
|
||||
nativeBuildInputs = [ pkg-config wrapGAppsHook ];
|
||||
buildInputs = [ alsa-lib gtk3 libpulseaudio ];
|
||||
|
||||
meta = {
|
||||
enableParallelBuilding = true;
|
||||
|
||||
meta = with lib; {
|
||||
description = "Doing phonetics by computer";
|
||||
homepage = "https://www.fon.hum.uva.nl/praat/";
|
||||
license = lib.licenses.gpl2Plus; # Has some 3rd-party code in it though
|
||||
platforms = lib.platforms.linux;
|
||||
license = licenses.gpl2Plus; # Has some 3rd-party code in it though
|
||||
maintainers = with maintainers; [ orivej ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
|
@ -16,8 +16,6 @@ python3Packages.buildPythonApplication rec {
|
||||
};
|
||||
|
||||
patches = [
|
||||
# tweak version requirements to what's available in Nixpkgs
|
||||
./dependencies.patch
|
||||
# Allow later websockets release, https://github.com/Chia-Network/chia-blockchain/pull/6304
|
||||
(fetchpatch {
|
||||
name = "later-websockets.patch";
|
||||
@ -66,6 +64,16 @@ python3Packages.buildPythonApplication rec {
|
||||
"test_spend_zero_coin"
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
# tweak version requirements to what's available in Nixpkgs
|
||||
substituteInPlace setup.py \
|
||||
--replace "aiohttp==3.7.4" "aiohttp>=3.7.4" \
|
||||
--replace "sortedcontainers==2.3.0" "sortedcontainers>=2.3.0" \
|
||||
--replace "click==7.1.2" "click>=7.1.2" \
|
||||
--replace "clvm_rs==0.1.7" "clvm_rs>=0.1.7" \
|
||||
--replace "clvm==0.9.6" "clvm>=0.9.6" \
|
||||
'';
|
||||
|
||||
preCheck = ''
|
||||
export HOME=`mktemp -d`
|
||||
'';
|
||||
|
@ -1,13 +0,0 @@
|
||||
diff --git a/setup.py b/setup.py
|
||||
index c5cf95db..b783a9e6 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -8,7 +8,7 @@ dependencies = [
|
||||
"clvm==0.9.6",
|
||||
"clvm_rs==0.1.7",
|
||||
"clvm_tools==0.4.3",
|
||||
- "aiohttp==3.7.4", # HTTP server for full node rpc
|
||||
+ "aiohttp==3.7.4.post0", # HTTP server for full node rpc
|
||||
"aiosqlite==0.17.0", # asyncio wrapper for sqlite, to store blocks
|
||||
"bitstring==3.1.7", # Binary data management library
|
||||
"colorlog==5.0.1", # Adds color to logs
|
@ -640,10 +640,10 @@
|
||||
elpaBuild {
|
||||
pname = "consult";
|
||||
ename = "consult";
|
||||
version = "0.8";
|
||||
version = "0.9";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/consult-0.8.tar";
|
||||
sha256 = "0vkq8dsj6k3gsdhiyg6ccv49fqgjw6f0db4wjsvm5zbkadjvlm86";
|
||||
url = "https://elpa.gnu.org/packages/consult-0.9.tar";
|
||||
sha256 = "1n3bnvgj92fjd9dai9f95wvyfb20yhaw7b722lkqjg42i10jqzfn";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -670,10 +670,10 @@
|
||||
elpaBuild {
|
||||
pname = "corfu";
|
||||
ename = "corfu";
|
||||
version = "0.8";
|
||||
version = "0.9";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/corfu-0.8.tar";
|
||||
sha256 = "1qrrky1g4k5vw56435dgkwnmnri7i51gkydd76as3l0ixm4pnp05";
|
||||
url = "https://elpa.gnu.org/packages/corfu-0.9.tar";
|
||||
sha256 = "0710bq07j6w6zm49ci1bbx580frdbc62b3hbxwzkwm5204nf78bf";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -835,10 +835,10 @@
|
||||
elpaBuild {
|
||||
pname = "devdocs";
|
||||
ename = "devdocs";
|
||||
version = "0.1";
|
||||
version = "0.2";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/devdocs-0.1.tar";
|
||||
sha256 = "1ps2jpp1ckq9839l63p6npqrf85b8zb5akwvjvv7fkm8nvspdkil";
|
||||
url = "https://elpa.gnu.org/packages/devdocs-0.2.tar";
|
||||
sha256 = "1npc7yra7pvf86ahmz1h7hnjxrz15ar1vjcalg4ilizypycpgrwj";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -1015,10 +1015,10 @@
|
||||
elpaBuild {
|
||||
pname = "ebdb";
|
||||
ename = "ebdb";
|
||||
version = "0.6.23";
|
||||
version = "0.6.24";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/ebdb-0.6.23.tar";
|
||||
sha256 = "0j3jvy9s606qjqcmcjzgck3dp8bhpgly2g00wnswzcgk4makdzld";
|
||||
url = "https://elpa.gnu.org/packages/ebdb-0.6.24.tar";
|
||||
sha256 = "0156rh6fkv2yp509h6i8qzh4gsda2mcmfrxl4r6ywn1z5ahijc3r";
|
||||
};
|
||||
packageRequires = [ cl-lib emacs seq ];
|
||||
meta = {
|
||||
@ -1075,10 +1075,10 @@
|
||||
elpaBuild {
|
||||
pname = "eev";
|
||||
ename = "eev";
|
||||
version = "20210607";
|
||||
version = "20210618";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/eev-20210607.tar";
|
||||
sha256 = "0avd58m8630s4d3ys9g84csscdmf2y1swwwkgzjkrrq8q0j5yd3l";
|
||||
url = "https://elpa.gnu.org/packages/eev-20210618.tar";
|
||||
sha256 = "13sb9shpj9fhns8sl3dxdgnn8z4wf14mgi4s87k5x4nrr012sscf";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -1198,10 +1198,10 @@
|
||||
elpaBuild {
|
||||
pname = "emms";
|
||||
ename = "emms";
|
||||
version = "7.2";
|
||||
version = "7.5";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/emms-7.2.tar";
|
||||
sha256 = "11vqqh9rnzibsfw7wx62rgzl8i8ldpf0hv1sj43nhl5c6dlc8d5z";
|
||||
url = "https://elpa.gnu.org/packages/emms-7.5.tar";
|
||||
sha256 = "0d7nsx2idzbp6d5im5rrsnwppbr2cimvxgx31bhwsm2aq3ya5v2j";
|
||||
};
|
||||
packageRequires = [ cl-lib nadvice seq ];
|
||||
meta = {
|
||||
@ -1867,10 +1867,10 @@
|
||||
elpaBuild {
|
||||
pname = "ivy-posframe";
|
||||
ename = "ivy-posframe";
|
||||
version = "0.6.0";
|
||||
version = "0.6.1";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/ivy-posframe-0.6.0.tar";
|
||||
sha256 = "07dzglrcdl54lkznyphw97xwd9bcwzdcgzkav0vqfk7f5cwh1wkf";
|
||||
url = "https://elpa.gnu.org/packages/ivy-posframe-0.6.1.tar";
|
||||
sha256 = "1nay2sfbwm2fkp3f1y89innd9h6j3q70q9y4yddrwa69cxlj9m23";
|
||||
};
|
||||
packageRequires = [ emacs ivy posframe ];
|
||||
meta = {
|
||||
@ -2017,10 +2017,10 @@
|
||||
elpaBuild {
|
||||
pname = "leaf";
|
||||
ename = "leaf";
|
||||
version = "4.4.8";
|
||||
version = "4.5.2";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/leaf-4.4.8.tar";
|
||||
sha256 = "0h0ksmgrhn29ci6z8y54dbbzcqlvfs1ra0kmf226gz0dqzk45vb3";
|
||||
url = "https://elpa.gnu.org/packages/leaf-4.5.2.tar";
|
||||
sha256 = "0i90shhhkpdcwmfi8zv0008qgmg4g3cqd2yvpycfv9n2axvhag54";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -2152,10 +2152,10 @@
|
||||
elpaBuild {
|
||||
pname = "marginalia";
|
||||
ename = "marginalia";
|
||||
version = "0.6";
|
||||
version = "0.7";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/marginalia-0.6.tar";
|
||||
sha256 = "05pwaz9643shxnv63l6r9m2c0qf1nc1hy6jiqw01bkvvgg8g4jag";
|
||||
url = "https://elpa.gnu.org/packages/marginalia-0.7.tar";
|
||||
sha256 = "1nz55nx6xp72nahs4g6asl5y5yrlnlnza58bjrlwwzmwsf7daz18";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -2829,10 +2829,10 @@
|
||||
elpaBuild {
|
||||
pname = "posframe";
|
||||
ename = "posframe";
|
||||
version = "1.0.3";
|
||||
version = "1.0.4";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/posframe-1.0.3.tar";
|
||||
sha256 = "0c3lnrydsysv8j25brgc0cckf1hz54yhkginncmw81y1ia43rqmx";
|
||||
url = "https://elpa.gnu.org/packages/posframe-1.0.4.tar";
|
||||
sha256 = "0i2pw90gw9zb22gj8yyvcp3b2k1bxxhbjj0idvr5iz1vd9023bc6";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -2889,10 +2889,10 @@
|
||||
elpaBuild {
|
||||
pname = "pyim";
|
||||
ename = "pyim";
|
||||
version = "3.7.9";
|
||||
version = "3.8.2";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/pyim-3.7.9.tar";
|
||||
sha256 = "00ff1izdwcy53dcwpdn18wwndnw2jsw4bhg8gkqaa60xm468xzkl";
|
||||
url = "https://elpa.gnu.org/packages/pyim-3.8.2.tar";
|
||||
sha256 = "05sgciqb0hzy07j8pvbg7h2vpa9z5z60m6pknxd3b1kpi45vaihw";
|
||||
};
|
||||
packageRequires = [ async emacs xr ];
|
||||
meta = {
|
||||
@ -3355,10 +3355,10 @@
|
||||
elpaBuild {
|
||||
pname = "setup";
|
||||
ename = "setup";
|
||||
version = "0.2.0";
|
||||
version = "0.2.1";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/setup-0.2.0.tar";
|
||||
sha256 = "1xhjkyksilw1vbx12a4yz4bpj0dhl3m02yi8d9nyd19z098cfa9y";
|
||||
url = "https://elpa.gnu.org/packages/setup-0.2.1.tar";
|
||||
sha256 = "15paand086g33w2vb6jkyxd3i2pmpp84f31y3j5v8w9ia68pjzms";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -3595,10 +3595,10 @@
|
||||
elpaBuild {
|
||||
pname = "sql-indent";
|
||||
ename = "sql-indent";
|
||||
version = "1.5";
|
||||
version = "1.6";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/sql-indent-1.5.tar";
|
||||
sha256 = "07k5rn9hbxppnka7nq0a3a6zyqqa1hp8j6qrb344js6zyak0cb63";
|
||||
url = "https://elpa.gnu.org/packages/sql-indent-1.6.tar";
|
||||
sha256 = "000pimlg0k4mrv2wpqq8w8l51wpr1lzlaq6ai8iaximm2a92ap5b";
|
||||
};
|
||||
packageRequires = [ cl-lib ];
|
||||
meta = {
|
||||
@ -3610,10 +3610,10 @@
|
||||
elpaBuild {
|
||||
pname = "ssh-deploy";
|
||||
ename = "ssh-deploy";
|
||||
version = "3.1.12";
|
||||
version = "3.1.13";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/ssh-deploy-3.1.12.tar";
|
||||
sha256 = "0fz49l63jfw9zy459f07bq2irdb8ispnx8m2c3wxwiim9yw5xnjg";
|
||||
url = "https://elpa.gnu.org/packages/ssh-deploy-3.1.13.tar";
|
||||
sha256 = "006jr8yc5qvxdfk0pn40604a2b7a1ah6l6hi6rhxm3p5b08d9i5w";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -3779,10 +3779,10 @@
|
||||
elpaBuild {
|
||||
pname = "tramp";
|
||||
ename = "tramp";
|
||||
version = "2.5.0.5";
|
||||
version = "2.5.1";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/tramp-2.5.0.5.tar";
|
||||
sha256 = "1dclxffynfacvwi2scpda35sxjb42603yyf2p0477qa9b0i4xha0";
|
||||
url = "https://elpa.gnu.org/packages/tramp-2.5.1.tar";
|
||||
sha256 = "1r7wifhzy2ipdlc4fqnx6549fnx45ggz57wh0cp7s6y25761si7q";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -3824,10 +3824,10 @@
|
||||
elpaBuild {
|
||||
pname = "transient";
|
||||
ename = "transient";
|
||||
version = "0.3.4";
|
||||
version = "0.3.5";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/transient-0.3.4.tar";
|
||||
sha256 = "1m71w52cr8f9wm6lybfa003w408lkrl6q9whs53hpp3pl5phhfvb";
|
||||
url = "https://elpa.gnu.org/packages/transient-0.3.5.tar";
|
||||
sha256 = "15dlj21gn0zxywic9wdcp5zc8skm1s170bq7smgkpd3p3lxslf68";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
@ -3949,6 +3949,21 @@
|
||||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
vc-hgcmd = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
|
||||
elpaBuild {
|
||||
pname = "vc-hgcmd";
|
||||
ename = "vc-hgcmd";
|
||||
version = "1.14";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/vc-hgcmd-1.14.tar";
|
||||
sha256 = "0pg6fg0znsmky3iwdpxn2sx5bbn72kw83s077000ilawi6zqwc2d";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/vc-hgcmd.html";
|
||||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
vcard = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
|
||||
elpaBuild {
|
||||
pname = "vcard";
|
||||
@ -4015,10 +4030,10 @@
|
||||
elpaBuild {
|
||||
pname = "vertico";
|
||||
ename = "vertico";
|
||||
version = "0.11";
|
||||
version = "0.12";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/vertico-0.11.tar";
|
||||
sha256 = "0hzwddkac85i449173az8crlksj9ivrqf969r81kbr45ksgr1ij6";
|
||||
url = "https://elpa.gnu.org/packages/vertico-0.12.tar";
|
||||
sha256 = "14qlc438bysg23wfj04zpvpraqzzi4jlz3r11vc56vd0k2hfmvmn";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
|
@ -4,10 +4,10 @@
|
||||
elpaBuild {
|
||||
pname = "org";
|
||||
ename = "org";
|
||||
version = "20210607";
|
||||
version = "20210628";
|
||||
src = fetchurl {
|
||||
url = "https://orgmode.org/elpa/org-20210607.tar";
|
||||
sha256 = "178z9bnzcdaymnwxf0kkw1yzlzkj5dmdjjwdklc9qb9iv6rckfji";
|
||||
url = "https://orgmode.org/elpa/org-20210628.tar";
|
||||
sha256 = "1sn2yyynndk8qf43ss8bayll33r4ina8xfx4ywzcs3m1lm6xy1zl";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
@ -19,10 +19,10 @@
|
||||
elpaBuild {
|
||||
pname = "org-plus-contrib";
|
||||
ename = "org-plus-contrib";
|
||||
version = "20210607";
|
||||
version = "20210628";
|
||||
src = fetchurl {
|
||||
url = "https://orgmode.org/elpa/org-plus-contrib-20210607.tar";
|
||||
sha256 = "03liivgfcmp0lh6p57bh2gyn85n3sc4p91y374kq8kzc7fzrgzyr";
|
||||
url = "https://orgmode.org/elpa/org-plus-contrib-20210628.tar";
|
||||
sha256 = "0r4kxp1hbhkwvi7939fglng8db4h4n7vigy8pd2gia3a02xcw8l5";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -255,12 +255,12 @@ in
|
||||
|
||||
datagrip = buildDataGrip rec {
|
||||
name = "datagrip-${version}";
|
||||
version = "2021.1.2"; /* updated by script */
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
description = "Your Swiss Army Knife for Databases and SQL";
|
||||
license = lib.licenses.unfree;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/datagrip/${name}.tar.gz";
|
||||
sha256 = "1znb4m7sv7xqi1mq3yw0m51m06wfwmhhxmvck0xkv8s0cfg18qim"; /* updated by script */
|
||||
sha256 = "0lhi3vwhwb359va4sa17y071i03l4mfwqpsp7haqxjf900dcld7d"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-datagrip";
|
||||
update-channel = "DataGrip RELEASE";
|
||||
@ -268,12 +268,12 @@ in
|
||||
|
||||
goland = buildGoland rec {
|
||||
name = "goland-${version}";
|
||||
version = "2021.1.2"; /* updated by script */
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
description = "Up and Coming Go IDE";
|
||||
license = lib.licenses.unfree;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/go/${name}.tar.gz";
|
||||
sha256 = "0g20r7yn4r2h08wv3i8bnnma8x4jljixsbmfml8kixk0pzfhv4px"; /* updated by script */
|
||||
sha256 = "0xy9k90v3kcm9sj48l809qn0vws4ygsxxyqwsg6y9a3r1raqgqxd"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-goland";
|
||||
update-channel = "GoLand RELEASE";
|
||||
@ -281,12 +281,12 @@ in
|
||||
|
||||
idea-community = buildIdea rec {
|
||||
name = "idea-community-${version}";
|
||||
version = "2021.1.2"; /* updated by script */
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
description = "Integrated Development Environment (IDE) by Jetbrains, community edition";
|
||||
license = lib.licenses.asl20;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/idea/ideaIC-${version}.tar.gz";
|
||||
sha256 = "03i5f6p0abr9yfs9fg90fg7hb1a7zar9q4d4iiag30cmndwpslg2"; /* updated by script */
|
||||
sha256 = "1phpfa9i3k7g92ankmibp53c1469ifnb12g6s8gklln7v7xxakmi"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-idea-ce";
|
||||
update-channel = "IntelliJ IDEA RELEASE";
|
||||
@ -294,12 +294,12 @@ in
|
||||
|
||||
idea-ultimate = buildIdea rec {
|
||||
name = "idea-ultimate-${version}";
|
||||
version = "2021.1.2"; /* updated by script */
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
description = "Integrated Development Environment (IDE) by Jetbrains, requires paid license";
|
||||
license = lib.licenses.unfree;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/idea/ideaIU-${version}-no-jbr.tar.gz";
|
||||
sha256 = "0mw4acaik1bkr7gqbwgs3i8f8px8zw95hm1zxgd5gd5kh88n17x5"; /* updated by script */
|
||||
sha256 = "13c7a96zbw05w1gy4ds4wzac853hdlnbflww2xaz60jnr1k24gnp"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-idea";
|
||||
update-channel = "IntelliJ IDEA RELEASE";
|
||||
@ -320,12 +320,12 @@ in
|
||||
|
||||
phpstorm = buildPhpStorm rec {
|
||||
name = "phpstorm-${version}";
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
version = "2021.1.4"; /* updated by script */
|
||||
description = "Professional IDE for Web and PHP developers";
|
||||
license = lib.licenses.unfree;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/webide/PhpStorm-${version}.tar.gz";
|
||||
sha256 = "05hjv1nz1b82bkakadjvsy23v0qv8fyni6h31lcg9198h1890f7v"; /* updated by script */
|
||||
sha256 = "0p9a8l2bpjm25x4af1hlqhmw5xsirsfajznd6y723yqmjy8hs46l"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-phpstorm";
|
||||
update-channel = "PhpStorm RELEASE";
|
||||
@ -333,12 +333,12 @@ in
|
||||
|
||||
pycharm-community = buildPycharm rec {
|
||||
name = "pycharm-community-${version}";
|
||||
version = "2021.1.2"; /* updated by script */
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
description = "PyCharm Community Edition";
|
||||
license = lib.licenses.asl20;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/python/${name}.tar.gz";
|
||||
sha256 = "0sp7w1xrl0y36dai08kqfd0jk06yr7jdbaf1a9f3fgxp5pmspxp1"; /* updated by script */
|
||||
sha256 = "0c03grsrjydb6jcnbq1qi4158c14vni3znr7vysnbvldi8al6w8m"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-pycharm-ce";
|
||||
update-channel = "PyCharm RELEASE";
|
||||
@ -346,12 +346,12 @@ in
|
||||
|
||||
pycharm-professional = buildPycharm rec {
|
||||
name = "pycharm-professional-${version}";
|
||||
version = "2021.1.2"; /* updated by script */
|
||||
version = "2021.1.3"; /* updated by script */
|
||||
description = "PyCharm Professional Edition";
|
||||
license = lib.licenses.unfree;
|
||||
src = fetchurl {
|
||||
url = "https://download.jetbrains.com/python/${name}.tar.gz";
|
||||
sha256 = "0ny7rbl8g5azpqnlcq8l6bwh6hrp8rgp06lf4a8gdr9rpvw9xsqb"; /* updated by script */
|
||||
sha256 = "01nwc9nprlyrwyij98px915w66g6vxbznsmmmg56rv3rvjvjp7yl"; /* updated by script */
|
||||
};
|
||||
wmClass = "jetbrains-pycharm";
|
||||
update-channel = "PyCharm RELEASE";
|
||||
|
@ -14,7 +14,7 @@ sub semantic_less {
|
||||
}
|
||||
|
||||
sub get_latest_versions {
|
||||
my @channels = get("http://www.jetbrains.com/updates/updates.xml") =~ /(<channel .+?<\/channel>)/gs;
|
||||
my @channels = get("https://www.jetbrains.com/updates/updates.xml") =~ /(<channel .+?<\/channel>)/gs;
|
||||
my %h = {};
|
||||
for my $ch (@channels) {
|
||||
my ($id) = $ch =~ /^<channel id="[^"]+" name="([^"]+)"/;
|
||||
|
@ -2,6 +2,7 @@
|
||||
, libuv, lua, ncurses, pkg-config
|
||||
, unibilium, xsel, gperf
|
||||
, libvterm-neovim
|
||||
, tree-sitter
|
||||
, glibcLocales ? null, procps ? null
|
||||
|
||||
# now defaults to false because some tests can be flaky (clipboard etc)
|
||||
@ -31,13 +32,13 @@ let
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "neovim-unwrapped";
|
||||
version = "0.4.4";
|
||||
version = "0.5.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "neovim";
|
||||
repo = "neovim";
|
||||
rev = "v${version}";
|
||||
sha256 = "11zyj6jvkwas3n6w1ckj3pk6jf81z1g7ngg4smmwm7c27y2a6f2m";
|
||||
sha256 = "0lgbf90sbachdag1zm9pmnlbn35964l3khs27qy4462qzpqyi9fi";
|
||||
};
|
||||
|
||||
patches = [
|
||||
@ -58,6 +59,7 @@ in
|
||||
msgpack
|
||||
ncurses
|
||||
neovimLuaEnv
|
||||
tree-sitter
|
||||
unibilium
|
||||
] ++ optional stdenv.isDarwin libiconv
|
||||
++ optionals doCheck [ glibcLocales procps ]
|
||||
@ -96,6 +98,7 @@ in
|
||||
"-DGPERF_PRG=${gperf}/bin/gperf"
|
||||
"-DLUA_PRG=${neovimLuaEnv.interpreter}"
|
||||
"-DLIBLUV_LIBRARY=${luvpath}"
|
||||
"-DUSE_BUNDLED=OFF"
|
||||
]
|
||||
++ optional doCheck "-DBUSTED_PRG=${neovimLuaEnv}/bin/busted"
|
||||
++ optional (!lua.pkgs.isLuaJIT) "-DPREFER_LUA=ON"
|
||||
|
@ -1,8 +1,19 @@
|
||||
{ ripgrep, git, fzf, makeWrapper, vim_configurable, vimPlugins, fetchFromGitHub
|
||||
, lib, stdenv, formats, runCommand, spacevim_config ? import ./init.nix }:
|
||||
{ ripgrep
|
||||
, git
|
||||
, fzf
|
||||
, makeWrapper
|
||||
, vim_configurable
|
||||
, vimPlugins
|
||||
, fetchFromGitHub
|
||||
, lib
|
||||
, stdenv
|
||||
, formats
|
||||
, runCommand
|
||||
, spacevim_config ? import ./init.nix
|
||||
}:
|
||||
|
||||
let
|
||||
format = formats.toml {};
|
||||
format = formats.toml { };
|
||||
vim-customized = vim_configurable.customize {
|
||||
name = "vim";
|
||||
# Not clear at the moment how to import plugins such that
|
||||
@ -14,17 +25,18 @@ let
|
||||
mkdir -p $out
|
||||
cp ${format.generate "init.toml" spacevim_config} $out/init.toml
|
||||
'';
|
||||
in stdenv.mkDerivation rec {
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "spacevim";
|
||||
version = "1.6.0";
|
||||
version = "1.7.0";
|
||||
src = fetchFromGitHub {
|
||||
owner = "SpaceVim";
|
||||
repo = "SpaceVim";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-QQdtjEdbuzmf0Rw+u2ZltLihnJt8LqkfTrLDWLAnCLE=";
|
||||
sha256 = "sha256-TmfPeaGkH1Wq2b5lB29PUYDVddJVN3mBuPAmu9EtiGY=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ makeWrapper vim-customized];
|
||||
nativeBuildInputs = [ makeWrapper vim-customized ];
|
||||
buildInputs = [ vim-customized ];
|
||||
|
||||
buildPhase = ''
|
||||
|
@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
|
||||
buildInputs = [ flex bison zlib proj gdal libtiff libpng fftw sqlite cairo proj
|
||||
readline ffmpeg_3 makeWrapper wxGTK30 netcdf geos postgresql libmysqlclient blas
|
||||
libLAS proj-datumgrid ]
|
||||
++ (with python2Packages; [ python dateutil wxPython30 numpy ]);
|
||||
++ (with python2Packages; [ python python-dateutil wxPython30 numpy ]);
|
||||
|
||||
# On Darwin the installer tries to symlink the help files into a system
|
||||
# directory
|
||||
|
@ -12,7 +12,7 @@ let
|
||||
numpy
|
||||
psycopg2
|
||||
chardet
|
||||
dateutil
|
||||
python-dateutil
|
||||
pyyaml
|
||||
pytz
|
||||
requests
|
||||
|
@ -7,12 +7,12 @@
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "3.4.1";
|
||||
version = "3.6.0";
|
||||
pname = "darktable";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/darktable-org/darktable/releases/download/release-${version}/darktable-${version}.tar.xz";
|
||||
sha256 = "sha256-f8P4UdqbzXxQU+zQnyGqPrYQO+mKbFj1IBC28iF0lB4=";
|
||||
sha256 = "sha256:0f8aqwkgw4gs97b5i4ygiqk5zilwq7ax7zwdd31r72zk98cd1g46";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake ninja llvm pkg-config intltool perl desktop-file-utils wrapGAppsHook ];
|
||||
|
@ -91,7 +91,7 @@ stdenv.mkDerivation rec {
|
||||
homepage = "https://about.draw.io/";
|
||||
license = licenses.asl20;
|
||||
changelog = "https://github.com/jgraph/drawio-desktop/releases/tag/v${version}";
|
||||
maintainers = with maintainers; [ danieldk ];
|
||||
maintainers = with maintainers; [ ];
|
||||
platforms = [ "x86_64-linux" ];
|
||||
};
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ mkDerivationWith python3Packages.buildPythonApplication rec {
|
||||
psutil
|
||||
pyxdg
|
||||
arrow
|
||||
dateutil
|
||||
python-dateutil
|
||||
easygui
|
||||
colour
|
||||
pymediainfo
|
||||
|
@ -107,7 +107,7 @@ stdenv.mkDerivation rec {
|
||||
description = "Multi-platform password manager";
|
||||
homepage = "https://1password.com/";
|
||||
license = licenses.unfree;
|
||||
maintainers = with maintainers; [ danieldk timstott savannidgerinel ];
|
||||
maintainers = with maintainers; [ timstott savannidgerinel ];
|
||||
platforms = [ "x86_64-linux" ];
|
||||
};
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ mkDerivation rec {
|
||||
cchardet
|
||||
css-parser
|
||||
cssselect
|
||||
dateutil
|
||||
python-dateutil
|
||||
dnspython
|
||||
feedparser
|
||||
html2text
|
||||
|
@ -3,20 +3,20 @@
|
||||
|
||||
mkDerivation rec {
|
||||
pname = "cura";
|
||||
version = "4.9.0";
|
||||
version = "4.10.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Ultimaker";
|
||||
repo = "Cura";
|
||||
rev = version;
|
||||
sha256 = "1q515qwrzla3ikbsjmk91y0nrbwih11jycgmd50lkrmnkh7qj0r2";
|
||||
sha256 = "0v65xg31rw4kc7f98k8zz0kmhrp9m55k8ahblha9r1vr4krcf30z";
|
||||
};
|
||||
|
||||
materials = fetchFromGitHub {
|
||||
owner = "Ultimaker";
|
||||
repo = "fdm_materials";
|
||||
rev = version;
|
||||
sha256 = "0hi9w1fsnazlr0vvxdr3alsdb8m1vjjfp5zhmlz4kyyxhsy3bc33";
|
||||
sha256 = "0ykf14j4yx4cf12qw0d4bff9ixrx96m6wxqvi83sn721y7dsd2rs";
|
||||
};
|
||||
|
||||
buildInputs = [ qtbase qtquickcontrols2 qtgraphicaleffects ];
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "curaengine";
|
||||
version = "4.9.1";
|
||||
version = "4.10.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Ultimaker";
|
||||
repo = "CuraEngine";
|
||||
rev = version;
|
||||
sha256 = "sha256-1hCjtnI1EnfyQ0QfU8qZoSLIjE5pyDYpu8H4J91cWYM=";
|
||||
sha256 = "sha256-t5i6s0KKcaoMqzDxZ6JL1NyKP33uxWdmyziK3xh8q88=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake ];
|
||||
|
@ -18,13 +18,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "dbeaver";
|
||||
version = "21.1.1"; # When updating also update fetchedMavenDeps.sha256
|
||||
version = "21.1.2"; # When updating also update fetchedMavenDeps.sha256
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "dbeaver";
|
||||
repo = "dbeaver";
|
||||
rev = version;
|
||||
sha256 = "sha256-enUwX+BxgPy4c1Vwo1+vN3lFYz4LgofgKvZOYuz/050=";
|
||||
sha256 = "sha256-3q5LTllyqw7s8unJHTuasBCM4iaJ9lLpwgbXwBGUtIw=";
|
||||
};
|
||||
|
||||
fetchedMavenDeps = stdenv.mkDerivation {
|
||||
@ -50,7 +50,7 @@ stdenv.mkDerivation rec {
|
||||
dontFixup = true;
|
||||
outputHashAlgo = "sha256";
|
||||
outputHashMode = "recursive";
|
||||
outputHash = "sha256-vNC+LmGEepZCepPodY3c783moReppqNw32d7AUuvBZc=";
|
||||
outputHash = "sha256-QPDnIXP3yB1Dn0LBbBBLvRDbCyguWvG9Zzb1Vjh72UA=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
@ -10,13 +10,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "free42";
|
||||
version = "3.0.4";
|
||||
version = "3.0.5";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "thomasokken";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-ZoW5gBAUp/5U8Is3Nhx+SHY4d0F3PGOS1/WOokKRnCU=";
|
||||
sha256 = "sha256-ytRPIBE8KcuM+pyfdKt/b+Vi03x8nowdgZjSt8EddSc=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ copyDesktopItems pkg-config ];
|
||||
|
@ -20,7 +20,7 @@ buildPythonApplication rec {
|
||||
'';
|
||||
|
||||
propagatedBuildInputs = [
|
||||
dateutil gflags httplib2 parsedatetime six vobject
|
||||
python-dateutil gflags httplib2 parsedatetime six vobject
|
||||
google-api-python-client oauth2client uritemplate
|
||||
libnotify
|
||||
];
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
mkDerivation rec {
|
||||
pname = "gpxsee";
|
||||
version = "9.1";
|
||||
version = "9.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "tumic0";
|
||||
repo = "GPXSee";
|
||||
rev = version;
|
||||
sha256 = "sha256-szq1i2/NEtMK4paSkxtkKXc8yY8qGj2U/p6CzNIecAY=";
|
||||
sha256 = "sha256-pU02Eaq6tB7X6EPOo8YAyryJRbSV3KebQv8VELxXaBw=";
|
||||
};
|
||||
|
||||
patches = (substituteAll {
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "hugo";
|
||||
version = "0.84.3";
|
||||
version = "0.84.4";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "gohugoio";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-3SbF4JsanNup0JmtEoZlyu3SvMn01r+nhnPgIi/W8pA=";
|
||||
sha256 = "sha256-nD2UBDSDG6OFfUvDBXCfhOCiJyFMP2pDXSlIESaEfqE=";
|
||||
};
|
||||
|
||||
vendorSha256 = "sha256-ImXTOtN6kQL7Q8IBlmK7+i47cWtyZT0xcnQdCw3NvWM=";
|
||||
|
@ -9,16 +9,12 @@ with python3.pkgs; buildPythonApplication rec {
|
||||
sha256 = "sha256-L92PwU/ll+Wn1unGPHho2WC07QIbVjxoSnHwcJDtpDI=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
./skip-broken-test.patch
|
||||
];
|
||||
|
||||
propagatedBuildInputs = [
|
||||
atomicwrites
|
||||
click
|
||||
click-log
|
||||
configobj
|
||||
dateutil
|
||||
python-dateutil
|
||||
icalendar
|
||||
lxml
|
||||
pkgs.vdirsyncer
|
||||
@ -31,16 +27,12 @@ with python3.pkgs; buildPythonApplication rec {
|
||||
freezegun
|
||||
];
|
||||
nativeBuildInputs = [ setuptools-scm sphinx sphinxcontrib_newsfeed ];
|
||||
checkInputs = [ pytest glibcLocales ];
|
||||
checkInputs = [
|
||||
glibcLocales
|
||||
pytestCheckHook
|
||||
];
|
||||
LC_ALL = "en_US.UTF-8";
|
||||
|
||||
postPatch = ''
|
||||
sed -i \
|
||||
-e "s/Invalid value for \"ics\"/Invalid value for \\\'ics\\\'/" \
|
||||
-e "s/Invalid value for \"\[ICS\]\"/Invalid value for \\\'\[ICS\]\\\'/" \
|
||||
tests/cli_test.py
|
||||
'';
|
||||
|
||||
postInstall = ''
|
||||
# zsh completion
|
||||
install -D misc/__khal $out/share/zsh/site-functions/__khal
|
||||
@ -56,11 +48,13 @@ with python3.pkgs; buildPythonApplication rec {
|
||||
|
||||
doCheck = !stdenv.isAarch64;
|
||||
|
||||
checkPhase = ''
|
||||
py.test -k "not test_vertical_month_abbr_fr and not test_vertical_month_unicode_weekdeays_gr \
|
||||
and not test_event_different_timezones and not test_default_calendar and not test_birthdays \
|
||||
and not test_birthdays_no_year"
|
||||
'';
|
||||
disabledTests = [
|
||||
# This test is failing due to https://github.com/pimutils/khal/issues/1065
|
||||
"test_print_ics_command"
|
||||
|
||||
# Mocking breaks in this testcase
|
||||
"test_import_from_stdin"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "http://lostpackets.de/khal/";
|
||||
|
@ -1,33 +0,0 @@
|
||||
diff --git a/tests/cli_test.py b/tests/cli_test.py
|
||||
index 5e354a5..d8fbcd5 100644
|
||||
--- a/tests/cli_test.py
|
||||
+++ b/tests/cli_test.py
|
||||
@@ -493,6 +493,7 @@ def test_import_invalid_choice_and_prefix(runner):
|
||||
assert result.output == '09.04.-09.04. An Event\n'
|
||||
|
||||
|
||||
+@pytest.mark.skip(reason="Mocking breaks in this testcase")
|
||||
def test_import_from_stdin(runner, monkeypatch):
|
||||
ics_data = 'This is some really fake icalendar data'
|
||||
|
||||
diff --git a/tests/ui/test_editor.py b/tests/ui/test_editor.py
|
||||
index 27b7fa5..5978d72 100644
|
||||
--- a/tests/ui/test_editor.py
|
||||
+++ b/tests/ui/test_editor.py
|
||||
@@ -1,5 +1,7 @@
|
||||
import datetime as dt
|
||||
|
||||
+import pytest
|
||||
+
|
||||
import icalendar
|
||||
from khal.ui.editor import RecurrenceEditor, StartEndEditor
|
||||
|
||||
@@ -19,7 +21,7 @@ palette = {
|
||||
'edit': 'blue',
|
||||
}
|
||||
|
||||
-
|
||||
+@pytest.mark.skip(reason="Mocking breaks in this testcase")
|
||||
def test_popup(monkeypatch):
|
||||
"""making sure the popup calendar gets callend with the right inital value
|
||||
|
@ -41,6 +41,7 @@ stdenv.mkDerivation rec {
|
||||
homepage = "https://code-industry.net/free-pdf-editor/";
|
||||
license = licenses.unfreeRedistributable;
|
||||
platforms = with platforms; [ "x86_64-linux" ];
|
||||
maintainers = with maintainers; [ cmcdragonkai flokli ];
|
||||
broken = true;
|
||||
maintainers = with maintainers; [ cmcdragonkai ];
|
||||
};
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
python3.pkgs.buildPythonApplication rec {
|
||||
pname = "metadata-cleaner";
|
||||
version = "1.0.6";
|
||||
version = "1.0.7";
|
||||
|
||||
format = "other";
|
||||
|
||||
@ -25,7 +25,7 @@ python3.pkgs.buildPythonApplication rec {
|
||||
owner = "rmnvgr";
|
||||
repo = "metadata-cleaner";
|
||||
rev = "v${version}";
|
||||
sha256 = "0k9qnycaqxnmsjsyxqgip6xr5w9affzxjc4zyb38ajbq4arfq5wv";
|
||||
sha256 = "sha256-HlP/QahVFCAct06pKanjozFqeyTdHoHanIemq5ID2CQ=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
36
pkgs/applications/misc/otpclient/default.nix
Normal file
36
pkgs/applications/misc/otpclient/default.nix
Normal file
@ -0,0 +1,36 @@
|
||||
{ stdenv
|
||||
, lib
|
||||
, fetchFromGitHub
|
||||
, cmake
|
||||
, pkg-config
|
||||
, gtk3
|
||||
, wrapGAppsHook
|
||||
, jansson
|
||||
, libgcrypt
|
||||
, libzip
|
||||
, libpng
|
||||
, libcotp
|
||||
, zbar
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "otpclient";
|
||||
version = "2.4.4";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "paolostivanin";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "0zjvhcx9q8nsf97zikddxriky0kghi4j4i7312s94pl8c7kb4abr";
|
||||
};
|
||||
|
||||
buildInputs = [ gtk3 jansson libgcrypt libzip libpng libcotp zbar ];
|
||||
nativeBuildInputs = [ cmake pkg-config wrapGAppsHook ];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Highly secure and easy to use OTP client written in C/GTK that supports both TOTP and HOTP";
|
||||
homepage = "https://github.com/paolostivanin/OTPClient";
|
||||
license = licenses.gpl3Only;
|
||||
maintainers = with maintainers; [ alexbakker ];
|
||||
};
|
||||
}
|
@ -29,7 +29,7 @@ python3Packages.buildPythonApplication rec {
|
||||
pikepdf
|
||||
img2pdf
|
||||
setuptools
|
||||
dateutil
|
||||
python-dateutil
|
||||
];
|
||||
|
||||
# incompatible with wrapGAppsHook
|
||||
|
@ -21,6 +21,8 @@ stdenv.mkDerivation rec {
|
||||
|
||||
outputs = [ "bin" "out" "dev" "man" ];
|
||||
|
||||
depsBuildBuild = [ pkg-config ];
|
||||
|
||||
nativeBuildInputs = [ meson ninja pkg-config scdoc ];
|
||||
|
||||
buildInputs = [ systemd ];
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "slides";
|
||||
version = "0.3.0";
|
||||
version = "0.4.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "maaslalani";
|
||||
repo = "slides";
|
||||
rev = "v${version}";
|
||||
sha256 = "00sml6b9q3df9dgl7fpsn6a3qkq6xklnbfvvblf91xdf4ssn7wrx";
|
||||
sha256 = "15f4sn1zsqqhzxnmwb1igh8xhka6li31ygdqgbjvxzm93lkarxvs";
|
||||
};
|
||||
|
||||
checkInputs = [
|
||||
|
@ -5,13 +5,13 @@
|
||||
}:
|
||||
|
||||
let
|
||||
version = "5.0.1";
|
||||
version = "5.0.2";
|
||||
|
||||
subsurfaceSrc = (fetchFromGitHub {
|
||||
owner = "Subsurface";
|
||||
repo = "subsurface";
|
||||
rev = "v${version}";
|
||||
sha256 = "01r836ckvrmgprjf4cqxn2n3w5w4pa2fjrhspjndsspic8nwlrwg";
|
||||
sha256 = "1yay06m8p9qp2ghrg8dxavdq55y09apcgdnb7rihgs3hq86k539n";
|
||||
fetchSubmodules = true;
|
||||
});
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
, buildPythonApplication
|
||||
, click
|
||||
, pyfiglet
|
||||
, dateutil
|
||||
, python-dateutil
|
||||
, setuptools
|
||||
}:
|
||||
|
||||
@ -18,7 +18,7 @@ buildPythonApplication rec {
|
||||
owner = "trehn";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [ dateutil click pyfiglet setuptools ];
|
||||
propagatedBuildInputs = [ python-dateutil click pyfiglet setuptools ];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Starts a countdown to or from TIMESPEC";
|
||||
|
@ -2,16 +2,16 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "tut";
|
||||
version = "0.0.17";
|
||||
version = "0.0.20";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "RasmusLindroth";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "0g4kbprsdjk2lbx81azdvz8kkhyk370id3622xxssr894v0i7iwj";
|
||||
sha256 = "03jiv5m807z96796fbpi6ny22am3sq4jfni37fxbld05sxdzwcnd";
|
||||
};
|
||||
|
||||
vendorSha256 = "1kf7ynmxrzvhl028b4nbz9h9v9x5srarsbynpgpp4vicmxqlvrmh";
|
||||
vendorSha256 = "1in5b7ixnm5iizkzziqclvgaq87ccdh507amkgfhfy5sxsgbfb1g";
|
||||
|
||||
meta = with lib; {
|
||||
description = "A TUI for Mastodon with vim inspired keys";
|
||||
|
41
pkgs/applications/misc/usb-reset/default.nix
Normal file
41
pkgs/applications/misc/usb-reset/default.nix
Normal file
@ -0,0 +1,41 @@
|
||||
{ lib
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, libusb1
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "usb-reset";
|
||||
# not tagged, but changelog has this with the date of the e9a9d6c commit
|
||||
# and no significant change occured between bumping the version in the Makefile and that
|
||||
# and the changes since then (up to ff822d8) seem snap related
|
||||
version = "0.3";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "ralight";
|
||||
repo = pname;
|
||||
rev = "e9a9d6c4a533430e763e111a349efbba69e7a5bb";
|
||||
sha256 = "0k9qmhqi206gcnv3z4vwya82g5nm225972ylf67zjiikk8pn8m0s";
|
||||
};
|
||||
|
||||
buildInputs = [ libusb1 ];
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace Makefile \
|
||||
--replace /usr/include/libusb-1.0 ${libusb1.dev}/include/libusb-1.0
|
||||
'';
|
||||
|
||||
makeFlags = [
|
||||
"DESTDIR=${placeholder "out"}"
|
||||
"prefix="
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Perform a bus reset on a USB device using its vendor and product ID";
|
||||
homepage = "https://github.com/ralight/usb-reset";
|
||||
changelog = "https://github.com/ralight/usb-reset/blob/master/ChangeLog.txt";
|
||||
license = licenses.mit;
|
||||
maintainers = [ maintainers.evils ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
, lib
|
||||
, buildPythonApplication
|
||||
, fetchFromGitHub
|
||||
, dateutil
|
||||
, python-dateutil
|
||||
, pandas
|
||||
, requests
|
||||
, lxml
|
||||
@ -36,7 +36,7 @@ buildPythonApplication rec {
|
||||
propagatedBuildInputs = [
|
||||
# from visidata/requirements.txt
|
||||
# packages not (yet) present in nixpkgs are commented
|
||||
dateutil
|
||||
python-dateutil
|
||||
pandas
|
||||
requests
|
||||
lxml
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ lib, fetchurl, buildPythonApplication, dateutil,
|
||||
{ lib, fetchurl, buildPythonApplication, python-dateutil,
|
||||
sqlalchemy, setproctitle, icalendar }:
|
||||
|
||||
buildPythonApplication rec {
|
||||
@ -11,7 +11,7 @@ buildPythonApplication rec {
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
dateutil
|
||||
python-dateutil
|
||||
sqlalchemy
|
||||
setproctitle
|
||||
icalendar
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "3proxy";
|
||||
version = "0.9.3";
|
||||
version = "0.9.4";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "z3APA3A";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "9aopwyz0U2bYTvx5YWLJo9EE8Xfb51IOguHRJodjpm8=";
|
||||
sha256 = "sha256-4bLlQ/ULvpjs6fr19yBBln5mRRc+yj+zVLiTs1e/Ypc=";
|
||||
};
|
||||
|
||||
makeFlags = [
|
||||
|
@ -90,11 +90,11 @@ in
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "brave";
|
||||
version = "1.26.67";
|
||||
version = "1.26.74";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb";
|
||||
sha256 = "Kg6ExXZYdSkyBoivu9h4blytHN9hOc4bUSuFR+1YZOY=";
|
||||
sha256 = "ULmoUXyPWHCewK4FPP7SX1Ena6n0aM/EWR7ZnMN1ztY=";
|
||||
};
|
||||
|
||||
dontConfigure = true;
|
||||
|
@ -62,7 +62,7 @@ mkChromiumDerivation (base: rec {
|
||||
-e '/\[Desktop Entry\]/a\' \
|
||||
-e 'StartupWMClass=chromium-browser' \
|
||||
$out/share/applications/chromium-browser.desktop
|
||||
'' + lib.optionalString (channel == "dev") ''
|
||||
'' + lib.optionalString (channel != "stable") ''
|
||||
cp -v "$buildPath/crashpad_handler" "$libExecPath/"
|
||||
'';
|
||||
|
||||
|
@ -149,9 +149,11 @@ in stdenv.mkDerivation {
|
||||
+ "chromium${suffix}-${version}";
|
||||
inherit version;
|
||||
|
||||
buildInputs = [
|
||||
nativeBuildInputs = [
|
||||
makeWrapper ed
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
# needed for GSETTINGS_SCHEMAS_PATH
|
||||
gsettings-desktop-schemas glib gtk3
|
||||
|
||||
|
@ -18,9 +18,9 @@
|
||||
}
|
||||
},
|
||||
"beta": {
|
||||
"version": "92.0.4515.70",
|
||||
"sha256": "06yhpxr5bg0gx7hmrhc6zg4gr1d9s34y2rb98rpl4dilmc548i6q",
|
||||
"sha256bin64": "1fkakh1r87pg5nr101m6v86y8iyyfba8vnzrg0229kcar7v8wzf7",
|
||||
"version": "92.0.4515.80",
|
||||
"sha256": "142v8y275mysgksvfprc83a7r1dlcnb5rqi8a451fmfnj6wrsq8i",
|
||||
"sha256bin64": "0sz2fvg6l7q7syc5pysa246p03sganmgjdfvind42i8cqxw8gycp",
|
||||
"deps": {
|
||||
"gn": {
|
||||
"version": "2021-05-07",
|
||||
|
@ -203,6 +203,7 @@ stdenv.mkDerivation {
|
||||
url = "http://www.mozilla.org/en-US/foundation/trademarks/policy/";
|
||||
};
|
||||
platforms = builtins.attrNames mozillaPlatforms;
|
||||
timeout = 86400; # 24 hours (increased from the Hydra default of 10h, c.f. #129115)
|
||||
maintainers = with maintainers; [ taku0 lovesegfault ];
|
||||
};
|
||||
}
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
mkYarnPackage rec {
|
||||
pname = "vieb";
|
||||
version = "5.2.0";
|
||||
version = "5.3.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Jelmerro";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "sha256-wLaOqjDxgjfv4+TJeLE0dkrhfdnNSjiDqtFcHTm8uG4=";
|
||||
sha256 = "sha256-NKWqSnUO8SScEodHYSptRHwVNOa5C4M61ac85d+wYK0=";
|
||||
};
|
||||
|
||||
packageJSON = ./package.json;
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "vieb",
|
||||
"productName": "Vieb",
|
||||
"version": "5.2.0",
|
||||
"version": "5.3.0",
|
||||
"description": "Vim Inspired Electron Browser",
|
||||
"main": "app/index.js",
|
||||
"scripts": {
|
||||
@ -29,18 +29,18 @@
|
||||
"license": "GPL-3.0-or-later",
|
||||
"devDependencies": {
|
||||
"archiver": "5.3.0",
|
||||
"electron": "13.1.2",
|
||||
"electron": "13.1.4",
|
||||
"electron-builder": "22.11.7",
|
||||
"eslint": "7.29.0",
|
||||
"eslint-plugin-compat": "3.9.0",
|
||||
"eslint-plugin-sort-keys-fix": "1.1.1",
|
||||
"jest-environment-jsdom": "27.0.3",
|
||||
"jest": "27.0.4"
|
||||
"jest": "27.0.6",
|
||||
"jest-environment-jsdom": "27.0.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"7zip-bin": "5.1.1",
|
||||
"@cliqz/adblocker-electron": "1.22.1",
|
||||
"@cliqz/adblocker-electron-preload": "1.22.1",
|
||||
"@cliqz/adblocker-electron": "1.22.2",
|
||||
"@cliqz/adblocker-electron-preload": "1.22.2",
|
||||
"is-svg": "4.3.1",
|
||||
"rimraf": "3.0.2"
|
||||
},
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -26,11 +26,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_babel_compat_data___compat_data_7.14.5.tgz";
|
||||
name = "_babel_compat_data___compat_data_7.14.7.tgz";
|
||||
path = fetchurl {
|
||||
name = "_babel_compat_data___compat_data_7.14.5.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz";
|
||||
sha1 = "8ef4c18e58e801c5c95d3c1c0f2874a2680fadea";
|
||||
name = "_babel_compat_data___compat_data_7.14.7.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz";
|
||||
sha1 = "7b047d7a3a89a67d2258dc61f604f098f1bc7e08";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -82,11 +82,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.14.5.tgz";
|
||||
name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.14.7.tgz";
|
||||
path = fetchurl {
|
||||
name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.14.5.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz";
|
||||
sha1 = "d5c70e4ad13b402c95156c7a53568f504e2fb7b8";
|
||||
name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.14.7.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz";
|
||||
sha1 = "97e56244beb94211fe277bd818e3a329c66f7970";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -178,11 +178,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_babel_parser___parser_7.14.6.tgz";
|
||||
name = "_babel_parser___parser_7.14.7.tgz";
|
||||
path = fetchurl {
|
||||
name = "_babel_parser___parser_7.14.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.6.tgz";
|
||||
sha1 = "d85cc68ca3cac84eae384c06f032921f5227f4b2";
|
||||
name = "_babel_parser___parser_7.14.7.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz";
|
||||
sha1 = "6099720c8839ca865a2637e6c85852ead0bdb595";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -298,11 +298,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_babel_traverse___traverse_7.14.5.tgz";
|
||||
name = "_babel_traverse___traverse_7.14.7.tgz";
|
||||
path = fetchurl {
|
||||
name = "_babel_traverse___traverse_7.14.5.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz";
|
||||
sha1 = "c111b0f58afab4fea3d3385a406f692748c59870";
|
||||
name = "_babel_traverse___traverse_7.14.7.tgz";
|
||||
url = "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz";
|
||||
sha1 = "64007c9774cfdc3abd23b0780bc18a3ce3631753";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -329,14 +329,6 @@
|
||||
sha1 = "643849d5f08c167eb84a2e7e3f1f9fbc41a3889b";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_cliqz_adblocker_electron_preload___adblocker_electron_preload_1.22.1.tgz";
|
||||
path = fetchurl {
|
||||
name = "_cliqz_adblocker_electron_preload___adblocker_electron_preload_1.22.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.22.1.tgz";
|
||||
sha1 = "8ce8c18d0ce5f7afa7c1dfe1f4cba30ada86f4af";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_cliqz_adblocker_electron_preload___adblocker_electron_preload_1.22.2.tgz";
|
||||
path = fetchurl {
|
||||
@ -346,11 +338,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_cliqz_adblocker_electron___adblocker_electron_1.22.1.tgz";
|
||||
name = "_cliqz_adblocker_electron___adblocker_electron_1.22.2.tgz";
|
||||
path = fetchurl {
|
||||
name = "_cliqz_adblocker_electron___adblocker_electron_1.22.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.22.1.tgz";
|
||||
sha1 = "13fe6de4be0c3beb2851634b27ea1223d10ca92b";
|
||||
name = "_cliqz_adblocker_electron___adblocker_electron_1.22.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.22.2.tgz";
|
||||
sha1 = "85af3b49f7f653e6fb0d008b6523e3b3ba0dd41e";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -418,91 +410,91 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_console___console_27.0.2.tgz";
|
||||
name = "_jest_console___console_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_console___console_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/console/-/console-27.0.2.tgz";
|
||||
sha1 = "b8eeff8f21ac51d224c851e1729d2630c18631e6";
|
||||
name = "_jest_console___console_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/console/-/console-27.0.6.tgz";
|
||||
sha1 = "3eb72ea80897495c3d73dd97aab7f26770e2260f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_core___core_27.0.4.tgz";
|
||||
name = "_jest_core___core_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_core___core_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/core/-/core-27.0.4.tgz";
|
||||
sha1 = "679bf9ac07900da2ddbb9667bb1afa8029038f53";
|
||||
name = "_jest_core___core_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/core/-/core-27.0.6.tgz";
|
||||
sha1 = "c5f642727a0b3bf0f37c4b46c675372d0978d4a1";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_environment___environment_27.0.3.tgz";
|
||||
name = "_jest_environment___environment_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_environment___environment_27.0.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/environment/-/environment-27.0.3.tgz";
|
||||
sha1 = "68769b1dfdd213e3456169d64fbe9bd63a5fda92";
|
||||
name = "_jest_environment___environment_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/environment/-/environment-27.0.6.tgz";
|
||||
sha1 = "ee293fe996db01d7d663b8108fa0e1ff436219d2";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_fake_timers___fake_timers_27.0.3.tgz";
|
||||
name = "_jest_fake_timers___fake_timers_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_fake_timers___fake_timers_27.0.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.0.3.tgz";
|
||||
sha1 = "9899ba6304cc636734c74478df502e18136461dd";
|
||||
name = "_jest_fake_timers___fake_timers_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.0.6.tgz";
|
||||
sha1 = "cbad52f3fe6abe30e7acb8cd5fa3466b9588e3df";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_globals___globals_27.0.3.tgz";
|
||||
name = "_jest_globals___globals_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_globals___globals_27.0.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.3.tgz";
|
||||
sha1 = "1cf8933b7791bba0b99305cbf39fd4d2e3fe4060";
|
||||
name = "_jest_globals___globals_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.6.tgz";
|
||||
sha1 = "48e3903f99a4650673d8657334d13c9caf0e8f82";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_reporters___reporters_27.0.4.tgz";
|
||||
name = "_jest_reporters___reporters_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_reporters___reporters_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.4.tgz";
|
||||
sha1 = "95609b1be97afb80d55d8aa3d7c3179c15810e65";
|
||||
name = "_jest_reporters___reporters_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.6.tgz";
|
||||
sha1 = "91e7f2d98c002ad5df94d5b5167c1eb0b9fd5b00";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_source_map___source_map_27.0.1.tgz";
|
||||
name = "_jest_source_map___source_map_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_source_map___source_map_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.1.tgz";
|
||||
sha1 = "2afbf73ddbaddcb920a8e62d0238a0a9e0a8d3e4";
|
||||
name = "_jest_source_map___source_map_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz";
|
||||
sha1 = "be9e9b93565d49b0548b86e232092491fb60551f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_test_result___test_result_27.0.2.tgz";
|
||||
name = "_jest_test_result___test_result_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_test_result___test_result_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.0.2.tgz";
|
||||
sha1 = "0451049e32ceb609b636004ccc27c8fa22263f10";
|
||||
name = "_jest_test_result___test_result_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.0.6.tgz";
|
||||
sha1 = "3fa42015a14e4fdede6acd042ce98c7f36627051";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_test_sequencer___test_sequencer_27.0.4.tgz";
|
||||
name = "_jest_test_sequencer___test_sequencer_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_test_sequencer___test_sequencer_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz";
|
||||
sha1 = "976493b277594d81e589896f0ed21f198308928a";
|
||||
name = "_jest_test_sequencer___test_sequencer_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz";
|
||||
sha1 = "80a913ed7a1130545b1cd777ff2735dd3af5d34b";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_transform___transform_27.0.2.tgz";
|
||||
name = "_jest_transform___transform_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_transform___transform_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.2.tgz";
|
||||
sha1 = "b073b7c589e3f4b842102468875def2bb722d6b5";
|
||||
name = "_jest_transform___transform_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.6.tgz";
|
||||
sha1 = "189ad7107413208f7600f4719f81dd2f7278cc95";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_jest_types___types_27.0.2.tgz";
|
||||
name = "_jest_types___types_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "_jest_types___types_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/types/-/types-27.0.2.tgz";
|
||||
sha1 = "e153d6c46bda0f2589f0702b071f9898c7bbd37e";
|
||||
name = "_jest_types___types_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/@jest/types/-/types-27.0.6.tgz";
|
||||
sha1 = "9a992bc517e0c49f035938b8549719c2de40706b";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -642,11 +634,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_types_babel__traverse___babel__traverse_7.11.1.tgz";
|
||||
name = "_types_babel__traverse___babel__traverse_7.14.0.tgz";
|
||||
path = fetchurl {
|
||||
name = "_types_babel__traverse___babel__traverse_7.11.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz";
|
||||
sha1 = "654f6c4f67568e24c23b367e947098c6206fa639";
|
||||
name = "_types_babel__traverse___babel__traverse_7.14.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.0.tgz";
|
||||
sha1 = "a34277cf8acbd3185ea74129e1f100491eb1da7f";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -666,11 +658,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_types_filesystem___filesystem_0.0.30.tgz";
|
||||
name = "_types_filesystem___filesystem_0.0.31.tgz";
|
||||
path = fetchurl {
|
||||
name = "_types_filesystem___filesystem_0.0.30.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.30.tgz";
|
||||
sha1 = "a7373a2edf34d13e298baf7ee1101f738b2efb7e";
|
||||
name = "_types_filesystem___filesystem_0.0.31.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.31.tgz";
|
||||
sha1 = "121a1ded274a2dc731d5e0d90163a920ad6a9ef1";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -754,19 +746,19 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_types_node___node_15.12.4.tgz";
|
||||
name = "_types_node___node_15.12.5.tgz";
|
||||
path = fetchurl {
|
||||
name = "_types_node___node_15.12.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/node/-/node-15.12.4.tgz";
|
||||
sha1 = "e1cf817d70a1e118e81922c4ff6683ce9d422e26";
|
||||
name = "_types_node___node_15.12.5.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/node/-/node-15.12.5.tgz";
|
||||
sha1 = "9a78318a45d75c9523d2396131bd3cca54b2d185";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "_types_node___node_14.17.3.tgz";
|
||||
name = "_types_node___node_14.17.4.tgz";
|
||||
path = fetchurl {
|
||||
name = "_types_node___node_14.17.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/node/-/node-14.17.3.tgz";
|
||||
sha1 = "6d327abaa4be34a74e421ed6409a0ae2f47f4c3d";
|
||||
name = "_types_node___node_14.17.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/@types/node/-/node-14.17.4.tgz";
|
||||
sha1 = "218712242446fc868d0e007af29a4408c7765bc0";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -858,11 +850,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "acorn___acorn_8.4.0.tgz";
|
||||
name = "acorn___acorn_8.4.1.tgz";
|
||||
path = fetchurl {
|
||||
name = "acorn___acorn_8.4.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/acorn/-/acorn-8.4.0.tgz";
|
||||
sha1 = "af53266e698d7cffa416714b503066a82221be60";
|
||||
name = "acorn___acorn_8.4.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz";
|
||||
sha1 = "56c36251fc7cabc7096adc18f05afe814321a28c";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1098,11 +1090,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "babel_jest___babel_jest_27.0.2.tgz";
|
||||
name = "babel_jest___babel_jest_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "babel_jest___babel_jest_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.2.tgz";
|
||||
sha1 = "7dc18adb01322acce62c2af76ea2c7cd186ade37";
|
||||
name = "babel_jest___babel_jest_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.6.tgz";
|
||||
sha1 = "e99c6e0577da2655118e3608b68761a5a69bd0d8";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1114,11 +1106,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "babel_plugin_jest_hoist___babel_plugin_jest_hoist_27.0.1.tgz";
|
||||
name = "babel_plugin_jest_hoist___babel_plugin_jest_hoist_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "babel_plugin_jest_hoist___babel_plugin_jest_hoist_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz";
|
||||
sha1 = "a6d10e484c93abff0f4e95f437dad26e5736ea11";
|
||||
name = "babel_plugin_jest_hoist___babel_plugin_jest_hoist_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz";
|
||||
sha1 = "f7c6b3d764af21cb4a2a1ab6870117dbde15b456";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1130,11 +1122,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "babel_preset_jest___babel_preset_jest_27.0.1.tgz";
|
||||
name = "babel_preset_jest___babel_preset_jest_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "babel_preset_jest___babel_preset_jest_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz";
|
||||
sha1 = "7a50c75d16647c23a2cf5158d5bb9eb206b10e20";
|
||||
name = "babel_preset_jest___babel_preset_jest_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz";
|
||||
sha1 = "909ef08e9f24a4679768be2f60a3df0856843f9d";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1322,11 +1314,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "caniuse_lite___caniuse_lite_1.0.30001239.tgz";
|
||||
name = "caniuse_lite___caniuse_lite_1.0.30001241.tgz";
|
||||
path = fetchurl {
|
||||
name = "caniuse_lite___caniuse_lite_1.0.30001239.tgz";
|
||||
url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz";
|
||||
sha1 = "66e8669985bb2cb84ccb10f68c25ce6dd3e4d2b8";
|
||||
name = "caniuse_lite___caniuse_lite_1.0.30001241.tgz";
|
||||
url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz";
|
||||
sha1 = "cd3fae47eb3d7691692b406568d7a3e5b23c7598";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1554,11 +1546,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "core_js___core_js_3.15.0.tgz";
|
||||
name = "core_js___core_js_3.15.2.tgz";
|
||||
path = fetchurl {
|
||||
name = "core_js___core_js_3.15.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/core-js/-/core-js-3.15.0.tgz";
|
||||
sha1 = "db9554ebce0b6fd90dc9b1f2465c841d2d055044";
|
||||
name = "core_js___core_js_3.15.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz";
|
||||
sha1 = "740660d2ff55ef34ce664d7e2455119c5bdd3d61";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1666,11 +1658,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "decimal.js___decimal.js_10.2.1.tgz";
|
||||
name = "decimal.js___decimal.js_10.3.1.tgz";
|
||||
path = fetchurl {
|
||||
name = "decimal.js___decimal.js_10.2.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz";
|
||||
sha1 = "238ae7b0f0c793d3e3cea410108b35a2c01426a3";
|
||||
name = "decimal.js___decimal.js_10.3.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz";
|
||||
sha1 = "d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1754,11 +1746,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "diff_sequences___diff_sequences_27.0.1.tgz";
|
||||
name = "diff_sequences___diff_sequences_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "diff_sequences___diff_sequences_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.1.tgz";
|
||||
sha1 = "9c9801d52ed5f576ff0a20e3022a13ee6e297e7c";
|
||||
name = "diff_sequences___diff_sequences_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz";
|
||||
sha1 = "3305cb2e55a033924054695cc66019fd7f8e5723";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -1858,19 +1850,19 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "electron_to_chromium___electron_to_chromium_1.3.752.tgz";
|
||||
name = "electron_to_chromium___electron_to_chromium_1.3.763.tgz";
|
||||
path = fetchurl {
|
||||
name = "electron_to_chromium___electron_to_chromium_1.3.752.tgz";
|
||||
url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz";
|
||||
sha1 = "0728587f1b9b970ec9ffad932496429aef750d09";
|
||||
name = "electron_to_chromium___electron_to_chromium_1.3.763.tgz";
|
||||
url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.763.tgz";
|
||||
sha1 = "93f6f02506d099941f557b9db9ba50b30215bf15";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "electron___electron_13.1.2.tgz";
|
||||
name = "electron___electron_13.1.4.tgz";
|
||||
path = fetchurl {
|
||||
name = "electron___electron_13.1.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/electron/-/electron-13.1.2.tgz";
|
||||
sha1 = "8c9abf9015766c9cbc16f10c99282d00d6ae1b90";
|
||||
name = "electron___electron_13.1.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/electron/-/electron-13.1.4.tgz";
|
||||
sha1 = "6d20d932a0651c3cba9f09a3d08cbaf5b69aa84b";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -2122,11 +2114,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "expect___expect_27.0.2.tgz";
|
||||
name = "expect___expect_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "expect___expect_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/expect/-/expect-27.0.2.tgz";
|
||||
sha1 = "e66ca3a4c9592f1c019fa1d46459a9d2084f3422";
|
||||
name = "expect___expect_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/expect/-/expect-27.0.6.tgz";
|
||||
sha1 = "a4d74fbe27222c718fff68ef49d78e26a8fd4c05";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -2866,131 +2858,131 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_changed_files___jest_changed_files_27.0.2.tgz";
|
||||
name = "jest_changed_files___jest_changed_files_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_changed_files___jest_changed_files_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.0.2.tgz";
|
||||
sha1 = "997253042b4a032950fc5f56abf3c5d1f8560801";
|
||||
name = "jest_changed_files___jest_changed_files_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.0.6.tgz";
|
||||
sha1 = "bed6183fcdea8a285482e3b50a9a7712d49a7a8b";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_circus___jest_circus_27.0.4.tgz";
|
||||
name = "jest_circus___jest_circus_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_circus___jest_circus_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.0.4.tgz";
|
||||
sha1 = "3b261514ee3b3da33def736a6352c98ff56bb6e6";
|
||||
name = "jest_circus___jest_circus_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.0.6.tgz";
|
||||
sha1 = "dd4df17c4697db6a2c232aaad4e9cec666926668";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_cli___jest_cli_27.0.4.tgz";
|
||||
name = "jest_cli___jest_cli_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_cli___jest_cli_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.0.4.tgz";
|
||||
sha1 = "491b12c754c0d7c6873b13a66f26b3a80a852910";
|
||||
name = "jest_cli___jest_cli_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.0.6.tgz";
|
||||
sha1 = "d021e5f4d86d6a212450d4c7b86cb219f1e6864f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_config___jest_config_27.0.4.tgz";
|
||||
name = "jest_config___jest_config_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_config___jest_config_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-config/-/jest-config-27.0.4.tgz";
|
||||
sha1 = "c4f41378acf40ca77860fb4e213b12109d87b8cf";
|
||||
name = "jest_config___jest_config_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-config/-/jest-config-27.0.6.tgz";
|
||||
sha1 = "119fb10f149ba63d9c50621baa4f1f179500277f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_diff___jest_diff_27.0.2.tgz";
|
||||
name = "jest_diff___jest_diff_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_diff___jest_diff_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.0.2.tgz";
|
||||
sha1 = "f315b87cee5dc134cf42c2708ab27375cc3f5a7e";
|
||||
name = "jest_diff___jest_diff_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.0.6.tgz";
|
||||
sha1 = "4a7a19ee6f04ad70e0e3388f35829394a44c7b5e";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_docblock___jest_docblock_27.0.1.tgz";
|
||||
name = "jest_docblock___jest_docblock_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_docblock___jest_docblock_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.1.tgz";
|
||||
sha1 = "bd9752819b49fa4fab1a50b73eb58c653b962e8b";
|
||||
name = "jest_docblock___jest_docblock_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz";
|
||||
sha1 = "cc78266acf7fe693ca462cbbda0ea4e639e4e5f3";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_each___jest_each_27.0.2.tgz";
|
||||
name = "jest_each___jest_each_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_each___jest_each_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-each/-/jest-each-27.0.2.tgz";
|
||||
sha1 = "865ddb4367476ced752167926b656fa0dcecd8c7";
|
||||
name = "jest_each___jest_each_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-each/-/jest-each-27.0.6.tgz";
|
||||
sha1 = "cee117071b04060158dc8d9a66dc50ad40ef453b";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_environment_jsdom___jest_environment_jsdom_27.0.3.tgz";
|
||||
name = "jest_environment_jsdom___jest_environment_jsdom_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_environment_jsdom___jest_environment_jsdom_27.0.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz";
|
||||
sha1 = "ed73e913ddc03864eb9f934b5cbabf1b63504e2e";
|
||||
name = "jest_environment_jsdom___jest_environment_jsdom_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz";
|
||||
sha1 = "f66426c4c9950807d0a9f209c590ce544f73291f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_environment_node___jest_environment_node_27.0.3.tgz";
|
||||
name = "jest_environment_node___jest_environment_node_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_environment_node___jest_environment_node_27.0.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.0.3.tgz";
|
||||
sha1 = "b4acb3679d2552a4215732cab8b0ca7ec4398ee0";
|
||||
name = "jest_environment_node___jest_environment_node_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.0.6.tgz";
|
||||
sha1 = "a6699b7ceb52e8d68138b9808b0c404e505f3e07";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_get_type___jest_get_type_27.0.1.tgz";
|
||||
name = "jest_get_type___jest_get_type_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_get_type___jest_get_type_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz";
|
||||
sha1 = "34951e2b08c8801eb28559d7eb732b04bbcf7815";
|
||||
name = "jest_get_type___jest_get_type_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz";
|
||||
sha1 = "0eb5c7f755854279ce9b68a9f1a4122f69047cfe";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_haste_map___jest_haste_map_27.0.2.tgz";
|
||||
name = "jest_haste_map___jest_haste_map_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_haste_map___jest_haste_map_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.2.tgz";
|
||||
sha1 = "3f1819400c671237e48b4d4b76a80a0dbed7577f";
|
||||
name = "jest_haste_map___jest_haste_map_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.6.tgz";
|
||||
sha1 = "4683a4e68f6ecaa74231679dca237279562c8dc7";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_jasmine2___jest_jasmine2_27.0.4.tgz";
|
||||
name = "jest_jasmine2___jest_jasmine2_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_jasmine2___jest_jasmine2_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz";
|
||||
sha1 = "c669519ccf4904a485338555e1e66cad36bb0670";
|
||||
name = "jest_jasmine2___jest_jasmine2_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz";
|
||||
sha1 = "fd509a9ed3d92bd6edb68a779f4738b100655b37";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_leak_detector___jest_leak_detector_27.0.2.tgz";
|
||||
name = "jest_leak_detector___jest_leak_detector_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_leak_detector___jest_leak_detector_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz";
|
||||
sha1 = "ce19aa9dbcf7a72a9d58907a970427506f624e69";
|
||||
name = "jest_leak_detector___jest_leak_detector_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz";
|
||||
sha1 = "545854275f85450d4ef4b8fe305ca2a26450450f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_matcher_utils___jest_matcher_utils_27.0.2.tgz";
|
||||
name = "jest_matcher_utils___jest_matcher_utils_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_matcher_utils___jest_matcher_utils_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz";
|
||||
sha1 = "f14c060605a95a466cdc759acc546c6f4cbfc4f0";
|
||||
name = "jest_matcher_utils___jest_matcher_utils_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz";
|
||||
sha1 = "2a8da1e86c620b39459f4352eaa255f0d43e39a9";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_message_util___jest_message_util_27.0.2.tgz";
|
||||
name = "jest_message_util___jest_message_util_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_message_util___jest_message_util_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.0.2.tgz";
|
||||
sha1 = "181c9b67dff504d8f4ad15cba10d8b80f272048c";
|
||||
name = "jest_message_util___jest_message_util_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.0.6.tgz";
|
||||
sha1 = "158bcdf4785706492d164a39abca6a14da5ab8b5";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_mock___jest_mock_27.0.3.tgz";
|
||||
name = "jest_mock___jest_mock_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_mock___jest_mock_27.0.3.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.0.3.tgz";
|
||||
sha1 = "5591844f9192b3335c0dca38e8e45ed297d4d23d";
|
||||
name = "jest_mock___jest_mock_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.0.6.tgz";
|
||||
sha1 = "0efdd40851398307ba16778728f6d34d583e3467";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -3002,99 +2994,99 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_regex_util___jest_regex_util_27.0.1.tgz";
|
||||
name = "jest_regex_util___jest_regex_util_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_regex_util___jest_regex_util_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz";
|
||||
sha1 = "69d4b1bf5b690faa3490113c47486ed85dd45b68";
|
||||
name = "jest_regex_util___jest_regex_util_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz";
|
||||
sha1 = "02e112082935ae949ce5d13b2675db3d8c87d9c5";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_resolve_dependencies___jest_resolve_dependencies_27.0.4.tgz";
|
||||
name = "jest_resolve_dependencies___jest_resolve_dependencies_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_resolve_dependencies___jest_resolve_dependencies_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz";
|
||||
sha1 = "a07a242d70d668afd3fcf7f4270755eebb1fe579";
|
||||
name = "jest_resolve_dependencies___jest_resolve_dependencies_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz";
|
||||
sha1 = "3e619e0ef391c3ecfcf6ef4056207a3d2be3269f";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_resolve___jest_resolve_27.0.4.tgz";
|
||||
name = "jest_resolve___jest_resolve_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_resolve___jest_resolve_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.0.4.tgz";
|
||||
sha1 = "8a27bc3f2f00c8ea28f3bc99bbf6f468300a703d";
|
||||
name = "jest_resolve___jest_resolve_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.0.6.tgz";
|
||||
sha1 = "e90f436dd4f8fbf53f58a91c42344864f8e55bff";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_runner___jest_runner_27.0.4.tgz";
|
||||
name = "jest_runner___jest_runner_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_runner___jest_runner_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.0.4.tgz";
|
||||
sha1 = "2787170a9509b792ae129794f6944d27d5d12a4f";
|
||||
name = "jest_runner___jest_runner_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.0.6.tgz";
|
||||
sha1 = "1325f45055539222bbc7256a6976e993ad2f9520";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_runtime___jest_runtime_27.0.4.tgz";
|
||||
name = "jest_runtime___jest_runtime_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_runtime___jest_runtime_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.0.4.tgz";
|
||||
sha1 = "2e4a6aa77cac32ac612dfe12768387a8aa15c2f0";
|
||||
name = "jest_runtime___jest_runtime_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.0.6.tgz";
|
||||
sha1 = "45877cfcd386afdd4f317def551fc369794c27c9";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_serializer___jest_serializer_27.0.1.tgz";
|
||||
name = "jest_serializer___jest_serializer_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_serializer___jest_serializer_27.0.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.1.tgz";
|
||||
sha1 = "2464d04dcc33fb71dc80b7c82e3c5e8a08cb1020";
|
||||
name = "jest_serializer___jest_serializer_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz";
|
||||
sha1 = "93a6c74e0132b81a2d54623251c46c498bb5bec1";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_snapshot___jest_snapshot_27.0.4.tgz";
|
||||
name = "jest_snapshot___jest_snapshot_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_snapshot___jest_snapshot_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.0.4.tgz";
|
||||
sha1 = "2b96e22ca90382b3e93bd0aae2ce4c78bf51fb5b";
|
||||
name = "jest_snapshot___jest_snapshot_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.0.6.tgz";
|
||||
sha1 = "f4e6b208bd2e92e888344d78f0f650bcff05a4bf";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_util___jest_util_27.0.2.tgz";
|
||||
name = "jest_util___jest_util_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_util___jest_util_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.2.tgz";
|
||||
sha1 = "fc2c7ace3c75ae561cf1e5fdb643bf685a5be7c7";
|
||||
name = "jest_util___jest_util_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.6.tgz";
|
||||
sha1 = "e8e04eec159de2f4d5f57f795df9cdc091e50297";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_validate___jest_validate_27.0.2.tgz";
|
||||
name = "jest_validate___jest_validate_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_validate___jest_validate_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.0.2.tgz";
|
||||
sha1 = "7fe2c100089449cd5cbb47a5b0b6cb7cda5beee5";
|
||||
name = "jest_validate___jest_validate_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.0.6.tgz";
|
||||
sha1 = "930a527c7a951927df269f43b2dc23262457e2a6";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_watcher___jest_watcher_27.0.2.tgz";
|
||||
name = "jest_watcher___jest_watcher_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_watcher___jest_watcher_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.0.2.tgz";
|
||||
sha1 = "dab5f9443e2d7f52597186480731a8c6335c5deb";
|
||||
name = "jest_watcher___jest_watcher_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.0.6.tgz";
|
||||
sha1 = "89526f7f9edf1eac4e4be989bcb6dec6b8878d9c";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest_worker___jest_worker_27.0.2.tgz";
|
||||
name = "jest_worker___jest_worker_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest_worker___jest_worker_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz";
|
||||
sha1 = "4ebeb56cef48b3e7514552f80d0d80c0129f0b05";
|
||||
name = "jest_worker___jest_worker_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.6.tgz";
|
||||
sha1 = "a5fdb1e14ad34eb228cfe162d9f729cdbfa28aed";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "jest___jest_27.0.4.tgz";
|
||||
name = "jest___jest_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "jest___jest_27.0.4.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest/-/jest-27.0.4.tgz";
|
||||
sha1 = "91d4d564b36bcf93b98dac1ab19f07089e670f53";
|
||||
name = "jest___jest_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/jest/-/jest-27.0.6.tgz";
|
||||
sha1 = "10517b2a628f0409087fbf473db44777d7a04505";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -3786,11 +3778,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "pretty_format___pretty_format_27.0.2.tgz";
|
||||
name = "pretty_format___pretty_format_27.0.6.tgz";
|
||||
path = fetchurl {
|
||||
name = "pretty_format___pretty_format_27.0.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.2.tgz";
|
||||
sha1 = "9283ff8c4f581b186b2d4da461617143dca478a4";
|
||||
name = "pretty_format___pretty_format_27.0.6.tgz";
|
||||
url = "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.6.tgz";
|
||||
sha1 = "ab770c47b2c6f893a21aefc57b75da63ef49a11f";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -4682,11 +4674,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "v8_to_istanbul___v8_to_istanbul_7.1.2.tgz";
|
||||
name = "v8_to_istanbul___v8_to_istanbul_8.0.0.tgz";
|
||||
path = fetchurl {
|
||||
name = "v8_to_istanbul___v8_to_istanbul_7.1.2.tgz";
|
||||
url = "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz";
|
||||
sha1 = "30898d1a7fa0c84d225a2c1434fb958f290883c1";
|
||||
name = "v8_to_istanbul___v8_to_istanbul_8.0.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz";
|
||||
sha1 = "4229f2a99e367f3f018fa1d5c2b8ec684667c69c";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -4754,11 +4746,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "whatwg_url___whatwg_url_8.6.0.tgz";
|
||||
name = "whatwg_url___whatwg_url_8.7.0.tgz";
|
||||
path = fetchurl {
|
||||
name = "whatwg_url___whatwg_url_8.6.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz";
|
||||
sha1 = "27c0205a4902084b872aecb97cf0f2a7a3011f4c";
|
||||
name = "whatwg_url___whatwg_url_8.7.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz";
|
||||
sha1 = "656a78e510ff8f3937bc0bcbe9f5c0ac35941b77";
|
||||
};
|
||||
}
|
||||
{
|
||||
@ -4810,11 +4802,11 @@
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "ws___ws_7.5.0.tgz";
|
||||
name = "ws___ws_7.5.1.tgz";
|
||||
path = fetchurl {
|
||||
name = "ws___ws_7.5.0.tgz";
|
||||
url = "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz";
|
||||
sha1 = "0033bafea031fb9df041b2026fc72a571ca44691";
|
||||
name = "ws___ws_7.5.1.tgz";
|
||||
url = "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz";
|
||||
sha1 = "44fc000d87edb1d9c53e51fbc69a0ac1f6871d66";
|
||||
};
|
||||
}
|
||||
{
|
||||
|
@ -19,16 +19,16 @@ let
|
||||
in
|
||||
buildGoModule rec {
|
||||
pname = "argo";
|
||||
version = "3.0.8";
|
||||
version = "3.1.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "argoproj";
|
||||
repo = "argo";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-TOPJvOQKEMEsQ/wAJNF+08g4z75GGkNom6gRCrNOO2I=";
|
||||
sha256 = "sha256-WErNPofVnV6L7DkYU/dh4mWm+u7UJNFUmRN6IZzMb2g=";
|
||||
};
|
||||
|
||||
vendorSha256 = "sha256-YjVAoMyGKMHLGEPeOOkCKCzeWFiUsXfJIKcw5GYoljg=";
|
||||
vendorSha256 = "sha256-99N//woGPx9QEtkFsktaiAbu7TS+3DHArBA52OUJFU4=";
|
||||
|
||||
doCheck = false;
|
||||
|
||||
|
@ -2,16 +2,16 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "fluxctl";
|
||||
version = "1.22.2";
|
||||
version = "1.23.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "weaveworks";
|
||||
repo = "flux";
|
||||
rev = version;
|
||||
sha256 = "sha256-qYdVplNHyD31m4IbIeL3x3nauZLl1XquslS3WrtUXBk=";
|
||||
sha256 = "sha256-CJY7XjHJ6suJrjhnG+w5oM1FtVnegcbkCVGjyoBtBag=";
|
||||
};
|
||||
|
||||
vendorSha256 = "sha256-4uSw/9lI/rdDqy78jNC9eHYW/v/sMFb+sQvwYG6GZks=";
|
||||
vendorSha256 = "sha256-aC6E+PpuUqFhZKvQT5AuxpPmHfhjCwHzwFHDzk5wazw=";
|
||||
|
||||
nativeBuildInputs = [ installShellFiles ];
|
||||
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "helm-secrets";
|
||||
version = "3.7.0";
|
||||
version = "3.8.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "jkroepke";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
hash = "sha256-AM+TLeSrXjn10DiQzXSqSwTqsc7CjTdnf6TWetden7g=";
|
||||
hash = "sha256-UZu3jChEK59UrtUR2ze68Kkc6MkHRtTsfTOS/B96sLM=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "k9s";
|
||||
version = "0.24.11";
|
||||
version = "0.24.12";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "derailed";
|
||||
repo = "k9s";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-UWY4r7pasFsmlRRKFANyxPIoNNuMPNg1gMXrAXEcqdw=";
|
||||
sha256 = "sha256-GuN+OAzuNus1B32ZSsnrJPrE7MQ0ZqNKDmoNe7Sa7Zs=";
|
||||
};
|
||||
|
||||
buildFlagsArray = ''
|
||||
@ -18,7 +18,7 @@ buildGoModule rec {
|
||||
-X github.com/derailed/k9s/cmd.commit=${src.rev}
|
||||
'';
|
||||
|
||||
vendorSha256 = "sha256-EEN3nKQBtAGG7MAa9h11KFPZ9g7xtNxhFB1i/2QS66g=";
|
||||
vendorSha256 = "sha256-JBWQxRaMvIbUiOD7sJiZH1SHNCdysgh5FeSmYf+FdG4=";
|
||||
|
||||
doCheck = false;
|
||||
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "kubeconform";
|
||||
version = "0.4.7";
|
||||
version = "0.4.8";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "yannh";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-ahVdKMx3u2KnJ30wi9rV8JCVg9wPmbgdrtG8IpWWlCs=";
|
||||
sha256 = "sha256-XD8xGqtE7eaBxPL4Z0Kw4BEqM2fdgww7wl8wJ1U3u0U=";
|
||||
};
|
||||
|
||||
vendorSha256 = null;
|
||||
|
@ -9,7 +9,7 @@ python3.pkgs.buildPythonApplication rec {
|
||||
sha256 = "b4b1ccf086586d041d7e91e68515d495c550f30e4d179d63863fea9ccdbb78eb";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = with python3.pkgs; [ dateutil tornado python-daemon boto3 ];
|
||||
propagatedBuildInputs = with python3.pkgs; [ python-dateutil tornado python-daemon boto3 ];
|
||||
|
||||
# Requires tox, hadoop, and google cloud
|
||||
doCheck = false;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user